Chapter 7: ポリシーの適用はどのように行いますか?
7.1. 強制モードを有効にする
ドメインポリシーと例外ポリシーの調整が完了したら、ドメインに対して強制モードを割り当てることができます。
ポリシーエディタを実行して、対象となるドメインにプロファイル 3 を割り当てます:
 
@ キーを押してプロセス一覧表示に切り替えてください。そして、 /usr/sbin/httpd プロセスとその子孫に対してプロファイル 3 が割り当てられていることを確認してください:
 
ポリシーエディタを終了して、ポリシーで許可されている操作をしてみましょう:
 
メールの送信はポリシーで許可されているので、操作は正常に終了しました。
ポリシーで許可されていない操作をしてみましょう:
 
一見すると正常に終了したように見えますが、実際には /bin/mail が「入力が空っぽです」と警告しているとおり、 /bin/cat の実行が拒否されています:
 
もしプロファイルで PREFERENCE::enforcing={ verbose=yes } と設定されている場合(デフォルトでそうなっています)、ポリシーで許可されていない操作を行うと ERROR: というメッセージがコンソールに表示されます:

7.2. 通知デーモン
ポリシー違反の発生を通知するために tomoyo-notifyd というデーモンプログラムが提供されています。例えば、1時間に1回まで root@example.com 宛のメールで通知するには以下の行を /etc/crontab に追加してください:
00 * * * * root /usr/lib/tomoyo/tomoyo-notifyd 0 'mail root@example.com'
上記のように設定した場合、アクセス要求の内容がメールで通知されます:
Mail version 8.1 6/6/93.  Type ? for help.
"/var/spool/mail/root": 1 message 1 unread
>U  1 root@localhost.local  Tue Jan 12 16:19  18/1234
&
Message 1:
From root@localhost.localdomain  Tue Jan 12 16:19:17 2010
Date: Tue, 12 Jan 2010 16:19:17 +0900
From: root <root@localhost.localdomain>
To: root@localhost.localdomain
Q0-0
#2010-01-12 16:19:17# profile=3 mode=enforcing (global-pid=4836) task={ pid=4836 ppid=4835 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 }
<kernel> /usr/sbin/httpd /bin/sh
allow_execute /bin/cat
このログは、 /usr/sbin/httpd から実行された /bin/sh から /bin/cat の実行が要求されたことを示しています。このログの1行目に mode=enforcing という内容が含まれているため、この要求は拒否されたことが判ります。
7.3. ポリシー違反を対話的に処理する
強制モードで発生したポリシー違反は、 tomoyo-queryd を用いることで対話的に処理することができます。この機能は、ソフトウェアアップデート時に便利です。なぜなら、ソフトウェアのアップデートにより、以下の何れかの状況が発生した場合にポリシーを修正する必要が生じる場合があるからです:
- ファイルのパス名が変化した場合
- ファイルの依存関係が変化した場合
- 必要なアクセス許可が変化したり増えたりした場合
学習モードを使ってポリシーを最初から再取得するのが理想です。しかし、一度強制モードでの運用を開始したシステムを強制モード以外に変更することは、アクセスが制限されていないドメインへの攻撃に対してシステム全体が無防備になってしまうため、望ましくありません。
幸いなことに、 tomoyo-queryd を使うことで、管理者は強制モードでシステムを稼働させた状態のままポリシーの修正を行うことができます。ただし、この方法は、全てのケースに対応できるとは限らず、最適なポリシーであることを保証するものではありません。
7.3.1. tomoyo-queryd の操作例
実際の tomoyo-queryd の操作手順について以下のムービーで紹介しています。また、以下にテキストでも示します:
ポリシーに違反したアクセス要求を処理するために tomoyo-queryd コマンドを利用します:
# /usr/sbin/tomoyo-queryd
Monitoring /sys/kernel/security/tomoyo/query . Press Ctrl-C to terminate.
パッケージのアップデート中に、デーモンの再起動などのように普段行われない動作によりポリシー違反が発生するかもしれません。ポリシー違反が発生した場合、 tomoyo-queryd にプロンプトが表示されます:
#2010-01-10 12:29:35# profile=3 mode=enforcing (global-pid=4561) task={ pid=4561 ppid=4557 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0 }
<kernel> /etc/rc.d/init.d/cups
allow_execute /bin/sleep
Allow? ('Y'es/'N'o/'R'etry/'S'how policy/'A'dd to policy and retry):
上記の例は、  <kernel> /etc/rc.d/init.d/sshd というドメインに属しているプロセスが /bin/sleep の実行を要求したが、ポリシーによって拒否されたことを示しています。通常であればポリシーに違反したアクセス要求は直ちに拒否されますが、 tomoyo-queryd が動作しているため、カーネルはあなたの判断を仰いでいることを示しています:
Y を押すと許可します。
N を押すと拒否します。
R を押すと再試行します。(手作業でドメインポリシーを変更した後などに利用します。)
S を押すとそのプロセスのドメインポリシーが表示します。
A を押すと編集した上でドメイン用ポリシーに追加後、再試行します。(先にドメインポリシーを編集することができます。)
無条件にアクセス要求を許可しないようにしてください。ポリシー違反の原因がパッケージのアップデートによるものとは限らず、侵入者の攻撃によるものである可能性があるからです。
このプログラムが動作している間は、ポリシーによって拒否されたアクセス要求は、あなたが応答するまで永遠に保留状態となりますので、ログアウトしないでください。プログラムが必要とするアクセス許可が与えられるようにするために、出力の監視を忘れないようにしてください。もし、アクセス許可の不足が検出された場合にはプロンプトが表示されます。ポリシーをのアップデートが完了したら、 Ctrl-C を入力して終了させてください。
#2010-01-10 12:30:10# profile=3 mode=enforcing (global-pid=4630) task={ pid=4630 ppid=4629 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0 }
<kernel> /usr/sbin/acpid
allow_unlink /var/run/acpid.socket
Allow? ('Y'es/'N'o/'R'etry/'S'how policy/'A'dd to policy and retry):a
Enter new entry> allow_unlink /var/run/acpid.socket
Added 'allow_unlink /var/run/acpid.socket'.
The pathname /usr/lib/libpurple.so.0.5.9 was deleted. Deleted from globally readable file.
The pathname /usr/lib/libpurple-client.so.0.5.9 was deleted. Deleted from globally readable file.
/etc/ld.so.cache に登録されている共有ライブラリファイルの情報が変更された場合に、 tomoyo-queryd は共有ライブラリのパス名を「無条件に読み込み可能なファイル」として例外ポリシーに追加します。例えば、以下のメッセージは /usr/lib/libpurple.so.0.6.3 というパス名が作成されて /etc/ld.so.cache に登録されたので例外ポリシーに追加したことを示しています。
The pathname /usr/lib/libpurple.so.0.6.3 was created. Appended to globally readable file.
また、「無条件に読み込み可能なファイル」として例外ポリシーに登録されているパス名が消滅した場合、tomoyo-queryd はそのパス名を例外ポリシーから削除します。
The pathname /usr/lib/libpurple.so.0.5.9 was deleted. Deleted from globally readable file.
このプログラムはメモリ上のポリシーを直接編集します。シャットダウンすると失われてしまいますので、忘れずに tomoyo-savepolicy を実行してポリシーを保存してください。
# /usr/sbin/tomoyo-savepolicy
7.3.2. tomoyo-queryd の出力例
以下は tomoyo-queryd がどのような出力を行うかの例を示しています:
#2010-01-10 12:27:10# profile=3 mode=enforcing (global-pid=4210) task={ pid=4210 ppid=4205 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0 }
<kernel> /etc/rc.d/init.d/sshd
allow_ioctl /dev/null 0x5401
Allow? ('Y'es/'N'o/'R'etry/'S'how policy/'A'dd to policy and retry):s
# select global-pid=4210
<kernel> /etc/rc.d/init.d/sshd
use_profile 3
allow_read /bin/bash
allow_read/write /dev/tty
allow_read/write /dev/pts/\$
allow_read /usr/lib/locale/locale-archive
allow_read /etc/nsswitch.conf
allow_read /etc/passwd
allow_read /etc/rc.d/init.d/sshd
allow_read /etc/rc.d/init.d/functions
allow_execute /sbin/consoletype
allow_read /etc/profile.d/lang.sh
allow_read /etc/sysconfig/i18n
allow_read /etc/sysconfig/init
allow_execute /sbin/runlevel
allow_execute /bin/cp
allow_execute /usr/sbin/sshd
allow_execute /bin/touch
allow_read/write /dev/console
allow_execute /bin/unicode_start
allow_read /var/run/sshd.pid
allow_write /dev/null
allow_execute /bin/usleep
allow_execute /bin/rm
allow_execute /usr/bin/killall
allow_execute /usr/bin/rhgb-client
allow_execute /bin/sleep
allow_ioctl /dev/console 0x5401
allow_ioctl /etc/rc.d/init.d/sshd 0x5401
allow_ioctl /var/run/sshd.pid 0x5401
allow_ioctl /dev/pts/\$ 0x5401
#2010-01-10 12:27:20# profile=3 mode=enforcing (global-pid=4210) task={ pid=4210 ppid=4205 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0 }
<kernel> /etc/rc.d/init.d/sshd
allow_ioctl /dev/null 0x5401
Allow? ('Y'es/'N'o/'R'etry/'S'how policy/'A'dd to policy and retry):a
Enter new entry> allow_ioctl /dev/null 0x5401
Added 'allow_ioctl /dev/null 0x5401'.
The pathname /usr/lib/libpurple.so.0.6.3 was created. Appended to globally readable file.
The pathname /usr/lib/libpurple-client.so.0.6.3 was created. Appended to globally readable file.
----------------------------------------
#2010-01-10 12:29:35# profile=3 mode=enforcing (global-pid=4561) task={ pid=4561 ppid=4557 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0 }
<kernel> /etc/rc.d/init.d/cups
allow_execute /bin/sleep
Allow? ('Y'es/'N'o/'R'etry/'S'how policy/'A'dd to policy and retry):a
Enter new entry> allow_execute /bin/sleep
Added 'allow_execute /bin/sleep'.
#2010-01-10 12:29:55# profile=3 mode=enforcing (global-pid=4561) task={ pid=4561 ppid=4557 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0 }
<kernel> /etc/rc.d/init.d/cups
# wants to create domain
<kernel> /etc/rc.d/init.d/cups /bin/sleep
Allow? ('Y'es/'N'o/'R'etry):y
#2010-01-10 12:29:58# profile=3 mode=enforcing (global-pid=4561) task={ pid=4561 ppid=4557 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0 }
<kernel> /etc/rc.d/init.d/cups /bin/sleep
allow_read /usr/lib/locale/locale-archive
Allow? ('Y'es/'N'o/'R'etry/'S'how policy/'A'dd to policy and retry):a
Enter new entry> allow_read /usr/lib/locale/locale-archive
Added 'allow_read /usr/lib/locale/locale-archive'.
----------------------------------------
#2010-01-10 12:30:10# profile=3 mode=enforcing (global-pid=4630) task={ pid=4630 ppid=4629 uid=0 gid=0 euid=0 egid=0 suid=0 sgid=0 fsuid=0 fsgid=0 }
<kernel> /usr/sbin/acpid
allow_unlink /var/run/acpid.socket
Allow? ('Y'es/'N'o/'R'etry/'S'how policy/'A'dd to policy and retry):a
Enter new entry> allow_unlink /var/run/acpid.socket
Added 'allow_unlink /var/run/acpid.socket'.
The pathname /usr/lib/libpurple.so.0.5.9 was deleted. Deleted from globally readable file.
The pathname /usr/lib/libpurple-client.so.0.5.9 was deleted. Deleted from globally readable file.
7.4. 全てのドメインに対して強制モードを有効にする
これまでに紹介してきた概念を理解しツールを使いこなせるようになれば、システム全体をアクセス制御の対象とするようなポリシーを作成することができることでしょう。全てのドメインを「強制モード」で運用すれば、システムの侵害へとつながるような弱点を減らすのに有効です。 Apache を制限する例で示した手順は、そのまま全てのドメインを制限するために使うことができます。
7.5. おわりに
このガイドのこの章までの内容は、 TOMOYO Linux を設定するのに十分な知識を提供することを狙っています。より深い知識を得るために、この先の章も読んでください。次の章から先は必ずしも不可欠とはいえない応用的な内容ですが、システムのセキュリティを高めるために役に立つことでしょう。このガイドの末尾にある付録、特に仕様についての解説は役に立つことでしょう。
セキュリティ対策が最も弱い場所を狙われるということを忘れないでください。 TOMOYO Linux が提供する強制アクセス制御機能を正しく使うことは、システムが侵害されることへの対策ではありますが、その他のシステムのセキュリティを高めるための手法や実践も忘れないでください。その他のシステムのセキュリティを高めるための手法や実践はこのガイドの対象外ですが、システムのセキュリティを最大限に高めたいと思うのならば真剣に取り組むようにしてください。
