systemd는 그룹에서 권한이 없는 사용자로 시작됩니다.

systemd는 그룹에서 권한이 없는 사용자로 시작됩니다.

그룹의 사용자가 다음 foogroup을 수행할 수 있기를 바랍니다.

  • systemctl start foo.service,
  • systemctl stop foo.service,
  • systemctl status foo.service, 그리고
  • journalctl -u foo.service

상승된 권한을 사용하지 마십시오. 그게 가능합니까?


다음과 같은 시스템 서비스가 있습니다.

[Unit]
Description=foo service

[Service]
Type=simple
ExecStart=/bin/sleep infinity
User=foobot
Group=foogroup

foobot시스템 사용자는 어디에 있습니까?

권한이 없는 사용자가 systemd를 사용할 수 있도록 단위 파일을 설치할 수 있다는 것을 알고 있지만 ~/.config/systemd/user/이는 실제로 커뮤니티에 도움이 되지 않습니다.

참고: 사용할 계획입니다.SD 버스API의libsystem-dev그리고조종석따라서 추가해도 systemctl도움 /etc/sudoers이 되지 않습니다.

별로 상관하지 않습니다 systemctl enable. 더 높은 권한이 필요한지 여부는 중요하지 않습니다.

답변1

이것이 제가 마침내 생각해낸 해결책입니다. 내가 만든다:

/etc/polkit-1/localauthority/50-local.d/service-auth.pkla
---
[Allow foogroup to start/stop/restart services]
Identity=unix-group:foogroup
Action=org.freedesktop.systemd1.manage-units
ResultActive=yes

이는 특히 Debian/Ubuntu에서 사용되는 polkit <106에 적용됩니다. 다른 배포판에서는 다음을 수행하는 최신 버전의 polkit을 사용합니다.

/etc/polkit-1/rules.d/foogroup.rules
---
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" &&
        subject.isInGroup("foogroup")) {
        return polkit.Result.YES;
    } });

단일 서비스로 제한하고 시작/중지/다시 시작만 하려면 다음과 같이 사용하세요.

polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" &&
        subject.isInGroup("foogroup")) {
        if (action.lookup("unit") == "foo.service") {
            var verb = action.lookup("verb");
            if (verb == "start" || verb == "stop" || verb == "restart") {
                return polkit.Result.YES;
            }
        }
    }
});

(에서https://wiki.archlinux.org/title/Polkit)

답변2

나는 해결책을 찾고 있지만 실제로 나를 만족시키는 해결책을 찾을 수 없습니다. 만족스러운 해결책은 에서 그룹 지원을 제공하는 것입니다 systemd. 그런데 이 해결 방법을 찾았습니다. 액세스 권한 을 부여하려는 사용자가 및 이라고 가정합니다 ann. 그들은 모두 하나의 그룹에 속해야 합니다 .benchrisawesomeproject

  1. 새 사용자를 생성 awesomeproject하고 해당 사용자를 그룹에 추가합니다 awesomeproject.
sudo adduser awesomeproject
sudo usermod -a -G awesomeproject ann
sudo usermod -a -G awesomeproject ben
sudo usermod -a -G awesomeproject chris
  1. systemctl그룹의 모든 사용자를 새 사용자의 sudoer에 추가합니다.
sudo visudo

이러한 항목은 다음과 같아야 합니다.

ann    ALL=(awesomeproject) NOPASSWD: /bin/systemctl
ben    ALL=(awesomeproject) NOPASSWD: /bin/systemctl
chris  ALL=(awesomeproject) NOPASSWD: /bin/systemctl

에 넣는 것보다 배포판에 따라 사용하는 것보다 /etc/sudoers넣는 것이 더 나을 수도 있습니다 ./etc/sudoers.d/awesomeprojectsudo visudo -f /etc/sudoers.d/awesomeproject

  1. awesomeproject그룹 구성원이 액세스할 수 있도록 파일 및 디렉터리에 대한 권한을 적절하게 관리합니다 ~awesomeproject.

  2. 이제 다음 명령이 ann, ben및 에서 작동합니다 chris.

sudo awesomeproject systemctl ...

관련 정보