実践Linux
SELinux SELinux 目次へ TOP(HOME)へ
SELinux 新しいタイプとポリシ・モジュールの作成 2009年3月
「audit2allowを使って問題を簡易解決する」でみたような生成されたallow文だけに頼る方法だと、かなり危険な設定になってしまう場合が多い。たとえばhttpd_tドメインにhttpd_sys_content_tタイプへの書き込みを許可するなど。このタイプは,/var/www以下すべてに付与されたタイプであるため,httpd_tドメインは/var/www全体に書き込めてしまう。しかし実際は,一部ディレクトリ以下にしか書き込み権限は必要なく,権限を与え過ぎである。
これを解決するには,新たなタイプを付与する等の設定が必要になる。
少し古い話になるが、CentOS5でhttp認証(Basic、Digest)を設定したとき、たとえば/home/hoo/conf/にパスワードファイル.htpasswdなどを置いたとき、/home/hoo/以下のディレクトリのアクセス認証に失敗してしまった。(/var/www/では大丈夫なのだが。)
アプリケーション→システムツール→SELinux Troubleshooterで、どこで引っかかっているかみてみたら、user_home_t:dir searchが原因のようだった。
そこで/home/hoo/conf以下にpublic_content_tタイプ(万能タイプ)をつけてみた。
# semanage fcontext -a -t public_content_t "/home/hoo/conf(/.*)?"
# restorecon -RF /home/hoo/conf
当然、認証が通るようになる。
しかしこれはあまりいい方法とは言えないので、新たなタイプを導入してみた。以下は、その時の対処を述べたもの。
目標 /home/hoo/conf以下に新しいタイプmy_type01_tを付与し、http認証が通るようにしてみる
●モジュール方式のポリシー・ファイル
ポリシー・ファイルの実体は「/etc/selinux/targeted/policy/policy.21」にある。
デフォルトでは、baseモジュール・パッケージがポリシー・ファイルに組み込まれており、インストール時に標準添付されるアプリケーションが動作するようになっている。
またユーザー自身もモジュール・パッケージを後で追加できるようになっている(ユーザー定義パッケージ)。
この方式の利点は、baseモジュール・パッケージに設定された内容を意識することなくポリシーを追加できることである。
●モジュール・パッケージ
ポリシーを追加するには「モジュール・パッケージ」を作成し、それをインストールする。
モジュール・パッケージを作成するには、アクセス許可設定とファイルのタイプ付与設定を記述する必要がある。アクセス許可設定は、拡張子が「.te」というテキスト・ファイルに記述し、ファイルのタイプ付与設定は、拡張子が「.fc」というテキスト・ファイルに記述する。このteファイルとfcファイルをバイナリ形式の一つのファイルに変換したものが「モジュール・パッケージ」である。
teファイル
teファイルの書式は,次のようになる。allow書式によるアクセス許可設定が設定内容の中心になる。
module local 1.0; モジュール・パッケージ名を指定。「local」という名前を付けることが一般的。バージョン番号は,改訂履歴を表す。
require { 使用する各種項目(タイプ,ドメイン,オブジェクト・クラス,パーミッション)の名前を列挙。
class file write;
type httpd_t;
type httpd_sys_content_t;
};
allow httpd_t httpd_sys_content_t file:write; アクセス許可の設定。httpd_tドメインにhttpd_sys_content_tタイプが付与されたfileオブジェクト・クラスへのwrite=書き込みを許可する。
fcファイル
fcファイルの書式は、file_contextsファイルの書式に似ている。
<ファイル名(正規表現可)> --|-d|-l|-c|-b gen_context(system_u:object_r:<タイプ>,s0)
例 /home/hoo/conf(/.*)? gen_context(system_u:object_r:my_type01_t,s0)
正規表現で最もよく使うのはディレクトリ以下のファイルをすべて表す<ディレクトリ名>(/.*)?
--は通常のファイルのみ、-dはディレクトリ、-lはシンボリックリンク、-cはキャラクタ型デバイス・ファイル、-bはブロック型デバイス・ファイル、何も付けないとすべてのファイル種別にラベル付けを行う。
●モジュール・パッケージ作成の準備
@checkpolicyパッケージのインストール(CentOS5ではインストール済み)
このパッケージには,テキスト形式の設定(teファイル,fcファイル)をモジュール・パッケージの形式に変換するためのコマンド類が含まれる。
# yum list installed | grep checkpolicy でインストールされているか調査。
もし、インストールされていなければ # yum install checkpolicy
Aselinux-policy-develのインストール(新しいタイプを作成するときは必須。)
# yum install selinux-policy-devel インストール(/usr/share/selinux/devel)
作業ディレクトリを作成しておく。ここでは/root/selinuxとする。
ここに /usr/share/selinux/devel/Makefileをコピーしておく。
●モジュール・パッケージの作成
/home/hoo/conf以下に新しいタイプmy_type01_tを付与し、http認証が通るようにしてみる。
これからは、上で作成した/root/selinuxで作業する。
teファイルの設定 :新タイプmy_type01_tの宣言
新しいタイプを付与する設定ではまず、teファイルで新しいタイプを宣言する。タイプを宣言しておけば、重複してしまったときでも設定反映時にエラーが表示されるので対処可能となる。
local.teファイル
module local 1.0;
type my_type01_t;
files_type(my_type01_t)
fcファイルの設定 :ファイルとタイプの関連付け
タイプを宣言したら、次はファイルにタイプを付与する設定を記述する。これはfcファイルに記述する。
local.fcファイル
/home/hoo/conf(/.*)? gen_context(system_u:object_r:my_type01_t,s0)
タイプ付与設定の反映
タイプ付与設定を反映するには,モジュール・パッケージのインストールとrestoreconコマンドを実行する。
モジュール・パッケージlocap.ppの作成とインストール
# make
# semodule -i local.pp
fcファイルに設定した内容は,自動的に反映されないため,restoreconコマンドを実行する。
# restorecon -RF /home/hoo/conf
タイプを確認
# ls -Z /home/hoo/conf
しかし、これだけだとうまく反映されてないことがわかる。それは、/etc/selinux/targeted/contexts/files/file_contextsに「/home/hoo/conf(/.*)?
system_u:object_r:my_type01_t:s0」が書き込まれているが、restoreconを実行したとき、file_contexts→file_contexts.homedirs→file_contexts.localの順に読み込まれていくため、最初のfile_contextsの設定がfile_contexts.homedirsやfile_contexts.localで上書きされてしまう。ここでは、/home関係はfile_contexts.homedirsの内容で上書きされて元の設定に戻ってしまうことになる。従って、「/home/hoo/conf(/.*)?
system_u:object_r:my_type01_t:s0」内容をfile_contexts.localに移動してやる。
/etc/selinux/targeted/contexts/files/file_contextsの「/home/hoo/conf(/.*)?
system_u:object_r:my_type01_t:s0」を削除し、file_contexts.localに移動してやる。
# restorecon -RF /home/hoo/conf
タイプを確認
# ls -Z /home/hoo/conf# restorecon -RF /home/hoo/conf
●ポリシー・モジュールの作成
しかしまだこの状態では、どのドメインもmy_type01_tにアクセスできない。allow設定を用いて、my_type01_tへの読み書き権限を与える必要がある。
permissiveモードで動作テストを行い、動作テスト中に得られたアクセス拒否ログに基づいて、必要な設定をaudit2allowコマンドで生成する。
permissiveモードにしてパスワード付きページにhttp認証でアクセスしてみる。
# audit2allow -a -l -r
この表示内容をlocal.teに追加し、設定を反映する。
local.teファイル
local.te module local 1.1;
type my_type01_t;
files_type(type my_type01_t)
require { ←require以下追加。
type http_t;
type my_type01_t;
class dir search;
class file { read getattr };
}
allow http_t my_type01_t:dir search;
allow http_t my_type01_t:file { read getattr };
# make
# semodule -i local.pp
/etc/selinux/targeted/contexts/files/file_contextsの「/home/hoo/conf(/.*)?
system_u:object_r:my_type01_t:s0」を削除し、file_contexts.localに移動してやる。
# restorecon -RF /home/hoo/conf
enforcingモードに戻して、動作を確認する。
動作しなければ、動くまで設定の追加を繰り返す。
●ポリシー・モジュールの削除
# semodule -r local
SELinux目次
TOP(HOME)へ