Я создал несколько системных сервисов, которые в основном работают:
расположение:
/etc/systemd/system/multi-user.target.wants/publicapi.service
содержание:
[Unit]
Description=public api startup script
[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=-/etc/environment
WorkingDirectory=/home/techops
ExecStart=/home/techops/publicapi start
ExecStop=/home/techops/publicapi stop
[Install]
WantedBy=multi-user.target
Когда я пытаюсь перезапустить службу как пользователь techops в командной строке, я получаю следующий вывод:
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to start 'publicapi.service'.
Multiple identities can be used for authentication:
1. Myself,,, (defaultuser)
2. ,,, (techops)
Choose identity to authenticate as (1-2):
Я хочу, чтобы только techops мог перезапустить службы, и я хочу, чтобы это приглашение не отображалось при входе в систему как techops. Как я могу это сделать?
Я читал, что есть разные подходы с polkit-1 или sudoers, но я не уверен.
[ОБНОВЛЕНИЕ] 2019-01-27 16:40
Спасибо за этот исчерпывающий ответ Томасу и Перлдуку. Это помогло мне улучшить мои знания о systemd.
В соответствии с подходом, чтобы запустить службу без запроса пароля, и я хочу извиниться, что я не подчеркнул достаточную реальную проблему:
На самом деле, самое важное для меня - то, что никто другой, кроме techops, не должен останавливать или запускать службу. Но по крайней мере с первыми двумя подходами я все еще могу работать, service publicapi stop
и я получаю подсказку ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
снова. Когда я выбираю пользователя по умолчанию и знаю пароль, я могу остановить все службы. Я хочу отказать этому пользователю в этом, даже если у него есть пароль . Важная справочная информация, чтобы лучше понять, почему это важнее для меня: пользователь по
умолчанию является единственным пользователем, который имеет доступ к ssh, но этот пользователь не может делать ничего другого (кроме перехода на других пользователей, если у вас есть пароль этих других пользователей) , Но на данный момент он может запускать или останавливать сервисы, но этот пользователь не должен этого делать.
Если кто-то получит пароль от defaultuser и войдет в систему через ssh, он может остановить все службы в данный момент. Это то, что я имел в виду, «я хочу, чтобы только techops мог перезапустить сервисы». Извините, что я не был так точен в моем начальном вопросе. Я думал, что sudoing пользователь techops может обойти эту проблему, но это не так. Сама проблема не в том, чтобы запустить команду без запроса пароля. (Я мог бы легко сделать это как пользователь techops, когда я просто выполняю /home/techops/publicapi start
). Сама проблема заключается в блокировке пользователя по умолчанию от запуска этих служб.
И я надеялся, что любое из решений может сделать это.
Я начал с подходов Томаса. Подход с sudo работает, когда я не хочу, чтобы у меня запрашивали пароль для пользователя, когда я выполняю команды, как описано, например,
sudo systemctl start publicapi.service
sudo systemctl stop publicapi.service
Второй подход у меня пока не работает. Я не могу запустить службу без запроса пароля, ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
и я могу войти в систему как defaultuser, когда у меня есть пароль этого пользователя.
При третьем подходе сервис даже не запускается при загрузке, поэтому я не уверен, что этот подход мне подходит. Я даже не могу это сделать, systemctl enable publicapi.service
что приводит меня к следующей ошибке:
Failed to enable unit: Unit file mycuisine-publicapi.service does not exist.
Ошибка не возникает, когда я перемещаю все службы обратно в / etc / systemd / system / и выполняю systemctl enable publicapi.service
. Затем служба запускается снова при загрузке.
Все эти подходы более или менее помогут обойти запрос пароля для пользователя techops, но когда я запускаю service publicapi stop
или systemctl stop publicapi
с defaultuser, я могу остановить службы, если у меня есть пароль. Но моя цель - заблокировать defaultuser от запуска или остановки служб вообще.
источник
systemctl --user ...
от имени пользователя,techops
а не от имени пользователя root. Ни мое предложение, ни предложение @PerlDuck не дают никакихsudo
прав вашему defaultuser, но только пользователю techops ./etc/sudoers
файл, если есть ссылка для этого пользователя.Ответы:
Чтобы добиться того, что пользователь
techops
может управлять сервисомpublicapi.service
без ввода пароля, у вас есть разные возможности. На какой из них вы не можете ответить, вам придется выбирать самостоятельно.Классический
sudo
подход, пожалуй, наиболее используемый, так как он существует долгое время. Вы должны создать, например, файл следующим образом.Обратите внимание, что раскрывающийся каталог
/etc/sudoers.d
активен, только если#includedir /etc/sudoers.d
установлен в/etc/sudoers
. Но это должно иметь место, если вы используете современный дистрибутив Ubuntu. Какroot
выполнить:Теперь вы сможете запускать
systemctl
команды от имени пользователя,techops
не вводя пароль, добавляяsudo
команды.Второй способ заключается в использовании PolKit (был переименован из PolicyKit ), чтобы позволить пользователю
techops
контролироватьsystemd
службы. В зависимости от версииpolit
вы можете предоставить обычным пользователям контроль над единицами systemd.Чтобы проверить версию polkit , просто запустите
pkaction --version
.с помощью polkit версии 0.106 и выше вы можете разрешить пользователям контролировать определенные модули systemd.
Для этого вы можете создать правило как
root
:с версией polkit 0.105 и ниже : вы можете разрешить пользователям управлять модулями systemd. К сожалению, это относится ко всем системным модулям, и вы можете этого не делать. Не уверен, есть ли способ ограничить доступ к определенным системным устройствам с версией 0.105 или ниже, но, возможно, кто-то еще может уточнить.
Чтобы включить это, вы можете создать файл как
root
:В обоих случаях вы можете работать
systemctl [start|stop|restart] publicapi.service
от имени пользователяtechops
без указания пароля. В последнем случае (polkit <= 0.105) пользовательtechops
может управлять любым модулем systemd.Третий вариант - сделать сервис пользовательским сервисом, который не нуждается
sudo
ни вpolkit
настройках. Таким образом все становится под контролем пользователя и работает только в том случае, если ваша действующая служба, с которой запускается,/home/techops/publicapi start
может работать безroot
привилегий.Сначала вы должны включить задержку для пользователя
techops
. Это необходимо для запуска службы пользователя при загрузке. Какroot
выполнить:Затем вы должны переместить
systemd
файл модуля вtechops
каталог пользователя. Как пользователь,techops
выполните команды следующим образом.Обратите внимание, что
WantedBy
должно быть так,default.target
как нетmulti-user.target
в пользовательском контексте.Теперь перезагрузите конфигурацию и включите сервис. Снова, как пользователь
techops
выполняет команды.Как правило, вы должны размещать свои системные модули
/etc/systemd/system/
не в/etc/systemd/system/multi-user.target.wants
. При выполнении будетsystemctl enable publicapi.service
создана символическая ссылкаetc/systemd/system/multi-user.target.wants
или какая-либо цель, указанная для этого подразделения.Как уже упоминалось, если сама служба / процесс может быть запущена без привилегий root, вам следует рассмотреть возможность добавления
User=techops
в файл модуля для запуска процесса с непривилегированной учетной записью пользователя.источник
.pkla
не работает. Для этого нужна[section]
запись. Обновленный ответ.Прежде всего, вы не помещаете файл модуля в каталог
/etc/systemd/system/multi-user.target.wants
. Этот каталог поддерживаетсяsystemd
иsystemctl
командами./etc/systemd/system
Вместо этого поместите файл модуля и затем включите егоЭто создаст символическую ссылку ниже
multi-user.target.wants
(или там, где онаsystemctl
знает лучше), чтобы соблюдать строкив блоке.
Далее создайте
sudoers
файл ниже/etc/sudoers.d
:со следующим содержанием:
Не используйте обычный редактор (например
sudo vim /etc/sudoers.d/techops
) для редактирования этого файла, потому что, если вы добавите в него какие-либо синтаксические ошибки, вы не сможете запустить егоsudo
снова.visudo
с другой стороны, проверяет синтаксис файла перед тем, как покинуть редактор.Теперь пользователь
techops
может запуститьи два других без указания пароля. Обратите внимание, что вы должны ввести команду и параметры точно так, как указано в
sudoers
файле (за исключением/bin/systemctl
части, которая может быть сокращена до простоsystemctl
).Например,
sudo /bin/systemctl start publicapi
(без.service
) будет запрашивать пароль.источник