Introduction

Summary

Public cloud의 문제점중 하나는, 가시성 확보가 어렵다 이다. 보안을 위해서 여러 Layer의 가시성 확보가 필요한대, 특히 Network 트래픽 데이터에 대해서는 필수이다. on-premise 환경에서는 TAP hardware 장비등을 이용하여 가시성 확보가 가능 했지만, Public cloud에서는 hardware를 사용할 수 없기때문에 다른 방법을 사용해야 한다. 리눅스 서버의 경우 iptables의 TEE module을 사용하여 간편하게 네트워크 트래픽을 미러링 할 수 있는데, 이 방법에 대해 기술하고자 한다.

Backbround

Public cloud의 보안을 하다보면 큰 문제에 부딪히는데, 바로 가시성 확보가 어렵다는 부분이다. 특히 네트워크 트래픽 데이터에 대한 검증은 필수 요소이나 L3/L4 수준의 가시성만 제공한다. 하지만 정확하고 정밀한 보안을 하려면 L7수준 까지의 확보가 필요하고, 아쉽게도 모든 Public cloud에서는 Network mirroring기능을 제공하지 않는다. 그렇다고 상용 솔루션을 구매해서 agent를 설치하자니 비용적으로나 운영측면에서 장애 요소가 부담 되는데, 이를 해결 할 수 있는 방법을 iptables에서 찾아보았다.

TEE module 소개

TEE
    The TEE target will clone a packet and redirect this clone to another machine on the local
    network segment. In other words, the nexthop must be the target, or you will have to  con-
    figure the nexthop to forward it further if so desired.

    --gateway ipaddr
     Send  the  cloned  packet  to  the  host reachable at the given IP address.  Use of
     0.0.0.0 (for IPv4 packets) or :: (IPv6) is invalid.

    To forward all incoming traffic on eth0 to an Network Layer logging box:

    -t mangle -A PREROUTING -i eth0 -j TEE --gateway 2001:db8::1

(Unix iptables man page에서 발췌)

Unix의 tee 명령은 특정 프로그램 실행 결과를 입력으로 받아서, 파일이나 스트링으로 출력 할 수 있다. 이것을 iptables에 접목한 것으로 iptables의 TEE module은 Network Interface card(NIC)에서 발생한 트래픽을 다른쪽(Server/NIC)으로 전달하고자 할때 사용할 수 있는데, 흡사 Network switch 또는 TAP 장비와 같이 mirroring이 가능하다.

Mirroring 구축

구성도

테스트용 구성은, 외부망의 Laptop과 EC2(118.118.77.30)간 통신 트래픽을 IP주소 118.118.84.105 EC2에게 Mirroring 하도록 해서, 105번 인스턴스에서 laptop과 30번 인스턴스간 통신 내역을 확인 할 수 있도록 했다.

1. Mirroring 대상 EC2의 iptables 설정

1.1 118.118.77.30 EC2로 ssh 접속.
1.2 sudo iptables -t mangle -I POSTROUTING -j TEE –gateway 118.118.84.105 명령어 실행으로 내부 Private IP를 외부 Public IP로 변환 mirroring 정책 추가.
1.3 sudo iptables -t mangle -I PREROUTING -j TEE –gateway 18.118.84.105 명령어 실행으로 외부 Public IP를 내부의 사실IP로 변환 mirroring 정책 추가.
1.4 sudo /etc/init.d/iptables start 명령 실행으로 iptables 활성화.
1.5 sudo iptables -t mangle -L 명령 실행으로 1.2와 1.3의 정책이 잘 들어 갔는지 확인.


(정책이 잘 들어갔다면, 이렇게 확인 되어야 한다)

1.6 재부팅시 iptables 정책이 초기화 되는데, 이를 방지 하려면 sudo /etc/init.d/iptables save 명렁 실행.

원하는 protocol, port를 필터링 하려면 URL 참조(http://www.packetinside.com/2012/08/iptables.html)

2. Mirroring 받는 EC2의 설정

2.1 AWS의 EC2 콘솔 접속.
2.2 promiscuous mode 활성화를 위해, Mirroring 받을 EC2 선택 후 Action → Networking → Change Source/Dest. Check → Disable 선택.

기본적으로 EC2는 자기 자신을 향하는 트래픽이 아니면, 받지 않도록 되어 있다.



(Disable 버튼을 클릭하자)

3. Mirroring 확인

3.1 mirroring 트래픽을 수신하는 EC2 접속.
3.2 sudo tcpdump -nni eth0 -A src 118.118.77.30 명령어로, 30번 EC2에서 들어오는 트래픽의 데이터만 볼 수 있도록 tcpdump 실행.
3.3 laptop에서 30번 EC2의 Public IP주소로 ping이나, ssh로 접속해서 외부의 웹사이트에 접속 해보기.
3.4 mirroring 트래픽을 수신하는 EC2에서, 30번 EC2의 트래픽이 tcpdump로 보인다면 성공! 만약, 안된다면 promiscuous mode 설정이 올바로 되었는지 확인.



(laptop에서 30번 EC2로 ping 보내는것을 105번 EC2에서 tcpdump로 확인 할 수 있다. )

4. 응용하기

mirroring 받은 트래픽을 활용 할 수 있는 방법은 많이 있다. suricata나 Bro와 같은 opensource IDS를 설치해서, VPC 내부 트래픽을 모니터링 하거나 요즘 문제가 되고 있는 AWS의 네트워크 품질에 대해서 packet들의 시퀸스 번호를 트래킹 한다면, 어느정도 loss가 발생하는지 등의 품질 측정도 가능하다.




끝!