
RHEL6 を強化した Tomcat サーバーとして設定し、アクセス制御に SELinux ポリシーを適用し始めています。RHEL6 と Tomcat6 (スタンドアロン、httpd なし) をインストールした後、Tomcat プロセスが unconfined_java_t として実行されていることに気付きました。Tomcat を選択したドメインに制限するにはどうすればよいでしょうか?
答え1
RHEL6では、デフォルトのSELinuxユーザーマッピングは次のようになります。
# semanage user -l
Labeling MLS/ MLS/
SELinux User Prefix MCS Level MCS Range SELinux Roles
git_shell_u user s0 s0 git_shell_r
guest_u user s0 s0 guest_r
root user s0 s0-s0:c0.c1023 staff_r sysadm_r system_r unconfined_r
staff_u user s0 s0-s0:c0.c1023 staff_r sysadm_r system_r unconfined_r
sysadm_u user s0 s0-s0:c0.c1023 sysadm_r
system_u user s0 s0-s0:c0.c1023 system_r unconfined_r
unconfined_u user s0 s0-s0:c0.c1023 system_r unconfined_r
user_u user s0 s0 user_r
xguest_u user s0 s0 xguest_r
標準targeted
ポリシーを使用している場合 (確認/etc/selinux/config
または実行してsestatus
確認してください)、SELinux ユーザー マッピングroot
を使用している可能性があります。次のように表示されます。unconfined_u
id -Z
root
をチェックすると、SELinux 対応システムではplain の代わりに を使用する必要があることを示すスイッチ/etc/init.d/tomcat{6,7}
が見つかります。ただし、このコマンドは SELinux ユーザー マッピングが Java プロセスによって継承されるのを防ぐものではありません。if
runuser
su
tomcat
これは関連性があり、私が示そうとしているものです:
つかむselinux-policy
SRPM、java
モジュールのソース コード (ファイル コンテキスト、インターフェイス、および型の適用) を見つけます。
selinux-policy-3.7.19-195.el6_4.6.src/serefpolicy-3.7.19/policy/modules/apps/java.fc
selinux-policy-3.7.19-195.el6_4.6.src/serefpolicy-3.7.19/policy/modules/apps/java.if
selinux-policy-3.7.19-195.el6_4.6.src/serefpolicy-3.7.19/policy/modules/apps/java.te
最初のものは説明不要です。この場合、java_exec_t
標準の場所とオプションの場所の両方からのバイナリとライブラリというラベルが付けられるパスが含まれています。
2 番目はおそらく最も理解しにくいでしょう。これは、このポリシー モジュール内で許可されるドメイン遷移を定義します。1 つのスニペットがあなたの質問に関連しています:
template(`java_role_template',`
gen_require(`
type java_exec_t;
')
type $1_java_t;
domain_type($1_java_t)
domain_entry_file($1_java_t, java_exec_t)
role $2 types $1_java_t;
domain_interactive_fd($1_java_t)
userdom_manage_tmpfs_role($2, $1_java_t)
allow $1_java_t self:process { ptrace signal getsched execmem execstack };
dontaudit $1_java_t $3:tcp_socket { read write };
allow $3 $1_java_t:process { getattr ptrace noatsecure signal_perms };
domtrans_pattern($3, java_exec_t, $1_java_t)
corecmd_bin_domtrans($1_java_t, $3)
dev_dontaudit_append_rand($1_java_t)
files_execmod_all_files($1_java_t)
fs_dontaudit_rw_tmpfs_files($1_java_t)
optional_policy(`
xserver_role($2, $1_java_t)
')
')
そのテンプレートのドキュメントには、「このテンプレートは派生ドメインを作成しますJavaアプリケーションに使用されるここで、「ユーザー ドメインのプレフィックス (例: user は user_t のプレフィックス)」、「ユーザー ドメインに関連付けられたロール」、および「ユーザー ドメインのタイプ」はすべて、Java アプリケーションを実行する SELinux ユーザーから取得されます。
最後に、3 番目のファイルには、型強制ルールとブール定義が含まれています。
さて、制限された SELinux ユーザーを使用して Java アプリケーションを実行するつもりであれば、現在の参照ポリシーにはそのようなポリシーがないため (RHEL6 でもアップストリームでもないと思います)、カスタム ポリシーを作成する必要があります。まずはファイルを複製して、そこから実験してみるとよいでしょう。
確かにそれは簡単な仕事ではありません。