tomoyotitle.png

Chapter 6: ポリシーはどのように作成しますか?

6.1. テンポラリファイルをパターン化する

特定のドメインでは、多数の資源に対して多数のアクセス許可を必要とすることがあります。「強制モード」では明示的に許可された資源へのアクセスだけが認められるため、必要な資源を全て網羅しておくことが重要です。網羅するために、アクセス許可をパターン化することができます。パターン化されたアクセス許可を使うと、多数のドメインポリシーのエントリを1個に集約することができます。

パターン化は、使い捨てのパス名が利用されるテンポラリファイルへの対処を行うのに有効です。以下に紹介する手順で対処することもできますし、ポリシーエディタを用いて対話的に対処することもできます。対話的に対処する手順の詳細についてはアクセス許可をパターン化するを参照してください。

ccs-findtemp コマンドを利用して、テンポラリファイルの可能性があるパス名を抽出します:

# /usr/sbin/ccs-findtemp < /proc/ccs/domain_policy
/tmp/RsACr8YD
/tmp/RsXg3Aav
/var/run/nscd/socket
/var/spool/clientmqueue/dfoBPETPpH002933
/var/spool/clientmqueue/dfoBPETf92002944
/var/spool/clientmqueue/qfoBPETPpH002933
/var/spool/clientmqueue/qfoBPETf92002944
/var/spool/clientmqueue/xfoBPETPpH002933
/var/spool/clientmqueue/xfoBPETf92002944

この例では、 /var/run/nscd/socket 以外は全てテンポラリファイルであると考えられます。そのため、これらのパス名をパターン化します。

最初に、どのようなパターンを利用するかを決めます。この例では、ランダムな文字列が使用されていると考えられます。そのため、 / 以外の任意の1文字に一致する \? と / 以外の任意の0文字以上に一致する \* が妥当だと考えられます。詳細についてはパターンの表記規則を参照してください。詳細についてはパターンの表記規則を参照してください。

ccs-patternize コマンドを利用して、非対話的にパターン化処理を行うことができます。パターン化の規則は /etc/ccs/tools/patternize.conf に記録されています。以下に初期設定を示します:

# This file contains rewriting rules used by ccs-patternize command.

# Domain policy consists with domain declaration lines (which start with
# '<' ,) and acl declaration lines (which do not start with '<' ).
# You can refer the former using 'domain' keyword and the latter using 'acl'
# keyword.
#
# Words in each line are separated by a space character. Therefore, you can
# use 'domain[index]', 'acl[index]' for referring index'th word of the line.
# The index starts from 1, and 0 refers the whole line (i.e.
# 'domain[0]' = 'domain', 'acl[0]' = 'acl').
#
# Three operators are provided for conditional rewriting.
# '.contains' is for 'fgrep keyword' match.
# '.equals' is for 'grep ^keyword$' match.
# '.starts' is for 'grep ^keyword' match.
#
# Rewriting rules are defined using multi-lined chunks. A chunk is terminated
# by a 'rewrite' line which specifies old pattern and new pattern.
# A 'rewrite' line is evaluated only when all preceding 'domain' and 'acl'
# lines in that chunk have matched.
# Evaluation stops at first 'rewrite' line where a word matched old pattern.
# Therefore, no words are rewritten more than once.
#
# For user's convenience, new pattern can be omitted if old pattern is reused
# for new pattern.

# Please use TOMOYO Linux's escape rule (e.g. '\040' rather than '\ ' for
# representing a ' ' in a word).

# Files on proc filesystem.
rewrite path_pattern proc:/self/task/\$/fdinfo/\$
rewrite path_pattern proc:/self/task/\$/fd/\$
rewrite head_pattern proc:/self/task/\$/
rewrite path_pattern proc:/self/fdinfo/\$
rewrite path_pattern proc:/self/fd/\$
rewrite head_pattern proc:/self/
rewrite path_pattern proc:/\$/task/\$/fdinfo/\$
rewrite path_pattern proc:/\$/task/\$/fd/\$
rewrite head_pattern proc:/\$/task/\$/
rewrite path_pattern proc:/\$/fdinfo/\$
rewrite path_pattern proc:/\$/fd/\$
rewrite head_pattern proc:/\$/

# Files on devpts filesystem.
rewrite path_pattern devpts:/\$

