Pseudo User Policy

Материал из ALT Linux Wiki

(Различия между версиями)
Перейти к: навигация, поиск
(согласование uid-gid)
м (Удаление пользователя: ...суть плохая идея)
 
(9 промежуточных версий не показаны.)
Строка 1: Строка 1:
-
{{Викифицировать}}
+
{{викифицировать}}
{{DraftPolicy
{{DraftPolicy
|responsible=?
|responsible=?
}}
}}
-
 
-
== Создание псевдопользователей ==
 
-
__TOC__
 
=== Проблема ===
=== Проблема ===
-
Ряду программных пакетов для реализации работы с понижением привилегий (privilege separation) требуется псевдопользователь (и обычно — соответствующая группа; численное значение — от 1 до 499 согласно принятых норм).
+
Ряду программных пакетов для реализации работы с понижением привилегий (<tt>privilege separation</tt>) требуется псевдопользователь (и обычно — соответствующая группа; численное значение — от 1 до 499 согласно принятых норм).
-
Идея предварительно «забить» всех нужных псевдо в <tt>/etc/passwd</tt> и <tt>/etc/group</tt> прямо при создании пакета <tt>setup</tt> обречена на столкновение с непредвиденными надобностями и серьёзными проблемами с интеграцией изменений — ведь новые версии этих файлов будут установлены как <tt>*.rpmnew</tt>, а автоматизированные средства сведения изменений не прилагаются.
+
Идея предварительно «забить» всех нужных псевдо в <code>/etc/passwd</code> и <code>/etc/group</code> прямо при создании пакета <code>setup</code> обречена на столкновение с непредвиденными надобностями и серьёзными проблемами с интеграцией изменений — ведь новые версии этих файлов будут установлены как <code>*.rpmnew</code>, а автоматизированные средства сведения изменений не прилагаются.
С другой стороны, идея создавать служебные аккаунты динамически при установке пакета сама по себе чревата несовместимостью uid/gid различных инсталляций, что создаёт вполне реальные проблемы с резервным копированием (восстановлением данных в контексте другого сервера).
С другой стороны, идея создавать служебные аккаунты динамически при установке пакета сама по себе чревата несовместимостью uid/gid различных инсталляций, что создаёт вполне реальные проблемы с резервным копированием (восстановлением данных в контексте другого сервера).
-
Кажется разумным сочетание этих подходов: поддержание списка зарегистрированных UID/GID и реализация добавления «по требованию», но с фиксированными значениями. Для этого требуется написать (обобщить имеющиеся) макросы для проверки коллизий (наличие пользователя с «неправильными» uid/gid, как было с sympa; наличие «реального» пользователя с uid/gid >= 500).
+
Кажется разумным сочетание этих подходов: поддержание списка зарегистрированных <tt>UID</tt>/<tt>GID</tt> и реализация добавления «по требованию», но с фиксированными значениями. Для этого требуется написать (обобщить имеющиеся) макросы для проверки коллизий (наличие пользователя с «неправильными» <tt>uid</tt>/<tt>gid</tt>, как было с <code>sympa</code>; наличие «реального» пользователя с <tt>uid</tt>/<tt>gid</tt> >= 500).
-
При этом для уменьшения плотности этих самых коллизий предлагается отдавать предпочтение именам вида «_name» для «системных» пользователей и групп.
+
При этом для уменьшения плотности этих самых коллизий предлагается отдавать предпочтение именам вида «<code>_name</code>» для «системных» пользователей и групп.
-
=== Заведение псевдопользователей ===
+
=== Суть policy ===
-
Если для нормальной работы пакета приходится создавать псевдопользователя, следует обсудить вопрос в devel@ — могут быть непредвиденные проблемы с доступностью или беспроблемностью имени, uid/gid или настройкой аккаунта.
+
* Если программа для своей работы не требует прав <code>root</code>, она должна работать от имени непривелигированного псевдопользователя.
-
<!-- взято с TypicalPackagingErrors/UserDel -->
+
* При этом разные программы следует запускать от имени индивидуальных псевдопользователей, в случаях, когда программы никак не связаны друг с другом, а именно:
 +
