루트가 아닌 사용자가 인스턴스로 시스템 서비스를 제어 할 수 있도록하려면 어떻게해야합니까?


12

dba그룹의 사용자 가 database@서비스 를 제어 할 수 있도록해야 합니다. 에 대한 대답 이 관련 질문은 단지 모두 나열하는 것입니다 systemctl제가에 허용 할 것을 "동사" sudoers나는 데이터베이스 시스템에있을 수 있습니다 사전에 알고하지 않기 때문에 내 경우에는 적용되지 않습니다, 그러나, 파일. 예를 들어 내가 나열하면

%dba = /usr/bin/systemctl start database@awsesomeapp
%dba = /usr/bin/systemctl start database@anotherawsesomeapp
%dba = /usr/bin/systemctl start database@yetanotherawsesomeapp
%dba = /usr/bin/systemctl start database@wowyetanotherawsesomeapp
# ... other "verbs" omitted for brevity

미래에 존재할 수있는 인스턴스를 다루지 않으며 dba는

$ sudo systemctl start database@omgwowyetanotherawsesomeapp

어쨌든 특정 시스템을 사용하는 것보다 패키징 측면에서 더 많은 생각을하고 있습니다.

다른 관련 질문에 대한 이 놀라운 답변 에서 볼 수 있듯이 sudo globs를 사용하는 것은 궁극적으로 안전하지 않습니다.

%dba ALL = /usr/bin/systemctl start database@[a-z]* # UNSAFE!

허용

$ sudo systemctl start database@awsesomeapp unrelatedservice

사용하는 sudo것이 내 문제를 해결하지 못할 것으로 생각합니다 (잘못되기를 바랍니다). 루트가 아닌 사용자가 systemd서비스 를 제어 할 수있는 다른 방법이 있습니까?

가치있는 것을 위해서는 CentOS 7 시스템과 향후 RHEL7 시스템 에서이 작업을 수행해야합니다. 또한 아치 리눅스에서 작동하는 솔루션에 관심이 있습니다.

답변:


1

Sudoers 파일은 그런 식으로 작동하지 않을 것입니다. Sudoers 파일은 해당 명령과 함께 사용할 수있는 인수를 지정하지 않고 특정 명령 액세스를 제공하기위한 것입니다.

루트로 실행되고 다음을 실행하는 스크립트를 작성하십시오.

/usr/bin/systemctl start database@

스크립트가 anotherawesomeapp와 같은 인수를 사용하여 다음을 실행하십시오.

스크립트 실행 : / usr / bin / systemctl start database @ anotherawsesomeapp

사용자에게 / etc / sudoers와 함께 script.sh 파일을 실행할 권한을 부여하십시오.

scriptuser ALL=(ALL) NOPASSWD: /path/to/script.sh

사용자는 다음과 같이 실행할 수 있습니다.

sh script.sh anotherawsesomeapp

예:

AppName=$1

/usr/bin/systemctl start database@$AppName;
if [ $? != "0" ] 
then; 
    echo "$AppName could not be started. Are you using the right application name?";
fi

1
있는 그대로 이것은 sudoers와 같은 문제가 있습니다. 변수를 인용해야합니다. 그렇지 않으면 변수가 공백으로 분할됩니다.
— kyrias

이것은 작동하지 않을 것입니다; setuid는 Linux에서 쉘 스크립트로 사용되지 않습니다.
— Martijn

스크립트를 실행하기 위해 sudo를 사용하기 만하면됩니다. 'hello world'스크립트와 동일하지 않습니다. 루트가 스크립트를 실행할 수 있으면 작동합니다.
— Baazigar

0

기반으로 제안 된 솔루션SUID

은 sudo로 systemctl을 호출하는 스크립트를 만들 수 있습니다. 루트가 스크립트를 소유하게하십시오. SUID데이터베이스 관리자 그룹 (dba)에 대한 루트 권한 및 읽기 및 실행 권한을 제공하십시오.
그룹이나 다른 사람에게 쓰기 권한을 제공하지 않도록주의하십시오. 이렇게하면 스크립트를 변경하고 sudo 앞에있는 것을 실행할 수 있습니다! 또한 스크립트가 입력 방식으로 방탄인지 확인하십시오.

$ 고양이 >> start_database.sh
sudo / usr / bin / systemctl start database @ $ 1
(Ctrl + D)

이 스크립트는 인수가 실제로 제공되는지 확인하여 Usage : 메시지를 인쇄하여 향상시킬 수 있습니다 SUID. 인수 뒤에 다른 명령이 삽입되는 것을 피합니다. 또는 언급 한 앱 관련 문자열 중 하나만 입력으로 허용해야합니다!
그런 다음 스크립트에 대한 권한이 다음과 같아야합니다.

$ sudo chown root : dba start_database.sh
$ sudo chmod ux, gw, o-rwx start_database.sh
$ sudo chmod u + s, g + rx start_database.sh

그런 다음 올바른 권한을 확인하십시오.

$ ls -la
.
.
.
-rwSr-x --- 1 루트 dba 35 8 월 2 일 19:11 start_database.sh
.
.
.

요약하자면 다음과 같습니다.

1. owner of the script is root
파일 2. can be read and executed by the dba group members
3 no-one else will be able to even read.
4. SUID스크립트를 실행하는 사용자 는 스크립트가 실행 되는 한 루트가 될 수 있습니다.
5. sudo는 비밀번호를 중지하지 않습니다.

어쨌든 여러 사용자가있는 시스템 에서는 권한 남용의 여지를 남겨 둘 수 있으므로 매우주의 해야 SUID합니다.


스크립트에서 shebang이 누락 되어도 SUID기본적으로 스크립트에서 작동하지 않습니다.
— Jan Tojnar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.