# Files on pipe filesystem.
rewrite path_pattern pipe:[\$]
rewrite path_pattern pipefs:/[\$]

# Files on / partition.
rewrite tail_pattern /etc/mtab~\$
rewrite tail_pattern /etc/ccs/policy/\*/domain_policy.conf
rewrite tail_pattern /etc/ccs/policy/\*/exception_policy.conf
rewrite tail_pattern /etc/ccs/policy/\*/manager.conf
rewrite tail_pattern /etc/ccs/policy/\*/profile.conf
rewrite tail_pattern /etc/ccs/policy/\*/

# Files on /tmp/ partition.
rewrite tail_pattern /vte\?\?\?\?\?\?
rewrite tail_pattern /.ICE-unix/\$
rewrite tail_pattern /keyring-\?\?\?\?\?\?/socket.ssh
rewrite tail_pattern /orbit-\*/bonobo-activation-register-\X.lock
rewrite tail_pattern /orbit-\*/bonobo-activation-server-\X-ior
rewrite tail_pattern /orbit-\*/linc-\*
rewrite tail_pattern /orbit-\*/
rewrite tail_pattern /sh-thd-\$
rewrite tail_pattern /zman\?\?\?\?\?\?

# Files on home directory.
rewrite tail_pattern /.ICEauthority-\?
rewrite tail_pattern /.xauth\?\?\?\?\?\?
rewrite tail_pattern /.xauth\?\?\?\?\?\?-?
rewrite tail_pattern /.local/share/applications/preferred-mail-reader.desktop.\?\?\?\?\?\?
rewrite tail_pattern /.local/share/applications/preferred-web-browser.desktop.\?\?\?\?\?\?

# Files on /var/ partition.
rewrite tail_pattern /cache/fontconfig/\X-le64.cache-3
rewrite tail_pattern /lib/gdm/.pulse/\X-default-source
rewrite tail_pattern /lib/gdm/.pulse/\X-default-sink
rewrite tail_pattern /lib/gdm/.dbus/session-bus/\X-\X
rewrite tail_pattern /run/gdm/auth-for-\*/database-\?
rewrite tail_pattern /run/gdm/auth-for-\*/database
rewrite tail_pattern /run/gdm/auth-for-\*/
rewrite tail_pattern /spool/abrt/pyhook-\*/\{\*\}/\*
rewrite tail_pattern /spool/abrt/pyhook-\*/\{\*\}/

path_pattern ディレクティブはパス名の全体一致をチェックします。
head_pattern ディレクティブはパス名の前方一致をチェックします。
tail_pattern ディレクティブはパス名の後方一致をチェックします。

/tmp/Rs\?\?\?\?\?\? および /var/spool/clientmqueue/\* というパターンを /etc/ccs/tools/patternize.conf に追加してください:

rewrite tail_pattern /tmp/Rs\?\?\?\?\?\?
rewrite tail_pattern /var/spool/clientmqueue/\*

その後、 ccs-patternize コマンドを利用してパターン化を行い、 ccs-diffpolicy コマンドを利用して結果を比較してください:

# ccs-savepolicy -d > /tmp/old
# ccs-patternize < /tmp/old > /tmp/new
# ccs-diffpolicy /tmp/old /tmp/new
<kernel> /usr/sbin/httpd

file write proc:/self/task/\$/attr/fscreate
delete file write proc:/self/task/2766/attr/fscreate

<kernel> /usr/sbin/httpd /bin/sh /bin/mail

file create /tmp/Rs\?\?\?\?\?\? 0666
file read /tmp/Rs\?\?\?\?\?\?
file unlink /tmp/Rs\?\?\?\?\?\?
file write /tmp/Rs\?\?\?\?\?\?
delete file create /tmp/RsACr8YD 0666
delete file create /tmp/RsXg3Aav 0666
delete file read /tmp/RsACr8YD
delete file read /tmp/RsXg3Aav
delete file unlink /tmp/RsACr8YD
delete file unlink /tmp/RsXg3Aav
delete file write /tmp/RsACr8YD
delete file write /tmp/RsXg3Aav

<kernel> /usr/sbin/httpd /bin/sh /bin/mail

file ioctl pipefs:/[\$] 0x5413
delete file ioctl pipefs:/[11895] 0x5413
delete file ioctl pipefs:/[11965] 0x5413

