증상

httpd.conf 설정

ProxyRequests Off

<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://localhost:8081/
ProxyPreserveHost On
ProxyStatus On

WAS (tomcat, jetty 등) 가 8081 포트에 떠 있고 apache httpd 에서 mod_proxy 로 연결 설정했으나 연결이 안되고 다음 에러 로그 발생

[Fri Sep 27 11:36:48 2013] [error] (13)Permission denied: proxy: HTTP: attempt to connect to 127.0.0.1:8081 (localhost) failed
[Fri Sep 27 11:36:48 2013] [error] ap_proxy_connect_backend disabling worker for (localhost)
[Fri Sep 27 11:36:48 2013] [error] proxy: HTTP: disabled connection for (localhost)

원인

  1. audit2why 로 분석

    ~# audit2why < /var/log/audit/audit.log
     
    type=AVC msg=audit(1380255768.480:232202): avc:  denied  { name_connect } for  pid=27935 comm="httpd" dest=8081 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:transproxy_port_t:s0 tclass=tcp_socket
            Was caused by:
            The boolean httpd_can_network_connect was set incorrectly. 
            Description:
            Allow HTTPD scripts and modules to connect to the network using TCP.
            Allow access by executing:
            # setsebool -P httpd_can_network_connect 1
    BASH
  2. semanage 로 해당 포트가 binding 된 context 가 있나 확인

    ~# semanage port -l |grep 8081
     
    transproxy_port_t              tcp      8081
    CODE
  3. httpd 가 연결할 수 있는 포트 Context 는 httpd_port_t 이나 8081 port는 transproxy_port_t 이므로 연결 실패

해결

#1 port context 추가

WAS의 포트를 기존 context 에 없는 포트(예: 10080)로 변경하고 SELinux context 에 해당 포트를 추가

  1. 관련 SELinux context 는 http_port_t 이므로 허용 가능한 port 를 확인

    ~# semanage port -l |grep http_port_t
    http_port_t                    tcp      80, 443, 488, 8008, 8009, 8443
    CODE
  2. httpd_port_t 에 10080 포트를 추가

    ~# semanage port -a -p tcp -t http_port_t 10080
    CODE

#2 기존 port context 변경

추가하려는 포트에 이미 다른 보안 컨텍스트가 부여되었을 경우 에러가 발생한다. 톰캣을 사용할 경우 기본 HTTP 포트가  8080 인데 이 포트는 http_cache_port_t 타입이다.

소나타입 넥서스를 사용할 경우 내장된 jetty 의 포트는 8081이며 transproxy_port_t  이나 두 가지 컨텍스트 모두 apache 웹 서버는 연결할 수 없으므로 에러가 발생한다.

이 경우 보안 컨텍스트를 추가하지 않고 변경해야 하며 -a  옵션 대신 -m 옵션을 사용한다.

# semanage port -m -p tcp -t http_port_t  8081
CODE

#3 httpd 의 네트웍 연결 허용(비추천)

sebool 로 httpd 가 모든 network 에 연결 가능하게 설정(httpd 가 해킹됐을 경우 이를 이용하여 2차 침입이 가능해질수 있음)

  1. setsebool -P httpd_can_network_connect on

확인

  1. service httpd restart
  2. 해당 증상이 사라졌는지 확인

Ref