実践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)へ

目 次

特別企画
Raspberry Piで遊ぶ

HOME(全体のシステム構成&目次)

CentOS7
CentOS7のインストール〜ネットワークの設定ほか
CentOS7の新機能(systemdとfirewalld)
ダイレクトルールを使ったfirewallの強化
DNS(BIND)サーバー
Webサーバー
  Webでファイルの受け渡し
  アクセス解析ツールAwstats
  Wordpressでブログ構築
  EC-CUBEショッピングサイト構築
FTPサーバー
FTPS(FTP over SSL/TLS)
Mail(Dovecot&Postfix)サーバー
Sambaサーバー
MariaDB(MySQL)サーバー
DHCPサーバー
SSHサーバー
VNCサーバー
ストリーミングサーバーRed5
ドメインの追加

CentOS5〜6
ネットワーク&ファイアウォール(iptables)
DNS(BIND)サーバー
DHCPサーバー
メールサーバー(基本)
メールサーバー/実際の運用
Webサーバー
  WebDAVによるファイル共有
  Webでファイルのやり取り
  アクセス解析ツールawstats
  namazuで全文検索
  WordPressブログサイト構築
  EC-CUBEショッピングサイト構築
FTPサーバー
ファイルサーバー・Samba
データベースpostgreSQL
  ExcelからpostgreSQLを操作
データベースMySQL
SSHサーバー
VNC
SSL/TLSを利用した暗号化通信
openVPN
ストリーミングサーバー
    C++ RTMP Server
    Helix server Basic
ドメインの追加
Xen・仮想化
特定ディレクトリに容量制限

SELinux
SELinux基本設定
audit2allowを使い問題の解決
新しいタイプとポリシー・モジュールを作成してみる
マクロを利用したteファイルの記述
新しいドメインを導入してみる

coLinux
Fedora11で試す

Cプログラミング目次
X11プログラム
サイエンス・プログラム

計測・プログラム
秋月電子のデーターロガーpico ADC-16
「今すぐ使えるパソコン計測USBマイコン基板」に付属のTRZ1102
センサーの使用例

Glade2/GTK+を使ってみる
テキスト・ビューで簡易エディター
ドローイングエリアで自動描画
放物線運動(pango、cairoも試してみる)
これらを、GTK+のみで書き出す

フォントについて
ネットワーク・プログラミング
postgreSQL接続
CGI
ファイル操作

●その他
印刷機関連開発 刷版絵柄面積率測定
数独をExcelで解く