<kernel> /usr/sbin/httpd /bin/sh /bin/mail /usr/sbin/sendmail

file create /var/spool/clientmqueue/\* 0660
file read /var/spool/clientmqueue/\*
file unlink /var/spool/clientmqueue/\*
file write /var/spool/clientmqueue/\*
delete file create /var/spool/clientmqueue/dfoBPETPpH002933 0660
delete file create /var/spool/clientmqueue/dfoBPETf92002944 0660
delete file create /var/spool/clientmqueue/qfoBPETPpH002933 0660
delete file create /var/spool/clientmqueue/qfoBPETf92002944 0660
delete file read /var/spool/clientmqueue/dfoBPETPpH002933
delete file read /var/spool/clientmqueue/dfoBPETf92002944
delete file unlink /var/spool/clientmqueue/dfoBPETPpH002933
delete file unlink /var/spool/clientmqueue/dfoBPETf92002944
delete file unlink /var/spool/clientmqueue/qfoBPETPpH002933
delete file unlink /var/spool/clientmqueue/qfoBPETf92002944
delete file unlink /var/spool/clientmqueue/xfoBPETPpH002933
delete file unlink /var/spool/clientmqueue/xfoBPETf92002944
delete file write /var/spool/clientmqueue/dfoBPETPpH002933
delete file write /var/spool/clientmqueue/dfoBPETf92002944
delete file write /var/spool/clientmqueue/qfoBPETPpH002933
delete file write /var/spool/clientmqueue/qfoBPETf92002944

<kernel> /usr/sbin/httpd /bin/sh /bin/ls

file ioctl pipefs:/[\$] 0x5413
delete file ioctl pipefs:/[11965] 0x5413

意図したとおりに変換されていない場合には、テキストエディタを利用して /tmp/new を直接編集しても構いませんし、 /etc/ccs/tools/patternize.conf を更新してから再度パターン化を行っても構いません。

意図したとおりに変換された場合には、差分をカーネル内に読み込ませることで反映することができます:

# ccs-diffpolicy /tmp/old /tmp/new | /usr/sbin/ccs-loadpolicy -d

特定のドメインだけを対象に変換処理を行いたい場合、 ccs-selectpolicy コマンドを利用して特定のドメインのドメインポリシーだけを抽出することができます。例えば、 <kernel> /usr/sbin/httpd ドメインとその子孫ドメインだけを対象にパターン化処理を行いたい場合には、以下のように実行してください:

# ccs-selectpolicy -r '<kernel> /usr/sbin/httpd' < /proc/ccs/domain_policy > /tmp/old-httpd
# ccs-patternize < /tmp/old-httpd > /tmp/new-httpd
# ccs-diffpolicy /tmp/old-httpd /tmp/new-httpd | ccs-loadpolicy -d

また、 /etc/ccs/tools/patternize.conf を編集することでも特定のドメインだけを対象に変換処理を行わせることができます。以下の行を rewite 行の前に挿入することで、 <kernel> /usr/sbin/httpd ドメインとその子孫ドメインだけを対象にパターン化処理を行わせることができます:

domain.starts <kernel> /usr/sbin/httpd

6.2. ファイルのアクセス許可をパターン化する

学習モードでは必ずしもアクセスされないファイルに対するアクセス許可を追加します。例えば、 WWW サーバがアクセスするコンテンツを扱うために、以下のようにパターン化を行うことができます:

修正前

修正後

<kernel> /usr/sbin/httpd


file read /var/www/html/index.html

file read /var/www/html/alice/index.html

file read /var/www/html/alice/page1.html

file read /var/www/html/alice/page2.html

file read /var/www/html/alice/image1.jpg

file read /var/www/html/alice/image2.jpg

file read /var/www/html/alice/archive/page1.html

file read /var/www/html/alice/archive/image1.jpg

file read /var/www/html/alice/archive/page2.html

file read /var/www/html/alice/archive/image2.jpg

file read /var/www/html/bob/index.html

file read /var/www/html/bob/page1.html

file read /var/www/html/bob/page2.html

file read /var/www/html/bob/image1.jpg

file read /var/www/html/bob/image2.jpg

file read /var/www/html/bob/archive/page1.html

file read /var/www/html/bob/archive/image1.jpg

file read /var/www/html/bob/archive/page2.html

