본문 바로가기

정보보안/침해사고 분석 및 대응

[보안장비 운영] 침입차단시스템

침입차단시스템
iptables

① 개념

  • 패킷 필터링(Packet Filtering) 기능이 있는 리눅스 커널에 내장된 netfilter 기능을 관리하기 위한 도구. 
  • (패킷필터링) rule 기반의 패킷 필터링 기능 제공
  • 상태추적(Connection Tracking / Statueful Inspection)기능 제공
    • (상태추적 기능) 방화벽을 통과하는 모든 패킷에 대한 연결 상태를 추적(tracking)하여 메모리에 기억하고 있다가 기존 연결을 가장해 접근할 경우, 메모리의 저장상태목록과 비교해 적합하면 통과, 부적합이면 거부
    • (상태추적 테이블) 방화벽의 메모리상에 생성된 연결 정보를 가지고 있는 모든 송수신 패킷을 기록하고 검사하는 테이블
    • (보안상 장점) 연결된 상태의 패킷인 것처럼 위조한 패킷의 접근 차단
    • (성능상 장점) 연결된 상태의 패킷에 대해서는 더 이상 패턴 매칭 검사 수행 x
    • Stateful Inspection(상태 검사) 방화벽이라는 표현은 90년대 초 이스라엘 보안업체인 체크포인트사에서 최초로 개발한 방화벽 구조로 오늘날 대부분 방화벽에서 기본적으로 제공하는 기능이다
  • (네트워크 주소변환) NAT 기능 제공
  • (로깅) 패킷 레벨에서의 로깅 기능 제공
  • (확장성) 확장 모듈을 통한 다양한 기능 제공

 

② 관련 용어

  1. 테이블(Table) : iptables가 제공하는 기능. 제공해주는 테이블에는 Filter,Nat,Mangle이 있다. Filter 기능은 가장 기본적인 기능으로 테이블을 명시하지 않으면 default로 Filter 테이블을 의미
  2. 체인(Chain) : 패킷이 이동하는 경로
    • Filter Table에는 3가지의 chain이 존재 
      • INPUT Chain : 방화벽을 최종 목적지로 하는 체인
      • OUTPUT Chain : 방화벽을 최초 출발지로 하는 체인
      • FORWARD Chain : 방화벽을 통과하는 채널. 방화벽을 별도의 서버로 구성해서 서비스할 때 사용하는 체인 (네트워크 방화벽)
  3. 룰(Rule) : 패킷을 필터링하기 위한 규칙

 

