systemd : 권한이없는 사용자에게 하나의 특정 서비스를 변경할 수있는 권한 부여


20

헤드리스 리눅스 박스에서 개인 게임 서버를 운영하고 있습니다. 내가 바보가 아니기 때문에 서버는 업데이트를 다운로드하고 세계 데이터베이스를 수정하는 데 필요한 최소한의 액세스 권한을 가진 권한이없는 사용자로 실행되고 있습니다.

또한 필요에 따라 서버를 올바르게 시작, 중지 및 다시 시작하기 위해 시스템 단위 파일을 만들었습니다 (예 : 업데이트).

그러나 실제로 전화를 걸 systemctl거나 service <game> start/stop/restart루트 또는 sudo유능한 사용자 로 로그인해야합니다 .

<game>서비스에 대해 권한이없는 사용자 gamesrv가 시작 / 중지 / 다시 시작 명령을 실행할 수 있음을 systemd에 알리는 방법이 있습니까?


어떤 버전의 PolicyKit / 배포입니까? 데비안 (및 파생 제품)은 다른 구성 파일 형식이 필요한 이전 버전입니다 .
Gert van den Berg

답변:


37

이 작업을 수행하는 두 가지 방법을 생각할 수 있습니다.


하나는 서비스를 시스템 서비스가 아닌 사용자 서비스로 만드는 것입니다.

시스템 장치를 작성하는 대신 시스템 장치는 서비스 사용자의 홈 디렉토리 ()에 배치됩니다 $HOME/.config/systemd/user/daemon-name.service. 동일한 사용자는 수 있습니다 서비스 관리 와를 systemctl --user <action> daemon-name.service.

부팅시 사용자 장치가 시작 되도록하려면 root는 계정에 대해 남아 있어야합니다 sudo loginctl enable-linger username. 단위는이어야합니다 WantedBy=default.target.


다른 방법은 PolicyKit을 통해 시스템 장치를 관리하기 위해 사용자 액세스를 허용하는 것입니다. 이를 위해서는 시스템 226 이상이 필요합니다 (그리고 JavaScript rules.d 파일의 경우 PolicyKit> = 0.106 – 확인하십시오 pkaction --version).

/etc/polkit-1/rules.d/57-manage-daemon-name.rules를 들어 허용하려는 속성을 확인 하는 새로운 PolicyKit 구성 파일을 작성합니다 . 예를 들면 다음과 같습니다.

// Allow alice to manage example.service;
// fall back to implicit authorization otherwise.
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" &&
        action.lookup("unit") == "example.service" &&
        subject.user == "alice") {
        return polkit.Result.YES;
    }
});

명명 된 사용자 systemctl는를 사용하거나 사용하지 않고 명명 된 서비스를 관리 할 수 ​​있습니다 sudo.


사용자 모드와 loginctl작동했습니다.
Shadur

1
우분투 16.04에서 작동합니까? rules.d 디렉토리가 존재하지 않는 것이 정상입니까? 나는 그것을 작동시킬 수 없다. 내 규칙은 무시됩니다.
ygoe

3
PolicyKit을 활성화하려면 무언가를 다시 시작해야합니까?
Josir

@MichaelHampton systemd --user를 사용하면 부팅시 서비스 시작을 제외하고 내가 원하는 모든 것을 얻을 수 있습니다. 여러 곳에서 읽을 때 이것이 정상이라고 생각합니다 (예 : archlinux wiki), 당신은 그것이 작동해야한다고 말합니까, 확실합니까?
daks

@ daks 그렇습니다. 여전히 문제가 있으면 새로운 질문을하십시오.
Michael Hampton

12

sudo그것을 위해 만들어졌습니다. 권한이없는 사용자가 사용할 수있는 명령 을 추가하도록 /etc/sudoers파일을 편집하십시오 .visudoCmd_alias

# game server commands
Cmnd_Alias GAME_CMDS = /usr/bin/systemctl start <game service>, /usr/bin/systemctl stop <game service>

권한이없는 사용자가 다음과 같이 별명으로 정의 된 명령을 사용할 수 있도록 행을 추가하십시오.

unprivileged_user ALL=(ALL) NOPASSWD: GAME_CMDS

sudo 명령의 다양한 매개 변수에 대한 주제에 대한 추가 문서 를 읽으십시오 .

시스템에서 사용 가능 하도록 sudo패키지 를 설치해야 할 수도 sudo있습니다.


sudo 사용법을 알고 있습니다. 이 경우 systemd단위 파일이 하는 첫 번째 작업은 로 실행해야한다는 것을 지정하기 때문에 건너 뛸 수있는 옵션이 있는지 궁금합니다 gamesrv.
Shadur

1

sudo해당하는 액세스를 제공하는 것과 연관 될 수 root있지만, 특정의 제한된 명령 세트에 대해 특정 사용자 루트 액세스를 허용하는 데 사용될 수도 있습니다.

[ sudo없이 루트가 아닌 사용자에게 명령 세트에 액세스 할 수 있음) 에서 서버 결함에 대해 이미 응답 한 방법 .

PolicyKit 사용은 여전히 ​​흔하지 않습니다. 체계화 된 "사용자 단위"를 사용하면 문제없이 작동하지만, 과거 sudo에는 사용자가 특정 명령을 루트로 실행할 수있는 기능을 사용하여 여러 번 목표를 달성했습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.