web-dev-qa-db-ja.com

fastcgiサーバー(またはWebプロキシサーバー)をジェイルする方法は?

Webサーバー(nginxなど)を使用している場合は、多くの場合、fast-cgiサーバーまたは別のアプリケーション(動的コンテンツにはhttp-server)を使用します。つまり、どちらの場合も、Webサーバープロセスとfast-cgi(または以下のスレーブと呼ばれるアプリケーション-http-serverプロセス)の間に優れたプロセス分離があります。

Webサーバーは、fast-cgiがソケットを経由するか、http要求がプロキシされるように構成されています。

スレーブプロセスにセキュリティ上の問題がある場合は、スレーブとWebサーバーに異なるユーザーを作成してファイルシステムの場所を保護できます。

しかし、Linuxでスレーブプロセスをさらに投獄するにはどうすればよいですか?

(ネットにアクセスしたり、メールを送信したりできないなど)

私は次のルートを考えることができます:

  • SELinux
  • Linuxシステムの名前空間( 'containers'、 cgroups

たとえば、現在のディストリビューションで最も便利な方法は何ですか。 Debian?実際にそれを行う方法は?構成例はありますか?

6
maxschlepzig

Ubuntuでは、ジェイルの別の方法は apparmor

これは、パスベースの強制アクセス制御(MAC)Linuxセキュリティモジュール(LSM)です。 Ubuntu 10.04では、選択したサービスに対してデフォルトで有効になっています。

ドキュメントはかなり断片化されています。 Ubuntuのドキュメントは...もっと良いかもしれません。 上流のドキュメント でさえ、良い紹介をしていません。 リファレンスページの状態

警告:このドキュメントは作成の非常に初期の段階にあり、リファレンスマニュアルとして使用されるまでの形ではありません。

ただし、開始は比較的簡単です。 AppAmorプロファイルは、実行可能パスと一致します。 /var/www/slave/slave。他に一致するものがない場合、プロファイルのデフォルトのルールは拒否です(これは素晴らしいことです)。プロファイルの拒否ルールは、常に許可ルールの前に一致します。空のプロファイルはすべてを拒否します。

さまざまなバイナリのプロファイルは、/etc/apparmor.dの下に保存されます。 apparmor_statusは、アクティブなプロファイル、強制モード(良好)、または不平モードのみ(ログメッセージのみが出力される)のプロファイルを表示します。

/var/www/slave/slaveの新しいプロファイルを作成するのは次のとおりです。

aa-genprof /var/www/slave/slave

別の端末/var/www/slave/slaveで開始し、一般的な使用例を実行します。終了したら、前の端末でsfを押します。

これで、/etc/apparmor.dにはプロファイルファイルvar.www.slave.slaveが含まれます。スレーブがフォークを行う場合、プロファイルは非常にまばらです-子のすべてのアクセスは無視されます。

とにかく、プロファイルは強制モードでアクティブになり、スレーブでアクションを繰り返しトリガーして、違反がないかtail -f /var/log/messagesを監視できます。別の端末では、プロファイルファイルを編集し、変更するたびにaa-enforce var.www.slave.slaveを実行します。次に、ログが表示されます。

audit(1308348253.465:3586):  operation="profile_replace" pid=25186 name="/var/www/slave/slave"

違反は次のようになります。

operation="open" pid=24583 parent=24061 profile="/var/www/slave/slave" 
  requested_mask="::r" denied_mask="::r" fsuid=10004 ouid=10000 name="/var/www/slave/config"

次のようなプロファイルルール:

/var/www/slave/config r,

将来的にアクセスを許可します。

これはすべて非常に簡単です。

AppAmorは、粗粒度のネットワークルールをサポートしています。

network inet stream,

このルールがないと、インターネットアクセスは不可能です(ローカルホストを含​​む)。つまり、このルールを使用すると、iptablesを使用してよりきめ細かいルール(スレーブuidに基づくなど)を実行できます。

別のドキュメントフラグメントには、phpスクリプトの サブプロファイル に関する情報が含まれています。

Var.www.slave.slaveプロファイルスケルトンは次のようになります。

#include <tunables/global>

/var/www/gapapp/gap.wt {

  #include <abstractions/base>

  network inet stream,

  /var/www/slave/config r,
  /var/www/slave/exehelper/foo ix,
  /var/www/slave/db/* rw,

  ...
}

このようなプロファイルを使用すると、スレーブはmailsendmailなどのユーティリティを呼び出すことができなくなります。

1
maxschlepzig

それを投獄する別の方法があります:所有者一致拡張機能を使用してiptables

Iptablesを使用すると、スレーブユーザーのすべてのプロセスによる発信(OUTPUT)ネットワークトラフィックをブロックできます。これはセットアップが非常に簡単です。つまり、便利です。

つまり、この簡単なセットアップで、ファイルシステムの場所とネットワークからスレーブプロセスを投獄することができます。

$ iptables -N slave_chain
$ iptables -A slave_chain -m owner --uid-owner 10004 -p tcp --dport 1:1024 -j REJECT
$ iptables -A slave_chain -m owner --uid-owner 10004 -p tcp -d 127.0.0.1 -j ACCEPT
$ iptables -A slave_chain -m owner --uid-owner 10004 -j REJECT
$ iptables -A OUTPUT -j slave_chain

ここで、10004はスレーブユーザーのuidです。スレーブは、プロキシされたWebサーバー要求に応答するだけで済みます。他のすべては拒否されます。 SPAMを送信するためのローカルホストポート25でのMTAへの接続試行。

スレーブは、mailsendmailなどのコマンドが利用可能な場合、それらを介してメールを送信できることに注意してください。つまり、fsの場所(chroot/cgroupsなど)をさらにジェイルする必要があるか、MTAを構成する必要があります。スレーブユーザーによる送信メールを禁止します。

1
maxschlepzig

Cgroupsは投獄の方法です。 2007年以降、 cgroups サブシステムには、いわゆる ネットワーク名前空間 も含まれています。

現在のディストリビューションは出荷されます Linuxコンテナユーザースペースツール 、コマンドラインツールのコレクション(lxc-*)および設定ファイルの例。また、ネットワーク名前空間の例も含まれています。

残念ながら、Ubuntu 10.04(LTS) 最近のカーネルアップデートでネットワーク名前空間を壊します

全体として、lxcに関するドキュメントはそれほど冗長ではありません。いくつかの設定ファイルの例を掘り下げる必要があります。

ルートのないコンテナをセットアップするためのベストプラクティスが何であるかは明確ではありません。

0
maxschlepzig