web-dev-qa-db-ja.com

www-dataに特権コマンドの実行を許可しても安全ですか?

Stack Overflowで、PHPを使用してroot権限でコマンドを実行することについて、 this oneなどのいくつかの質問に気付きました。行を追加するために提案された答え

www-data ALL=(ALL) NOPASSWD: ALL

/etc/sudoers.dファイル。

問題を解決するのは安全なアプローチですか?脆弱性を作成しますか?

25
UserK

これはひどいです。 root以外のユーザーとしてWebを実行することの全体のポイントは損傷の封じ込めです:Webサーバープロセスが何らかの脆弱性を介してハイジャックされた場合、少なくとも攻撃者はしませんroot以外のアカウントの制限によって制約を受けるため、マシンの完全な制御を取得しますwww-data。ただし、www-data任意のユーザー(rootを含む)の権限を持ち、それ以上の認証なしで、必要なすべてのコマンドを実行する方法。これにより、損傷の封じ込め機能が失われます。

公平であるために、 www-data + Sudoは、すべてをrootとして実行するよりもわずかに優れています。これは、ルートに移動することを明示的にする必要があるためです。したがって、PHPスクリプトが不適切な場所にファイルを書き込むスクリプトなどの一般的な欠陥は、悪用するのが難しくなります。しかし、www-data sudoersのメンバーは、よくない考えのようです。

83
Tom Leek

何かがどれほど安全であるかを検討するときは、攻撃者がwww-dataユーザーとしてログインし、シェルを持っていると想定する必要があります。これは、攻撃者が実際にシェルを入手できるという意味ではありませんが、攻撃者が任意のシェルコマンドを実行する方法はたくさんあります。これらは、Shellshockなどのライブラリバグの結果、またはコードの見落としの可能性があります。

最も安全な方法

これを行う最善の方法は、@ AlexeyVesninが言ったように、特別なプロセスを使用して作業を行うことです。このプロセスに(Unixドメイン、つまりネットワークから到達できない)ソケットをリッスンさせ、そのソケットからその入力を読み取り、入力をサニタイズし(!)、処理を実行し、どこからソケットに結果を返します。 Webサーバースクリプトが結果を読み取ります。承認(ユーザーがこれを行うには、Webサイトでパスワードを入力する必要があります)はそのプロセスで処理する必要があり、www-dataユーザーはその承認データを読み取ることができません。

ほとんど安全なSudoの方法

予算やスキルによってこの最善のアプローチが実現できない場合は、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プログラムの監査証跡があります。あなたを与えません。

Suid way

注:何をしているかわからない場合は、これを行わないでください。stackexchangeでこの質問をしたり読んだりしている場合は、おそらくそうではありません。したがって、これを行わないでください。

実行可能ファイルの所有者を特定のユーザー(chown user /my/executable/file)に設定し、次にsuidビット(chmod u+s /my/executable/file)を設定すると、そのプログラムは、実行されるたびにそのユーザーの権限で実行されます。したがって、たとえば、chown root /bin/cat; chmod u+s /bin/catは、ルート権限でcatを呼び出すたびに実行されます。つまり、システム上のすべてのファイルを、そのアクセス権とは無関係に読み取ることができます。 ネットワークに接続されているシステムでこれを試さないでください。「動作するかどうかを確認する」ために5分間もかかりません

  • 多くのUNIXシステムでは、これはコンパイルされたプログラムでのみ機能し、インタープリターを必要とするスクリプトでは機能しません
  • 一部の構成では、たとえばstraceでプログラムを実行した場合、sビットは効果がありません
  • NFS構成では、rootがNFSサーバー上のファイルにアクセスできないことがよくあります。そのため、これにより、実行できることが少なくなる場合があります。

Restricted-suid-Linuxの方法

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_ファイルに含める必要があります。

5
Tom