SELinux事始め
朝起きたらテレビで若手俳優の傷害事件について報じていた。道路に駐車していた車に対して「通れない」と苦情を言うだけでなく、殴りかかって怪我を負わせてしまったようだ。そのニュース自体には驚きもしないのだけれど、事故の様子を3Dでモデリングされた車や人物でアニメーションで流していたのに驚いた。確かに事故の状況はよくわかるけれども、わざわざそのためにモデリングしたり、ビューポイントを変えたりする必要があるのだろうか。こんなことを言うと怒られるかもしれないけれど、なんだか無駄な技術の進歩だなと思った。(あるいは、進歩した技術の無駄な使い方というほうが適切か)
今日は午後少し雨が降ったようだけれど朝は晴天で空がきれいだった。東海道線のつり革につかまって外を眺めていたら雪化粧をした富士山がはっきりと見えた。電車が進み品川を過ぎると今度はビルの合間からときおり東京タワーが見える。富士山は勿論きれいだけれど、今日は何故か電車から見えた東京タワーがとても優美に見えて仕方なかった。もう1年以上も毎日同じ電車に乗っていて、富士山とは違って天気の悪い日も見ているはずなのに、こんなふうに思ったことはなかった。とても不思議な気がする。昨年の暮れに事情があって、少し田町の付近を歩いた。もしかしたらそのときに自分の中に何かインプットされたのかな。都会に住んでいて「東京タワーがきれいだ」なんて言ったら馬鹿にされてしまうので、誰にも言わずにここに書いておこう。
仕事始めから3日目になったが、体感通り体重が1kg弱軽くなった。この調子で落ちてくれたらうれしいけれど、経験的にここからは多分安定する。仕事と睡眠時間とストレスの均衡状態だ。
(本ページは備忘録なのであまり読まないでください)
出発
- Fedora Core 3フルインストール(SELinux有効)
- LXR 0.9.3を/usr/local/lxrに導入する(Perlモジュールは実体を/usr/lib/perl5/site-perl配下にコピーし、/usr/local/lxrにはシンボリックリンクを置いた)。
つまずき
- indexingまで無事行えたがブラウザからページを開くと"Internal Server Error"となる。
- dmesgコマンドでログを調べると、httpd他の/usr/local/lxr配下に対するアクセスが失敗していることがわかる。
audit(1104977378.787:0): avc: denied { search } for pid=30359 exe=/usr/bin/perl scontext=root:system_r:httpd_sys_script_t tcontext=system_u:object_r:sysctl_kernel_t tclass=dir audit(1104977378.787:0): avc: denied { search } for pid=30359 exe=/usr/bin/perl name=sys dev=proc ino=-268435431 scontext=root:system_r:httpd_sys_script_t tcontext=system_u:object_r:sysctl_t tclass=dir audit(1104977379.148:0): avc: denied { write } for pid=30359 exe=/usr/bin/perl name=.s.PGSQL.5432 dev=sda3 ino=453399 scontext=root:system_r:httpd_sys_script_t tcontext=root:object_r:tmp_t tclass=sock_file audit(1104984868.688:0): avc: granted { load_policy } for pid=30635 exe=/usr/sbin/load_policy scontext=root:system_r:unconfined_t tcontext=system_u:object_r:security_t tclass=security security: 3 users, 4 roles, 280 types, 16 bools security: 53 classes, 5494 rules audit(1104984902.298:0): avc: denied { search } for pid=30641 exe=/usr/bin/perl scontext=root:system_r:httpd_sys_script_t tcontext=system_u:object_r:sysctl_kernel_t tclass=dir audit(1104984902.298:0): avc: denied { search } for pid=30641 exe=/usr/bin/perl name=sys dev=proc ino=-268435431 scontext=root:system_r:httpd_sys_script_t tcontext=system_u:object_r:sysctl_t tclass=dir audit(1104984902.568:0): avc: denied { write } for pid=30641 exe=/usr/bin/perl name=.s.PGSQL.5432 dev=sda3 ino=453399 scontext=root:system_r:httpd_sys_script_t tcontext=user_u:object_r:tmp_t tclass=sock_file
これを解決するのもっとも安直な方法は、上記エラーをaudit2allowに食わせた結果をpolicyに追加することで、その場合どんな内容になるかを確認した。
1[root@harada]# dmesg | audit2allow -l allow httpd_t usr_t:dir { write }; allow httpd_t usr_t:file { execute };
これだとあまりに権限を与えすぎるので、/usr/local/lxr配下のコンテキストを変更することにしたが、そのためにはpolicyの定義ファイル群が必要となる。http://download.fedora.redhat.com/pub/fedora/linux/core/updates/3/SRPMS/から1/6現在の最新であるselinux-policy-targeted-1.17.30-2.66.src.rpmをダウンロードし、rpm -ivhで展開した。展開結果は、/etc/selinux/targeted/src/policy/配下に展開される。
/usr/local/lxrのコンテキストを変更するための方法を探した結果、
- file_contexts/program/apache.fcにpolicy定義を追加すれば良さそうと判明
- /usr/local/lxr(/.*)? system_u:object_r:httpd_sys_script_exec_tという行を追加
- make reload
- setfiles file_contexts/file_contexts /usr/local/lxr
1[root@harada]# ls -lZ /usr/local/lxr -rw-r--r-- root root system_u:object_r:httpd_sys_script_exec_t Local.pm -rwxr-xr-x root root system_u:object_r:httpd_sys_script_exec_t diff -rwxr-xr-x root root system_u:object_r:httpd_sys_script_exec_t find -rwxr-xr-x root root system_u:object_r:httpd_sys_script_exec_t fixhashbang -rwxr-xr-x root root system_u:object_r:httpd_sys_script_exec_t genjavaclasses -rwxr-xr-x root root system_u:object_r:httpd_sys_script_exec_t genxref drwxrwxrwx root root system_u:object_r:httpd_sys_script_exec_t glimpse -rw-r--r-- root root system_u:object_r:httpd_sys_script_exec_t html-dir.html -rw-r--r-- root root system_u:object_r:httpd_sys_script_exec_t html-find.html -rw-r--r-- root root system_u:object_r:httpd_sys_script_exec_t html-head.html -rw-r--r-- root root system_u:object_r:httpd_sys_script_exec_t html-ident-refs.html -rw-r--r-- root root system_u:object_r:httpd_sys_script_exec_t html-ident.html -rw-r--r-- root root system_u:object_r:httpd_sys_script_exec_t html-search-glimpse.html -rw-r--r-- root root system_u:object_r:httpd_sys_script_exec_t html-search-swish.html -rw-r--r-- root root system_u:object_r:httpd_sys_script_exec_t html-tail.html -rwxr-xr-x root root system_u:object_r:httpd_sys_script_exec_t ident drwxr-xr-x root root system_u:object_r:httpd_sys_script_exec_t lib -rw-r--r-- root root system_u:object_r:httpd_sys_script_exec_t lxr.conf -rw-r--r-- root root system_u:object_r:httpd_sys_script_exec_t lxr.conf~ -rw-r--r-- root root system_u:object_r:httpd_sys_script_exec_t lxr.css -rwxr-xr-x root root system_u:object_r:httpd_sys_script_exec_t search -rwxr-xr-x root root system_u:object_r:httpd_sys_script_exec_t source drwxr-xr-x root root system_u:object_r:httpd_sys_script_exec_t src drwxr-xr-x root root system_u:object_r:httpd_sys_script_exec_t templates 1[root@harada]#
この状態で再度lxrにアクセスしてみるが、
audit(1104986063.683:0): avc: denied { search } for pid=30725 exe=/usr/bin/perl scontext=root:system_r:httpd_sys_script_t tcontext=system_u:object_r:sysctl_kernel_t tclass=dir audit(1104986063.683:0): avc: denied { search } for pid=30725 exe=/usr/bin/perl name=sys dev=proc ino=-268435431 scontext=root:system_r:httpd_sys_script_t tcontext=system_u:object_r:sysctl_t tclass=dir audit(1104986063.956:0): avc: denied { write } for pid=30725 exe=/usr/bin/perl name=.s.PGSQL.5432 dev=sda3 ino=453399 scontext=root:system_r:httpd_sys_script_t tcontext=user_u:object_r:tmp_t tclass=sock_file
これを再度audit2allowにかけてみると、まだ権限が不足しているらしい。
1[root@harada]# dmesg | audit2allow -l allow httpd_sys_script_t sysctl_kernel_t:dir { search }; allow httpd_sys_script_t sysctl_t:dir { search }; allow httpd_sys_script_t tmp_t:sock_file { write }; 1[root@harada]#
とりあえずここまで。