file read /var/www/html/bob/archive/image2.jpg

<kernel> /usr/sbin/httpd


file read /var/www/html/\*.html

file read /var/www/html/\{\*\}/\*.html

file read /var/www/html/\{\*\}/\*.jpg

例外ポリシーで以下のようなグループを定義しておくことにより:

path_group WEB-CONTENTS /var/www/html/\*.html
path_group WEB-CONTENTS /var/www/html/\{\*\}/\*.html
path_group WEB-CONTENTS /var/www/html/\{\*\}/\*.jpg

ドメインポリシーでの記述を以下のように単純化することができます:

<kernel> /usr/sbin/httpd

file read @WEB-CONTENTS

上記の変換処理は ccs-editpolicy を利用して行うことができますが、 ccs-patternize を利用して行うこともできます。上記のように path_group を例外ポリシーに追加し( ccs-patternize はドメインポリシーしか扱わないので例外ポリシーへの追加は手作業で行う必要があります)、以下の内容を /etc/ccs/tools/patternize.conf に追加後、 6.1. テンポラリファイルをパターン化すると同様の手順を行ってください:

domain.equals <kernel> /usr/sbin/httpd
acl.starts file read
rewrite path_pattern /var/www/html/\*.html @WEB-CONTENTS

domain.equals <kernel> /usr/sbin/httpd
acl.starts file read
rewrite path_pattern /var/www/html/\{\*\}/\*.html @WEB-CONTENTS

domain.equals <kernel> /usr/sbin/httpd
acl.starts file read
rewrite path_pattern /var/www/html/\{\*\}/\*.jpg @WEB-CONTENTS

6.3. 数値パラメータをパターン化する

ファイルのDACモードやネットワークのポート番号などの数値で表現されるパラメータについてもパターン化を行うことができます。

以下のドメインポリシーの例では <kernel> /usr/sbin/httpd ドメインに対してクライアントのポート番号が1024~65535からの接続要求を受け付けるようにパターン化しています:

修正前

修正後

<kernel> /usr/sbin/httpd


network inet stream accept 0:0:0:0:0:ffff:c0a8:801 3810

network inet stream accept 0:0:0:0:0:ffff:c0a8:801 3829

network inet stream accept 0:0:0:0:0:ffff:c0a8:801 3829

<kernel> /usr/sbin/httpd


network inet stream accept 0:0:0:0:0:ffff:c0a8:801 1024-65535

例外ポリシーで以下のようなグループを定義しておくことにより:

number_group WEB-CLIENT-PORTS 1024-65535

ドメインポリシーでの記述を以下のように単純化することができます:

<kernel> /usr/sbin/httpd

network inet stream accept 0:0:0:0:0:ffff:c0a8:801 @WEB-CLIENT-PORTS

上記の変換処理は ccs-editpolicy を利用して行うことができますが、 ccs-patternize を利用して行うこともできます。上記のように number_group を例外ポリシーに追加し、以下の内容を /etc/ccs/tools/patternize.conf に追加後、 6.1. テンポラリファイルをパターン化すると同様の手順を行ってください:

domain.equals <kernel> /usr/sbin/httpd
acl.starts network inet stream accept
rewrite number_pattern 1024-65535 @WEB-CLIENT-PORTS

6.4. ネットワークアドレスをパターン化する

同様にIPアドレスについてもパターン化を行います。以下に例を示します:

修正前

修正後

<kernel> /usr/sbin/httpd


network inet stream accept 0:0:0:0:0:0:0:1 @WEB-CLIENT-PORTS

network inet stream accept 0:0:0:0:0:ffff:a00:1 @WEB-CLIENT-PORTS

network inet stream accept 0:0:0:0:0:ffff:a00:a1 @WEB-CLIENT-PORTS

network inet stream accept 10.0.0.10 @WEB-CLIENT-PORTS

network inet stream accept 10.0.0.200 @WEB-CLIENT-PORTS

<kernel> /usr/sbin/httpd


network inet stream accept 0:0:0:0:0:0:0:1 @WEB-CLIENT-PORTS

network inet stream accept 0:0:0:0:0:ffff:a00:1-0:0:0:0:0:ffff:a00:ff @WEB-CLIENT-PORTS

network inet stream accept 10.0.0.1-10.0.0.255 @WEB-CLIENT-PORTS

