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
권한 남용의 여지가 생길 수 있기 때문입니다 .