Linuxのセキュリティ周りを拡張するフレームワークであるLinux Security Modules(LSM)を作ってみます。LSMはSELinuxやTOMOYO Linuxの実装に使われており、LSMを利用することでシステムのさまざまな部分をフックしてアクセス制御などの処理を実現することができるようになります。
とりあえず以下の記事にあったLSMのスケルトンを実際にUbuntuに組み込んでみたのでメモしておきます。
Writing a Skeleton Linux Security Module | recluze
インストール
カーネル構築の準備
必要なツールとカーネルのソースコードをインストールしておきます。
うちの環境(Ubuntu 11.04)ではこのままだとエラーになってしまったため、こちらを参考に対処。
以下のように修正。
LSMの追加
LSMのスケルトンをダウンロードしてきてカーネルに組み込みます。
そのままだと大量のログを吐いて操作不能になるのとか、記述が古かったりするのを修正。
MakefileとKconfigに追加したLSMを含める設定を追記します。
Makefile
Kconfig
カーネルの構築
現在利用しているカーネルの設定をもとにLSMを組み込んだカーネルを構築します。make oldconfigを実行すると追加したLSMを有効にするかどうか聞かれるので、yを選択して有効にしてください。
LSMを利用する設定
GRUBの設定を変更して作成したLSMが利用されるようにします。
以下のように記述。
動作確認
再起動するとLSMが組み込まれたカーネルで起動します。printk関数で出力したログは/var/log/dmesgに保存されるので、blabbermouth:で始まるログがあることを確認してください。
困っているところ
とりあえずLSMを組み込んだカーネルを起動させることには成功したのですが、分からない点がいろいろと。
初期化時のログが出力されない
LSMの初期化を行うblabbermouth_init内でprintk関数を呼び出してもログが残ってくれません。ログレベルをKERN_EMERGなどとすると画面上には表示されるので、実行されてはいるみたいですし、他のLSMの出力するログは出力されてるみたいなのですが……。
security_module_enableを呼んでいない
ドキュメントや他のLSMのソースを眺めていると、どうも初期化時にsecurity_module_enable関数を呼び出さなければならないようなのですが、今回参考にしたサンプルではそれが行われていませんでした。試しにsecurity_module_enable関数を呼び出すように書き換えてみたのですが、動作しなくなってしまいました。security_module_enable関数のコードを見た感じだと、動作しないほうが正しいような気すらしてしまうのですが、どうなっているんでしょうかね。
makeが遅い
LSMを1行いじっただけで30分近く待たされてしまうのはちょっと耐えられません。何かがおかしい気がします。
おわりに
AKARIを使えばカーネルの再構築をすることなくLSMを実装することができると聞いたので、試してみたいなぁと思っています。