例外ポリシーで以下のようなグループを定義しておくことにより:

address_group WEB-CLIENT-ADDRESS 0:0:0:0:0:0:0:1
address_group WEB-CLIENT-ADDRESS 0:0:0:0:0:ffff:a00:1-0:0:0:0:0:ffff:a00:ff
address_group WEB-CLIENT-ADDRESS 10.0.0.1-10.0.0.255

ドメインポリシーでの記述を以下のように単純化することができます:

<kernel> /usr/sbin/httpd

network inet stream accept @WEB-CLIENT-ADDRESS @WEB-CLIENT-PORTS

上記の変換処理は ccs-editpolicy を利用して行うことができますが、 ccs-patternize を利用して行うこともできます。上記のように address_group を例外ポリシーに追加し、以下の内容を /etc/ccs/tools/patternize.conf に追加後、 6.1. テンポラリファイルをパターン化すると同様の手順を行ってください:

domain.equals <kernel> /usr/sbin/httpd
acl.starts network inet stream accept
rewrite address_pattern 0:0:0:0:0:0:0:1 @WEB-CLIENT-ADDRESS

domain.equals <kernel> /usr/sbin/httpd
acl.starts network inet stream accept
rewrite address_pattern 0:0:0:0:0:ffff:a00:1-0:0:0:0:0:ffff:a00:ff @WEB-CLIENT-ADDRESS

domain.equals <kernel> /usr/sbin/httpd
acl.starts network inet stream accept
rewrite address_pattern 10.0.0.1-10.0.0.255 @WEB-CLIENT-ADDRESS

6.5. 収集されたアクセス許可を確認する

Apache に許可したい操作を一通り行ったと判断したら、ポリシーエディタを実行してプロファイル番号を 2 に変更します。

Apache は(例えば /bin/sh /usr/bin/perl /usr/lib/sendmail のような)外部のプログラムを実行したことにより、 Apache に子ドメインや孫ドメインが作成されているかもしれません。 Apache 本体のドメインだけでなくその子孫ドメインのプロファイル番号も変更するのを忘れないようにしてください。

editpolicy-httpd-profile2.png

q キーを押してポリシーエディタを終了してください。その後、 Apache に対して許可したい操作を再度行ってください:

operation-permissive.png

/proc/ccs/stat からポリシー違反の発生回数と最後に発生した時刻について知ることができます:

# cat /proc/ccs/stat
Policy update:                              1571 (Last: 2010/12/25 16:10:48)
Policy violation in learning mode:           453 (Last: 2010/12/25 15:33:21)
Policy violation in permissive mode:          22 (Last: 2010/12/25 15:47:10)
Policy violation in enforcing mode:            0
Memory used by policy:                    165728
Memory used by audit log:                      0 (Quota:   16777216)
Memory used by query message:                  0 (Quota:    1048576)
Total memory used:                        165728

6.6. アクセスログからポリシーを生成する(任意)

もしアクセスログの設定を 4.6. アクセスログを保存する(任意)で行っていた場合は、必要なアクセス許可を /var/log/tomoyo/reject_002.log から抽出することができます:

