ログからフルパスを得る方法

seeditのポリシ生成ツールでは、auditログ中のアクセス拒否ログから、ポリシを生成する。
しかし、seeditは、パス名ベースの設定であるため、「ファイルのフルパス」を得る必要がある。
どうやっているか、メモっておこう。ファイルのフルパスを得るのは、普通のSELinuxの設定でも役立つ知識かも。
自分用メモなので、意味不明かも。

普通の場合

  • 第一段階

AVC_PATHエントリ、PATHエントリに
「/」から始まる名前が出ていれば、これをフルパスとする。
例:
PATH=/var/www/html/cgi_write/test.txt

  • 第二段階

PATH=.
のように、相対パスしか出てない場合がある。
このときは、CWDエントリをジョイント。
PATH=./test.txt
CWD=/var/www/html/cgi_write
→ フルパスは、/var/www/html/cgi_write/test.txt

chrootの扱い

さて、実はこれだけではうまくいかない。
chrootしている時。
例えば、vsftpdは、/var/ftpchrootしている。
すると、/var/ftp/pubにアクセスしたときは、
PATH=/path
という、chrootしたところからのパスしかでない。
どこにchrootしたかを何とか探す必要がある。
seedit 2.0ではこの辺が駄目だったが、2.1では改良。

  • 第一段階:capability sys_chrootのログを取る

auditallow domain self:capability sys_chroot;
として、chrootが許可されたログを取る。
すると、
PATH=xxxx
CWD=xxxx
AVC=xxxxx granted sys_chroot
のように、chrootしたパスが出る!

chrootのログを見ていって、
「アプリケーションがchrootしたよ!」ってことを覚えておく。
PATH=/var/ftp
CWD=.
AVCxxx granted chroot pid=1111
ってログが出たら、pid 1111のアプリが/var/ftpchrootした、と覚えておく。
で、以後、pid 1111のアプリのログを解析した場合、
生成されたフルパスの頭に「/var/ftp/chroot」をくっつける。

厄介なのがあって、
pid 1111がchroot -> 子プロセス生成
って場合は、子プロセスにchrootが引き継がれる。なので、ppidを見て、ppidが1111の場合もchrootしたとみなす。

  • 第二段階

実は、これだけではchrootのパスが取れない。
PATH=.
CWD=.
AVC=xxxxx granted sys_chroot
のように、chrootしたパスが「.」だけという謎なログが出て、chroot先がわからないことがある。
こういったアプリを解析すると、chrootの前に「chdir」をしている。
chdirのログを取るようにして、
chroot直前のchdirのログを見てやればいい。
実際、
PATH=/var/ftp
CWD=.
SYCALL..... syscall=12(chdirのこと)

PATH=.
CWD=.
AVC=xxxx granted sys_chroot
のようなログが取得できる。

これから、「/var/ftpchrootした」ことが判明。長かった。。。

  • chdirのログ取り設定

というわけで、seeditでは、auditを使って、
auditctl -a exit,always -S chdir
のように、chdirのログを取っている。が、問題があって、chdirの全ログを取ると、あっという間にログが爆発する(cronが、updatedbしたときとか)
なので、FC6版seeditでは、「confineされたドメインだけのchdirのログを取る」ようにしている。
auditctl -a exit,always -S chdir -F obj_type=httpd_t
みたいなのを列挙している。
ちなみに、CentOSでは、-F obj_typeができないので、全chdirのログを取るしかなかったり。
chdirのログ取り設定は、
FC6の場合
seedit-loadとすると、自動的に行なわれる。
seedit-load -nとすると、chdirのログを取らないようにできる。
CentOSの場合、
seedit-loadとしただけでは、chdirのログが取られない。seedit-load -aとすると、全chdirのログが取られる。
ということは、普通の状態だとCentOSではchroot環境でフルパス推測が失敗することも。

こうやって書いてみると、フルパス取得は大変だ!