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


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.