일반 사용자로 systemd 서비스에서 루트가 되고자 하는 프로세스를 실행하는 방법은 무엇입니까?

일반 사용자로 systemd 서비스에서 루트가 되고자 하는 프로세스를 실행하는 방법은 무엇입니까?

systemd를 사용하여 서비스를 시작했습니다. 서비스 사용자 및 그룹을 권한이 없는 사용자로 변경합니다.

[Service]
...
User=regular_user
Group=regular_user
...

어느 시점에서 서비스는 루트가 될 것으로 예상되는 다른 프로세스를 시작해야 합니다. 다른 프로세스에는 's' 비트가 설정되어 있으며 setuid()루트가 되는 데 사용됩니다.

프로세스를 시작하면 정상적으로 실행됩니다. 그러나 서비스가 시작하려고 하면 함수 setuid()가 오류와 함께 반환됩니다.

작업이 허용되지 않습니다.

setuid()기능에 대한 몇 가지 옵션이 표시되지만 서비스 기능을 유지하는 데 필요한지 여부는 알 수 없습니다 . 나는 몇 가지를 시도했지만 지금까지 아무 소용이 없습니다.

예를 들어 다음과 같이 시도했습니다.

AmbientCapabilities=CAP_SETGID CAP_SETUID
SecureBits=keep-caps

프로세스가 더 이상 오류를 생성하지 않는 것처럼 보이지만 여전히 해야 할 일을 수행하고 있지 않습니다. (다시 말하지만, 콘솔에서 프로세스를 실행하면 제대로 작동합니다!)

답변1

내가 실제로 찾았어새로운 권한 없음 =내 프로세스 하위 프로세스가 setuid().

그들이 말하는 바에 따르면 이것은 확실히 가볍게 받아들여야 할 선택이 아닙니다. 그러나 기본 설정은 이 setuid()기능을 허용하지 않음입니다. (그 말은«권한 상승».)

나에게 도움이 된 것은 다음과 같습니다.

NoNewPrivileges=false

설명서에는 Ubuntu 16.04에서 이 옵션의 기본값이 true라고 명시적으로 나와 있지 않습니다. 이는 운영 체제에 따라 다를 수 있습니다.

관련 정보