by 한동훈
1. DoS 공격에 대한 이해
2000년도는 DoS(Denial of Service: 서비스 거부 공격)에 의한 유명 사이트들의 서버 다운 소식, 처벌에 대한 이야기가 많이 있었다. 게다가 DoS의 버전업판인 DdoS(Distributed Denial of Service 분산 서비스 거부 공격)이라는 새로운 유형의 공격방법이 나타나서 많은 네트웍 관리자들의 간담을 서늘하게 했던 때도 있었다.
DoS 공격이란 다중 작업을 지원하는 운영체계에서 발생할 수 있다. 구체적으로 시스템의 한 프로세스가 자원을 모두 독점하거나 소비하여 시스템이 다른 프로세스의 서비스를 제공하지 못하도록 하는 방법이다. 인터넷 환경에서 서비스는 웹이나 메일 서버와 같은 응용프로그램을 뜻한다.
2. DoS 공격의 특징
DoS 공격은 다른 해킹처럼 시스템의 관리자 권한 획득, 시스템에 있는 데이터의 파괴 등을 행하지 않으며 서비스를 사용할 수 없게 만든다. DoS 공격은 로그를 남기는 공격이 아니기 때문에 문제가 발생했을 때 추적하기 어려우며, 이를 해결하기가 어렵다는 문제점이 있다. 또한 정형화된 공격 방법이 존재하지 않으며 경우에 따라 많은 공격 방법이 존재한다. DoS 공격을 받는 시스템마다 결과가 다르게 나타날 수 있다. 이는 서버의 성능과 네트웍의 구현 방법에 따른 차이에 기인한다.
3. DoS 공격의 유형 및 대처
DoS 공격은 내부에서의 공격과 외부에서의 공격의 두 가지로 나눌 수 있다. 내부에서의 공격은 비교적 간단한데 비해, 외부에서의 공격은 더 높은 수준의 기술을 요구한다.
내부에서의 공격으로는 시스템의 /tmp와 같이 시스템이 프로세스를 생성하거나, 작업을 처리하는데 사용하는 폴더의 디스크 공간을 채우는 방법이 있다. 이와 같은 방법을 미연에 방지하려면 사용자에게 디스크 용량 사용 제한(쿼터: quota)을 두는 방법이 있다.
디스크 공간을 채우기 위해 간단한 프로그램을 작성해서 돌릴 수도 있다. 이런 경우에는 사용자 디스크 용량 제한 뿐만 아니라, 프로세스별로 제한을 설정할 수 있다.
실제 DoS 공격을 받게 되는 상황에서는 콘솔에서의 root 로긴조차 허용되지 않을 것이다. 만약 여러 사람이 로긴하여 사용하는 서버라면 다른 사용자의 로그오프와 동시에 잠시동안 로긴할 수 있으므로 /tmp 폴더의 내용을 제거하고, 매초 단위로 /tmp를 비우도록 cron 작업을 설정하고 모든 사용자의 업무 중단 통보와 데이터를 백업하도록 한다. 트래픽이 급격하게 많으면 콘솔에서 조차 반응을 보이지 않으며 이 경우에는 재기동할 수 밖에 없다.
또 다른 내부 공격 유형으로는 프로세스를 생성하여 메모리와 CPU 클럭을 고갈시키는 방법이다. 이러한 공격은 프로세스를 생성하고 메모리를 할당하는 루프를 무한히 돌리거나 단순히 프로세스를 무한히 복제하는 것으로 이루어질 수 있다.
이와 같은 공격도 마찬가지로 사용자에 대해 동시에 처리할 수 있는 프로세스를 제한하는 방법으로 미연에 방지할 수 있다(모든 Unix 운영체제가 이와 같은 기능을 제공하는 것은 아니므로 각 Unix 운영체제의 매뉴얼을 꼼꼼히 검토할 것을 권하며, 이와 같은 자세한 안내는 한빛미디어의
시스템 관리의 핵심에 자세히 나와 있다).
외부 공격은 내부 공격보다 다양하다. 가장 대표적인 것으로는 메일 폭풍을 예로 들 수 있다. 메일 폭풍은 동시에 대량의 메일을 전송하여 메일 시스템을 마비시키는 방법이다.
메일 폭풍은 두 가지로 나눌 수 있는데, 하나는 메일을 처리하는 호스트 메일 서버에 대량의 메일을 전송하여 호스트 메일 서버를 마비시키는 방법이며, 다른 하나는 메일 익스체인저에 대량의 메일을 전송하여 해당 시스템에 속한 모든 사용자가 메일 시스템을 이용하지 못하도록 하므로, 후자가 더 피해가 크다고 할 수 있다.
이러한 공격을 받게 될 경우에 해당 메일이 전송되는 사용자 email 주소와 IP를 수신 거부하도록 메일 서버를 설정하거나, 메일 서비스를 잠시 중단하는 방법이 있다.
SYN Flooding은 SYN을 대량으로 보내서 시스템의 특정 서비스를 마비시키는 방법이다. TCP/IP는 Three Way Handshaking 이라는 전송 방법을 이용한다. 클라이언트가 서버에게 SYN 신호를 보내고 서버가 클라이언트에게 연결을 허용한다는 ACK 신호를 보낸다. 이렇게 연결이 설정된 이후에는 일련의 연속번호를 증가시켜가면서 데이터를 주고 받게 된다.
만약 클라이언트가 이 연결 과정에서 ACK 신호를 보내지 않게 되면 서버는 해당 연결을 half-open 상태로 두게 된다. 그리고 일정시간 동안 half-open 상태가 유지되면 연결을 버리고 다시 정상상태로 돌아오게 된다. 만약 공격자가 고의적으로 ACK 신호를 보내지 않게 되어 큐를 모두 채워버리게 되면 서버의 해당 서비스는 마비될 것이다.
이와 같이 서버의 특정 서비스만을 마비시키는 경우에는 공격 당했는지의 여부를 쉽게 알 수 없다. 이러한 것을 확인하는 방법은 netstat 명령을 이용해서 각 서비스의 상태가 계속해서 SYN_RECEIVED로 나타난다면 SYN Flooding 공격을 의심해볼 수 있다.
이러한 공격에 대비하려면 이러한 시간 간격을 짧게 조정하고 큐의 크기를 여유 있게 늘리도록 한다. 이러한 자세한 설정 방법은 Unix 시스템마다 다르므로 각 시스템의 매뉴얼을 참고하기 바란다.
시스템의 경우에 커널을 다시 컴파일해야 하는 경우도 있다. 솔라리스의 경우에는 다음과 같이 조정할 수 있다.
/usr/sbin/ndd -set /dev/tcp tcp_time_wait_interval 60000
60000는 밀리초(ms) 단위이다. 다른 방법은 /etc/system 파일을 다음과 같이 설정해도 된다.
set ip:ip_forwarding=0
Solaris 2.6 이전 버전인 경우에는 tcp_time_wait_interval이 아니라 tcp_close_wait_interval로 쓰도록 한다.
TCP/IP 프로토콜에서 half-open 연결 상태를 저장하고 있는 큐의 크기를 조정하려면 ndd 명령을 이용해서 tcp_conn_req_max_q0을 늘려주도록 한다. 기본값은 1024이며 2048 정도로 늘려주는 것이 SYN Flooding 예방에 도움이 된다.
tcp_conn_req_max_q는 completed connection, 즉, SYN-ACK를 받아서 연결이 완료된 커넥션을 저장하는 큐이며, 웹 서버로 이용되는 시스템에서 값을 적절히 늘려 주도록 한다.기본값은 128인데 1024-2048 사이로 늘려 주는 것이 적합하다.
솔라리스 시스템에서 SYN Flooding을 확인하려면 다음과 같은 수치로 알아볼 수 있다.
netstat -s -p tcp
출력되는 메시지에서 다음과 같은 항목을 찾을 수 있다.
tcpListenDrop = 0
tcpListenDropQ0 = 0
tcpListemDrop은 accept() system call시에 버려진 half-open 연결의 카운트이며, tcpListenDropQ0는 처음 SYN을 받고 두번째 ACK를 받지 못한 half-open 연결이 큐에 들어가지 못한 카운트이다. 보통 이 카운트가 0이 아닌 경우에는 침입을 의심하기 바란다.
ndd 명령은 솔라리스에서 NIC 디바이스에 대해서 세세한 조정을 할 수 있으므로 자세하게 알아두면 좋다.
리눅스에서도 마찬가지로 "netstat -an" 명령으로 공격받고 있는지 확인할 수 있다. 만일 이런 상태가 계속된다면 설정값을 조정해야 한다. 우선 커널 컴파일을 다시 하면서 "CONFIG_SYNCOOKIES" 옵션을 활성화 시킨다. 새로 컴파일한 커널로 재부팅한 후에 sysctl 명령으로 다음 값을 재지정한다.
sysctl -w net.ipv4.tcp_syncookies=1
이 설정으로 커널 레벨에서 SYN flooding 공격에 대한 훌륭한 방어가 된다. 참고로 로드가 많이 걸리거나 서버간의 잘못된 설정으로 쓸데 없는 접속이 많은 서버에서는 이 공격이 없어도 synflood 경고가 나타날 수 있다. 이 때는 tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow 값을 조정하거나 서버간 설정을 고쳐야 한다. 자세한 내용은 /usr/src/linux/Documentation/networking/ip-sysctl.txt을 참고 하기 바란다.
모든 DoS 공격 방법을 설명하지는 않았지만, 이 부족한 글로 DoS 공격에 대한 이해와 적절한 대비책을 찾을 수 있었으면 좋겠다. 끝으로 변명을 하자면 모든 해킹 방법을 소개하고 그에 대한 대책을 제시할 수 있으면 좋겠지만 해킹은 늘 빠르게 변화하고 있고, 보안 기술은 늘 그 뒤를 따르고 있다. 따라서 네트웍 관리자나 시스템 관리자 모두 보안관련 사이트(CERT-CC, MS Security Bulletin)를 정기적으로 확인하는 자세가 필요하다.
참고자료
- Network Bible 2nd. (영진출판사)
- Security PLUS For UNIX (영진출판사)
- 시스템 관리의 핵심(한빛미디어)
- 인터넷 방화벽 구축하기(한빛미디어)
- SA-400(Sun Educational Service)