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 が提供する強制アクセス制御機能を正しく使うことは、システムが侵害されることへの対策ではありますが、その他のシステムのセキュリティを高めるための手法や実践も忘れないでください。その他のシステムのセキュリティを高めるための手法や実践はこのガイドの対象外ですが、システムのセキュリティを最大限に高めたいと思うのならば真剣に取り組むようにしてください。