RHEL6: Tomcat は制限のない Java ユーザーとして実行されます

RHEL6: Tomcat は制限のない Java ユーザーとして実行されます

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_uid -Zroot

をチェックすると、SELinux 対応システムではplain の代わりに を使用する必要があることを示すスイッチ/etc/init.d/tomcat{6,7}が見つかります。ただし、このコマンドは SELinux ユーザー マッピングが Java プロセスによって継承されるのを防ぐものではありません。ifrunusersutomcat

これは関連性があり、私が示そうとしているものです:

つかむselinux-policySRPM、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 でもアップストリームでもないと思います)、カスタム ポリシーを作成する必要があります。まずはファイルを複製して、そこから実験してみるとよいでしょう。

確かにそれは簡単な仕事ではありません。

関連情報