web-dev-qa-db-ja.com

Webコントロールパネルを介してrootとしてコマンドを安全に実行するにはどうすればよいですか?

非常にシンプルなPHPベースのWebベースのコントロールパネルを構築して、ユーザーを追加および削除し、linode vps(Ubuntu 8.04 LTS)のnginx構成ファイルにセクションを追加および削除したいと思います。 )。

Webベースのコントロールパネルからの入力に基づいてrootとしてコマンドを実行する最も安全な方法は何ですか?

明らかな理由から、rootとしてPHP(IPテーブルファイアウォールの背後にある場合でも))を実行するのは嫌です。

提案を歓迎します。いくつかの商用(そして私のニーズでは肥大化した)コントロールパネルが同様の機能を提供するので、それは可能でなければなりません。

ありがとう

5
Chris J

Webサーバーが実行されるユーザーのSudoルールを作成して、特定のコマンドのみを実行できるようにします。たとえば、ファイルを編集するには、Webサーバーが所有し、Webサーバーのみが書き込み可能なディレクトリにコピーを作成し(悪意のあるローカルユーザーがプロセスの途中で変更を踏むことができないようにする)、Sudoルールを設定します。編集したファイルを所定の位置にコピーします。 Sudoルールをロックして、特定の引数を持つコマンドのみを処理できるようにすることができます。

また、ユーザーを認証していることを確認し、ユーザーからの入力をサニタイズして、シェルのメタ文字などが侵入しないようにします。たとえば、ユーザーを追加するときに、入力が最大長内に収まることを確認し、文字と数字のみで構成されます。 Sudoを使用すると、とにかくそのようなことのほとんどを防ぐことができますが、複数の保護層が適しています。ユーザーの入力に偏執的になりすぎることはあり得ません。 ;)

または、Webminをインストールするだけです。 :)

2
dannysauer

何をするにしても、それは常にセキュリティホールになる可能性があります。

いくつかの提案:

  • 入力を実行する単純なシェルスクリプトを記述し、それをchownおよびsetuidrootにします。 PHPはそれを呼び出し、提供されたコマンドを渡します。
  • 実行するさまざまなタスクに対してより具体的なスクリプトを使用し、それらをsetuidrootにします。繰り返しますが、PHPはそれらを呼び出します。
  • TCPソケットでコマンドを受け入れて実行し、rootとして実行するデーモンを作成します; PHPはそれに接続します。
  • 「rootとしてやりたいことを実行できるシステム上に何か他のものを持っていて、PHPそれを呼び出す」」という概念に基づく他のもの。

上記のどれも、単に「コントロールパネル」をrootとして実行することほど、実際に安全であるとは思えません(そして間違いなく単純ではありません)。そして、ほとんどの「コントロールパネル」パッケージ( webmin など)は、これを完全にバイパスして、rootとして実行します。

2
Massimo

これらのアイテムを組み合わせて、適切なレベルのセキュリティを実現できると思います。

  • Fast-cgi、cgi-bin、またはphpsuexecのいずれかを介して特定のユーザーとしてPHP
  • Hardened PHPプロジェクト http://www.hardened-php.net/ の使用を検討してください
  • 提案されているように、Sudoを使用して必要なルートレベルのアクセスを取得します
  • 可能であれば、ここでSELinuxを使用すると、非常に優れたセキュリティが得られますが、デプロイするのは面倒な場合があります。

また、上記のアプローチを好みますが、クライアントにアクションをファイルにダンプしてから、スクリプトにこれらのアクションを処理させる方法を用意しました。スクリプトは5分ごとにcron経由で実行されました。

これにはパブリックアクセスが必要ですか?そうでない場合は、IPtablesとApache独自のAuthconfigを使用して、悪用から保護します。

0
jeffatrackaid

ファイルをWebルートフォルダにシンボリックリンクし、セミセキュリティ用のhtaccess(php authの上に)を作成し、それをモーフィングするスクリプトを記述します。その後、ファイルが変更されたときにnginxプロセスを再起動する必要があります。

www.cyberciti.biz/faq/freebsd-configure-nginx-php-fastcgi-server/

次のようなものを使用して、変更を監視し、変更があったときに(変更とともに)電子メールを送信し、スクリプトを介してnginxプロセスを再開できます。

http://inotify-tools.sourceforge.net/

Cronを介して毎分かそこらでそれを検出できた場合、やり過ぎかもしれません。

0
Grizly

アイデア番号1:puppetを使用して、構成ファイルへの変更を指示します。

ファイルを編集する必要がある場合は、次のことを試してください。独自のローカルコピーを編集するPHPスクリプトを作成します。これは、ローカルSVNリポジトリにチェックインされます。次に、svn-externalsを使用するだけです。 rootは、nginx構成ファイル(もちろんSVNにチェックインしています)とセットでsvn updateを実行する必要があります。

更新スクリプトはcronジョブで実行できます。

0
pobk

これを行うcPannelとWebMinがあり、それらも悪名高いほど安全ではありません。ハッキングの結果も大きく、システム全体が失われ、ハッキングされたときに最初から再インストールする必要があります。

Telnetを使用したくないのと同じように、httpも使用したくありません。必ずHTTPSを使用し、実際の証明書を購入してください。結局、rootパスワードをネット経由でスローすることは重大な間違いであり、正しいサーバーに確実に送信されるようにする必要があります。

EDIT: chrootでcPannelを実行できるため、侵害された場合でも、新しいchrootを作成できます。また、ルートがアクセスできるものを正確に定義できるパッド付きの刑務所でもあります。

0
Rook

pythonでcgiスクリプトを書くと、おそらくもっと簡単だと思います。 Massimoが言ったように、webminを実行する方がはるかに安全ですが...

0
user30461