Stack Overflowで、PHPを使用してroot権限でコマンドを実行することについて、 this oneなどのいくつかの質問に気付きました。行を追加するために提案された答え
www-data ALL=(ALL) NOPASSWD: ALL
/etc/sudoers.d
ファイル。
問題を解決するのは安全なアプローチですか?脆弱性を作成しますか?
これはひどいです。 root以外のユーザーとしてWebを実行することの全体のポイントは損傷の封じ込めです:Webサーバープロセスが何らかの脆弱性を介してハイジャックされた場合、少なくとも攻撃者はしませんroot以外のアカウントの制限によって制約を受けるため、マシンの完全な制御を取得しますwww-data
。ただし、www-data
任意のユーザー(root
を含む)の権限を持ち、それ以上の認証なしで、必要なすべてのコマンドを実行する方法。これにより、損傷の封じ込め機能が失われます。
公平であるために、 www-data
+ Sudoは、すべてをroot
として実行するよりもわずかに優れています。これは、ルートに移動することを明示的にする必要があるためです。したがって、PHPスクリプトが不適切な場所にファイルを書き込むスクリプトなどの一般的な欠陥は、悪用するのが難しくなります。しかし、www-data
sudoersのメンバーは、よくない考えのようです。
何かがどれほど安全であるかを検討するときは、攻撃者がwww-dataユーザーとしてログインし、シェルを持っていると想定する必要があります。これは、攻撃者が実際にシェルを入手できるという意味ではありませんが、攻撃者が任意のシェルコマンドを実行する方法はたくさんあります。これらは、Shellshockなどのライブラリバグの結果、またはコードの見落としの可能性があります。
これを行う最善の方法は、@ AlexeyVesninが言ったように、特別なプロセスを使用して作業を行うことです。このプロセスに(Unixドメイン、つまりネットワークから到達できない)ソケットをリッスンさせ、そのソケットからその入力を読み取り、入力をサニタイズし(!)、処理を実行し、どこからソケットに結果を返します。 Webサーバースクリプトが結果を読み取ります。承認(ユーザーがこれを行うには、Webサイトでパスワードを入力する必要があります)はそのプロセスで処理する必要があり、www-dataユーザーはその承認データを読み取ることができません。
予算やスキルによってこの最善のアプローチが実現できない場合は、Sudoのアプローチを使用することは完全に間違っているわけではありませんが、Sudoのアクセス許可を実際に必要な最小限に制限する必要があります。たとえば、iotop
を呼び出す必要がある現在のディスクI/OデータをWebサイトに表示したいとします。
この例では/var/www/bin/get-disk-io
で、必要なデータを抽出するスクリプトを作成します。
/usr/sbin/iotop -b -n 1 | /usr/bin/head -2
$1
、$2
、...、$*
、$@
にアクセスできません。/etc/sudoers
env_reset
がsudoersファイルのデフォルトポリシーにあることを確認してくださいこれは、suidプログラムよりも安全であることに注意してください。これは、(a)実行できるユーザーを制限できるため、別のユーザーのもとでプログラムを実行する権限を取得した攻撃者は、プログラムを使用できないためです(b)任意のパラメーターを渡すことはできません。(c)環境はSudo
によってサニタイズされます。(d)コマンドが実行されたときにSudoをログに記録できるため、sidプログラムの監査証跡があります。あなたを与えません。
注:何をしているかわからない場合は、これを行わないでください。stackexchangeでこの質問をしたり読んだりしている場合は、おそらくそうではありません。したがって、これを行わないでください。
実行可能ファイルの所有者を特定のユーザー(chown user /my/executable/file
)に設定し、次にsuidビット(chmod u+s /my/executable/file
)を設定すると、そのプログラムは、実行されるたびにそのユーザーの権限で実行されます。したがって、たとえば、chown root /bin/cat; chmod u+s /bin/cat
は、ルート権限でcat
を呼び出すたびに実行されます。つまり、システム上のすべてのファイルを、そのアクセス権とは無関係に読み取ることができます。 ネットワークに接続されているシステムでこれを試さないでください。「動作するかどうかを確認する」ために5分間もかかりません。
strace
でプログラムを実行した場合、s
ビットは効果がありませんLinuxには機能システムがあります。これはほぼsuidのように機能しますが、より細かい粒度です。たとえば、プロセスが1024未満のポート番号を使用できるようにする必要がある場合、従来のUNIXシステムでは、コマンドをrootとして実行する必要があります。これは、上記のchown/chmod u+s
を実行する必要があることを意味します。これらのポート番号だけでなく、ファイルシステムへのアクセスも許可します。 Linuxでは、rootに付属する他のすべてを使わずにポート機能を提供できます。
setcap cap_net_bind_service+EP /path/to/my/program
詳細については、man 7 capabilities
を実行してください。プログラムにsuidを与えることを真剣に検討する場合は、機能を設定する方が良い考えではないかどうかをよく考えてください。
Every時間、例外なく、_/etc/sudoers
_ファイルにALL=(ALL) NOPASSWD: ALL
が表示された場合、誰かが発砲されるに値します。基本的に、2人目のrootユーザーがいます。
安全ですか?地獄いいえ。脆弱性を作成しますか?もちろん。
can Sudoを使用してroot以外のユーザー(www-dataを含む)に特権実行を安全に許可しますが、alwaysはできるだけ具体的にする必要があります。何らかの理由でrootとして_/usr/bin/my_system_tool +x /var/cache/my_cache
_を実行する必要がある場合、正確なコマンド(パラメーターを含む)を_/etc/sudoers
_ファイルに含める必要があります。