IIS 웹 서버의 취약점과 대응책
다음 그림은 일반적으로 IIS 웹 서버가 노출되어 있는 보안상의 취약점과 위협 요소를 정리한 것이다.
[그림1] 웹 서버의 취약점과 위협요소
이러한 웹 서버의 보안상 취약점과 각각의 대응책에 대해서 정리해 보도록 하자.
1. 프로파일링(Profiling)
프로파일링은 특정 웹 사이트에 대한 정보를 모으는데 사용되며 공격자는 이렇게 모아진 정보를 이용해서 취약점을 찾아 공격한다.
취약점
- 불필요하게 사용되는 프로토콜이나 열려 있는 포트가 프로파일링의 대상이 되며 일반적으로 포트 스캔, 포트 스윕, NetBIOS와 SMB 열거(Server Message Block enumeration)와 같은 방법이 사용된다.
대응책
- 프로파일링 공격에 대한 대응책으로 불필요한 포트를 막고 ICMP(Internet Control Message Protocol), NetBIOS, SMB와 같은 불필요한 프로토콜을 비활성화 시켜야 한다.
2. 서비스 거부(Denial of Service) 공격
서비스 거부(DoS) 공격은 클라이언트의 요청에 의해 서버가 응답할 수 없는 상태가 되는 것을 말한다.
취약점
- 주로 TCP/IP 스택이 취약하게 설정되어 있거나 최신 패치가 적용되지 않은 서버가 공격대상이 되며, 네트워크 레벨의 SYN Floods, 버퍼 오버플로우, 과도한 요청으로 웹 서버에게 부하를 주는 공격 방법 등이 사용된다.
대응책
- 이에 대한 대응책으로 TCP/IP 스택을 강화하고 시스템 소프트웨어에 대하여 최근 패치와 업데이트를 지속적으로 적용해야 한다.
3. 불법적인 접근
권한 없는 사용자가 제한된 기능을 실행하거나 정보에 접근하려는 것을 말한다.
취약점
- IIS의 권한 제어상의 취약 사항이나 NTFS 권한의 취약점이 공격대상이 된다.
대응책
- 이에 대한 대응책으로 Web 권한이나 NTFS 권한을 강화하여 익명 사용자가 제한된 자원에 접근할 수 없도록 해야 한다.
4. 임의의 코드 실행(Arbitrary code execution)
공격자가 악의적인 코드를 서버 상에서 실행시켜서 서버의 리소스에 영향을 주거나 시스템의 하위에 마운트되어 추가 공격하려는 행위을 말한다.
취약점
- IIS 설정상의 취약점이나 패치되지 않은 서버가 공격 대상이 되며, 경로 탐색(path traversal)이나 코드 주입으로 버퍼 오버플로우를 발생시키는 방법이 사용된다.
대응책
- 대응책으로 "../"로 상위 경로를 탐색하려는 URL 접근을 거부하도록 IIS를 설정하고, 시스템 명령과 유틸리티 파일 또는 해당 폴더에 접근 권한(ACL)을 강화하고, 최근의 업데이트와 패치가 적용된 상태로 시스템을 유지해야 한다.
5. 정보 공개(Information Disclosure)
웹 서버 상의 특정 소스 코드나 정보가 외부에 공개되는 것을 말한다.
취약점
- 최신 패치가 적용되지 않은 서버의 IIS 서비스에 존재하는 백도어나 기타 불필요한 서비스나 프로토콜이 공격 대상이 된다.
대응책
- 항상 최근의 업데이트와 패치를 유지해야 하며, 서버 상에 데이터베이스 연결 문자열과 같은 주요 정보를 소스 코드상에 직접 기입하지 않고 다른 저장소(예: 레지스트리)를 사용하는 것이 좋다.
6. 바이러스, 웜, 토로이 목마
대부분의 경우 이들 코드는 시스템 자원을 소비해서 느려지거나 실행이 중단되도록 만든다. 코드레드 웜의 경우 ISAPI 필터의 버퍼 오버플로우 취약점을 이용하여 IIS 서비스에 영향을 준 대표적인 예이다.
[표 1] 바이러스, 웜, 트로이목마의 구분
취약점
- 바이러스나 웜과 같은 악성 코드는 주로 패치가 안된 서버와 불필요하게 실행중인 서비스나 ISAP 필터와 확장을 대상으로 공격한다.
대응책
- 최근의 소프트웨어 패치를 항시 적용하고, 사용되지 않는 ISAPI 필터나 확장 기능을 비활성화 시켜야 한다. 안티바이러스 프로그램으로 바이러스의 침투를 예방하고 자동으로 치료할 수 있는 환경을 설정한다. 또한 공격 대상의 영역을 최소화하기 위해 최소한의 권한으로 프로세스가 실행되도록 설정해야 한다.
지금까지 IIS 웹 서버의 취약점과 대응책을 개괄적으로 알아보았다. 다음 호에서부터는 IIS 웹 서버를 보호하기 위한 보다 구체적인 방법을 살펴보도록 하겠다.
1. 필요한 구성요소만 설치한다.
1.1 IIS의 구성요소
IIS 웹 서버는 5.0버전부터 Windows 운영체제의 구성요소로 포함되어 배포되고 있다. IIS를 설치하면 다음과 같은 서비스나 웹 사이트, 폴더, 계정이 기본적으로 설치 또는 구성되는데 이 중에서 필요한 구성요소만 설치하는 것이 최우선 과제이다.
[표 1] IIS의 설치 항목
[제어판] - [프로그램 추가/제거] - [Windows 구성요소 추가/제거]에서 인터넷 정보 서비스(IIS) 항목을 보면 기본적으로 다음과 같은 구성요소가 설치된 것을 확인할 수 있다. 대다수의 악의적인 공격은 초기 기본 설정으로 IIS 서버가 구성되어 있다고 가정하고 취약점을 노리는 경우가 많으므로 FTP나 NNTP, SMTP, Server Extensions 등의 서비스들은 사용하지 않는 경우에는 설치하지 않는 것이 보안 및 관리적인 측면에서 좋다.
[그림 1] IIS의 구성 요소
1.2 웹 사이트의 구성
IIS를 설치한 후에 [관리도구] - [인터넷 서비스 관리자]를 실행하여 확인해 보면 다음과 같이 '기본 웹 사이트'와 그 하위에 IISHelp, MSADC, Printers, Scripts와 같은 가상 디렉토리가 기본적으로 구성되어 있음을 알 수 있다. 그러나 이러한 기본 구성 또한 악의적인 공격의 대상이 된다. 예를 들면 ADSI 스크립트를 이용해서 기본 웹 사이트에 대한 설정을 변경한다든지 MSADC 가상 디렉토리를 통한 서버 자원 접근 등이 가능하다.
[그림 2] 기본 웹 사이트에 추가되어 있는 가상 디렉토리들
물론 이러한 문제점들은 최신 서비스 팩과 보안 패치를 설치함으로써 해결이 되지만, 필자의 경우에는 '기본 웹 사이트'를 중지 또는 제거하고 초기 웹 서버의 루트 경로인 '%system drive%\inetpub\wwwroot'가 아닌 다른 위치에 웹 서버를 위한 루트 폴더를 만들어 사용한다. (위 [그림 2]를 보면 '기본 웹 사이트'가 중지되어 있고 'noenemy'라는 새로운 웹 사이트를 만들어 운영하고 있음을 알 수 있다.)
2. 최신 패치와 업데이트를 항상 유지한다.
운영체제의 서비스 팩과 보안 패치를 최신 버전으로 유지하는 것은 보안 사고를 예방하기 위한 기본적인 과제이다. 과거 큰 피해를 입었던 보안 사고들은 주기적인 보안 패치를 통해서 미연에 막을 수 있는 것이 대부분이었다는 점을 기억하자. 이러한 권장 패치에 대한 알림과 자동 업데이트 기능이 운영체제 차원에서 제공되므로 패치 적용에 대한 관리적인 이슈가 많이 감소되었다.
또한 마이크로소프트에서 제공하고 있는 MBSA(Microsoft Baseline Security Analyzer)라는 툴을 이용하면 중요한 보안 패치의 적용 여부 뿐만 아니라 운영체제나 인터넷 익스플로어, SQL 서버, MDAC 등의 구성요소를 분석하여 보안상 취약한 부분을 손쉽게 확인할 수 있다.
[그림 3] MBSA를 이용한 취약점 분석 결과
[관련 사이트]
- Windows Update 사이트 : http://windowsupdate.microsoft.com
- MBSA 사이트 : http://www.microsoft.com/technet/security/tools/mbsahome.mspx
3. IIS Lockdown 툴을 사용한다.
3.1 IIS Lockdown 설치 및 구성
앞서 IIS를 설치할 때에 필요한 구성요소만 설치하라고 언급했었는데 IIS Lockdown 툴은 사용 목적에 따라 권장되는 IIS 웹 서버의 설정으로 구성해주는 도구이다. 즉, 사용 목적에 따라 필요한 구성요소만 활성화 시키고 그외의 구성요소는 비활성 상태로 만든다. IIS Lockdown 툴은 여기에서 다운로드 받을 수 있다.
참고사이트 : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secmod/html/secmod109.asp
1) SYN Floods 공격 방어
SYN 공격은 TCP/IP에서 연결을 맺는 메카니즘의 취약점을 대상으로 하며, 공격자는 TCP의 SYN 요청을 의도적으로 발생시키는 프로그램을 이용해서 서버상의 커넥션 큐를 넘치게 만든다.
SYN Floods 공격으로부터 웹 서버를 보호하려면 레지스트리 편집기를 이용해서 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 키에 다음과 같은 항목에 대한 값을 지정하면 된다.
이 외에도 TcpMaxConnectResponseRetransmissions, TcpMaxDataRetransmissions, EnablePMTUDiscovery, KeepAliveTime, NoNameReleaseOnDemand와 같은 매개변수가 제공된다. 보다 자세한 내용은 여기를 참조하기 바란다.
② AFD.SYS 설정
FTP 서버 및 웹 서버와 같은 Windows 소켓 응용 프로그램에서는 연결 시도를 Afd.sys에서 처리한다. Afd.sys도 HKLM\System\CurrentControlSet\Services\AFD\Parameters 레지스트리 키에 대하여 많은 매개변수를 제공한다.
③ ICMP 공격 방어
ICMP(Internet Control Message Protocol)는 호스트 서버와 인터넷 게이트웨이 사이에서 메시지를 제어하고 에러를 알려주는 프로토콜이다(RFC 792 참조). 대표적인 예로 ping 명령어는 인터넷 접속을 테스트하기 위해 ICMP를 사용한다. 최근 발생한 윌시아 웜 바이러스는 ICMP 패킷을 무작위로 보내서 패치가 안된 컴퓨터에 침투한다.
HKLM\System\CurrentControlSet\Services\AFD\Parameters 레지스트리 키에서 다음 항목을 설정한다.
④ SNMP 공격 방어
SNMP(Simple Network Management Protocol)는 네트워크를 관리하기 위한 프로토콜로서 망 관리를 위해 SNMP manager와 agent가 서로 통신하는데 사용된다. 그러나 SNMP을 악용하면 네트워크 연결 장비를 무력화시킬 수 있을 뿐만 아니라 장비를 직접 조작하거나 서비스 거부 공격으로 웹사이트를 마비시킬 수 있다.
HKLM\System\CurrentControlSet\Services\Tcpip\Parameters 레지스트리 키에서 다음 항목을 설정한다.
계정 관리, 공유 자원 관리, 감사관리 측면에서 IIS 웹 서버를 보호하는 방법을 알아보도록 하자.
5. 계정 관리
서버에서 사용되지 않는 계정들은 공격자가 이 계정을 이용해서 접근할 수 있으므로 제거하는 것이 좋다. 또한 단순하거나 유추하기 쉬운 패스워드는 무차별 대입 공격(brute force)이나 사전 공격(dictionary attack)에 취약하다.
5.1 사용하지 않는 계정을 제거한다.
서버상에 사용되지 않는 계정을 이용해서 공격자가 권한을 얻어서 접근할 수 있으므로 이러한 계정은 제거하는 것이 좋다. 실제 서버에 반영하기 전에 테스트 서버에서 계정을 제거한 후에 서비스에 이상이 없는지 먼저 확인하는 것이 좋다.
5.2 Guest 계정을 비활성화한다.
Guest 계정은 컴퓨터에 익명 접속을 연결할 때 사용되는데 이를 비활성시킴으로써 익명 연결을 제한할 수 있다. Guest 계정의 활성화 여부는 [컴퓨터 관리] 도구에서 [로컬 사용자 및 그룹]의 [사용자] 메뉴의 목록에서 확인할 수 있다.
5.3 관리계정의 이름을 바꾸고 복잡한 패스워드를 사용한다.
기본적으로 관리자에게 지정되는 Administrator 계정은 컴퓨터에 대한 모든 권한을 가지므로 악의적인 목적으로 사용하기 위한 목표가 된다. 따라서 이 계정의 이름을 다른 이름으로 변경하고 유추하기 어려운 복잡한 패스워드를 사용하는 것이 좋다.
[그림 1] Administrator 계정의 이름 바꾸기
5.4 기본 익명 계정(IUSR_Machine) 대신 사용자 정의한 계정을 사용한다.
인터넷으로 익명으로 접근하는 사용자들은 IIS 설치시 기본적으로 생성되는 IUSR_Machine (서버의 NetBIOS명) 계정으로 접근하게 된다. 예를 들어 'WebSvr'라는 이름의 서버에는 'IUSR_WebSvr'이라는 계정이 생성된다. 이 계정을 비활성화하고 웹 서버의 익명 접속에 사용할 계정을 직접 정의하는 것이 좋다.
웹 애플리케이션의 기능을 제공하는데 필요한 최소한의 권한을 가지는 계정을 만들고, 인터넷 관리자에서 웹 애플리케이션 별로 직접 정의한 계정을 지정하면 서버 상에 여러 개의 웹 사이트를 운영하는 경우 로그 분석에도 용이하다.
특정 웹 사이트에 대해서 익명 연결에 사용할 계정을 지정하려면 다음 그림과 같이 [인터넷관리자]에서 해당 사이트의 [등록정보]-[디렉토리 보안]-[익명 액세스 및 인증 제어]-[편집]에서 익명 사용자 계정을 지정하면 된다.
[그림 2] 익명 사용자 계정의 변경
5.5 강력한 암호 정책을 적용한다.
계정 암호에 대한 무차별 대입 공격이나 사전 공격을 막기 위해 암호의 최소 길이나 특수문자의 사용여부를 지정하는 등의 보다 강화된 정책을 사용하는 것이 좋다.
암호 정책은 [관리 도구] - [로컬 보안 설정]에서 [계정 정책] - [암호 정책]에서 설정할 수 있다.
[그림 3] 암호 정책의 설정
5.6 익명 로그온(널 세션)을 비활성화 한다.
널 세션(Null Session) 접속은 인증을 받지 않은 상태에서 해당 컴퓨터에 접근하는 것을 의미하며 해커들은 이를 이용해서 원격 컴퓨터의 정보를 제공 받을 수 있고, 특정 권한으로 승격하거나 DoS 공격을 수행할 수도 있다. 널 세션 접속을 허용하지 않으려면 레지스트리 편집기를 이용해서 'HKLM\System\CurrentControlSet\Control\LSA' 키의 RestrictAnonymous 값을 '1'로 설정하면 된다.
6. 공유
서버에서 사용되지 않는 공유를 제거하고 사용중인 공유 자원에 대해서는 NTFS 권한을 부여함으로써 자원을 보호할 필요가 있다. 특히 기본적으로 공유가 생성될 때 모든 사용자들에게 모든 권한이 부여되므로 NTFS 권한을 적용해서 필요한 사용자에게만 접근을 허용하도록 관리해야 한다.
또한 관리목적에서 사용되는 C$, ADMIN$와 같은 관리 공유를 사용하지 않는다면 제거하는 것이 권장된다. 관리 공유를 사용하지 않으려면 레지스트리 편집기를 이용해서 HKLM\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters 키에 AutoShareServer와 AutoShareWks 값을 REG_DWORD로 만들고 '0'으로 설정하면 된다.
7. 감사관리
감사관리는 시스템 공격을 막지는 못하지만 진행중인 공격이나 침입자를 인식하고 공격의 흔적을 추적하는데 많은 도움을 준다. 웹 서버의 감사정책 수준을 높이고 NTFS 권한으로 로그 파일을 보호함으로써 공격자가 로그파일을 지우거나 변조하는 것을 방지하는 것도 필요하다.
7.1 로그인 실패 로그를 기록한다.
시스템에 로그인하는데 실패한 이벤트에 대해서는 반드시 로그를 기록해야 한다. 로그를 통해서 암호에 대한 무차별 대입 공격이나 사전 공격의 흔적을 찾을 수 있으며 공격자가 어떠한 게정으로 접근을 시도했는지도 알 수 있다.
[관리도구]에서 [로컬 보안 설정] 도구를 실행하고 [로컬 정책]-[감사 정책]에서 '로그온 이벤트 감사' 항목에서 '실패' 로그를 기록하도록 설정하면 된다. 이렇게 설정하면 이후에 발생하는 로그인 실패 이벤트에 대한 내역을 [이벤트 뷰어]의 [보안 로그] 목록에서 확인할 수 있게 된다.
[그림 4] 로그온 실패에 대한 감사 기록 설정
7.2 개체 접근 실패에 대한 로그를 기록한다.
파일이나 폴더 등의 개체에 대한 악의적인 접근 시도에 대하여 감사기록을 하는 방법을 알아보자. 먼저 7.1에서 설명한 것과 동일한 방법으로 감사정책에서 '개체 액세스 감사'에 대하여 '실패'시 로그를 기록하도록 설정한다.
그리고 감사하려는 대상 폴더나 파일을 탐색기에서 선택하고 [등록정보]의 [보안]탭에서 [고급] 버튼을 누른다. 액세스 컨트롤 설정 창에서 [감사]탭을 선택하고 [추가] 버튼을 클릭한 뒤 'Everyone' 그룹에 대한 모든 실패 이벤트를 기록하도록 감사 항목을 설정하면 된다.
[그림 5] 개체 액세스 실패에 대한 감사기록 설정하기
7.3 IIS 로그파일의 위치를 변경하고 NTFS 권한을 적용한다.
기본적으로 IIS 로그파일은 '%systemroot%\system32\LogFiles'에 사이트별로 저장되는데 이를 다른 폴더에 저장하거나 이름을 변경함으로써 공격자가 로그 파일을 변경하거나 삭제하는 것을 어느 정도 막을 수 있다. 가능하면 이 로그 파일이 저장되는 디렉토리를 웹 사이트가 위치한 디스크와 다른 볼륨을 사용하고 NTFS 권한을 Administrator(모든 권한), System(모든 권한), Backup Operators(읽기)로 지정하여 다른 계정으로 로그 파일에 접근하는 것을 막는 것이 좋다.
다음 그림은 일반적으로 IIS 웹 서버가 노출되어 있는 보안상의 취약점과 위협 요소를 정리한 것이다.

