私はDebian(カーネル2.6.32-5-686)でSambaを制御するための小さなWebインターフェースを書いています。私は、ユーザーの追加、フォルダの作成などの簡単なスクリプトを書くことから始めました。 rootで実行するとうまくいきます。ただし、ネットワーク(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をルートグループに追加してより多くのroot権限を与えようとしました。まだ状況が進展していません。
これまでの進捗のため、次に何をすべきかわかりません。私の質問は次のとおりですwww-dataユーザーが実行するにはroot権限を必要とする簡単なスクリプトをどのように取得できますか?私はこれが/ etc / passwdファイルに問題がある可能性があると思います。ルートだけがファイルを変更する権限を持っていると想像できるからです。
答え1
私の答えはその行にのみ関連しています
sudo jupiter=(ALL)NOPASSWD:/bin/<script>
sudo
この行により、ユーザーは認証なしでホスト上のすべてのユーザーとして実行できます。私の考えでは、これをしたくないと思います。/bin/<script>
juptier
私が正しく理解したら、ユーザーはrootとして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で呼び出されたときにrootとして実行されることを意味します。 (これはWebサーバーがユーザーのApacheとして実行されていると仮定します。)
しかし、もしそうなら、そのすべての危険性を指摘します。ページにアクセスできる人は誰でも好きなように何でもできます。したがって、userdelを介してユーザー(およびすべてのファイル)を削除することができ、コードの書き方に応じてなりすまします。ルートとしてコマンドします。
(これで正しく設定されていれば、sudoは何ができるかを制限できるので、プログラムを正しく書くことができます(セキュリティsetuid、CGI、php(shell_exec()を使用するプログラムなど))を書くのは難しいかもしれません)しかし、userdelはPretty inで行うことができます。
したがって、これを行うには、少なくともsudo(sudoを使用している場合)が必ず実行する必要があるコマンドのみを実行するように設定されていることを確認し、他の人がページにアクセスできないことを確認してください。たとえば、後ろのApacheでページをロックします。パスワードは会社のファイアウォールの背後にあるのではなく、インターネットにいる場合は特に注意してください。 (ただし、ファイアウォールを信頼して安全に保ちないでください。)また、信頼できない他の人がこのホストまたはCGIにPHPを追加できないことを確認してください。 /etc/sudoersでもこの行を使用できるからです。
PHPのshell_exec()を使用しているので、コードがコマンドに提供する引数に非常に注意してください。ユーザーが欲しいものをそこに置くと、ユーザーは何でもできます。
あなたのコマンドが "userdel $ user"で、$ userがそのページのユーザーから直接来たとします。 user="foo;restart" の場合。ルートとして実行すると、コンピュータが再起動します。ただし、rootとして実行しなくても、Apacheユーザーとしてコードを実行してシステムに入ろうとすることができます。
つまり、入力内容を適切に削除する方法は、この単純な答えが実際に許可するよりも長いトピックです。トピック全体をカバーするのではなく、簡単に言及するだけです。