CentOS6の練習-#12(ClamAVの話,続き-#3)。

 前稿からずいぶん時間が経ってしまった。あと何に取り組もうと考えていたかというと,「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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください