2013-11-26 4 views
0

현재 우분투 상자에 PHP 파일이 있습니다. 웹 인터페이스 (보안 blablabla)에있는 사용자를 작성하는 데 사용하고자하는 내부 네트워크의 모든 사용자가 완전히 액세스 할 수없는 사람PHP에서 sudo로 쉘 스크립트 실행하기

shell_exec("sudo mkdir -m 755 ".escapeshellarg($directory)); 

    shell_exec("sudo useradd -s /bin/false -d ".escapeshellarg($directory)." -p ".crypt($pass,$salt)." ".escapeshellarg($servername)); 

하지만 분명이 MKDIR 모두 노출 및 암호없이 sudo'd로 useradd를, 그래서 대신이 일을 내가 만들에 의한 합병증을 줄이기로 결정 : 실수로/의도적으로 내가 처음이를 사용하여 시도) 시스템에 해를 입힐 것 'newserver.sh'라는/etc에있는 쉘 스크립트. 더 나은 ABIT를 작동하는 듯 내가 터미널에서 그것을 실행할 때 꽤 잘 작동하지만, PHP는 exexutes 때 아무것도 할

shell_exec("sudo sh /etc/newserver.sh /home/testuser testuser testpass"); 

을 보일지 나던 사용

#!/bin/bash 
#Var 1 = Directory, Var 2 = Username Var 3 = Password 
mkdir "$1" 
chmod 755 "$1" 
useradd -s /bin/false -d "$1" -p "$3" "$2" 
chown "$2" "$1" 

는 (심지어 시험 필자 내가 터미널에서 실행할 때와 동일한 매개 변수.

참고로 내의 sudoers 파일은이 라인 모두의 www-data ALL=(root) NOPASSWD: /etc/newserver.sh

+0

: 당신이 당신의 스크립트를 확인해야하는 경우

, 난 당신이 디버깅 목적으로 임시 로그 파일을 사용하는 것이 좋습니다 것 shell_exec) : "이 함수를 사용하여 실행 실패를 감지 할 수 없습니다. 프로그램 종료 코드에 대한 액세스가 필요할 때 exec()를 사용해야합니다." 코드로 모든 것이 잘 작동한다고 가정합니다. 그러지 마. 실패를 가정하고 성공을 즐거운 놀라움으로 대하십시오. exec()로 전환하고 출력/반환 값 확인을 시작합니다. –

+0

는 아무것도 반환하지 않습니다. 사실 sh isnt sudoable 일 수 있습니까? 그것의 no는 내가 명령을 실행할 때 패스워드를 묻지 않는다. 그래서 나는 확신 할 수 없다 ... –

+0

또한 아파치는 보통'www-data' 사용자와 그룹에서 실행되며'useradd'와 같은'sudo' 명령에 접근 할 수 없습니다 PHP에서. 그것은 sudo 사용자 아래서'bash -c'와 함께 작동 할 것입니다. 나는 결코 그것을 시도하지 않았다. – machineaddict

답변

0

첫째, 암호 m을 가지고

/etc/newserver.sh /home/testuser testuser "$6$VP9.GI9D$nVjpXIlgoTCLYICNW9ijPqg07opPrjTU2ilYULaT4rut8S9CAmWggMXuOhJ27C5ltwCRfzSxEVgSlReA2i/rH1" 

그리고 저는 "-c"를 인수로 사용해야한다고 생각합니다. 루트로 실행

shell_exec("sudo sh -c \"/etc/newserver.sh /home/testuser testuser testpass\""); 
+0

나는 암호화 암호에 대해 알고있다. 명령은 여전히 ​​실행되어야하고 계정은 암호를 통해 액세스 할 수 없다는 것 외에는 유효해야한다. im은 테스트 베드로 사용한다. 다른 매개 변수 집합을 가진다. 암호화 된 암호를 포함한 PHP에서 전달됩니다. 이제 -c를 사용해보십시오. –

+0

그 권한이 거부되었다고 응답합니다. –

+0

파일 실행 권한을 확인 했습니까? chmod u + x /etc/newserver.sh – Construidor

0

은 두 가지 방법으로 수행 할 수 있습니다 :

  • sudo를 사용
  • 는 setuid를
설정 (... sudoer 좋은 생각처럼 아무것도 www-data을)

살펴보기 /bin/ping :

-rwsr-xr-x 1 root root /bin/ping 

이것은 루트에 속하지만 'x'(실행)을 대체하는 's'는이 프로그램이 setuid라는 것을 의미합니다. 항상 소유자의 ID 인 root로 실행됩니다. ping은 ICMP 패킷을 작성해야하는 프로그램이며 루트 만이 끝까지 조작 할 수 있습니다.

당신은 유사한 environement를 만들 수 있습니다 쉘 스크립트에 명령을 배치 (의이 myscript.sh을 가정 해 봅시다)과 :

chown root:root myscript.sh # Give it to root. 
chmod u+s myscript.sh # Use setuid on it. 

를 이제, 당신도 웹에 대한 일반 사용자 (또는 www-data으로, 그것을 실행할 때 서버 ...) 프로세스가 루트의 ID로 작성됩니다.

위험 스크립트에 setuid (root 권한)를 부여하는 것은 매우 위험합니다. 사용 권한에주의해야합니다. 관심있는 사람 외에는 다른 사람을 허용하지 마십시오. 예를 들어, 그룹이 스크립트를 실행하도록 허용 사람들을 위해 myscriptexec라는 만들 : 당신이 필요로

addgroup myscriptexec 
chgrp myscriptexec myscript.sh 
chmod g+x # Group can execute. 
chmod o= myscript.sh # No one executes except root and group members. 

그런 다음,이 그룹에 사용자를 추가합니다.http://php.net/ ([shell_exec에 대한 문서] 당으로

exec > /tmp/mylog.log 
exec 2> /tmp/mylog.log 
+0

괜찮아요. 아프다. 나에게 그랬다. –

+0

내가 그랬을 때, sudo없이 sh를 실행하면 루트로 실행되지 않기 때문에 실패한다. 그렇지 않으면 실행되지 않기 때문에 mkdir과 ​​adduser에서 에러로 응답한다. 루트로. –

+0

내 잘못 : 이후에 실행 된 명령이 루트로 실행되지 않습니다. 스크립트 내에서'sudo'를 사용하여 명령 앞에 접두사를 붙여보십시오. 암호를 물어 보지 마십시오 ("부모"프로그램은 루트로 실행 됨). –

관련 문제