X を必要とするプログラムを実行する Web アプリケーションがあります。起動には xvfb を使用していますが、別のユーザーとして実行したいと考えています。
おそらくできるでしょうsudo -u username -p password my command
。ただし、ユーザーのパスワードをプレーンテキストで保存するのはあまり気が進みません。
これを行う「よりスマートな」方法はありますか?
答え1
使用suEXECこれにより、Web サーバーのユーザーではなく、ファイルの所有者としてスクリプトを実行できるようになります。
答え2
私が見た方法は、Apache ユーザーに、特定のコマンド (この場合は apache2ctrl restart) のみに対する sudo 権限を与えるというものでした。パスワードを使用する必要はありません。Apache ユーザーが読み取れる場所にプレーンテキストで保存する場合は、パスワードがないのと同じです。
もちろん、Apache ユーザーとして Sudo を介して複数の異なるコマンドを実行する必要がある場合を除きます。コマンドごとに sudo 権限を追加する必要がある場合は、面倒なことになる可能性があります。
答え3
Apache の外部でこれを実行する必要がある場合は、より一般的な解決策があります。
あるユーザーが別のユーザーとして特定のコマンドを繰り返し実行できるようにするには、そのユーザーが所有するシェルスクリプトを作成し、設定された必要なコマンドを実行するだけの 1 ビットが有効になっています。グループ所有権を apache グループに設定し (このグループに他のユーザーがいないことを確認してください)、apache グループと自分のユーザー以外のすべてのユーザーの実行権限を無効にして、信頼できるユーザーのみがスクリプトを実行できるようにします。
例:
# Replace $MYCOMMAND, $USERNAME, $GROUPNAME, and $MYSCRIPTNAME below
# In this case $GROUPNAME should probably be apache
su
touch $MYSCRIPTNAME
chown $USERNAME:$GROUPNAME $MYSCRIPTNAME
chmod 4750 $MYSCRIPTNAME # setuid, read/execute for group, none for others
echo '#!/bin/sh' >> $MYSCRIPTNAME
echo "sudo -u $USERNAME $MYCOMMAND" >> $MYSCRIPTNAME
答え4
今答えるのは少し遅いかもしれませんが、NOPASSWD
の特徴についてはsudo
言及する必要があると感じています。
たとえば、次の場合/etc/sudoers
(Apache が Web サーバーを実行しているユーザーであると仮定) :
User_Alias WWW = apache
WWW ALL =(username) NOPASSWD: my_command
そして を呼び出しますsudo -u username my_command
。パスワードを保存する必要はなく、Web サーバーがmy_command
ユーザー名として実行することのみを許可します。
ユーザーはusername
パスワードを保持し続けることができます。