SELinuxで組み込み機器のセキュリティを高める(前編) ―― SELinuxの概要
● SELinuxモジュール
SELinuxによるセキュリティ・チェックそのものを担うのが,Linuxカーネル内のSELinuxモジュールです注3.SELinuxのようなセキュリティ・システムを採用する場合,気になるのはセキュリティ・チェックの性能への影響です.SELinuxモジュールでは,AVC(Access Vector Cache)という実装を採用し,性能への影響を最小限に抑えています(図10).動作は以下のとおりです.
図10 AVCでセキュリティ・チェックの処理を高速化
(1) プロセスがSELinuxリソースにアクセスする際,SELinuxにアクセス可否を問い合わせる.アクセス可否のルールはセキュリティ・ポリシに記述されているが,SELinuxはセキュリティ・ポリシを直接見にいかず,AVCというキャッシュを見にいく.AVCには,過去のアクセス可否の判定結果がキャッシュされている.ここでアクセス可否を判定できれば,処理は終わる.
(2) AVCでアクセス可否を判定できない場合,セキュリティ・サーバというSELinuxの中の機能に処理が渡る.
(3) セキュリティ・サーバは,セキュリティ・ポリシ内のアクセス可否ルールを探索し,アクセス可否を判定する.
(4) セキュリティ・サーバがアクセス可否の判定結果をAVCに書き込む.AVCの探索は,セキュリティ・ポリシの探索より約100倍高速.一般的なシステムではAVCのヒット率は99%以上なので,AVCによって大きく処理速度を向上できる.ちなみに,周波数が200MHz程度のCPUの場合,AVCの探索にかかる時間はμsのオーダである.
(5) SELinuxモジュールのステータス(SELinuxのモードなど)やAVCの統計情報(キャッシュのヒット・ミス回数)などは,selinuxfsというメモリ上の特殊なファイル・システムに記録される.通常は,/selinuxにマウントされる.例えば,/selinux/avcディレクトリには,AVCの統計情報が記録されている.
● ファイル・システムの拡張属性xattr
SELinuxでは,プロセスにドメインを,ファイルなどのリソースにタイプというラベルを付与する必要がありました.ファイルのタイプについては,ファイル・パーミッションや更新日時と同じように,ファイル・システム内部に保存しておく必要があります.そのため,ファイル・システムは,タイプを保存するための領域を確保しておかなければなりません.タイプのようなセキュリティ属性を保存する領域のことを「xattr(Extended Attribute:拡張属性)」と呼びます.SELinuxを使うためには,xattrをサポートしたファイル・システムを使う必要があります.組み込み分野で使われるファイル・システムでは,ext2,ext3,jffs2がxattrに対応しています.一方,yaffs,logfs,cramfsはxattrに対応していません.
● ログ取得のためのauditサブシステム
SELinuxによるアクセス可否判定の結果をログ・ファイルに残すことができますが,ログを取得するために使われているのがauditサブシステムです.
auditサブシステムとは,もともとは「どんなuid,pidのプロセスが,どんなシステム・コールを呼び出したか」といったシステム・コールのログを取得するために用意された仕組みです.そのため,取りこぼしなくログを取得できる堅ろうな実装になっています.現在はシステム・コールのログ以外のログも取得できるようになっており,SELinuxに関するログもauditサブシステムを使って取得されるようになっています.ログ・メッセージは,syslogが動作している場合はsyslogに処理が渡り,ログ・ファイルに記録されます.syslogが動作していない場合は,カーネル・メッセージとして,カーネルのメッセージ・バッファに出力されます.auditdというauditサブシステムに対応したデーモンが動作している場合は,/var/log/audit以下にログが保存されます.
● ユーザランド
SELinuxを使うためには,SELinuxを有効にしたカーネルだけではなく,ライブラリやコマンドが必要です.セキュリティ・ポリシの設定ファイルをカーネルに読み込ませるためのコマンドや,ファイルのラベルを閲覧・変更するためのコマンドがなどが配布されています.主なライブラリ・コマンドを表1に示します.
名 前 | 機 能 | |
ライブラリ | libselinux | SELinux管理コマンドを使うための基本ライブラリ.必須 |
libsepol | SELinuxのポリシ・ファイルを解析するためのライブラリ | |
libsemanage | SELinuxのポリシ・ファイルをモジュール化して管理するためのライブラリ.パソコン・サーバ向けの機能 | |
コマンドの拡張 | ls | ファイルのラベルを閲覧するためのオプション「-Z」が用意 |
ps | プロセスのラベルを閲覧するためのオプション「-Z」が用意 | |
管理コマンド | load_policy | セキュリティ・ポリシの設定ファイルをカーネルにロードする.必須 |
setfiles, restorecon | ファイルのラベル付与設定ファイルの設定を反映.必須 | |
chcon | ファイルに任意のラベルを付与する | |
getenforce, setenforce | SELinuxのモードを切り換える |