第5回 Referenceポリシーの作成と動作テスト

古田 真己
サイオステクノロジー株式会社
インフラストラクチャービジネスユニット
Linuxテクノロジー部
OSSテクノロジーグループ
2006/6/17

 そろそろ読者の皆さんもFedora Core 5(FC5)に触れているころではないかと思います。

 第4回「ReferenceポリシーをEnforcingモードで動かそう」ではReferenceポリシーでのモジュール作成に向けて必要なことをおさらいも含め解説しました。今回は、実際にモジュールを作成してSELinuxのポリシーを仕上げます。

 ドメイン名を考える

 いよいよモジュールの作成に取り掛かります。最初に、アプリケーションバイナリ名を基にしてドメイン名を考えます。これはtomcat.teを作成する部分に当たります。

 アプリケーション実行環境であるTomcatはJavaバイナリによって実行されるので、こういったアプリケーションには通常ドメイン名としてはjava_tやjvm_tなどを割り当てることが考えられます。

Linuxシステム上ではTomcatはjvmの引数(オブジェクト)で表されるので、ドメイン名にするには適当ではない。

 しかしながら、今回Targetedポリシーを適用する対象用途としてサーバでの運用を考えていますので、tomcat_tドメインとして作成します。ここでは、クライアントとしてWebブラウザを使用することを考えないこととします。

 teファイルの構成は、以下の手順で行っていきます。

1.ドメインの定義(tomcat.te)

type tomcat_t;

2.実行バイナリ、設定ファイルのタイプ定義(tomcat.te)

type tomcat_exec_t;

3.ドメインの定義(tomcat.te)

init_daemon_domain(tomcat_t,tomcat_exec_t)

4.ネットワークの使用許可(tomcat.te)

 kernelレイヤに含まれるkernel/corenetwork.ifのインターフェイスを使用します。

corenet_tcp_sendrecv_all_if(tomcat_t)
corenet_udp_sendrecv_all_if(tomcat_t)
corenet_raw_sendrecv_all_if(tomcat_t)
corenet_tcp_sendrecv_all_nodes(tomcat_t)
corenet_udp_sendrecv_all_nodes(tomcat_t)
corenet_raw_sendrecv_all_nodes(tomcat_t)
corenet_tcp_sendrecv_all_ports(tomcat_t)
corenet_udp_sendrecv_all_ports(tomcat_t)
corenet_non_ipsec_sendrecv(tomcat_t)
corenet_tcp_bind_all_nodes(tomcat_t)
corenet_udp_bind_all_nodes(tomcat_t)

 mod_jkで使用するポートをcorenetwork.ifに定義(後述)して、それを使用します(tomcat.te)。

corenet_tcp_connect_tomcat_modjk_port(tomcat_t)
corenet_tcp_bind_tomcat_modjk_port(tomcat_t)

 8080ポートをcorenetwork.ifのインターフェースで指定します(tomcat.te)。

corenet_tcp_bind_http_cache_port(tomcat_t)

5.ログの読み込み設定(tomcat.te)

type tomcat_log_t;
logging_log_file(tomcat_log_t)
allow tomcat_t tomcat_log_t:file append;

6.設定ファイルの読み込み設定(tomcat.te)

sysnet_read_config(tomcat_t)
type tomcat_etc_t;
files_config_file(tomcat_etc_t)
allow tomcat_t tomcat_etc_t:file create_file_perms;
allow tomcat_t tomcat_etc_t:dir rw_dir_perms;

7.corenetwork.ifへのmod_jkのポート設定の追加(corenetwork.if.in)

 Referenceポリシーではネットワークの定義はtomcatやapacheの各モジュールのほか、corenetwork.ifに記述する必要があります。しかし、直接、corenetwork.ifには記述せずに、corenetwork.if.inに記述してコンパイル時に自動生成させます。

network_port(tomcat_modjk, tcp,8009,s0, tcp,8005,s0)

 これを記述することで、4.で指定した以下のインターフェイスが自動的にcorenetwork.ifファイルに加わります。

corenet_tcp_connect_tomcat_modjk_port(tomcat_t)
corenet_tcp_bind_tomcat_modjk_port(tomcat_t)

