루트가 아닌 사용자가 인스턴스를 통해 시스템 서비스를 제어하도록 허용하는 방법은 무엇입니까?

루트가 아닌 사용자가 인스턴스를 통해 시스템 서비스를 제어하도록 허용하는 방법은 무엇입니까?

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 glob을 사용하는 것은 궁극적으로 안전하지 않습니다.

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

실제로 허용됨

$ sudo systemctl start database@awsesomeapp unrelatedservice

사용해도 문제가 해결되지 않는 것 같습니다 sudo(비록 제가 틀렸기를 바랍니다). 루트가 아닌 사용자가 systemd서비스를 제어할 수 있도록 하는 다른 방법이 있습니까 ?

어쨌든 CentOS 7 시스템에서 이 작업을 수행해야 하며 향후에는 RHEL7 시스템에서도 수행해야 합니다. 저는 또한 Arch Linux용 솔루션에도 관심이 있습니다.

답변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

답변2

제안된 솔루션은 다음을 기반으로 합니다.SUID

sudo를 사용하여 systemctl을 호출하는 위 스크립트를 만들 수 있습니다. 스크립트를 루트가 소유하게 만듭니다. SUID데이터베이스 관리자(dba) 그룹에 루트 권한과 읽기 및 실행 권한을 제공합니다.
그룹이나 다른 사람에게 쓰기 권한을 부여하지 않도록 주의하십시오. 그러면 스크립트를 변경하여 sudo 이전에 무엇이든 실행하게 할 수 있습니다! 또한 입력 측면에서 스크립트가 완벽한지 확인하세요.

$ 고양이 >> start_database.sh
sudo /usr/bin/systemctl 시작 데이터베이스@$1
(Ctrl+D)

이 스크립트는 인수가 실제로 제공되었는지 확인하고 그렇지 않은 경우 사용법: 메시지를 인쇄하여 개선할 수 있습니다. 또한 스크립트이므로 SUID인수 뒤에 다른 명령을 삽입하지 않도록 확인하는 것이 적합합니다. 아니면 언급한 애플리케이션 관련 문자열 중 하나만 입력하도록 허용하는 것이 더 좋습니다!
그런 다음 스크립트의 권한이 엄격하게 다음과 같은지 확인해야 합니다.

$ sudo chown 루트: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--- 루트 dba 1개 8월 35일, 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권한 남용의 여지가 생길 수 있기 때문입니다 .

관련 정보