# cat /var/log/tomoyo/reject_002.log
#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=1545499 major=8 minor=1 perm=0755 type=file } path1.parent={ uid=0 gid=0 ino=1540116 perm=0755 } exec={ realpath="/usr/bin/id" argc=1 envc=7 argv[]={ "id" } envp[]={ "TERM=vt100" "PATH=/sbin:/usr/sbin:/bin:/usr/bin" "PWD=/usr/share/horde/admin" "LANG=en_US.UTF-8" "SHLVL=3" "LANGUAGE=en_US.UTF-8" "_=/usr/bin/id" } }
<kernel> /usr/sbin/httpd /bin/sh
file execute /usr/bin/id

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
use_profile 2

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
use_group 0

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=1545499 major=8 minor=1 perm=0755 type=file } path1.parent={ uid=0 gid=0 ino=1540116 perm=0755 } exec={ realpath="/usr/bin/id" argc=1 envc=7 argv[]={ "id" } envp[]={ "TERM=vt100" "PATH=/sbin:/usr/sbin:/bin:/usr/bin" "PWD=/usr/share/horde/admin" "LANG=en_US.UTF-8" "SHLVL=3" "LANGUAGE=en_US.UTF-8" "_=/usr/bin/id" } }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
misc env TERM

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=1545499 major=8 minor=1 perm=0755 type=file } path1.parent={ uid=0 gid=0 ino=1540116 perm=0755 } exec={ realpath="/usr/bin/id" argc=1 envc=7 argv[]={ "id" } envp[]={ "TERM=vt100" "PATH=/sbin:/usr/sbin:/bin:/usr/bin" "PWD=/usr/share/horde/admin" "LANG=en_US.UTF-8" "SHLVL=3" "LANGUAGE=en_US.UTF-8" "_=/usr/bin/id" } }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
misc env PATH

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=1545499 major=8 minor=1 perm=0755 type=file } path1.parent={ uid=0 gid=0 ino=1540116 perm=0755 } exec={ realpath="/usr/bin/id" argc=1 envc=7 argv[]={ "id" } envp[]={ "TERM=vt100" "PATH=/sbin:/usr/sbin:/bin:/usr/bin" "PWD=/usr/share/horde/admin" "LANG=en_US.UTF-8" "SHLVL=3" "LANGUAGE=en_US.UTF-8" "_=/usr/bin/id" } }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
misc env PWD

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=1545499 major=8 minor=1 perm=0755 type=file } path1.parent={ uid=0 gid=0 ino=1540116 perm=0755 } exec={ realpath="/usr/bin/id" argc=1 envc=7 argv[]={ "id" } envp[]={ "TERM=vt100" "PATH=/sbin:/usr/sbin:/bin:/usr/bin" "PWD=/usr/share/horde/admin" "LANG=en_US.UTF-8" "SHLVL=3" "LANGUAGE=en_US.UTF-8" "_=/usr/bin/id" } }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
misc env LANG

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=1545499 major=8 minor=1 perm=0755 type=file } path1.parent={ uid=0 gid=0 ino=1540116 perm=0755 } exec={ realpath="/usr/bin/id" argc=1 envc=7 argv[]={ "id" } envp[]={ "TERM=vt100" "PATH=/sbin:/usr/sbin:/bin:/usr/bin" "PWD=/usr/share/horde/admin" "LANG=en_US.UTF-8" "SHLVL=3" "LANGUAGE=en_US.UTF-8" "_=/usr/bin/id" } }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
misc env SHLVL

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=1545499 major=8 minor=1 perm=0755 type=file } path1.parent={ uid=0 gid=0 ino=1540116 perm=0755 } exec={ realpath="/usr/bin/id" argc=1 envc=7 argv[]={ "id" } envp[]={ "TERM=vt100" "PATH=/sbin:/usr/sbin:/bin:/usr/bin" "PWD=/usr/share/horde/admin" "LANG=en_US.UTF-8" "SHLVL=3" "LANGUAGE=en_US.UTF-8" "_=/usr/bin/id" } }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
misc env LANGUAGE

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=1545499 major=8 minor=1 perm=0755 type=file } path1.parent={ uid=0 gid=0 ino=1540116 perm=0755 } exec={ realpath="/usr/bin/id" argc=1 envc=7 argv[]={ "id" } envp[]={ "TERM=vt100" "PATH=/sbin:/usr/sbin:/bin:/usr/bin" "PWD=/usr/share/horde/admin" "LANG=en_US.UTF-8" "SHLVL=3" "LANGUAGE=en_US.UTF-8" "_=/usr/bin/id" } }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
misc env _

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=1245682 major=8 minor=1 perm=0644 type=file } path1.parent={ uid=0 gid=0 ino=1245419 perm=0755 }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
file read /etc/selinux/config

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=12 major=0 minor=15 perm=0444 type=file } path1.parent={ uid=0 gid=0 ino=496 perm=0755 }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
file read selinuxfs:/mls

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
network unix stream connect /var/run/setrans/.setrans-unix

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=4026531844 major=0 minor=3 perm=0444 type=file } path1.parent={ uid=0 gid=0 ino=1 perm=0555 }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
file read proc:/filesystems

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=1547485 major=8 minor=1 perm=0644 type=file } path1.parent={ uid=0 gid=0 ino=1540124 perm=0755 }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
file read /usr/lib/locale/locale-archive

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
network unix stream connect /var/run/setrans/.setrans-unix

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
network unix stream connect /var/run/nscd/socket

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
network unix stream connect /var/run/nscd/socket

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=1245231 major=8 minor=1 perm=0644 type=file } path1.parent={ uid=0 gid=0 ino=1245185 perm=0755 }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
file read /etc/nsswitch.conf

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=1245924 major=8 minor=1 perm=0644 type=file } path1.parent={ uid=0 gid=0 ino=1245185 perm=0755 }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
file read /etc/passwd

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
network unix stream connect /var/run/nscd/socket

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
network unix stream connect /var/run/nscd/socket

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=1245902 major=8 minor=1 perm=0644 type=file } path1.parent={ uid=0 gid=0 ino=1245185 perm=0755 }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
file read /etc/group

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=1245902 major=8 minor=1 perm=0644 type=file } path1.parent={ uid=0 gid=0 ino=1245185 perm=0755 }
<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
file read /etc/group

