ポリシモジュール調査
ソース無しでどうポリシを追加するのか調査。
なお,SELinuxのコア部分では,モジュールじゃないポリシにも対応している。
以下,自分用&物好きな人向けのメモです。
ポリシモジュールとは
- モジュール:一つのteファイルをバイナリ形式にしたもの
- パッケージ:モジュールとfcファイルをパックしたもの
で,ポリシは,パッケージの塊で構成されている。
パッケージは,取ったりつけたりが自在。
C言語におけるライブラリみたいなもんですね。
ポリシの配布や取捨選択が楽になるに違いない…
感想
- ポリシの開発者にとっては便利なものである。
- 特に「ポリシの追加」は非常に素晴らしくなった。
- 「追加したポリシ」の管理がしやすい。
- モジュールを使いたくない人は,ソースを使えばよい。
- 一般ユーザに対する影響はほとんど無し。たぶん。
- (ソースを使ってない場合)何が設定されているか確認しようと思うと,setoolsを使うしかなくなる。コマンドライン版setoolsが欲しくなる。
ドキュメント
Smalley氏によると,鍵はaudit2allow。
man audit2allowしよう。
で,EXAMLEをみよう。
おそらく,これが最重要なドキュメント。
http://sepolicy-server.sourceforge.net/index.php?page=module-language
も重要。
モジュールの書式
require{
…
}
のところに,モジュール名,依存関係(定義すべきタイプ,オブジェクトクラス,アクセスベクタパーミッション)を列挙する。
あとは普通のteファイルと一緒。
依存関係は,機械的に生成できる。
audit2allow -mを使えば,勝手にやってくれる。
これをcheckmoduleコマンド,semodule_packageコマンドで
パッケージを作り,ポリシに組み込む。
慣れれば,ポリシの反映速度が早くなってなかなかいいかも。
モジュールは,baseモジュールが必須で,そこに付け足していく形になる。
semodule -l
すると,インストールされているモジュール一覧が分かる(baseモジュールは表示されない)
teファイルの追加
「ポリシの追加」は簡単にできる。
audit2allowの「Example」にあるとおり。
以下,localというパッケージを作り,それを反映する場合。
localモジュールをログから作成
#audit2allow -m local -i /var/log/audit/audit.log -o local.te
#checkmodule -M -m -o local.mod local.te
localモジュールをパッケージに。
#semodule_package -o local.pp -m local.mod
パッケージをインストール
#semodule -i local.pp
確認
#semodule -l
local 1.0
man checkmodule
man semodule_package
man semodule
するとさらに深く分かることでしょう。
fcファイル
fcファイルもモジュール化されてる。
これはいいかも。
例:
/root/testにroot_tというタイプを追加したい場合。
●local.fc
/root/test system_u:object_r:root_t:s0
注意:FCファイルの最後に「s0」をつけないとエラーになる。
これをlocalモジュールにパッケージする。
# semodule_package -o local.pp -m local.mod -f local.fc
local.ppに,fcファイルもパッケージされる
# semodule -i local.pp
でインストール完了。
で,
/etc/selinux/targeted/contexts/files/file_contexts
を見ると追加されてる。
モジュールの削除
semodule -r local
ハマリ
assertionチェックの回避が難しい(ソースがないので)
audit2whyユーティティを使うとよさそうだが…
例:
[root@localhost ~]# semodule -i local.pp
libsepol.check_assertion_helper: assertion on line 0 violated by allow avahi_t fixed_disk_device_t:blk_file { read };
というエラーが出た場合。
audit2why < /var/log/audit/audit.log
駄目だ。正しい理由が出てこない。
こりゃやっぱソース見るしかない…
ソースのpolicy.confをgrepしてneverallowを探す
で,
local.teに
typeattribute avahi_t fixed_disk_raw_read;
を追加。
また,requires{}の間に
attribute fixed_disk_raw_read;
を追加。
local.teに新たに何か追加する時もちょっとめんどいかも。
今は,local.teを記述する際,ソース無しだと生のallow文を使う必要があった。が,将来的には,reference policyのマクロを,ソース無しでも使えるようになる。/usr/includeにマクロが配置されるとか。
ざっと見たが,モジュールもさほど恐れるに足りず。
次は,refpolicyを見てみよう。