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 本体のドメインだけでなくその子孫ドメインのプロファイル番号も変更するのを忘れないようにしてください。
q キーを押してポリシーエディタを終了してください。その後、 Apache に対して許可したい操作を再度行ってください:
/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