これらのログは、 ccs-sortpolicy コマンドを使って圧縮することができます:

# cat /var/log/tomoyo/reject_002.log | /usr/sbin/ccs-sortpolicy
<kernel> /usr/sbin/httpd /bin/sh

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler }
file execute /usr/bin/id

<kernel> /usr/sbin/httpd /bin/sh /usr/bin/id
use_profile 2

#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler }
#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=12 major=0 minor=15 perm=0444 type=file } path1.parent={ uid=0 gid=0 ino=496 perm=0755 }
#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=1245231 major=8 minor=1 perm=0644 type=file } path1.parent={ uid=0 gid=0 ino=1245185 perm=0755 }
#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=1245682 major=8 minor=1 perm=0644 type=file } path1.parent={ uid=0 gid=0 ino=1245419 perm=0755 }
#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=1245902 major=8 minor=1 perm=0644 type=file } path1.parent={ uid=0 gid=0 ino=1245185 perm=0755 }
#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=1245924 major=8 minor=1 perm=0644 type=file } path1.parent={ uid=0 gid=0 ino=1245185 perm=0755 }
#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=1545499 major=8 minor=1 perm=0755 type=file } path1.parent={ uid=0 gid=0 ino=1540116 perm=0755 } exec={ realpath="/usr/bin/id" argc=1 envc=7 argv[]={ "id" } envp[]={ "TERM=vt100" "PATH=/sbin:/usr/sbin:/bin:/usr/bin" "PWD=/usr/share/horde/admin" "LANG=en_US.UTF-8" "SHLVL=3" "LANGUAGE=en_US.UTF-8" "_=/usr/bin/id" } }
#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=1547485 major=8 minor=1 perm=0644 type=file } path1.parent={ uid=0 gid=0 ino=1540124 perm=0755 }
#2010/12/25 15:47:10# profile=2 mode=permissive granted=no (global-pid=3390) task={ pid=3390 ppid=3386 uid=48 gid=48 euid=48 egid=48 suid=48 sgid=48 fsuid=48 fsgid=48 type!=execute_handler } path1={ uid=0 gid=0 ino=4026531844 major=0 minor=3 perm=0444 type=file } path1.parent={ uid=0 gid=0 ino=1 perm=0555 }
file read /etc/group
file read /etc/nsswitch.conf
file read /etc/passwd
file read /etc/selinux/config
file read /usr/lib/locale/locale-archive
file read proc:/filesystems
file read selinuxfs:/mls
misc env LANG
misc env LANGUAGE
misc env PATH
misc env PWD
misc env SHLVL
misc env TERM
misc env _
network unix stream connect /var/run/nscd/socket
network unix stream connect /var/run/setrans/.setrans-unix
use_group 0

圧縮されたログをテンポラリファイルとして保存し、必要に応じて加工してから、 ccs-loadpolicy コマンドを用いてドメインポリシーに追加することができます:

# cat /var/log/tomoyo/reject_002.log | /usr/sbin/ccs-sortpolicy > ~/rejected.log
# vim ~/rejected.log
# /usr/sbin/ccs-loadpolicy -d < ~/rejected.log

カーネル内のメモリに存在しているポリシーを直接編集しているため、ディスク上に保存せずにシャットダウンすると変更内容は失われてしまいます。以下のコマンドを実行して exception_policy.conf domain_policy.conf profile.conf manager.conf をディスク上に保存してください:

# /usr/sbin/ccs-savepolicy