Chapter 5: ドメインの管理はどのように行いますか?
5.1. ドメインの作成
それぞれのドメインは異なる振る舞いをするので、それぞれのドメインの振る舞いに適合したアクセス許可を必要とします。そのため、あなたが許可すべきアクセス許可を決める上で、ドメインの振る舞いを解析することが必要になります。TOMOYO Linux は特定のドメインだけをアクセス制限の対象とすることもできます、しかし、最も安全なシステムにするためには、脆弱なままのドメインを残さないようにするために全てのドメインをアクセス制限の対象とすることが望まれるでしょう。
最初に、どのアプリケーションを解析/保護の対象とするかを決めてください。以下の手順は CentOS 5 環境で Apache を保護する場合で説明します。
対象となるアプリケーションを開始させます:
# service httpd start
現在カーネル内に存在しているポリシーを直接編集するので、 /etc/tomoyo/ オプションを指定しないでポリシーエディタを実行してください。既にポリシーエディタを実行中であれば、 Domain Transition 画面に切り替えてください。
CentOS 5 では、 Apache プログラムパス名は /usr/sbin/httpd です。
矢印キーや Home/End/PageUp/PageDown キーを使ってカーソルをスクロールして、 /usr/sbin/httpd の行を見つけてください。この絵では 386 行目です:
もし、 /usr/sbin/httpd
が <kernel> /usr/sbin/mingetty /bin/login /bin/bash ドメインから起動された場合、 <kernel> /usr/sbin/mingetty /bin/login /bin/bash /usr/sbin/httpd という名前のドメインが作成されます。
あなたのシステムで表示されている内容は上記の写真の内容とは多少異なっていることでしょう。これは、 <kernel> /usr/sbin/httpd ドメインが initialize_domain ディレクティブによって作成されているためです。続ける前に、ドメインの管理について少し勉強してみることにしましょう。
5.2. ドメイン遷移の管理
TOMOYO Linux では複雑なドメイン遷移の制御が可能です。そのためには、例外ポリシーを修正します。このセクションの手順はポリシーエディタを用いて行います。例外ポリシーを編集するには、ポリシーエディタを実行して 例外ポリシー編集画面に切り替えます。エントリを追加するには a キーを押して、追加したいエントリを入力してから Enter キーを押します。利用可能なコマンドの一覧を表示するには ? キーを押します。
5.2.1. initialize_domain
今までにない動作パターンでプログラムが実行された場合、新しいドメインが作成されます。これにより、プログラムがどのように起動されたか(例えば Xterm から起動された)に応じて異なるアクセス許可を与えることができます。しかし、どのように起動されたかによらず同一のアクセス許可を与えた方が好都合な場合があります。同一のアクセス許可を与える場合、ポリシーを単純化することができます。
そのためには、例外ポリシーにエントリを追加する必要があります。例えば、例外ポリシーに以下のディレクティブを追加するかもしれません:
initialize_domain /usr/sbin/sshd from any
もちろん、 /usr/sbin/sshd の部分はドメイン遷移を制御したいアプリケーションのパス名に置き換えてください。このディレクティブを追加すると、これ以降、今までにない動作パターンでプログラムが実行されても、新しいドメインを作成しないようになります。代わりに、<kernel> /usr/sbin/sshd というドメインで動作するようになります:
上記のディレクティブの from any という部分は、任意のドメインから実行された場合にドメイン遷移を初期化するという意味です。特定のドメインから実行された場合だけドメイン遷移を初期化させるようにもできます。これは、例外ポリシーに以下のようなエントリを追加することで実現できます:
initialize_domain /usr/sbin/sshd from <kernel> /etc/rc.d/init.d/sshd
ドメイン名の全体ではなくドメイン名の最後のプログラム名部分だけを指定することもできます。例えば、 from <kernel> /etc/rc.d/init.d/sshd の代わりに from /etc/rc.d/init.d/sshd のように指定します。これは、もちろんあいまいな指定方法であり、ターミナルからSSHサーバを実行した場合にも適用されるかもしれません。
Domain Transition Editor 画面に戻ると、3番目のカラムに ! 印の付いたドメインを見つけるかもしれません。これは、そのドメインへは到達できないので削除することができることを意味しています。ドメイン遷移を初期化するよう指定したドメインには * 印が表示されます。
到達不可能になったドメインのアクセス許可はドメイン遷移を初期化したドメインへと自動的に引き継がれることはありません。現時点では、まだアクセス許可を与えていないのでこれは問題にはならないでしょう。もし、アクセス許可を与えた後でこのディレクティブを使用した場合、アクセス許可を再度学習させるか、あるいはドメイン遷移を初期化したドメインへとコピーしてやる必要があります。
5.2.2. no_initialize_domain
initialize_domain を指定した後で、特定のドメインから実行された場合にはドメイン遷移を初期化させたくないと思うことがあるかもしれません。例えば、 /bin/mail
はメールを送信するために /usr/sbin/sendmail.sendmail
を実行します。以下のエントリが例外ポリシーに追加されている場合を考えてみましょう:
initialize_domain /usr/sbin/sendmail.sendmail from any
例えば、メールを送信するためと受信するためとで異なるアクセス許可を与えたい場合、以下のエントリを例外ポリシーに追加することができます:
no_initialize_domain /usr/sbin/sendmail.sendmail from /bin/mail
5.2.3. keep_domain
特定のドメインからプログラムが実行された場合にはドメイン遷移を行わない方が好都合な場合があります。そのようにすると、プログラムの実行を要求したプロセスのドメインに与えられているアクセス許可で動作することになります。例えば、SSHセッションから起動されたシェルから実行されるプログラムに対しては全て同じアクセス許可を与えたいと思うかもしれません。その場合、例外ポリシーに以下のエントリを追加します:
keep_domain any from <kernel> /usr/sbin/sshd /bin/bash
このようにすると、 /bin/ls
や /bin/cat
を実行した場合に、新しいドメインを作成しないようになります。代わりに、上記で指定したドメインに留まり、そのドメインに与えられているアクセス許可で動作するようになります。
例外ポリシーで以下のように指定すると、 /bin/bash のプロセスから実行されるプログラムを /bin/bash のドメインで動作させることができるようになります:
keep_domain any from /bin/bash
これは、特定のドメインから特定のプログラムが実行された場合にのみドメイン遷移を抑制するような、より限定的な指定を行うこともできます。そのようにするには、例外ポリシーに以下のエントリを指定します:
keep_domain /usr/bin/xargs from <kernel> /usr/sbin/sshd /bin/bash
keep_domain ディレクティブは、 initialize_domain ディレクティブより優先度が低くなります。もし、特定のプログラムに対して initialize_domain ディレクティブが指定されている場合、そのアプリケーションは keep_domain ディレクティブが指定されているドメインから抜け出してドメイン遷移を初期化させます。
Domain Transition Editor 画面に戻ると、3番目のカラムに ! 印の付いたドメインを見つけるかもしれません。これは、そのドメインへは到達できないので削除することができることを意味しています。ドメイン遷移を初期化するよう指定したドメインには * 印が表示されます。ドメイン遷移を抑制するよう指定したドメインには # 印が表示されます。
到達不可能になったドメインのアクセス許可は(ドメイン遷移を抑制した)親ドメインへと自動的に追加されることはありません。現時点では、まだアクセス許可を与えていないのでこれは問題にはならないでしょう。もし、アクセス許可を与えた後でこのディレクティブを使用した場合、アクセス許可を再度学習させるか、あるいはドメイン遷移を親ドメインへとコピーしてやる必要があります。
5.2.4. no_keep_domain
keep_domain ディレクティブは、どのようなコマンドをどのような順番で実行するかを予測することが不可能なSSHログインセッションを制限するのに便利です。しかし、パスワードを変更するためにパスワード情報が格納されたファイルへのアクセスを認めたい場合や、デーモンを再起動させたい場合など、ドメイン遷移を再開させたいと思う場合があるかもしれません。
例えば、 /bin/cat
が実行される場合だけドメイン遷移を再開させたい場合、例外ポリシーに以下のエントリを追加することができます:
keep_domain any from <kernel> /usr/sbin/sshd /bin/bash no_keep_domain /bin/cat from <kernel> /usr/sbin/sshd /bin/bash
5.3. 学習モードへの切り替え
解析/保護の対象である Apache の話に戻りましょう。 Apache を initialize_domain ディレクティブに指定します:
initialize_domain /usr/sbin/httpd from any
これで、 Apache がどのように実行されても <kernel> /usr/sbin/httpd ドメインで動作するようになりました。 ! 印が付いているドメインは到達不可能なので削除して構いません。このドメインに対するアクセス許可を与えるために、学習モードに切り替えます。
s キーを押して、 1 と入力し、 Enter キーを押してください:
/usr/sbin/httpd ドメインのプロファイル番号が 1 に変化しました:
@ キーを押してプロセス一覧に切り替えてください。 /usr/sbin/httpd プロセスにプロファイル 1 が割り当てられていることを確認してください:
5.4. 必要なアクセス許可の収集
Apache を起動/終了させるのに必要なアクセス許可を学習させるために、 Apache を再起動させます:
# service httpd restart
ポリシーエディタを再度実行して /usr/sbin/httpd の行を見てください。プログラムの実行によりドメインが新しく作成されたことで、行番号が変化しているかもしれません。
Enter キーを押して、現在までに学習されたアクセス許可を閲覧します:
(クリックすると全体を表示します。)最初は空っぽでしたが、学習モードが割り当てられているので、新しい動作を行うとドメインポリシーへと追加されていきます。追加は学習モードを終わらせるまで続きます。 r キーを押すと最新の情報に更新できます。
ポリシーエディタを終了し、 Apache が通常の使い方をするのに必要なアクセス許可を生成するために、 Apache に対して許可したい操作を全て行ってください:
5.5. アクセス許可をディスク上に保存する
収集されたアクセス許可はカーネル内のメモリにしか存在しないため、時々ポリシーファイルとしてディスク上に保存することを忘れないでください。システムを再起動した場合、カーネル内のメモリに存在しているアクセス許可は失われます。
現在カーネル内のメモリに存在しているポリシーをディスク上に保存するには、以下のコマンドを実行します:
# /usr/sbin/tomoyo-savepolicy
tomoyo-savepolicy
を実行することにより、4個のファイル( exception_policy.conf domain_policy.conf profile.conf manager.conf )が /etc/tomoyo/policy/YYYY-MM-DD.hh:mm:ss/ ディレクトリ内に作成されます。( YYYY-MM-DD.hh:mm:ss は現在時刻です。)
ディスク上に保存されているポリシーをカーネル内のメモリに読み込ませるには、 tomoyo-loadpolicy
コマンドを利用します:
# /usr/sbin/tomoyo-loadpolicy -df < /etc/tomoyo/domain_policy.conf # /usr/sbin/tomoyo-loadpolicy -ef < /etc/tomoyo/exception_policy.conf # /usr/sbin/tomoyo-loadpolicy -p < /etc/tomoyo/profile.conf # /usr/sbin/tomoyo-loadpolicy -m < /etc/tomoyo/manager.conf
-df オプションは /sys/kernel/security/tomoyo/domain_policy を上書きします。
-ef オプションは /sys/kernel/security/tomoyo/exception_policy を上書きします。
-p オプションは /sys/kernel/security/tomoyo/profile に追記します。
-m オプションは /sys/kernel/security/tomoyo/manager に追記します。
致命的な操作ミスを防ぐために、 -pf および -mf というオプションはサポートされていません。
5.6. メモリの使用量を管理する
コンソール上に以下のようなメッセージが表示され、ドメインポリシーに quota_exceeded というエントリが表示される場合があります:
WARNING: Domain '<kernel> /usr/sbin/httpd' has too many ACLs to hold. Stopped learning mode.
これは、 TOMOYO Linux が全てのメモリを消費してしまうのを予防するための安全装置です。もし、学習モードに対して制限が存在しない場合、学習モードにより学習されたポリシーとの比較処理のために使い物にならないくらい応答が遅くなってしまうかもしれません。この制限はプロファイルの max_learning_entry の値を増やすことで緩めることができます。しかし、 max_learning_entry の値を増やすとメモリ消費が増えるため、注意が必要です。 max_learning_entry の値を増やす前に、ポリシーのチューニングを行ってください。チューニングを行う手順は次章で紹介します。ポリシーのチューニングを行うことで、ドメインポリシーの量を減らして管理しやすくなり、 max_learning_entry の値を増やす必要性も解消できることが期待されます。
メモリ使用量の上限は /etc/tomoyo/stat.conf で指定することができます:
# Memory quota (byte). 0 means no quota. Memory used by policy: 0 Memory used by audit log: 16777216 Memory used by query message: 1048576
この設定は以下のコマンドを実行することでカーネル内に反映することができます:
tomoyo-loadpolicy -s < /etc/tomoyo/stat.conf
ドメインを作成することでカーネル内のメモリを消費するため、 Memory used by policy の制限を行うことは重要です。もし、大量のドメインが作成された場合、メモリ不足に陥ってシステムがクラッシュしてしまうかもしれません。制限を行うことにより、システムがクラッシュしてしまう前に新しいドメインの作成を止めることができます。このガイドに従ってポリシーを完成させた後、 Statistics 画面でどれくらいのメモリを消費しているかを確認してください。そこで得られた情報を、上限(例えば現在の使用量+25%程度)を設定するための参考にしてください。大量のアクセス許可を追加したり大量のドメインを作成した場合には、この上限を適切に修正してください。