Web /WAS 기반의 서비스 구축시 보안에 유의해야할 사항 정리

 

SELinux

Linux 계열의 OS 를 사용한다면 SELinux 를 꼭 켜야 합니다(기본적으로 켜져 있습니다). SELinux 는 zero-day attack 이나 기타 보안 취약점으로 인해 서버가 공격받았을 경우 MAC(mandatory Access Control) 기반의 강력한 보호를 통해 2차 피해를 최소화해 해줍니다.

특히 SELinux 는 Web Server 에 대해 잘 설계된 policy 와 context 를 적용하고 있으므로 웹서버를 통해 해킹당했을 경우 피해를 최소화 합니다.

SElinux 를 켜려면 다음 절차를 따르세요.

 

  1. sestatus 후 아래처럼 enforcing mode 인지 확인

    SELinux status: enabled
    SELinuxfs mount: /selinux
    Current mode: enforcing
    Mode from config file: enforcing
    Policy version: 24
    Policy from config file: targeted

  2. vi /etc/sysconfig/selinux 후 SELINUX=enforcing 로 변경
  3. reboot
  4. sestatus 로 설정 확인

Apache Web Server

Web Server information hide

apache web server 는 browser에게 HTTP header에 다음과 같이 서버의 정보와 버전, 모듈등의 정보를 보냅니다.

HTTP/1.1 200 OK
Date: Sun, 10 Feb 2012 07:24:47 GMT
Server: Apache/2.2.17 (Win32) PHP/5.2.17
Vary: Accept-Encoding,Cookie

 

이런 정보는 공격자에게 유용한 정보이므로 숨겨야 합니다. httpd.conf 에 다음 설정을 수정합니다.

ServerTokens ProductOnly
ServerSignature Off

 

위 설정을 적용하고 나면 다음과 같이 HTTP header 가 보내집니다.

HTTP/1.1 200 OK
Date: Sun, 10 Feb 2012 07:24:47 GMT
Server: Apache
Vary: Accept-Encoding,Cookie

 

참고 자료 How to hide apache information with ServerTokens and ServerSignature directives

민감한 resource가 있는 Location 제한

web 과 was 가 한 서버에 있는데 실수로 was 의 WEB-INF 를 DocumentRoot 에 설정했거나 tomcat 의 host-manager context 를 기본 암호로 설정하고 enable 했을시등 심각한 보안문제가 발생할수 있습니다.

apache web 에서 다음 설정으로 보안 문제를 해결할 수 있습니다.

tomcat manager를 지정한 IP 에서만 연결가능

 

## Deny tomcat manager url

 

<Location /manager>
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1 192.168.0.0/24
</Location>

 

 

 

tomcat

  1. tomcat 은 root 가 아닌 일반 사용자로 구동합니다.

  2. Context deploy 를 위해 host-manager Context 를 사용할 경우 default Context name(manager) 을 변경하고 암호를 새로 설정해 사용합니다. 기본 암호가 설정되어 있고 3번 접근 IP 제한이 안 걸려 있을 경우 외부에서 악성코드를 war 에 담아서 deploy 할 우려가 있습니다.

    공격예

    82.117.233.102 - - [03/Apr/2013:13:30:38 +0900] "PUT /manager/deploy?path=/ApacheLoader HTTP/1.1" 200 57
    82.117.233.102 - - [03/Apr/2013:13:30:43 +0900] "GET /manager/undeploy?path=/ApacheLoader HTTP/1.1" 200 59


 
설정

username 에 tomcat 같이 유추가 쉬운 id 사용하지 않기

<role rolename="manager"/>
<user username="darren" password="ReallyComplexPassword" roles="manager"/>

 

  1. host manager 와 manager 는 특정 IP 나 내부에서만 연결 가능하게 설정합니다. 다음 설정은 톰캣이 구동된 서버 또는 192.168.152. 대역 서버와 localhost 에서만 연결 가능합니다.
    conf/Catalina/localhost/manager.xml

     

    <?xml version="1.0" encoding="UTF-8"?>
    <Context antiResourceLocking="false" privileged="true">
        <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192\.168\.152\.\d+|127\.0\.0\.1"/>
    </Context>

     

     

  2. tomcat 셧다운은 Server 가 사용하는 포트(기본 8005)만 알면 로컬 시스템에 계정이 있다면 누구나 종료 시킬수 있습니다. 다음과 같이 telnet 으로 포트를 열고 종료 명령어를 보내봅시다.

    $ telnet localhost 8005
    Connected to localhost.
    Escape character is '^]'.

     연결됐다는 프롬프트가 보이면 SHUTDOWN  을 입력하고 엔터를 치면 톰캣이 종료됩니다.

     

    이제 임의의 계정이 tomcat shutdown 을 못 하도록 다음과 같이 shutdown 암호를 설정합니다. (Optional)

     

    <Server port="8005" shutdown="goingdown">

    이제 톰캣을 종료하려면 telnet 으로 서버 포트를 열어서 goingdown 를 입력해야 종료가 됩니다. 변경된 shutdown인 goingdown 은 유출되지 않게 주의해야 합니다. 다른 방법으로는 Server Port 를 사용하지 않는 방법도 있습니다. 다음과 같이 설정하면 서버 포트를 사용하지 않으므로 톰캣 종료시 kill 명령어를 사용해야 합니다.

    <Server port="-1" shutdown="goingdown">

참고 자료Best Practices for Securing Apache Tomcat 7

 

같이 보기

 


blog comments powered by Disqus