ポリシモジュール調査

ソース無しでどうポリシを追加するのか調査。
なお,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を見てみよう。