회사 리눅스 서버에서 /etc/resolv.conf 설정상 Cache DNS의 L4 VIP로 쿼리가 날아가야 정상인데, Cache DNS 로그상 Real IP로 쿼리가 들어오는 경우가 일부 보였다. 해당 서버를 찾아가봤지만 resolv.conf는 정상 설정 상태였고 도무지 어떤 데몬이 DNS 쿼리를 Real IP로 날리는지 알 수 없었다.


구글링으로 여러가지 방법을 찾아본 결과 auditd를 활용하는게 제일 편했다.


1. audit rule 추가

아래와 같이 audit rule을 추가한다. -F a2=17은 IPPROTO_UDP (0x11) 만 필터하겠다는 뜻이다. (dig 말고 실제 application에서 0x10으로 들어오는 경우도 있어서 필터 취소)

auditctl -a always,exit -F arch=b64 -S connect,sendto,sendmsg,socket -k udp_connections



2. 테스트

아래와 같이 내 블로그의 주소를 구글 DNS에 쿼리해 보았다.


dig @8.8.8.8 www.snoopybox.co.kr


3. 검색

ausearch에 -i 옵션을 줘야 주소가 16진수가 아닌 정상 표시된다. grep -A1은 찾은 주소 다음 줄에 실제 필요한 auid, pid 등의 정보가 출력되기 때문에 After 1 줄을 더 보겠다는 뜻이다.


ausearch -i | grep -A1 8.8.8.8



4. 결과

아래와 같이 내가 원했던 pid와 auid 등을 찾을 수 있었다.


type=PROCTITLE msg=audit(04/08/2019 17:12:28.891:102) : proctitle=dig @8.8.8.8 www.snoopybox.co.kr 
type=SYSCALL msg=audit(04/08/2019 17:12:28.891:102) : arch=x86_64 syscall=socket success=yes exit=6 a0=inet a1=SOCK_DGRAM a2=udp a3=0x0 items=0 ppid=12528 pid=12580 auid=root uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts1 ses=3 comm=dig exe=/usr/bin/dig key=udp_connections 



5. 삭제

전체 rule을 삭제하려면 auditctl -D 하면 된다. 하지만 다른 rule을 건드리지 않고 삭제하고픈 특정 rule만 삭제하려면 auditctl -d로 삭제해야 하는데, -a로 rule을 추가했던 값 그대로 -d를 입력하면 되지만 기억을 못할 수 있으니 -l로 먼저 조회를 해보자.


[root@CentOS7 ~]# auditctl -l
-a always,exit -F arch=b64 -S socket,connect,sendto,sendmsg -F key=udp_connections


조회된 rule에서 삭제하고 싶은 라인을 -a 대신 -d로 변경하면 삭제 가능하다.


[root@CentOS7 ~]# auditctl -d always,exit -F arch=b64 -S socket,connect,sendto,sendmsg -F key=udp_connections
[root@CentOS7 ~]# auditctl -l
No rules