[그림1] 웹 서버의 취약점과 위협요소
이러한 웹 서버의 보안상 취약점과 각각의 대응책에 대해서 정리해 보도록 하자.
1. 프로파일링(Profiling)
프로파일링은 특정 웹 사이트에 대한 정보를 모으는데 사용되며 공격자는 이렇게 모아진 정보를 이용해서 취약점을 찾아 공격한다.
- 불필요하게 사용되는 프로토콜이나 열려 있는 포트가 프로파일링의 대상이 되며 일반적으로 포트 스캔, 포트 스윕, NetBIOS와 SMB 열거(Server Message Block enumeration)와 같은 방법이 사용된다.
- 프로파일링 공격에 대한 대응책으로 불필요한 포트를 막고 ICMP(Internet Control Message Protocol), NetBIOS, SMB와 같은 불필요한 프로토콜을 비활성화 시켜야 한다.
2. 서비스 거부(Denial of Service) 공격
서비스 거부(DoS) 공격은 클라이언트의 요청에 의해 서버가 응답할 수 없는 상태가 되는 것을 말한다.
- 주로 TCP/IP 스택이 취약하게 설정되어 있거나 최신 패치가 적용되지 않은 서버가 공격대상이 되며, 네트워크 레벨의 SYN Floods, 버퍼 오버플로우, 과도한 요청으로 웹 서버에게 부하를 주는 공격 방법 등이 사용된다.
- 이에 대한 대응책으로 TCP/IP 스택을 강화하고 시스템 소프트웨어에 대하여 최근 패치와 업데이트를 지속적으로 적용해야 한다.
3. 불법적인 접근
권한 없는 사용자가 제한된 기능을 실행하거나 정보에 접근하려는 것을 말한다.
- IIS의 권한 제어상의 취약 사항이나 NTFS 권한의 취약점이 공격대상이 된다.
- 이에 대한 대응책으로 Web 권한이나 NTFS 권한을 강화하여 익명 사용자가 제한된 자원에 접근할 수 없도록 해야 한다.
4. 임의의 코드 실행(Arbitrary code execution)
공격자가 악의적인 코드를 서버 상에서 실행시켜서 서버의 리소스에 영향을 주거나 시스템의 하위에 마운트되어 추가 공격하려는 행위을 말한다.
- IIS 설정상의 취약점이나 패치되지 않은 서버가 공격 대상이 되며, 경로 탐색(path traversal)이나 코드 주입으로 버퍼 오버플로우를 발생시키는 방법이 사용된다.
- 대응책으로 "../"로 상위 경로를 탐색하려는 URL 접근을 거부하도록 IIS를 설정하고, 시스템 명령과 유틸리티 파일 또는 해당 폴더에 접근 권한(ACL)을 강화하고, 최근의 업데이트와 패치가 적용된 상태로 시스템을 유지해야 한다.
5. 정보 공개(Information Disclosure)
웹 서버 상의 특정 소스 코드나 정보가 외부에 공개되는 것을 말한다.
- 최신 패치가 적용되지 않은 서버의 IIS 서비스에 존재하는 백도어나 기타 불필요한 서비스나 프로토콜이 공격 대상이 된다.
- 항상 최근의 업데이트와 패치를 유지해야 하며, 서버 상에 데이터베이스 연결 문자열과 같은 주요 정보를 소스 코드상에 직접 기입하지 않고 다른 저장소(예: 레지스트리)를 사용하는 것이 좋다.
6. 바이러스, 웜, 토로이 목마
대부분의 경우 이들 코드는 시스템 자원을 소비해서 느려지거나 실행이 중단되도록 만든다. 코드레드 웜의 경우 ISAPI 필터의 버퍼 오버플로우 취약점을 이용하여 IIS 서비스에 영향을 준 대표적인 예이다.
구분 | 설명 |
바이러스 | 자기 복제를 하며, 컴퓨터 시스템을 파괴하거나 작업을 지연 또는 방해하는 악성 프로그램이다. |
웜 | 분산형 시스템, 네트워크에 상주하는 독립 프로그램 또는 실행 가능한 코드 모듈을 말한다. 웜은 가능한 많은 시스템 자원을 이용하기 위해 필요하다면 스스로 자기 자신을 복제한다. |
트로이 목마 | 시스템에서 정상적인 기능을 하는 프로그램으로 가장해 다른 프로그램 안에 숨어 있다가 그 프로그램이 실행될 때 자신이 활성화하는 악성 프로그램을 말한다. 컴퓨터 바이러스와 달리 자기 복사 능력은 없지만, 자기자신이 실행되는 순간 시스템에 직접적인 피해를 가하는 특징을 가지고 있다. |
- 바이러스나 웜과 같은 악성 코드는 주로 패치가 안된 서버와 불필요하게 실행중인 서비스나 ISAP 필터와 확장을 대상으로 공격한다.
- 최근의 소프트웨어 패치를 항시 적용하고, 사용되지 않는 ISAPI 필터나 확장 기능을 비활성화 시켜야 한다. 안티바이러스 프로그램으로 바이러스의 침투를 예방하고 자동으로 치료할 수 있는 환경을 설정한다. 또한 공격 대상의 영역을 최소화하기 위해 최소한의 권한으로 프로세스가 실행되도록 설정해야 한다.
지금까지 IIS 웹 서버의 취약점과 대응책을 개괄적으로 알아보았다. 다음 호에서부터는 IIS 웹 서버를 보호하기 위한 보다 구체적인 방법을 살펴보도록 하겠다.
1. 필요한 구성요소만 설치한다.
1.1 IIS의 구성요소
IIS 웹 서버는 5.0버전부터 Windows 운영체제의 구성요소로 포함되어 배포되고 있다. IIS를 설치하면 다음과 같은 서비스나 웹 사이트, 폴더, 계정이 기본적으로 설치 또는 구성되는데 이 중에서 필요한 구성요소만 설치하는 것이 최우선 과제이다.
항목 | 설명 |
서비스 | 웹과 FTP 관리를 위한 IIS 관리 서비스 World Wide Web 서버 서비스 FTP 서비스 메일 발송을 위한 SMTP(Simple Mail Transport Protocol) 서비스 뉴스그룹을 위한 NNTP(Network News Transport Protocol) 서비스 |
계정 및 그룹 |
IUSR_MACHINE (인터넷으로 접근하는 익명 계정) IWAM_MACHINE (out-of-process로 실행되는 웹 애플리케이션이 실행되는 계정) |
폴더 | %windir%\system32\inetsrv (IIS 프로그램) %windir%\system32\inetsrv\iisadmin (IIS 관리 프로그램) %windir%\help\iishelp (IIS 도움말 파일) %systemdrive%\inetpub (웹, FTP, SMTP 루트 폴더) |
웹 사이트 | 기본 웹 사이트(80번 포트) : %systemdrive%\inetpub\wwwroot 관리 웹 사이트(3693번 포트) : %systemdrive%\system32\inetsrv\iisadmin |
[제어판] - [프로그램 추가/제거] - [Windows 구성요소 추가/제거]에서 인터넷 정보 서비스(IIS) 항목을 보면 기본적으로 다음과 같은 구성요소가 설치된 것을 확인할 수 있다. 대다수의 악의적인 공격은 초기 기본 설정으로 IIS 서버가 구성되어 있다고 가정하고 취약점을 노리는 경우가 많으므로 FTP나 NNTP, SMTP, Server Extensions 등의 서비스들은 사용하지 않는 경우에는 설치하지 않는 것이 보안 및 관리적인 측면에서 좋다.
[그림 1] IIS의 구성 요소
1.2 웹 사이트의 구성
IIS를 설치한 후에 [관리도구] - [인터넷 서비스 관리자]를 실행하여 확인해 보면 다음과 같이 '기본 웹 사이트'와 그 하위에 IISHelp, MSADC, Printers, Scripts와 같은 가상 디렉토리가 기본적으로 구성되어 있음을 알 수 있다. 그러나 이러한 기본 구성 또한 악의적인 공격의 대상이 된다. 예를 들면 ADSI 스크립트를 이용해서 기본 웹 사이트에 대한 설정을 변경한다든지 MSADC 가상 디렉토리를 통한 서버 자원 접근 등이 가능하다.
[그림 2] 기본 웹 사이트에 추가되어 있는 가상 디렉토리들
물론 이러한 문제점들은 최신 서비스 팩과 보안 패치를 설치함으로써 해결이 되지만, 필자의 경우에는 '기본 웹 사이트'를 중지 또는 제거하고 초기 웹 서버의 루트 경로인 '%system drive%\inetpub\wwwroot'가 아닌 다른 위치에 웹 서버를 위한 루트 폴더를 만들어 사용한다. (위 [그림 2]를 보면 '기본 웹 사이트'가 중지되어 있고 'noenemy'라는 새로운 웹 사이트를 만들어 운영하고 있음을 알 수 있다.)
2. 최신 패치와 업데이트를 항상 유지한다.
운영체제의 서비스 팩과 보안 패치를 최신 버전으로 유지하는 것은 보안 사고를 예방하기 위한 기본적인 과제이다. 과거 큰 피해를 입었던 보안 사고들은 주기적인 보안 패치를 통해서 미연에 막을 수 있는 것이 대부분이었다는 점을 기억하자. 이러한 권장 패치에 대한 알림과 자동 업데이트 기능이 운영체제 차원에서 제공되므로 패치 적용에 대한 관리적인 이슈가 많이 감소되었다.
또한 마이크로소프트에서 제공하고 있는 MBSA(Microsoft Baseline Security Analyzer)라는 툴을 이용하면 중요한 보안 패치의 적용 여부 뿐만 아니라 운영체제나 인터넷 익스플로어, SQL 서버, MDAC 등의 구성요소를 분석하여 보안상 취약한 부분을 손쉽게 확인할 수 있다.
[그림 3] MBSA를 이용한 취약점 분석 결과
[관련 사이트]
- Windows Update 사이트 : http://windowsupdate.microsoft.com
- MBSA 사이트 : http://www.microsoft.com/technet/security/tools/mbsahome.mspx
3. IIS Lockdown 툴을 사용한다.
3.1 IIS Lockdown 설치 및 구성
앞서 IIS를 설치할 때에 필요한 구성요소만 설치하라고 언급했었는데 IIS Lockdown 툴은 사용 목적에 따라 권장되는 IIS 웹 서버의 설정으로 구성해주는 도구이다. 즉, 사용 목적에 따라 필요한 구성요소만 활성화 시키고 그외의 구성요소는 비활성 상태로 만든다. IIS Lockdown 툴은 여기에서 다운로드 받을 수 있다.
|
잠깐! |
IIS Lockdown 툴은 실행과 동시에 IIS 웹 서버의 하위 서비스나 그 환경설정 내용이 변경되어 적용되므로 주의가 필요하다. 적용 후에 일부 서비스가 정상 동작하지 않을 수 있으며 이를 수정하는 과정이 필요할 수 있기 때문이다. 따라서 실제 사용중인 웹 서버에 바로 적용하기 전에 테스트 서버로 동일한 환경을 구성한 뒤에 정상적으로 서비스가 되는지 테스트한 후에 사용하는 것이 좋다. |
잠깐! 레지스트리로 제공되는 TCP/IP의 매개변수에는 항목별로 허용하는 범위내의 값을 설정해야 하며 최적의 값을 설정해야 한다. 이 값을 잘못 설정할 경우 클라이언트의 연결이 제한되어 정상적인 서비스를 제공하지 못할 수 있으므로 실제 서버에 적용하기 전에 테스트 서버를 통해서 충분한 검증한 한 후에 적용해야 한다. |
참고사이트 : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secmod/html/secmod109.asp
1) SYN Floods 공격 방어
SYN 공격은 TCP/IP에서 연결을 맺는 메카니즘의 취약점을 대상으로 하며, 공격자는 TCP의 SYN 요청을 의도적으로 발생시키는 프로그램을 이용해서 서버상의 커넥션 큐를 넘치게 만든다.
SYN Floods 공격으로부터 웹 서버를 보호하려면 레지스트리 편집기를 이용해서 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 키에 다음과 같은 항목에 대한 값을 지정하면 된다.
항목명 | 권장 | 범위 | 설명 |
SynAttackProtect | 2 | 0(비활성)-2 | SYN 공격에 대한 보호 기능을 활성화시킨다. SYN-ACKS의 재전송을 적게 조절함으로써 SYN 공격을 막는다. TcpMaxHalfOpen나 TcpMaxHalfOpenRetried 설정과 함께 사용되어야 한다. |
TcpMaxPortsExhausted | 5 | 0-65535 | SYN Floods 공격이 발생했음을 판단하는데 기준이 되는 TCP 연결의 최대값 |
TcpMaxHalfOpen | 500 | 100-65535 | SYN 공격이 동작하기 전에 SYN_RCVD 상태에서 연결을 허용할 최대값. 이를 적용하려면 먼저 SynAttackProtect가 활성화되어 있어야 한다. |
TcpMaxHalfOpenRetried | 400 | 80-65535 | SYN 공격이 동작하기 전에 SYN_RCVD 상태에서 연결을 허용할 최대값. SYN_RCVD는 SYN 공격에 대한 방어가 동작하기 전에 적어도 한번의 SYN 플래그를 재전송한다. 이를 적용하려면 먼저 SynAttackProtect가 활성화되어 있어야 한다. |
이 외에도 TcpMaxConnectResponseRetransmissions, TcpMaxDataRetransmissions, EnablePMTUDiscovery, KeepAliveTime, NoNameReleaseOnDemand와 같은 매개변수가 제공된다. 보다 자세한 내용은 여기를 참조하기 바란다.
② AFD.SYS 설정
FTP 서버 및 웹 서버와 같은 Windows 소켓 응용 프로그램에서는 연결 시도를 Afd.sys에서 처리한다. Afd.sys도 HKLM\System\CurrentControlSet\Services\AFD\Parameters 레지스트리 키에 대하여 많은 매개변수를 제공한다.
항목명 | 권장 | 범위 | 설명 |
EnableDynamicBacklog | 1 | 0(사용안함) 1(사용) |
많은 양의 SYN_RCVD 연결에 대해서 능동적으로 대처할 것인지에 대한 AFD.SYS 기능의 활성화 여부를 지정한다. |
MinimumDynamicBacklog | 20 | 0-4294967295 | Listening endpoint에서 허용하는 접속의 최소 수를 지정한다. 접속수가 설정된 값 이하가 되면 새로운 스레드에서 추가 연결을 생성한다. |
MaximumDynamicBacklog | 20000 | 0-4294967295 | Listening endpoint에서 허용하는 'Quansi-free' 연결의 최대 수를 지정한다. 'Quansi-free' 는 SYN_RCVD 상태의 연결과 free connections를 더한 값이다. |
DynamicBacklogGrowthDelta | 10 | 0-4294967295 | 추가적인 연결이 필요할 때 생성되는 free connections의 수를 지정한다. |
③ ICMP 공격 방어
ICMP(Internet Control Message Protocol)는 호스트 서버와 인터넷 게이트웨이 사이에서 메시지를 제어하고 에러를 알려주는 프로토콜이다(RFC 792 참조). 대표적인 예로 ping 명령어는 인터넷 접속을 테스트하기 위해 ICMP를 사용한다. 최근 발생한 윌시아 웜 바이러스는 ICMP 패킷을 무작위로 보내서 패치가 안된 컴퓨터에 침투한다.
HKLM\System\CurrentControlSet\Services\AFD\Parameters 레지스트리 키에서 다음 항목을 설정한다.
항목명 | 권장 | 범위 | 설명 |
EnableICMPRedirect | 0 | 0(사용안함) 1(사용) |
이 값을 0으로 설정함으로써 ICMP 리디렉트 패킷을 수신했을 때 호스트 경로를 생성하지 않게 하여 부하를 줄일 수 있다. |
④ SNMP 공격 방어
SNMP(Simple Network Management Protocol)는 네트워크를 관리하기 위한 프로토콜로서 망 관리를 위해 SNMP manager와 agent가 서로 통신하는데 사용된다. 그러나 SNMP을 악용하면 네트워크 연결 장비를 무력화시킬 수 있을 뿐만 아니라 장비를 직접 조작하거나 서비스 거부 공격으로 웹사이트를 마비시킬 수 있다.
HKLM\System\CurrentControlSet\Services\Tcpip\Parameters 레지스트리 키에서 다음 항목을 설정한다.
항목명 | 권장 | 범위 | 설명 |
EnableDeadGWDetect | 0 | 0(사용안함) 1(사용) |
공격자가 2차 게이트웨이로 스위칭하는 것을 막는다. 이 값을 1로 설정하면 TCP는 dead-gateway 탐지를 수행한다. |
계정 관리, 공유 자원 관리, 감사관리 측면에서 IIS 웹 서버를 보호하는 방법을 알아보도록 하자.
5. 계정 관리
서버에서 사용되지 않는 계정들은 공격자가 이 계정을 이용해서 접근할 수 있으므로 제거하는 것이 좋다. 또한 단순하거나 유추하기 쉬운 패스워드는 무차별 대입 공격(brute force)이나 사전 공격(dictionary attack)에 취약하다.
5.1 사용하지 않는 계정을 제거한다.
서버상에 사용되지 않는 계정을 이용해서 공격자가 권한을 얻어서 접근할 수 있으므로 이러한 계정은 제거하는 것이 좋다. 실제 서버에 반영하기 전에 테스트 서버에서 계정을 제거한 후에 서비스에 이상이 없는지 먼저 확인하는 것이 좋다.
5.2 Guest 계정을 비활성화한다.
Guest 계정은 컴퓨터에 익명 접속을 연결할 때 사용되는데 이를 비활성시킴으로써 익명 연결을 제한할 수 있다. Guest 계정의 활성화 여부는 [컴퓨터 관리] 도구에서 [로컬 사용자 및 그룹]의 [사용자] 메뉴의 목록에서 확인할 수 있다.
5.3 관리계정의 이름을 바꾸고 복잡한 패스워드를 사용한다.
기본적으로 관리자에게 지정되는 Administrator 계정은 컴퓨터에 대한 모든 권한을 가지므로 악의적인 목적으로 사용하기 위한 목표가 된다. 따라서 이 계정의 이름을 다른 이름으로 변경하고 유추하기 어려운 복잡한 패스워드를 사용하는 것이 좋다.
[그림 1] Administrator 계정의 이름 바꾸기
5.4 기본 익명 계정(IUSR_Machine) 대신 사용자 정의한 계정을 사용한다.
인터넷으로 익명으로 접근하는 사용자들은 IIS 설치시 기본적으로 생성되는 IUSR_Machine (서버의 NetBIOS명) 계정으로 접근하게 된다. 예를 들어 'WebSvr'라는 이름의 서버에는 'IUSR_WebSvr'이라는 계정이 생성된다. 이 계정을 비활성화하고 웹 서버의 익명 접속에 사용할 계정을 직접 정의하는 것이 좋다.
웹 애플리케이션의 기능을 제공하는데 필요한 최소한의 권한을 가지는 계정을 만들고, 인터넷 관리자에서 웹 애플리케이션 별로 직접 정의한 계정을 지정하면 서버 상에 여러 개의 웹 사이트를 운영하는 경우 로그 분석에도 용이하다.
특정 웹 사이트에 대해서 익명 연결에 사용할 계정을 지정하려면 다음 그림과 같이 [인터넷관리자]에서 해당 사이트의 [등록정보]-[디렉토리 보안]-[익명 액세스 및 인증 제어]-[편집]에서 익명 사용자 계정을 지정하면 된다.
[그림 2] 익명 사용자 계정의 변경
5.5 강력한 암호 정책을 적용한다.
계정 암호에 대한 무차별 대입 공격이나 사전 공격을 막기 위해 암호의 최소 길이나 특수문자의 사용여부를 지정하는 등의 보다 강화된 정책을 사용하는 것이 좋다.
암호 정책 | 기본 설정 | 권장 설정 |
최근 암호 기억 | 0개 암호 기억됨 | 24개 암호 기억됨 |
최대 암호 사용 기간 | 42일 | 42일 |
최소 암호 사용 기간 | 0일 | 2일 |
최소 암호 길이 | 0문자 | 8문자 |
암호는 복잡성을 만족해야 함 | 사용안함 | 사용함 |
암호 정책은 [관리 도구] - [로컬 보안 설정]에서 [계정 정책] - [암호 정책]에서 설정할 수 있다.
[그림 3] 암호 정책의 설정
5.6 익명 로그온(널 세션)을 비활성화 한다.
널 세션(Null Session) 접속은 인증을 받지 않은 상태에서 해당 컴퓨터에 접근하는 것을 의미하며 해커들은 이를 이용해서 원격 컴퓨터의 정보를 제공 받을 수 있고, 특정 권한으로 승격하거나 DoS 공격을 수행할 수도 있다. 널 세션 접속을 허용하지 않으려면 레지스트리 편집기를 이용해서 'HKLM\System\CurrentControlSet\Control\LSA' 키의 RestrictAnonymous 값을 '1'로 설정하면 된다.
6. 공유
서버에서 사용되지 않는 공유를 제거하고 사용중인 공유 자원에 대해서는 NTFS 권한을 부여함으로써 자원을 보호할 필요가 있다. 특히 기본적으로 공유가 생성될 때 모든 사용자들에게 모든 권한이 부여되므로 NTFS 권한을 적용해서 필요한 사용자에게만 접근을 허용하도록 관리해야 한다.
또한 관리목적에서 사용되는 C$, ADMIN$와 같은 관리 공유를 사용하지 않는다면 제거하는 것이 권장된다. 관리 공유를 사용하지 않으려면 레지스트리 편집기를 이용해서 HKLM\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters 키에 AutoShareServer와 AutoShareWks 값을 REG_DWORD로 만들고 '0'으로 설정하면 된다.
7. 감사관리
감사관리는 시스템 공격을 막지는 못하지만 진행중인 공격이나 침입자를 인식하고 공격의 흔적을 추적하는데 많은 도움을 준다. 웹 서버의 감사정책 수준을 높이고 NTFS 권한으로 로그 파일을 보호함으로써 공격자가 로그파일을 지우거나 변조하는 것을 방지하는 것도 필요하다.
7.1 로그인 실패 로그를 기록한다.
시스템에 로그인하는데 실패한 이벤트에 대해서는 반드시 로그를 기록해야 한다. 로그를 통해서 암호에 대한 무차별 대입 공격이나 사전 공격의 흔적을 찾을 수 있으며 공격자가 어떠한 게정으로 접근을 시도했는지도 알 수 있다.
[관리도구]에서 [로컬 보안 설정] 도구를 실행하고 [로컬 정책]-[감사 정책]에서 '로그온 이벤트 감사' 항목에서 '실패' 로그를 기록하도록 설정하면 된다. 이렇게 설정하면 이후에 발생하는 로그인 실패 이벤트에 대한 내역을 [이벤트 뷰어]의 [보안 로그] 목록에서 확인할 수 있게 된다.
[그림 4] 로그온 실패에 대한 감사 기록 설정
7.2 개체 접근 실패에 대한 로그를 기록한다.
파일이나 폴더 등의 개체에 대한 악의적인 접근 시도에 대하여 감사기록을 하는 방법을 알아보자. 먼저 7.1에서 설명한 것과 동일한 방법으로 감사정책에서 '개체 액세스 감사'에 대하여 '실패'시 로그를 기록하도록 설정한다.
그리고 감사하려는 대상 폴더나 파일을 탐색기에서 선택하고 [등록정보]의 [보안]탭에서 [고급] 버튼을 누른다. 액세스 컨트롤 설정 창에서 [감사]탭을 선택하고 [추가] 버튼을 클릭한 뒤 'Everyone' 그룹에 대한 모든 실패 이벤트를 기록하도록 감사 항목을 설정하면 된다.
[그림 5] 개체 액세스 실패에 대한 감사기록 설정하기
개체 액세스에 대한 감사기능은 해당 디스크 볼륨이 NTFS 파티션일 경우에만 사용할 수 있다. NTFS 파일시스템은 FAT과 비교했을 때 파일 및 폴더 단위의 권한 부여 및 관리가 용이하므로 웹 서버의 자원이 저장되는 파티션은 NTFS를 사용하는 것이 좋다. |
7.3 IIS 로그파일의 위치를 변경하고 NTFS 권한을 적용한다.
기본적으로 IIS 로그파일은 '%systemroot%\system32\LogFiles'에 사이트별로 저장되는데 이를 다른 폴더에 저장하거나 이름을 변경함으로써 공격자가 로그 파일을 변경하거나 삭제하는 것을 어느 정도 막을 수 있다. 가능하면 이 로그 파일이 저장되는 디렉토리를 웹 사이트가 위치한 디스크와 다른 볼륨을 사용하고 NTFS 권한을 Administrator(모든 권한), System(모든 권한), Backup Operators(읽기)로 지정하여 다른 계정으로 로그 파일에 접근하는 것을 막는 것이 좋다.
[Reference] : 너준군, 「윈도우 IIS - IIS 보안설정」 http://nc.mahome.net/?document_srl=1041.
'연구개발 > 보안' 카테고리의 다른 글
Sql Injection 침해 흔적을 통한 보안점검 (0) | 2011.04.28 |
---|