Как пакет Debian должен создавать учетные записи пользователей?

33

Пакет qqq.debустанавливает программу, qqqкоторая должна запускаться от uqqqучетной записи пользователя. Пакет состоит из qqqпрограммы, qqq.confконфигурационного файла и /etc/init.d/qqqinitscript.

Как пакет должен управлять созданием пользователя uqqq? Есть ли лучшие практики или официальные рекомендации по этому поводу?

  1. Просто создайте пользователя автоматически uqqqв postinst;
  2. Создать пользователя автоматически при первом запуске из /etc/init.d/qqqскрипта;
  3. Создать пользователя автоматически при первом запуске qqqпрограммы (без аргументов)
  4. Не создавайте учетные записи пользователей, откажитесь от запуска, если пользователь явно не создан администратором (например, используя qqq --create-user);
  5. Не создавайте учетные записи пользователей, по умолчанию работайте небезопасно из-под root;
  6. Интерактивно спросите в postinst, скрипте init.d или в qqqсамом себе, создавать ли пользователя.

Должен ли пакет удалять учетную запись пользователя при удалении?

Vi.
источник
7
Самый простой способ - найти ответы на этот вопрос - посмотреть на сценарии до / после установки официальных пакетов Debian. Просто запустите grep adduser /var/lib/dpkg/info/*.postinstна любой системе, основанной на Debian, чтобы получить много примеров.
Джофель
Когда adduserиспользуется, это также должно зависеть от пакета. См .: lintian.debian.org/tags/…
Лекенштейн

Ответы:

22

Вики Debian содержит более подробное и конкретное руководство, чем уже упоминавшееся Руководство по политике Debian. См. AccountHandlingInMaintainerScripts :

Программа adduser делает правильные вещи, если вызывается с опцией --system. Таким образом, обычно необходимо только позвонить

adduser --system $ USERNAME

в вашем postinst, чтобы создать учетную запись с отключенными логинами, основной группой nogroup и домашним каталогом в / home. Если вы хотите, чтобы другие варианты, добавьте их, как вы хотите.

Обычно нет необходимости проверять с помощью getent, существует ли учетная запись, поскольку adduser --system обычно делает правильные вещи. Если нет, пожалуйста, сообщите об ошибке в adduser, чтобы сохранить ваши скрипты сопровождающего простыми.

Совет по удалению учетных записей не дает окончательных результатов. Однако отмечу, что соответствующий совет для fedora не вызывает сомнений.

Не удалять пользователей или группы Мы никогда не удаляем пользователей или группы, созданные пакетами. Нет никакого разумного способа проверить, остались ли файлы, принадлежащие этим пользователям / группам (и даже если бы они были, что бы мы с ними сделали?), И оставление тех, у кого есть владения, указывающие на несуществующих пользователей / групп, может привести к проблемам с безопасностью. когда семантически несвязанный пользователь / группа создается позже и повторно использует UID / GID. Кроме того, в некоторых установках удаление пользователя / группы может быть невозможным или / или нежелательным (например, при использовании общей удаленной базы данных пользователей / групп). Очистка неиспользуемых пользователей / групп оставлена ​​на усмотрение системных администраторов, если они того пожелают.

fuzzyBSc
источник
12

Как администратор, устанавливающий пакеты, я бы ожидал, что мои пакеты автоматически создадут пользователей, которых они требуют, в pre или postinst, так что любые файлы, которые должны принадлежать пользователю, могут быть созданы до запуска программы.

Ваша программа должна запускаться от имени root только в том случае, если это необходимо (например, привязка к привилегированному порту), и в идеале она должна отбрасывать свои привилегии, как только она закончит делать требуемый root.

Вы можете посмотреть, как другие (установленные) пакеты справились с этим, используя

grep -l adduser /var/lib/dpkg/info/*postinst /var/lib/dpkg/info/*preinst

и чтение перечисленных файлов (большинство из них занимают более одной строки параметров).

Как ни странно, все, кроме одного из моих установленных пакетов, которые создают пользователя, используют adduserдля добавления пользователей, но пакет adduser не является обязательным пакетом, поэтому ваш пакет должен быть собран, чтобы зависеть от него. useraddПрограмма используется пакет libuuid1, и является частью passwdпакета , который является обязательным пакетом.

DerfK
источник
1
Это ужасно, проверьте правильный способ создания сценариев preinst, а не взломайте их вручную.
17
--quietподход кажется очень популярным
vidstige
6

Раздел 10.9. Разрешения и владельцы в Руководстве по политике Debian содержат то, что вы ищете (из "версии 3.9.5.0, 2013-10-28"):

Если вам нужно создать нового пользователя или группу для вашего пакета, есть две возможности. Во-первых, вам может потребоваться, чтобы некоторые файлы в двоичном пакете принадлежали этому пользователю или группе, или вам может потребоваться скомпилировать идентификатор пользователя или группы (а не только имя) в двоичный файл (хотя этого следует избегать, если возможно, так как в этом случае вам нужен статически выделенный идентификатор).

Если вам нужен статически размещенный идентификатор, вы должны запросить идентификатор пользователя или группы из base-passwd' maintainer, and must not release the package until you have been allocated one. Once you have been allocated one you must either make the package depend on a version of theпакета base-passwd с идентификатором, присутствующим в /etc/passwd' or / etc / group, или договориться о том, чтобы ваш пакет создал самого пользователя или группу с правильным id (использование adduser') in itspreinst или postinst'. (Doing it in thepostinst должно быть предпочтительным, если это возможно, в противном случае потребуется предварительная зависимость для пакета adduser).

Заметка: The Debian-Devel список довольно активен и ответы на такие вопросы тоже (хотя этот пример с 2003 года).

Глина Б
источник
3
Итак, краткий упрощенный ответ - «Использовать adduserв postinst».
Ви.