Apache httpd는 Unix 도메인 소켓을 통해 Tomcat에 연결할 수 없습니다. - SELinux가 거부되었습니다.

Apache httpd는 Unix 도메인 소켓을 통해 Tomcat에 연결할 수 없습니다. - SELinux가 거부되었습니다.

Unix 도메인 소켓을 통해 Tomcat9/Java17에 연결하기 위해 Rocky9에 Apache httpd v2.4.57을 구성했습니다.

SELinux가 시작되고 다음과 같이 거부되었다고 말합니다.

type=AVC msg=audit(1685376249.480:134): avc:  denied  { connectto } for  pid=1769 comm="httpd" path="/run/tomcat-xxx2-yyy/socket" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:tomcat_t:s0 tclass=unix_stream_socket permissive=0
type=SYSCALL msg=audit(1685376249.480:134): arch=c000003e syscall=42 success=no exit=-13 a0=12 a1=7faa3403a050 a2=27 a3=727461702d746163 items=0 ppid=1767 pid=1769 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null)^]ARCH=x86_64 SYSCALL=connect AUID="unset" UID="apache" GID="apache" EUID="apache" SUID="apache" FSUID="apache" EGID="apache" SGID="apache" FSGID="apache"
type=PROCTITLE msg=audit(1685376249.480:134): proctitle=2F7573722F7362696E2F6874747064002D44464F524547524F554E44002D6600636F6E662F6465766963652D6D61696E2E636F6E66

이것이 작동하려면 SELinux 구성에서 명시적으로 무엇을 변경해야 합니까?

소켓에 컨텍스트를 설정합니까? 현재 소켓 컨텍스트는 다음과 같지만 행운은 없습니다.

[root@swordfish ~]# ls -alZ /run/tomcat-xxx2-yyy/socket 
srw-rw----. 1 fma fma system_u:object_r:httpd_var_run_t:s0 0 May 29 17:56 /run/tomcat-xxx2-yyy/socket

selinux 부울을 설정합니까? 그렇다면 어느 것, 무엇을 위해?

답변1

오류 메시지를 통해 SELinux가 Apache HTTP 서버에서 Tomcat 서버로의 연결을 차단하고 있음을 알고 있습니다. (Apache HTTPD에 할당됨)은 UNIX 소켓( ) httpd_t을 사용하여 .unix_stream_sockettomcat_t

이 작업을 허용하는 사용자 정의 SELinux 정책 모듈을 만들어 보겠습니다.

먼저 audit2allow도구를 사용하여 Type Enforcement를 생성합니다.

grep 'comm="httpd"' /var/log/audit/audit.log | audit2allow -M my_httpd_tomcat

그런 다음 정책 패키지를 설치할 수 있습니다

sudo semodule -i my_httpd_tomcat.pp

semanage또 다른 해결책은 소켓의 유형 컨텍스트를 변경하는 데 사용하는 것입니다 .

sudo semanage fcontext -a -t httpd_unix_stream_connect_t "/run/tomcat-xxx2-yyy/socket"
sudo restorecon -v "/run/tomcat-xxx2-yyy/socket"

답변2

비결은 거부 이유를 해석하고 해결책을 제안하는 audit2why 명령입니다. 이 명령은 변경의 파급 효과와 부작용에 대한 완전한 지식을 바탕으로 적용할 수 있습니다.

[root@swordfish ~]# cat /var/log/audit/audit.log | audit2why | less

이를 통해 다음과 같은 사실이 드러났습니다.

type=AVC msg=audit(1685362712.138:110): avc:  denied  { connectto } for  pid=1804 comm="httpd" path="/run/tomcat-xxx2-yyy/so
cket" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:tomcat_t:s0 tclass=unix_stream_socket permissive=0

        Was caused by:
        The boolean daemons_enable_cluster_mode was set incorrectly. 
        Description:
        Allow daemons to enable cluster mode

        Allow access by executing:
        # setsebool -P daemons_enable_cluster_mode 1

결과적으로 이 특정 질문에 대한 답변을 권장했는데, 이는 다음과 같습니다.

setsebool -P daemons_enable_cluster_mode 1

위 모드는 즉시 적용됩니다.

소켓에 컨텍스트를 설정합니까? 그렇게 하는 것만으로는 충분하지 않습니다. Unix 도메인 소켓의 경우 소켓 파일의 컨텍스트뿐만 아니라 프로세스의 컨텍스트(이 경우 tomcat)도 고려됩니다.

부울 "daemons_enable_cluster_mode"는 데몬이 서로 통신할 수 있도록 하는 내장된 SELinux 정책을 활성화합니다.

관련 정보