비밀번호 없이 www-data 사용자로 sudo로 특정 명령을 실행할 수 있는 권한

비밀번호 없이 www-data 사용자로 sudo로 특정 명령을 실행할 수 있는 권한

인터넷 라디오도 재생하는 웹서버가 있습니다. www-data 사용자로서 저는 몇 가지 명령을 실행하고 싶습니다. 예를 들어 다음과 같이 만들었습니다./etc/sudoers파일:

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer

그리고 PHP를 구성하면 다음과 같이 비밀번호를 사용하지 않고 볼륨을 조작할 수 있습니다.

exec('sudo -u user amixer set Master 3%-');

그리고:

exec('sudo -u user amixer set Master 3%+');

하지만 이제 다음 명령을 실행하여 내 서비스를 다시 시작할 수 있기를 원합니다.

exec('sudo -u user service servicename restart');

그래서 나는 다음을 시도했습니다.

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer, NOPASSWD: /bin/service

이:

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer, /bin/service

그리고 이것조차:

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer
www-data        ALL=(ALL) NOPASSWD: /bin/service

그러나 그들 중 누구도 작동하지 않는 것 같습니다. 저를 도와주세요.


미안해요 - 내 실수예요. 몇 가지 변경 작업을 수행했으며 /sbin 양식을 /bin에 연결하려고 시도했습니다.

이제 다음과 같이 변경했습니다.

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer, NOPASSWD: /usr/sbin/service

그리고 그것은 작동합니다! 감사해요! 주제가 종료되었습니다.

답변1

솔루션에 주의하세요. 그런 식으로 모든 서비스를 시작, 중지 또는 다시 시작할 수 있습니다!

이 명령을 실행하는 쉘 스크립트를 만드는 것이 좋습니다.

echo "#!/bin/sh' > /usr/bin/amixer_restart
echo "sudo -u user service amixer restart' >> /usr/bin/amixer_restart

적절한 권한 부여(550은 루트 및 그룹 www-data가 읽고 실행할 수 있음을 의미하며 아무도 쓸 수 없음을 의미함)

sudo chown root:www-data /usr/bin/amixer_restart
sudo chmod 550 /usr/bin/amixer_restart

그리고 이 스크립트에서 Apache가 sudo를 수행하도록 허용합니다.

www-data        ALL=(ALL) NOPASSWD: /usr/bin/amixer_restart

답변2

이것이 내가 한 일입니다.

  1. 다음을 실행하여 apache2를 설치하십시오.sudo apt-get install apache2
  2. 다음을 실행하여 Apache가 cgi 스크립트를 실행할 수 있는지 확인하십시오.sudo a2enmod cgi
  3. 아파치를 다시 시작sudo service apache2 restart
  4. 다음 스크립트를 생성하여 bash 스크립트를 실행할 수 있는지 확인하십시오./usr/lib/cgi-bin/test.sh

    #!/bin/bash
    
    # get today's date
    OUTPUT="$(date)"
    USR=$(whoami)
    
    # headers
    echo "Content-type: text/plain"
    echo ""
    
    # body
    echo "Today is $OUTPUT"
    echo "Current user is $USR"
    
  5. 스크립트를 실행 가능하게 만듭니다chmod +x /usr/lib/cgi-bin/test.sh

  6. 스크립트를 실행할 수 있는지 확인하면 curl localhost/cgi-bin/test.sh다음 응답이 반환됩니다.

     Today is Wed Sep  6 12:19:34 PDT 2017 
     Current user is www-data
    
  7. 사용자가 www-data이기 때문에 해당 사용자를 sudoer로 추가합니다. 그런 다음 /etc/sudoers끝에 다음 줄을 추가하여 파일을 수정합니다 .

    www-data ALL=(ALL) NOPASSWD: ALL

  8. 이제 해당 사용자는 루트 권한을 갖게 됩니다. 그런 다음 test.sh 스크립트를 다음과 같이 수정합니다.

    #!/bin/bash
    
    # get today's date
    OUTPUT="$(date)"
    USR=$(sudo whoami)
    
  9. 그러면 get 요청을 다시 실행할 때 다음 응답이 표시됩니다 localhost/cgi-bin/test.sh.

    Today is Wed Sep  6 12:28:38 PDT 2017
    Current user is root
    

관련 정보