③ 사용법

  1. 기본
    • 형식 : iptables [테이블] [체인] [룰] [타겟]
    • 대소문자 구별함.
  2. 테이블(Table) 설정
    • 형식 : -t [테이블]
    • 테이블을 명시하지 않을 경우 default로 Filter 테이블 적용
  3. 체인(Chain) 설정
    • 형식 : iptables -[ A | I | D ] [체인]
      • -A : (append 모드) 해당 체인의 제일 마지막에 룰 추가
      • -I : (insert 모드) 해당 체인의 첫 행에 룰을 추가하며 "-I 체인 n" 형식으로 행 번호 n을 지정하면 특정 위치에 룰을 추가
      • -D : (delete 모드)
        • "-D 체인 룰" : 해당 룰을 삭제
        • "-D 체인 n" : 행번호 n을 지정해 그 위치 룰 삭제
    • Filter 테이블일 경우 3가지의 체인 : INPUT 체인, OUTPUT 체인, FORWARD 체인
  4. 룰(Rule) 설정
    1. IP/ICMP/TCP/UDP 모두 호스트를 식별하기 위해서 IP를 이용
      • -s [IP 또는 IP 대역] : Source IP 명시. (default: any)
      • -d [IP 또는 IP 대역] : Destination IP 명시. (default: any)
    2. TCP/UDP의 경우 포트 번호를 통해 서비스 식별 (범위를 나타내는 구분자 : 사용) 
      • --sport [포트번호] : Source Port
        • ex) --sport 23 : 23번 출발지 포트
        • ex) --sport 1:1023 : 1-1023 출발지 포트
        • ex) --sport 1024: : 1024 이상 출발지 포트
        • ex) --sport :65535  :65535 이하 출발지 포트
      • --dport [포트번호] : Destination Port
    3. ICMP의 경우 타입과 코드를 통해 메시지 식별
      • --icmpy-type [메시지 타입] : 메시지 타입 명시
        • ex) --icmp-type echo-request : ICMP Echo Request 메시지 의미
    4. TCP 패킷 행동 유형에 따른 필터링 룰 설정으로 다음의 모든 옵션은 TCP 프로토콜(-p tcp) 옵션이 먼저 설정되어야 한다.
      • --tcp-flags [검사할 플래그 리스트] [설정되어야할(설정되어있는) 플래그 리스트]
        • ex) --tcp-flags SYN,FIN SYN,FIN : SYN,FIN 플래그만 검사해서 SYN,FIN 플래그가 설정된 패킷을 탐지한다. (=SF+)
        • ex) --tcp-flags ALL SYN,FIN : 모들 플래그(ALL)를 검사해서 SYN,FIN플래그만 설정된 패킷을 탐지한다.(=SF)
      • --m state --state [탐지할상태]
        • -m state : 확장 기능 중, TCP 상태기능(상태추적) 기능을 사용한다는 의미.
        • --state [탐지할상태] : 탐지할 상태에는 NEW, ESTABLISHED, RELATED, INVALID가 있다.
  5. 타겟(Target) 설정
    • -j [정책] : 룰에 매칭될 때 적용할 정책 지정
      • -j ACCEPT : 해당 패킷 허용
      • -j DROP : 해당 패킷 차단 후 응답메시지 전송 x
      • -j REJECT : 해당 패킷 차단 후 ICMP 에러메시지로 응답
      • -j LOG : 탐지 로그 남김. (일반적으로 "/etc/log/messages"에 남김)
  6. 기타 옵션
    1. iptables -L [체인] -n
      • -L [체인] : 해당 체인에 등록된 룰 리스트 확인
      • -n : IP와 Port를 숫자형식으로 출력. 
    2. iptables -F [체인] : 해당 체인에 등록된 모든 룰 정보 삭제(Flush)
    3. iptables -P [체인] [ ACCEPT | DROP | REJECT ]
      • -P [체인] [정책] : 해당 체인의 기본 정책을 지정.
        • 기본정책 : 해당 체인의 모든 룰에 매칭되지 않으면 적용되는 정책
          • Negative 정책 : default policy를 DROP/REJECT 하고 허용할 부분만 ACCEPT (화이트리스트)
          • Positive 정책 : default Policy를 ACCEPT로 하고 차단할 부분만 DROP/REJECT (블랙리스트)

 

