Управление учетными записями служб в спецификации RPM

16

Мне дали частично полную спецификацию RPM для сервиса, который мы пишем. Он позволяет создавать необходимые каталоги, копировать файлы, устанавливать разрешения и т. Д., Но не создает системную учетную запись, под которой будет работать служба. Мне сказали, что RPM лучше всего позаботиться об этом, поэтому я добавил

Requires(pre): /usr/sbin/useradd

%pre
useradd -r -d /path/to/program -s /bin/false myservice

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

Моя текущая проблема заключается в следующем: а) если учетная запись пользователя уже существует, установка RPM завершится неудачно из-за useraddсбоя (поскольку пользователь уже существует); и б) я не знаю, как rpm -e myserviceтакже удалить соответствующего пользователя и группу.

Coderer
источник
//, рассмотрите возможность использования FPM?
Натан Басанезе

Ответы:

18

Я на самом деле решил это самостоятельно, посмотрев на другие спецификации RPM, которые делали подобные вещи. Если вы просто хотите добавить пользователя (условно), воспользуйтесь ссылкой Игнасио. Я сделал это:

Requires(pre): /usr/sbin/useradd, /usr/bin/getent
Requires(postun): /usr/sbin/userdel

%pre
/usr/bin/getent group myservice || /usr/sbin/groupadd -r myservice
/usr/bin/getent passwd myservice || /usr/sbin/useradd -r -d /path/to/program -s /sbin/nologin myservice

%postun
/usr/sbin/userdel myservice

Это гарантирует, что RPM «очищается после себя», но все же предоставляет возможность установки, даже если учетная запись уже существует.

Coderer
источник
13
Хотя это отвечает на вопрос, стоит прочитать заметку в ссылке на ссылку Fedora, опубликованную Игнасио, о том, почему удаление пользователя / группы нежелательно.
CoverosGene
1
Существует проблема повторного использования UID и GID (когда удаленный пользователь имеет самый высокий UID / GID), что делает любое автоматическое использование userdel плохой идеей.
Bruno9779
1
В моем CentOS 6.7 я удалил команду / usr / sbin / groupadd, так как команда useradd создаст саму группу. Также useradd завершит работу с ошибкой, когда группа с таким именем уже существует.
Рафаэль
rpmlint отчет «W: опасная команда в% postun userdel», если вы его используете
Rfraile
5

Любой из двух предыдущих ответов готов к работе, так как эти методы удаляют пользователя, если пакет обновляется. Yum устанавливает новый пакет, а затем удаляет старый пакет. Это оставит вас без пользователя. Не круто!

Используйте этот метод вместо:

%postun
case "$1" in
   0) # This is a yum remove.
      /usr/sbin/userdel myservice
   ;;
   1) # This is a yum upgrade.
      # do nothing
   ;;
 esac
Стивен
источник
4

Ответ от Coderer хороший, но вторая предварительная команда выдает ошибку на Centos 7. Группу необходимо указать.

Requires(pre): /usr/sbin/useradd, /usr/bin/getent
Requires(postun): /usr/sbin/userdel

%pre
/usr/bin/getent group myservice > /dev/null || /usr/sbin/groupadd -r myservice
/usr/bin/getent passwd myservice > /dev/null || /usr/sbin/useradd -r -d /path/to/program -s /sbin/nologin -g myservice myservice

%postun
/usr/sbin/userdel myservice

Я также добавил перенаправление в / dev / null, чтобы игнорировать нежелательные эхо.

Tabinol
источник