루트가 아닌 사용자가 system.d 서비스를 제어 할 수 있도록하려면 어떻게해야합니까?


60

을 사용하면 다음 sysvinit과 같은 sudoers항목으로 충분합니다.

%webteam cms051=/sbin/service httpd *

이를 통해 다음과 같은 명령이 가능합니다.

  • sudo service httpd status
  • sudo service httpd restart

이제 systemd서비스 이름이 최종 인수입니다. 즉, 서비스 재시작은 다음과 같이 수행됩니다.

systemctl restart httpd.service

당연히 나는 명령을 systemctl * httpd.service작동 하는 것으로 정의 했지만 systemctl restart puppet.service httpd.service원하는 효과가 아닌 것을 허용 한다고 생각했습니다 .

이를 고려할 때 루트가 아닌 사용자가 system.d서비스 를 제어 할 수있는 가장 좋은 방법은 무엇입니까? 반드시 그럴 필요는 없습니다 sudoers. 아마도 파일 권한 변경으로 충분할 수 있습니까?


sudo한동안 구성을 건드리지 않았지만 같은 것을 할 수 없었 cms051=systemctl * httpd.service습니까?
John WH Smith 17

1
그러면 서비스를 다시 시작할 수 있습니다. 질문에 그 답을 포함시켜야 했어요. 죄송합니다.
Belmin Fernandez

답변:


43

필요한 모든 명령을 sudoers별도로 추가하십시오 .

%webteam cms051=/usr/bin/systemctl restart httpd.service
%webteam cms051=/usr/bin/systemctl stop httpd.service
%webteam cms051=/usr/bin/systemctl start httpd.service 
%webteam cms051=/usr/bin/systemctl status httpd.service

모든 단위 명령을 캡처하기를 원했지만 항목을 항목별로 지정해야한다면 그게 내가해야 할 일이라고 생각합니다.
Belmin Fernandez

9
모든 사용자가 그렇게 할 수 있으므로 상태는 유용하지 않습니다
Dereckson

5
무엇입니까 cms051?
케빈

1
그래서 systemctl restart http.service mariadb.service ;-)를 호출하면 어떻게됩니까? 아마 mariadb도 다시 시작됩니다
마렉 Wajdzik에게

1
@MarekWajdzik sudo는 명시 적으로 *또는 유사한 패턴 으로 허용되지 않는 경우 추가 인수를 허용하지 않습니다 .
jofel

31

@jofel의 대답은 작업 설정을 얻는 데 필요한 것입니다. 이 질문에 다른 사람을 위해 이것을 배치. capistrano로컬 컴퓨터에서 배포 한 후 Ruby 애플리케이션을 다시 시작 하는 방법이 필요했습니다 . 즉, systemd서비스 를 다시 시작하기 위해 비밀번호없이 액세스해야 합니다. 이것이 내가 가진 것이며 훌륭하게 작동합니다!

참고 : 내 사용자 및 그룹은 deployer
여기에서 사용자 정의 파일에 코드 입력 이라고 합니다 : /etc/sudoers.d/deployer
코드 :

%deployer ALL= NOPASSWD: /bin/systemctl start my_app
%deployer ALL= NOPASSWD: /bin/systemctl stop my_app
%deployer ALL= NOPASSWD: /bin/systemctl restart my_app

deployer이 경우 사용자로 로그인 한 후 systemctlsudo를 사용 하여 명령을 실행해야한다는 것을 추가해야합니다 .
Muyiwa Olu

8

액세스하려는 명령으로 명령 별명을 작성하십시오. 그런 다음 그룹을 해당 명령 별명에 지정하십시오.

Cmnd_Alias APACHE-SVC = /usr/bin/systemctl stop httpd, /usr/bin/systemctl start httpd, /usr/bin/systemctl restart httpd

%webteam ALL=APACHE-SVC

sudoers 파일을 직접 편집하지 않고 /etc/sudoers.d/filename에 편집 내용을 배치하는 것이 좋습니다. sudoers에서 .d / filename을 가리켜 야합니다. 대부분의 새로운 배포판은 그렇게합니다. sudoers 에이 두 줄을 배치하면 트릭을 수행해야합니다.

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

참고 : 포함 된 앞의 #은 주석이 아닙니다. 남아 있어야합니다.


암호를 입력하지 않고 중지 / 시작 / 다시 시작하는 기회를 어떻게 추가합니까?
Nikolay Baranenko

최고의 답변 IMO. 누구나 명령 별칭을 추가하고이 작업을 수행해야합니다.
DASKAjA

6

조펠이 제안한 대로 항목을 분류하는 것이 가장 안전 합니다.

누군가 명령 기능의 제한된 하위 집합을 사용하도록하려면 sudoers 줄에서 와일드 카드를 신뢰하지 않습니다. 언어가 쉘 글로브보다 표현력이 뛰어나더라도 추적해야 할 코너 케이스가 너무 많습니다.

" service httpd *"행은 비교적 안전합니다. (이를 검증하십시오 )에는 특별히 민감한 것을 수행하지 않는 service유용한 플래그 ( --status-all) 가 하나만 있으므로 (이 또한 검증하십시오) /etc/init.d/httpd는 허용하려는 명령 행 만 허용합니다.

조합이 너무 많아서 나열하기가 어색한 경우, 수행중인 작업에 의문을 제기해야합니다. 그러나 그들에게 명령을 실행하는 신중하게 작성된 도우미 스크립트에 대한 액세스 권한을 부여 할 수 있습니다 (와 유사 /etc/init.d/http). 이 경우에도 허용되는 명령 및 옵션을 정확하게 나열하고 가능한 한 사용자 입력을 대상 명령에 직접 전달하지 않아야합니다.

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