④ 상태추적(connection tracking) 기능활용

  1. 상태 유형
    • NEW 상태 : 최초로 들어온 패킷의 상태. 상태추적 테이블에 연결정보 가지고있지 않음. (일반적으로 TCP에 경우 SYN)
    • ESTABLISHED 상태 : 상태추적 테이블에 연결 정보를 가지고 있는 패킷의 상태. 연결된 이후 송수신 되는 패킷들
    • RELATED 상태 : 상태추적 테이블에 연관된 연결 정보를 가지고 있는 패킷의 상태.
      • 연관된 상태 : 연결 시 포트 정보가 서비스 수행 중에 새롭게 추가될 수 있는데 이러한 서비스 패킷은 연관된 상태가 됨
      • ex) 대표적으로 FTP 프로토콜. (activemode) 21/tcp로 제어 채널 생성 후 20/tcp로 데이터 채널 생성. 이때 데이터 채널로 송수신되는 패킷들은 모두 related 상태가 됨
    • INVALID 상태 : 어떤 상태에도 해당하지 않는 패킷 상태. 연결 상태를 알 수 없거나 잘못된 헤더를 가지고 있는 경우
  2. 프로토콜별 상태 유형
    • TCP 프로토콜 상태
      • NEW: SYN이 보일때. inbound SYN 이 처음 들어오면 NEW 상태
      • ESTABLISHED: SYN+ACK가 보일 때. SYN+ACK outbound 응답 패킷이 나갈 때부터
      • 연결 종료 시에는 마지막 ack 패킷이 보이기 전 까지 ESTABLISHED 상태
    • UDP 프로토콜 상태
      • 비연결 프로토콜로 연결 상태를 유지하지 않아 프로토콜 수준에는 연결 상태 정보가 없다.
      • NEW : 최초 들어온 패킷
      • ESTABLISHED : 패킷이 들어올 때마다 임의의 시간(TTL) 동안 정보를 유지함. 이 상태를 ESTABLISHED
  3. 상태추적 기능 예시
    1. 위조된 TCP SYN 패킷 차단을 위한 룰 설정
      • TCP 패킷 중 상태추적 테이블에서는 NEW 상태이면서(최초들어왔으면서) SYN 플래그를 설정하지 않는 패킷은 차단한다.
      • TCP 상태 추적 테이블에 NEW 상태라면 반드시 SYN 플래그가 설정된 패킷이어야 하며 이외에 패킷은 모두 조작된 패킷으로 차단한다.
      • 룰 작성
        #service iptables restart
        ① iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
        ② iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "[Wrong SYN Packet]"
        ③ iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
      • ① iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
      •  상태 추적 기능을 사용하기 위해서는 state 모듈과 state 옵션을 이용해 관련 상태 유형을 명시한다. 해당 라인을 보면 ESTABLISHED 상태 또는 RELATED 상태의 패킷에 대해서는 모두 허용하도록 설정한다.
      • (성능성 장점) 이 덕분에 이미 허용된 트래픽에 대해 이후 발생하는 패킷들의 룰 검사를 다시 할 필요 없이 빠르게 허용할 수 있다.
        ② iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "[Wrong SYN Packet]"
      • inbound TCP 패킷의 상태가 NEW 상태이면서, SYN 플래그가 설정되지 않은 비정상 패킷을 명시한 이름으로 로그에 남긴다.
        ③ iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
      • iinbound TCP 패킷의 상태가 NEW이면서 SYN 플래그가 설정되지 않은 비정상 패킷을 모두 폐기한다(메시지X)
    2. FTP Active Mode 상태추적 기능 
      1. 룰 설정
        service iptables restart
        # 기본 정책 설정 -P(Policy
        iptables -P INPUT DROP # 모든 inbound에 대하여 차단 
        iptables -P OUTPUT DROP # 모든 outbound에 대하여 차단 

        # INPUT 체인에 대해 ESTABLISHED,RELATED 상태의 패킷 로그를 남기도록 설정
        iptables -A INPUT -m state --state ESTABLISHED -j LOG --log-prefix "[FTP INPUT_ESTABLISHED]"
        iptables -A INPUT -m state --state RELATED -j LOG --log-prefix "[FTP INPUT_RELATED]"

        # INPUT 체인에 대해 ESTABLISHED,RELATED 상태의 패킷 로그를 모두 허용
        iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

        # INPUT 체인에 대해 tcp 21번 포트(FTP)에 대한 연결 요청을 로그를 남기도록 설정
        iptables -A INPUT -m state --state NEW -p tcp --dport 21 -j LOG --log-prefix "[FTP INPUT_NEW]"
        # INPUT 체인에 대해 tcp 21번 포트(FTP)에 대한 연결 요청을 모두 허용
        iptables -A INPUT -m state --state NEW -p tcp --dport 21 -j ACCEPT

        #OUTPUT 체인에 대해 ESTABLISHED,RELATED 상태의 패킷 로그를 남기도록 설정
        iptables -A OUTPUT -m state --state ESTABLISHED -j LOG --log-prefix "[FTP IOUTPUT_ESTABLISHED]"
        iptables -A OUTPUT -m state --state RELATED -j LOG --log-prefix "[FTP OUTPUT_RELATED]"
        # OUTPUT 체인에 대해 ESTABLISHED,RELATED 상태의 패킷을 모두 허용
        iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
      2. (active 모드 로그) (spt=45524 dpt=21)input new > (spt=21 dpt=45524)output esatblished > (spt=45524 dpt=21)input esatblished > (spt=22 dpt=42185)output related
      3. (passive 모드 로그 ) (spt=50576 dpt=21) input new >  (spt=21 dpt=50576) outpuet established > (spt=50576 dpt=21) input established > (spt=40554 dpt=60524) input establshed

 

