保護する必要のあるレイヤーがいくつかあります。
一部のホスティング業者は誤って open_basedir、safe_mode(古いPHP)、disable_functionsなどのPHPの「保護」に依存します。
PHPでさえ、それらをセキュリティ機能とは見なしていません- http://php.net/security- note.php
これらはPHPのエクスプロイトで無効にすることができ、システム全体が運命づけられます。しない
どのように行うべきか
下部
- ホストされているサイトごとにOSレベル/システムユーザーを分離する
- 正しい権限(一方が他方のページを表示/編集できない)-サブディレクトリも同様になるため、正しい権限を持っていることを確認してください
- 個別のセッションファイル(多くのウェブホスティングは、PHPでホストされている各サイトのセッションファイルを同じディレクトリに配置します。これは悪いことです。
Apacheはついにこのための独自のモジュールを手に入れました-
短編小説: これを想像してみてください。ユーザーに(自分のuidの下で)マシン上のシェルを提供します。ユーザーは他のホストされているサイトに対して何もできません。
- 異なるuid/gid
- システム権限
- SELinux、AppArmorなどのフレームワーク
- ハードコアになりたい場合はgrsecurity..しかし、システムの保守は難しくなります。
上がる?
あなたはよりハードコアを得ることができます。私が見た中で最高のものは、apache(またはあなたが使用するもの)の共有ライブラリです-これは、apacheがLD_PRELOAD
を使用して開始されたときに使用されます また、system()
などの潜在的に悪意のあるシステムコールをすべて実装します。 、execve()
そして基本的にあなたが悪いと思う他のどんな電話でも。
私はまだこれの良い実装を見ていません(どこかでカスタムのものを除いて)-私が間違っているなら私を訂正してください。
たとえば、このためのホワイトリストを実装してください。 PHPのmail()はデフォルトでsendmailを実行しますが、これは機能しなくなります。
結論
従来のdisable_functions、open_basedirなどをグローバルphp.iniに追加し、session.save_pathをすべてのvhostに追加します-セッションをユーザーディレクトリに配置します。ユーザーが何かを共有しないようにしてください 。
アンダーレイOSレベルの分離を正しく実装します。
grsecとLD_PRELOADlibフッキングシステムコールでハードコアになりましょう。
分離、分離、分離.. Dockerのようなシステムは、カーネルレベルでユーザーを分離するためのLXCベースのコンテナーをまもなく提供しますが、まだ完全に本番環境に対応していません(imho)。