パスワードなしで 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. Apacheを再起動します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. これで、そのユーザーは root 権限を持つことになります。次に、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
    

関連情報