⑤ iptables 확장모듈 : iptables는 다양한 확장 모듈(-m)을 사용해 효과적인 필터링 정책 설계할 수 있다.

  1. connlimit 모듈 : 동일한 IP/IP대역의 동시 연결 개수에 대한 제한 (디도스 공격에 효과적)
    • 옵션
      • --connlimit-above n : n을 초과하는 동시 연결 제한
      • --connlimit-above mask : 0 - 32 벙위의 Mask값 지정. IP 대역에 대한 동시 연결 제한
    • 예시
      • 웹서버(80/tcp)에 대한 TCP SYN Flooding 공격에 대응하기 위한 룰 설정1
        iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 

        # tcp 80포트 요청에 대하여 동일 출발지에서 동시 연결 개수가 5개 초과 시 이를 "[CONNLIMIT]" 접두어를 사용해 로그에 남긴다.
        iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -j LOG --log-prefix "[CONNLIMIT]"
        # tcp 80포트 요청에 대하여 동일 출발지에서 동시 연결 개수가 5개 초과 시 이를 DROP(차단)한다.
        iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -j DROP

        iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
      • 웹서버(80/tcp)에 대한 TCP SYN Flooding 공격에 대응하기 위한 룰 설정2
        iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 

        # tcp 80포트 요청에 대하여 동일24bit마스크 대역의 I에서 동시 연결 개수가 10개 초과 시 이를 "[CONNLIMIT]" 접두어를 사용해 로그에 남긴다.
        iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 --conlimit-mask 24 -j LOG --log-prefix "[CONNLIMIT]"
        # tcp 80포트 요청에 대하여  동일24bit마스크 대역의 I에서 동시 연결 개수가 10개 초과 시 이를 DROP(차단)한다.
        iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 --conlimit-mask 24 -j DROP

        iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
  2. limit 모듈 : 룰에 매칭되는 비율을 제한할 수 있는 기능 (불필요한 로그를 남지 않도록 함)
    • 옵션 
      • --limit : 초당/분당/시간당/하루당 매칭되는 제한 건수 지정
      • limit [n/second(또는 s) | n/minute(또는 m) | n/hour(또는 h) | n/day(또는 d)
    • 예시
      • 비정상적인 TCP 플래그 패킷 차단 룰 설정
        iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

        #① SYN_FIN 패킷 조합 차단(SF)
        #TCP 패킷의 모든 플래그를 검사해서 SYN,FIN 플래그만 설정된 패킷을 분당 최대 6개까지 로그를 남긴다.
        iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN -m limit --limit 6/m -j LOG --log-prefix "[LIMIT]"
        #TCP 패킷의 모든 플래그를 검사해서 SYN,FIN 플래그만 설정된 패킷을 모두 DROP(차단)한다.
        iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN -j DROP

        #SYN_FIN 패킷 변형 차단(SF+)
        #TCP 패킷의 SYN,FIN 플래그만 검사해서 SYN,FIN 플래그만 설정된 패킷을 초당 최대 1개까지 로그를 남긴다.
        iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 1/s -j LOG --log-prefix "[LIMIT2]"
        #TCP 패킷의SYN,FIN 플래그만 검사해서 SYN,FIN 플래그만 설정된 패킷을 모두 DROP(차단)한다.
        iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

        #③ FIN 패킷 차단
        #TCP 패킷의 모든 플래그를 검사해서 FIN 플래그만 설정된 패킷을 초당 최대 1개까지 로그를 남긴다.
        iptables -A INPUT -p tcp --tcp-flags ALL FIN -m limit --limit 1/s -j LOG --log-prefix "[LIMIT3]"
        #TCP 패킷의 모든 플래그를 검사해서 FIN 플래그만 설정된 패킷을 모두 DROP(차단)한다.
        iptables -A INPUT -p tcp --tcp-flags ALL FIN -j DROP

        #④ 플래그가 설정되지 않은 패킷 차단 (NULL)
        #TCP 패킷의 모든 플래그를 검사해서 플래그가 설정되지 않은 패킷을 초당 최대 1개까지 로그를 남긴다.
        iptables -A INPUT -p tcp --tcp-flags ALL NONE -m limit --limit 1/s -j LOG --log-prefix "[LIMIT4]"
        #TCP 패킷의 모든 플래그를 검사해서 플래그가 설정되지 않은 패킷을 모두 DROP(차단)한다.
        iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

        #⑤ 모든 플래그가 설정된 패킷 차단 (X-Mas)UAPRSF
        #TCP 패킷의 모든 플래그를 검사해서 플래그가 설정되지 않은 패킷을 초당 최대 1개까지 로그를 남긴다.
        iptables -A INPUT -p tcp --tcp-flags ALL ALL -m limit --limit 1/s -j LOG --log-prefix "[LIMIT5]"
        #TCP 패킷의 모든 플래그를 검사해서 플래그가 설정되지 않은 패킷을 모두 DROP(차단)한다.
        iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

        iptables - A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
  3. recert 모듈: 동적으로 Source IP 목록을 생성해(변수같은거 만들어서 저장) 이를 기반으로 패킷을 제어하는 기능 제공