前稿からずいぶん時間が経ってしまった。あと何に取り組もうと考えていたかというと,「avc: deniedをもとに,
clamdについてSELinuxのポリシーを新しく作る」である。記事を書いて読み直してみたら,「ClamAVの話」というより,SELinuxの話になってるなあ。
ところで正直なところ,Access Vector Cache (AVC)そのものが,いまだによくわかっていない状態である。
そもそも,SELinuxには,Access Vectorルール(P.157参照)というのがあって,これはあるプロセスが(今の場合 clamd),ある作業をすることについてのルールであるらしい。で,これを素早く利用するためにキャッシュが作られるのだが,これがAVC。avc: denied(Clam-Per-rt参照)というのが,audit.logに出るということは,必要な作業についての特権が,当該プロセスに許されていないということになる。「Clam-Per-rt」を見ると,avc: deniedが11行出ていて,scontext(Source Context)は11行とも
scontext=unconfined_u:system_r:clamd_t:s0
である。これは,アクセス元の pid=1362 clamd のセキュリティ・コンテキストなわけだから,11個とも同じなのは当然だ。で,:で区切られた4つの部分を左から順に user:role:type[:level] と呼ぶらしい(Security Context (P.20) 参照)。プロセス clamd は clamd_t ドメインで動いているというわけだ。 Clam-Per-rt は, Permissive かつ User root で clamdscan を /home/centos で走らせたときのログなんだが,このとき user は unconfined_u ,role は system_r となっている。
一方,プロセス clamd のスナップショットを表示してみると,以下のようになる。ここでは,user が system_u になる。OSを起動したときにデフォで動き出すプロセスのほとんどが,system_u:system_rになっているみたい。この辺もまだよくわからない。グダグダだね。
$ ps -AZ | grep clamd
system_u:system_r:clamd_t:s0 xxxx ? 00:00:00 clamd
さらに,グダグダになるが,忘れないために書いておくと,ps -A(ps -eでも同じ)にくっついている Z は,SELinuxのオプションで,これをつけると大抵のものについて,セキュリティ・コンテキストを表示してくれる。例えば,今の段階で,/home/centos に aaa.txt を作っておいて
$ ls -Z とやると,
-rw-r–r–. centos users unconfined_u:object_r:user_home_t:s0 aaa.txt
というように,aaa.txt のセキュリティ・コンテキストが表示される。
さて,よくわからないなりに,モジュール・パッケージを作ってみることにする。audit2allow を使うらしいが,
$ sudo yum provides */audit2allow
で調べてみると,含まれている policycoreutils-python-2.0.83-19.24.el6.i686 が未インストールなので,まずはこれをインストール。
$ sudo yum install policycoreutils-python
でね,audit2allow マンを見て, -M オプションを付けて,
$ sudo cat /var/log/audit/audit.log | audit2allow -M myClamAV
とやってみた。
******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i myClamAV.pp
というメッセージが戻って来て,/home/centos には,myClamAV.pp と myClamAV.te が出来た。
xxx.pp <<— Policy packages つまり,新ポリシーをロードするためのモジュールパッケージ。
xxx.te <<— Private policy files in the Reference Policy xxx.ppに何が定義されているかを教えてくれる。
さあこれで,semodule -i myClamAV.pp をやれば,新しいポリシーが有効になる。とはいうものの,セキュリティ関係の話だから,実態も把握せずに新ポリシーを有効にするのは論外。というわけで,早速,myClamAV.teを覗いてみた。これ見てもらったらわかるけど,とんでもないことになっていた。前稿までにいろいろやったことがすべて audit.log に残ったままだったわけだ。これじゃあんまりだというわけで, myClamAV.pp は削除し, myClamAV.te と Clam-Per-rt を参考にしながら,新しい myClamAV.te を作ってみた。
Clam-Per-rt をみると, type: xxxx_t で使われているのは,次の4つ。これを module myClamAV 1.0; の後に require として記述。
clamd_t
home_root_t
user_home_dir_t
user_home_t
次に,myClamAV.te に class xxxx という行があるが,Clam-Per-rt で使われているclassという単語は,tclass(target class)だけで,tclass=dir と tclass=file の2つ。tclass=dir 関連の denied は, search getattr read open ,また,tclass=file 関連の denied は, read open だから,以下の2行を require に追加し,これを閉じる。
class dir { search getattr read open };
class file { read open };
最後に, clamd_t に allow を許可することを列記する。
allow clamd_t home_root_t:dir search;
allow clamd_t user_home_dir_t:dir { getattr read open search };
allow clamd_t user_home_t:dir { getattr read open search };
allow clamd_t user_home_t:file { read open };
出来上がったのが,新myClamAV.te。なんというか,これ,上出来だった。あとで, audit.log を真っ新にして,audit2allow に作らせてみたのと順番が多少違うだけで,同じだったヨ。
編集した myClamAV.te をチェック。checkmodule マン参照。
$ checkmodule -M -m myClamAV.te -o myClamAV.mod
これが,エラーなしで通るまでやる。基本的にやっていることは間違っていなかったが,綴りミスとかセミコロン忘れとか,2回ばかりエラーが出た(恥)。通ると myClamAV.mod ができる。次は, myClamAV.pp を生成。semodule_package マン参照。
$ semodule_package -o myClamAV.pp -m myClamAV.mod
できたモジュールをインストールした。
$ sudo semodule -i myClamAV.pp
ちゃんとインストールされたかどうか,確認。
$ sudo semodule -l|grep myClamAV
myClamAV 1.0 が戻ってきた。インストール完了。
で,何が出来るようになったかというと,以下の環境において,ユーザのホームディレクトリ(例えば,/home/centos)で clamdscan がエラーなく走るようになった。
$ getenforce
Enforcing
$ grep User /etc/clamd.conf
User root
=======================================================
$ clamdscan
/home/centos: OK
———– SCAN SUMMARY ———–
Infected files: 0
Time: 0.001 sec (0 m 0 s)
==============================================こんな感じ
あくまで,ユーザのホームディレクトリという制限つきだから, /root だと,以下のように見慣れたエラーが戻ってくる。
=======================================================
# clamdscan
/root: lstat() failed: Permmision denied. ERROR
———– SCAN SUMMARY ———–
Infected files: 0
Tlotal errors: 1
Time: 0.000 sec (0 m 0 s)
=======================================================
さて,Enforcing,User root で clamdscan を走らせることができた。あとは,User clamav でということなのだが,これはまだまだ前途多難なようなので,後回しにして他のことに取り組もうと思う。
ところで, clamscan を自動で走らせるときに,そのオプションを下記のようにしようかなと思っている。
clamdscan /
–infected
–recursive
–move=/var/log/clamav/virus
–log=/var/log/clamav/clamav_`date +%Y-%m-%d`.log
–exclude-dir=^/sys
–exclude-dir=^/proc
–exclude-dir=^/dev
–exclude-dir=^/var/log/clamav/virus
で,参考に読んだところでは clamdscan のオプションは clamscan に準じると書いてあったが,上のを clamdscan で使うと,
WARNING: Ignoring unsupported option –recursive (-r)
WARNING: Ignoring unsupported option –exclude-dir
WARNING: Ignoring unsupported option –exclude-dir
WARNING: Ignoring unsupported option –exclude-dir
WARNING: Ignoring unsupported option –exclude-dir
が戻ってくる。ということは,同じ使い方はできないということになりそうだ。clamscan と clamdscan の違いを考えると,ダウンロードディレクトリをスキャンするのに使うのが現実的かな。
ああそうだ,忘れないうちに, myClamAV をアンインストールしておこう。
$ sudo semodule -r myClamAV.pp