Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

13장. Apache HTTP 서버

Apache HTTP 서버는 현재 HTTP 표준과 함께 오픈 소스 HTTP 서버를 제공합니다.[14]
Red Hat Enterprise Linux에서 httpd 패키지는 Apache HTTP 서버를 제공합니다. 다음 명령을 입력하여 httpd 패키지가 설치되어 있는지 확인합니다.
~]$ rpm -q httpd
package httpd is not installed
설치되지 않고 Apache HTTP 서버를 사용하려면 root 사용자로 yum 유틸리티를 사용하여 설치합니다.
~]# yum install httpd

13.1. Apache HTTP 서버 및 SELinux

SELinux가 활성화되면 기본적으로 Apache HTTP Server(httpd)가 제한된 실행됩니다. 제한된 프로세스는 자체 도메인에서 실행되며 다른 제한된 프로세스와 분리됩니다. SELinux 정책 구성에 따라 공격자가 제한된 프로세스가 손상되면 공격자가 리소스에 대한 액세스와 가능한 손상을 제한합니다. 다음 예제에서는 자체 도메인에서 실행되는 httpd 프로세스를 보여줍니다. 이 예제에서는 httpd,setroubleshoot,setroubleshoot-serverpolicycoreutils-python 패키지가 설치되어 있다고 가정합니다.
  1. getenforce 명령을 실행하여 SELinux가 강제 모드로 실행 중인지 확인합니다.
    ~]$ getenforce
    Enforcing
    
    명령은 SELinux가 강제 모드에서 실행 중일 때 Enforcing (강제)을 반환합니다.
  2. root로 다음 명령을 입력하여 httpd 를 시작합니다.
    ~]# systemctl start httpd.service
    서비스가 실행 중인지 확인합니다. 출력에는 아래 정보가 포함되어야 합니다(시간 스탬프만 다릅니다).
    ~]# systemctl status httpd.service       
    httpd.service - The Apache HTTP Server
    	  Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
    	  Active: active (running) since Mon 2013-08-05 14:00:55 CEST; 8s ago
    
  3. httpd 프로세스를 보려면 다음 명령을 실행합니다.
    ~]$ ps -eZ | grep httpd
    system_u:system_r:httpd_t:s0    19780 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    19781 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    19782 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    19783 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    19784 ?        00:00:00 httpd
    system_u:system_r:httpd_t:s0    19785 ?        00:00:00 httpd
    
    httpd 프로세스와 연결된 SELinux 컨텍스트는 system_u:system_r:httpd_t:s0입니다. 컨텍스트의 마지막 부분인 httpd_t 는 유형입니다. 유형은 프로세스 및 파일의 유형에 대한 도메인을 정의합니다. 이 경우 httpd 프로세스는 httpd _t 도메인에서 실행됩니다.
SELinux 정책은 제한된 도메인(예: httpd_t)에서 실행되는 프로세스가 파일, 기타 프로세스 및 일반적으로 시스템과 상호 작용하는 방법을 정의합니다. httpd 액세스를 허용하려면 파일에 올바르게 레이블이 지정되어야 합니다. 예를 들어 httpdhttpd_sys_content_t 유형으로 레이블이 지정된 파일을 읽을 수 있지만 Linux(DAC) 권한이 쓰기 액세스를 허용하는 경우에도 쓸 수 없습니다. 스크립트 네트워크 액세스 허용, NFS 및 CIFS 볼륨에 대한 httpd 액세스 허용, CGI(Common Gateway Interface) 스크립트를 실행할 수 있는 httpd 등의 특정 동작을 허용하려면 부울을 활성화해야 합니다.
httpd 가 TCP 포트 80, 443, 488, 8008, 8009 또는 8443 이외의 포트에서 수신 대기하도록 /etc/httpd/conf/httpd.conf 파일을 구성하는 경우 semanage port 명령을 사용하여 SELinux 정책 구성에 새 포트 번호를 추가해야 합니다. 다음 예제에서는 httpd 의 SELinux 정책 구성에 아직 정의되어 있지 않은 포트에서 수신 대기하도록 httpd 를 구성하는 방법을 보여주므로 httpd 가 시작되지 않습니다. 이 예제에서는 httpd 가 정책에 아직 정의되지 않은 비표준 포트에서 수신 대기하도록 SELinux 시스템을 구성하는 방법도 보여줍니다. 이 예제에서는 httpd 패키지가 설치되어 있다고 가정합니다. 예제에서 root 사용자로 각 명령을 실행합니다.
  1. 다음 명령을 입력하여 httpd 가 실행 중이 아닌지 확인합니다.
    ~]# systemctl status httpd.service
    httpd.service - The Apache HTTP Server
    	  Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
              Active: inactive (dead)
    
    출력이 다르면 프로세스를 중지합니다.
    ~]# systemctl stop httpd.service
  2. semanage 유틸리티를 사용하여 SELinux에서 httpd 가 수신 대기할 수 있는 포트를 확인합니다.
    ~]# semanage port -l | grep -w http_port_t
    http_port_t                    tcp      80, 443, 488, 8008, 8009, 8443
    
  3. /etc/httpd/conf/httpd.conf 파일을 root로 편집합니다. httpd 의 SELinux 정책 구성에 구성되지 않은 포트를 나열하도록 Listen 옵션을 구성합니다. 이 예제에서는 httpd 가 포트 12345에서 수신 대기하도록 구성되어 있습니다.
    # Change this to Listen on specific IP addresses as shown below to 
    # prevent Apache from glomming onto all bound IP addresses (0.0.0.0)
    #
    #Listen 12.34.56.78:80
    Listen 127.0.0.1:12345
    
  4. httpd 를 시작하려면 다음 명령을 입력합니다.
    ~]# systemctl start httpd.service
    Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.
    
    다음과 유사한 SELinux 거부 메시지가 기록됩니다.
    setroubleshoot: SELinux is preventing the httpd (httpd_t) from binding to port 12345. For complete SELinux messages. run sealert -l f18bca99-db64-4c16-9719-1db89f0d8c77
    
  5. SELinux가 이 예제에서 사용된 대로 httpd 가 포트 12345에서 수신 대기하도록 하려면 다음 명령이 필요합니다.
    ~]# semanage port -a -t http_port_t -p tcp 12345
  6. httpd 를 다시 시작하고 새 포트에서 수신하도록 합니다.
    ~]# systemctl start httpd.service
  7. 이제 httpd 가 비표준 포트(이 예에서는 TCP 12345)에서 수신 대기하도록 SELinux가 구성되었으므로 이 포트에서 httpd 가 성공적으로 시작됩니다.
  8. httpd 가 수신 대기하고 TCP 포트 12345에서 통신하고 있음을 증명하려면 지정된 포트에 대한 telnet 연결을 열고 다음과 같이 HTTP GET 명령을 실행합니다.
    ~]# telnet localhost 12345
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    GET / HTTP/1.0
    
    HTTP/1.1 200 OK
    Date: Wed, 02 Dec 2009 14:36:34 GMT
    Server: Apache/2.2.13 (Red Hat)
    Accept-Ranges: bytes
    Content-Length: 3985
    Content-Type: text/html; charset=UTF-8
    [...continues...]