![일반 사용자로 systemd 서비스에서 루트가 되고자 하는 프로세스를 실행하는 방법은 무엇입니까?](https://linux55.com/image/95918/%EC%9D%BC%EB%B0%98%20%EC%82%AC%EC%9A%A9%EC%9E%90%EB%A1%9C%20systemd%20%EC%84%9C%EB%B9%84%EC%8A%A4%EC%97%90%EC%84%9C%20%EB%A3%A8%ED%8A%B8%EA%B0%80%20%EB%90%98%EA%B3%A0%EC%9E%90%20%ED%95%98%EB%8A%94%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%A5%BC%20%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
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라고 명시적으로 나와 있지 않습니다. 이는 운영 체제에 따라 다를 수 있습니다.