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하거나 실행 ) SELinux 사용자 매핑을 사용할 가능성이 높습니다 . 당신에게 말하듯 이 .sestatusrootunconfined_uid -Zroot

을 선택하면 SELinux 지원 시스템에서 일반 스위치 대신 사용해야 한다는 스위치를 /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표준 위치와 선택적 위치 모두의 바이너리 및 라이브러리라는 라벨이 붙을 경로가 포함되어 있습니다 .

두 번째는 아마도 가장 이해하기 어려울 것입니다. 이 정책 모듈 내에서 허용되는 도메인 전환을 정의합니다. 귀하의 질문과 관련이 있는 스니펫은 다음과 같습니다.

 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의 접두사)", "사용자 도메인과 관련된 역할" 및 "사용자 도메인의 유형"은 모두 다음을 실행하는 SELinux 사용자로부터 가져옵니다. 자바 애플리케이션.

마지막으로 세 번째 파일에는 유형 적용 규칙과 부울 정의가 포함되어 있습니다.

이제 제한된 SELinux 사용자를 사용하여 Java 애플리케이션을 실행하려는 경우 현재 참조 정책에는 그런 것이 없기 때문에 사용자 지정 정책을 작성해야 합니다(RHEL6이나 업스트림에는 없음). 파일을 복제하여 시작하고 거기서부터 실험해 볼 수 있습니다.

확실히 쉬운 일이 아닙니다.

관련 정보