** файловая система (общие файлы или каталоги для <tt>IPC</tt>)
 +
** <tt>SYSV</tt> <tt>IPC</tt>
 +
** сигналы, посылаемые процессам
 +
** обобщённо, то, на что распространяются <tt>unix permissions</tt>
-
=== Переписка ===
+
=== Пример заведения псевдопользователя ===
-
<pre>> В процессе обсуждения упаковки jabber-пакетов возник такой дискуссионный
+
<pre>
-
> вопрос: есть серверы, есть компоненты - под какими unix-пользователями
+
%define _pseudouser_user    _foo
-
> их запускать?
+
%define _pseudouser_group    _foo
-
>
+
%define _pseudouser_home    %_localstatedir/foo
-
> Я лично придерживаюсь мнения, что это все абсолютно отдельные, ничем не
+
-
> связанные сервера и есть смысл держать их под отдельными пользователями
+
-
> (jabberd2, ejabberd, jabber-jit, jabber-mrim и т.п.) - у них у каждого
+
-
> собственные спулы, собственные логи и т.п.
+
-
>
+
-
> pma@ в личной беседе озвучил противоположную мысль - а не завести ли нам
+
-
> единого пользователя, например, "jabber", которые будет владеть всеми
+
-
> каталогами всех jabber-related пакетов, и под которым, собственно, будут
+
-
> запускаться все сервисы?
+
-
>
+
-
> У кого какие мнения есть на этот счет?
+
-
Если сервера не связанные, то и псевдопользователи должны быть не связанные.</pre>
+
Name: foo
-
''[http://lists.altlinux.org/pipermail/devel/2007-March/043675.html ldv@]''
+
...
-
<pre>В данном случае под связью имеется в виду
+
%pre
-
- файловая система (общие файлы или каталоги для IPC)
+
/usr/sbin/groupadd -r -f %_pseudouser_group ||:
-
- SYSV IPC
+
/usr/sbin/useradd -g %_pseudouser_group -c 'The foo daemon' \
-
- сигналы, посылаемые процессам
+
        -d %_pseudouser_home -s /dev/null -r %_pseudouser_user >/dev/null 2>&1 ||:
-
короче говоря, то, на что распространяются unix permissions.</pre>
+
...
-
''[http://lists.altlinux.org/pipermail/devel/2007-March/043688.html ldv@]''
+
-
<pre>> > > Можно заводить пользователя _tremulous и
+
%files
-
> > > группу _tremulous или нет? И если можно -- с какими uid/gid?
+
%dir %attr(0775,root,%_pseudouser_group) %_var/run/%name
-
> > > Автогенерируемые, как я понял? Доп. разрешение нужно у кого-нибудь
+
%dir %attr(0770,root,%_pseudouser_group) %_localstatedir/%name
-
> > > на этот счет запрашивать?
+
</pre>
-
> > Если автогенерить, то втиснуть uid/gid до 500 желательно...
+
-
> Это то понятно, это и в полиси написано: http://www.altlinux.org/UidGid
+
-
>
+
-
> А вот как именно раздавать -- согласовывая номер с ответственным или же
+
-
> автоматически (похоже, что именно этот вариант, судя спекам других
+
-
> пакетов) -- неясно.
+
-
 
+
-
Согласовывать не надо, useradd выполнит необходимую работу сам.
+
-
Более-менее актуальный пример есть в пакете iftop.</pre>
+
-
''[http://lists.altlinux.org/pipermail/devel/2008-September/078918.html ldv@]''
+
=== Права на каталоги ===
=== Права на каталоги ===
-
См. [http://docs.altlinux.ru/alt/devel/ch01s03.html ALT Secure Packaging Policy], но вкратце:
+
При упаковке приложений следует уделять должное внимание правам доступа, выставляемым на файлы и директории, принадлежащие этому приложению. Подробно об этом можно почитать в [[SecurePackagingPolicy|ALT Linux Secure Packaging Policy]].
-
<pre>> Мне отсюда не видно, но обычно в таких ситуациях
+
 
-
> %dir %attr(2770,root,asterisk) %_localstatedir/asterisk
+
Вкратце:
-
Если в каталог пишет только один псевдопользователь, то 0770.
+
* Если в каталог пишет только один псевдопользователь, то <code>0770 root:_pseudouser_group</code>
-
Если в каталог пишет не только один псевдопользователь, то
+
* Если в каталог пишет не только один псевдопользователь, то если у них нет общих для записи файлов, то 3770, иначе 2770.
-
  если у них нет общих для записи файлов, то 3770, иначе 2770.
+
* Если псевдопользователи только читают из каталога, то 0750.
 +
* Если псевдопользователи только открывают файлы из каталога, то 0710
 +
 
 +
=== Удаление пользователя ===
 +
Удалять псевдопользователей ''не следует''.
-
Если псевдопользователи только читают из каталога, то 0750.
+
В силу специфического [[SpecTips/triggers|порядка выполнения пакетных скриптов]] в rpm прописанный в <code>%postun</code> <code>userdel</code> при обновлении пакета отработает ''после'' <code>%post</code> (с какими угодно <code>useradd</code>) из обновляемого пакета. Результатом будет отсутствие пользователя после установки пакета ''вообще''. Так что пусть уж лучше не удаляются… заодно решать вопросы с «плавающими» правами в условиях отсутствия полиси на фиксирование UID/GID динамически создаваемых пользователей и групп.
-
Если псевдопользователи только открывают файлы из каталога, то 0710.</pre>
+
-
''[http://lists.altlinux.org/pipermail/devel/2007-April/044602.html ldv@]''
+
-
=== TODO ===
+
=== Исправление ситуации, если псевдопользователь был удалён ===
-
* ссылки на sympa.spec, webalizer.spec, bugzilla, обсуждения в devel@/sisyphus@
+
На примере [http://sisyphus.ru/srpm/webalizer/spec webalizer.spec] версии 2.01.10-alt3:
 +
<pre>%triggerpostun -- webalizer < 2.01.10-alt3
 +
echo "Fixing permissions after faulty previous package:"
 +
/usr/sbin/groupadd -r -f %webalizer_group ||:
 +
/usr/sbin/useradd -g %webalizer_group -G %apache_group -c 'The Webalizer' \
 +
        -d %webalizer_home -s /dev/null -r %webalizer_user ||:
 +
chown -Rv root:%webalizer_group %webalizer_home %webalizer_html</pre>
=== Ссылки ===
=== Ссылки ===
-
* [[Документация/ПраваГруппПользователей|Описание назначения некоторых групп]]
 
* [https://bugzilla.altlinux.org/show_bug.cgi?id=15268 пример проблемы]
* [https://bugzilla.altlinux.org/show_bug.cgi?id=15268 пример проблемы]
* [https://bugzilla.altlinux.org/show_bug.cgi?id=9895 add useradd and groupadd macros]
* [https://bugzilla.altlinux.org/show_bug.cgi?id=9895 add useradd and groupadd macros]
* [http://lists.altlinux.org/pipermail/devel/2004-January/018128.html http://lists.altlinux.org/pipermail/devel/2004-January/018128.html]
* [http://lists.altlinux.org/pipermail/devel/2004-January/018128.html http://lists.altlinux.org/pipermail/devel/2004-January/018128.html]
* [http://lists.altlinux.org/pipermail/devel/2004-January/018132.html http://lists.altlinux.org/pipermail/devel/2004-January/018132.html]
* [http://lists.altlinux.org/pipermail/devel/2004-January/018132.html http://lists.altlinux.org/pipermail/devel/2004-January/018132.html]
 +
* [https://bugzilla.altlinux.org/show_bug.cgi?id=2623 #2623]
 +
* [https://bugzilla.altlinux.org/show_bug.cgi?id=2977 #2977].

Текущая версия на 17:10, 22 октября 2012

42px-Wikitext-ru.svg.png
Эту статью следует викифицировать.
Stub.png
Черновик политики Sisyphus
Автор(ы) — ?


Содержание

Проблема

Ряду программных пакетов для реализации работы с понижением привилегий (privilege separation) требуется псевдопользователь (и обычно — соответствующая группа; численное значение — от 1 до 499 согласно принятых норм).

Идея предварительно «забить» всех нужных псевдо в /etc/passwd и /etc/group прямо при создании пакета setup обречена на столкновение с непредвиденными надобностями и серьёзными проблемами с интеграцией изменений — ведь новые версии этих файлов будут установлены как *.rpmnew, а автоматизированные средства сведения изменений не прилагаются.

С другой стороны, идея создавать служебные аккаунты динамически при установке пакета сама по себе чревата несовместимостью uid/gid различных инсталляций, что создаёт вполне реальные проблемы с резервным копированием (восстановлением данных в контексте другого сервера).

Кажется разумным сочетание этих подходов: поддержание списка зарегистрированных UID/GID и реализация добавления «по требованию», но с фиксированными значениями. Для этого требуется написать (обобщить имеющиеся) макросы для проверки коллизий (наличие пользователя с «неправильными» uid/gid, как было с sympa; наличие «реального» пользователя с uid/gid >= 500).

При этом для уменьшения плотности этих самых коллизий предлагается отдавать предпочтение именам вида «_name» для «системных» пользователей и групп.

Суть policy

  • Если программа для своей работы не требует прав root, она должна работать от имени непривелигированного псевдопользователя.
  • При этом разные программы следует запускать от имени индивидуальных псевдопользователей, в случаях, когда программы никак не связаны друг с другом, а именно:
    • файловая система (общие файлы или каталоги для IPC)
    • SYSV IPC
    • сигналы, посылаемые процессам
    • обобщённо, то, на что распространяются unix permissions

Пример заведения псевдопользователя

%define _pseudouser_user     _foo
%define _pseudouser_group    _foo
%define _pseudouser_home     %_localstatedir/foo

Name: foo
...

%pre
/usr/sbin/groupadd -r -f %_pseudouser_group ||:
/usr/sbin/useradd -g %_pseudouser_group -c 'The foo daemon' \
        -d %_pseudouser_home -s /dev/null -r %_pseudouser_user >/dev/null 2>&1 ||:
...

%files
%dir %attr(0775,root,%_pseudouser_group) %_var/run/%name
%dir %attr(0770,root,%_pseudouser_group) %_localstatedir/%name

Права на каталоги

При упаковке приложений следует уделять должное внимание правам доступа, выставляемым на файлы и директории, принадлежащие этому приложению. Подробно об этом можно почитать в ALT Linux Secure Packaging Policy.

Вкратце:

  • Если в каталог пишет только один псевдопользователь, то 0770 root:_pseudouser_group
  • Если в каталог пишет не только один псевдопользователь, то если у них нет общих для записи файлов, то 3770, иначе 2770.
  • Если псевдопользователи только читают из каталога, то 0750.
  • Если псевдопользователи только открывают файлы из каталога, то 0710

Удаление пользователя

Удалять псевдопользователей не следует.

В силу специфического порядка выполнения пакетных скриптов в rpm прописанный в %postun userdel при обновлении пакета отработает после %post (с какими угодно useradd) из обновляемого пакета. Результатом будет отсутствие пользователя после установки пакета вообще. Так что пусть уж лучше не удаляются… заодно решать вопросы с «плавающими» правами в условиях отсутствия полиси на фиксирование UID/GID динамически создаваемых пользователей и групп.

Исправление ситуации, если псевдопользователь был удалён

На примере webalizer.spec версии 2.01.10-alt3:

%triggerpostun -- webalizer < 2.01.10-alt3
echo "Fixing permissions after faulty previous package:"
/usr/sbin/groupadd -r -f %webalizer_group ||:
/usr/sbin/useradd -g %webalizer_group -G %apache_group -c 'The Webalizer' \
        -d %webalizer_home -s /dev/null -r %webalizer_user ||:
chown -Rv root:%webalizer_group %webalizer_home %webalizer_html

Ссылки

 
Личные инструменты