나는 데비안(커널 2.6.32-5-686)에서 삼바를 제어하기 위한 작은 웹 인터페이스를 작성하고 있습니다. 저는 사용자 추가, 폴더 생성 등을 위한 간단한 스크립트를 작성하는 것부터 시작했습니다. 루트로 실행하면 잘 작동합니다. 그러나 네트워크(apache + php)를 통해 실행되는 일부 기능을 사용할 때는 php: shell_exec()
작동하지 않습니다. 그것들은 다음과 같습니다:
#!/bin/sh
#archive the userprofile
cp /home/samba/profile/$1 /home/samba/archive/$1
smbpasswd -LU $1 -x
userdel $1
exit 0
sudo를 사용하여 스크립트를 실행해 보았지만 작동하지 않는 것 같습니다. 다음 줄을 추가했습니다. (jupiter는 서버 이름입니다.)
%sudo jupiter=(ALL)NOPASSWD:/bin/<script>
/etc/sudoers 파일로 이동하여 www-data 사용자 sudo 그룹에 아무것도 지정하지 마십시오.
그런 다음 내가 읽어야 할 장소 chmod 4755
와 대본을 읽었습니다. chown
아직도 소용이 없습니다.
이 시점에서 나는 문제가 무엇인지 궁금해서 STDERR을 파일로 리디렉션했습니다. 사용자를 삭제하고 그의 공유를 보관하기 위해 , 및 cp
를 호출하는 작은 스크립트를 실행했습니다 . 모든 통화는 종료 코드 1을 반환하며, 이는 내가 아는 바로는 다음을 나타냅니다.smbpasswd
userdel
무엇문제가 발생했습니다. STDERR이 나에게 힌트를 주었습니다.
userdel: cannot lock /etc/passwd; try again later.
이는 일부 *.lock 파일로 인해 발생한 것 같지만 /etc/ 폴더에는 해당 파일이 없습니다.
이 시점에서 나는 약간 좌절감을 느꼈고 www-data를 루트 그룹에 추가하여 더 많은 루트 권한을 부여하려고 했습니다. 아직 상황이 진전되지 않았습니다.
지금까지의 진행 상황으로 인해 다음에 무엇을 해야 할지 모르겠습니다. 내 질문은 다음과 같습니다www-data 사용자가 실행하려면 루트 권한이 필요한 간단한 스크립트를 어떻게 얻을 수 있습니까?나는 이것이 /etc/passwd 파일에 문제가 있을 수 있다고 생각합니다. 루트만이 파일을 변경할 수 있는 권한을 가지고 있다고 상상할 수 있기 때문입니다.
답변1
내 대답은 해당 줄에만 관련됩니다
sudo jupiter=(ALL)NOPASSWD:/bin/<script>
sudo
이 줄을 사용하면 사용자가 인증 없이 호스트에서 모든 사용자로 실행할 수 있습니다 . 내 생각엔 당신이 이것을 원하지 않을 것 같아요./bin/<script>
juptier
내가 올바르게 이해했다면 사용자가 루트로 www-data
실행되기를 원합니다 /bin/<script>
. 이 경우 적절한 줄은 다음과 같습니다.
www-data jupiter=(root) NOPASSWD:/bin/<script>
이제 다음을 호출하여 특권 /bin/<script>
모드 에서 www-data
실행할 수 있습니다.root
www-data:~ $ sudo /bin/<script>
또는 shell_exec("sudo /bin/<script>")
PHP 스크립트를 통해(보안 문제에 대해 걱정하시기 바랍니다).
자세한 내용은 man sudoers
온라인 버전을 참조하세요.sudoers.man. 빠른 이해를 위해 이 섹션을 확인하는 것이 좋습니다 EXAMPLES
.
답변2
몇 가지 다른 방법이 있습니다.
- 앞에서 언급한 대로 sudo를 사용하십시오.
- suEXEC 기능을 사용하여 Apache 구성(php의 옵션이 아닐 수도 있음)
- 작은 setuid 프로그램을 사용하여 코드 호출
- 더있다...
가장 쉬운 방법은 이미 설명한 sudo를 사용하는 것입니다.
sudo 옵션에 대한 간략한 요약:
- /etc/sudoers에 "기본 요구 사항"이 없는지 확인하세요.
- "apache ALL = NOPASSWD:/path/to/command" 파일에 이 줄을 추가합니다. 이는 "sudo /path/to/commandwhatever"가 Apache로 호출되면 루트로 실행된다는 의미입니다. (이는 웹 서버가 사용자 아파치로 실행되고 있다고 가정합니다.)
그러나 만약 그렇다면, 그 모든 것의 위험성을 지적하겠습니다. 페이지에 액세스할 수 있는 사람은 누구나 원하는 대로 무엇이든 할 수 있습니다. 따라서 userdel을 통해 사용자(및 모든 파일)를 삭제할 수 있으며, 코드 작성 방법에 따라 스푸핑할 수도 있습니다. 루트로 명령합니다.
(이제 올바르게 구성되면 sudo는 수행할 수 있는 작업을 제한할 수 있으므로 프로그램을 올바르게 작성할 수 있습니다(비록 보안 setuid, CGI 및 php(shell_exec()를 사용하는 프로그램과 같은 프로그램)를 작성하는 것은 까다로울 수 있음). 그러나 userdel은 Pretty in에서 할 수 있습니다. 그 자체가 파괴적입니다).
따라서... 이렇게 하면 최소한 sudo(sudo를 사용하는 경우)가 반드시 실행해야 하는 명령만 실행하도록 구성되어 있는지 확인하고 페이지에 다른 사람이 액세스할 수 없는지 확인하세요. 예를 들어 뒤에 있는 Apache에서 페이지를 잠그세요. 비밀번호는 회사 방화벽 뒤에 있는 것이 아니라 인터넷에 있는 경우 특히 주의하십시오. (그러나 그래도 - 방화벽을 신뢰하여 안전하게 유지하지 마십시오.) 또한 신뢰할 수 없는 다른 사람이 이 호스트 또는 CGI에 PHP를 추가할 수 없도록 확인하십시오. /etc/sudoers에서도 이 줄을 사용할 수 있기 때문입니다.
PHP의 shell_exec()를 사용하고 있으므로 코드가 명령에 제공하는 인수에 대해 매우 주의하십시오. 사용자가 원하는 것을 거기에 넣으면 사용자는 무엇이든 할 수 있습니다.
귀하의 명령이 "userdel $user"이고 $user가 해당 페이지의 사용자로부터 직접 온다고 가정합니다. 사용자 = "foo;restart"인 경우. 루트로 실행하면 컴퓨터가 재부팅됩니다. 그러나 루트로 실행하지 않더라도 Apache 사용자로 코드를 실행하고 시스템에 들어가려고 시도할 수 있습니다.
즉, 입력 내용을 적절하게 삭제하는 방법은 이 간단한 답변이 실제로 허용하는 것보다 더 긴 주제입니다. 전체 주제를 다루려는 것이 아니라 간단히 언급하기만 하면 됩니다.