8.teファイルの完成(tomcat.te)

 1〜7の手順を行い、微調整を行うことで以下のようなポリシーを作成しました。

policy_module(tomcat,1.0.0)

require {
     type bin_t;
     type devpts_t;
     type proc_t;
     type urandom_device_t;
};

type tomcat_t;
type tomcat_exec_t; ←ドメイン設定
init_daemon_domain(tomcat_t,tomcat_exec_t)

type tomcat_log_t;
logging_log_file(tomcat_log_t) ←ログ設定
allow tomcat_t tomcat_log_t:file append;

allow tomcat_t devpts_t:chr_file { read write };

sysnet_read_config(tomcat_t)
type tomcat_etc_t;
files_config_file(tomcat_etc_t) ←コンフィグ設定
allow tomcat_t tomcat_etc_t:file create_file_perms;
allow tomcat_t tomcat_etc_t:dir rw_dir_perms;

type tomcat_tmp_t;
files_tmp_file(tomcat_tmp_t) ←/tmp用の設定
files_create_tmp_files(tomcat_t,tomcat_tmp_t,{file dir})
allow tomcat_t tomcat_tmp_t:file execute;

type tomcat_var_run_t;
files_pid_file(tomcat_var_run_t)
files_create_pid(tomcat_t,tomcat_var_run_t) ←pidファイル用の設定
allow tomcat_t var_t:dir { read remove_name write };
allow tomcat_t var_t:file { getattr read unlink };

allow tomcat_t bin_t:dir r_dir_perms;
allow tomcat_t bin_t:lnk_file r_file_perms; ←/usr/lib/jvm/java/bin/java用の設定
can_exec(tomcat_t,bin_t)

allow tomcat_t self:fifo_file { getattr read write };
allow tomcat_t self:process { sigkill signal };

allow tomcat_t urandom_device_t:chr_file { getattr read };

allow tomcat_t proc_t:dir search;
allow tomcat_t proc_t:file { getattr read }; ←java VM用メモリ関連設定
allow tomcat_t proc_t:lnk_file read;

files_read_var_lib_files(tomcat_t)
files_list_var_lib(tomcat_t)
files_read_var_lib_symlinks(tomcat_t)
files_read_etc_files(tomcat_t) ←そのほかのライブラリなどの設定
files_read_usr_files(tomcat_t)
files_read_usr_symlinks(tomcat_t)
files_read_generic_tmp_files(tomcat_t)
libs_use_ld_so(tomcat_t)
allow tomcat_t lib_t:file { execute getattr read };

corenet_tcp_sendrecv_all_if(tomcat_t)
corenet_udp_sendrecv_all_if(tomcat_t)
corenet_raw_sendrecv_all_if(tomcat_t)
corenet_tcp_sendrecv_all_nodes(tomcat_t)
corenet_udp_sendrecv_all_nodes(tomcat_t)
corenet_raw_sendrecv_all_nodes(tomcat_t)
corenet_tcp_sendrecv_all_ports(tomcat_t)
corenet_udp_sendrecv_all_ports(tomcat_t)
corenet_non_ipsec_sendrecv(tomcat_t) ←ネットワークの設定
corenet_tcp_bind_all_nodes(tomcat_t)
corenet_udp_bind_all_nodes(tomcat_t)
corenet_tcp_connect_tomcat_modjk_port(tomcat_t)
corenet_tcp_bind_tomcat_modjk_port(tomcat_t)
corenet_tcp_bind_http_cache_port(tomcat_t)
allow tomcat_t self:tcp_socket { accept bind connect create getattr listen setopt shutdown read write };
allow tomcat_t self:udp_socket { connect create write };

1/4

Index
Referenceポリシーの作成と動作テスト
Page1
ドメイン名を考える
  Page2
実行ファイルのタイプを考える
インターフェイスを考える
モジュールの作成
ログの再確認と修正
  Page3
FC5におけるポリシーソースのインストール方法
新しくなったaudit2allowによる設定方法
  Page4
SELinuxのこれからの展開


Security&Trust記事一覧


Security&Trust フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Security & Trust 記事ランキング

本日 月間