폐쇄망 현장 — 방산·국방 도메인 · 나가는 통신이 없다는 것을 자료로 보이기 · 실습
나가는 통신이 없다는 것을 자료로 보이기
목표
제품 구성 파일과 세 가지 기록만으로 "인가받지 않은 바깥 통신이 없다" 를 판정하고, 감리에 그대로 낼 수 있는 요약을 만든다. 확인한 범위와 확인하지 못한 것이 같은 문서에 들어 있어야 한다.
왜 중요한가
망 분리 환경의 인도에서 "밖으로 나가지 않습니다" 는 문장으로 받아들여지지 않는다. 제품에는 업데이트 확인, 라이선스 검사, 원격 진단, 사용 통계, 시각 동기가 들어 있고 대부분 기본값이 켜짐이다.
이 실습 파드에는 커널 권한이 하나도 없어 tcpdump 도 iptables 도 동작하지 않는다. 패킷을 잡아 보이는 길이 애초에 없다는 뜻이다. 실제 현장에서도 그 자리는 네트워크 팀이 내주는 방화벽 정책 사본과 장비 로그가 채우고, 개발자가 낼 수 있는 자료는 구성과 기록이다. 그래서 이 실습은 설정과 기록을 근거로 판정한다. 이것이 이 실습의 가정이다.
숫자를 맞히는 것보다 세 가지를 구분하는 일이 중요하다. 주석으로 가려 둔 항목과 기본값으로 켜져 있는 항목, 막힌 시도와 나간 통신, 그리고 이름으로 대조할 수 없어 아직 모르는 것.
단계
1. python3 /root/egress/mkdata.py 로 판정의 바탕이 될 자료를 만든다. 구성 3개, 허용 목록, 프록시·DNS·형상 변경 기록이 나온다.
2. 구성에서 바깥을 가리키는 주소를 전부 뽑아 /root/egress/endpoints.tsv 에 host port scheme state source 로 적는다.
3. 허용 목록과 대조해 /root/egress/classify.tsv 에 host port state verdict 로 세 갈래로 가른다.
4. 프록시 기록에서 미허용 목적지로 간 시도를 세어 /root/egress/attempts.tsv 에 host port attempts ok auth blocked 로 적는다.
5. 질의 기록에만 있는 목적지를 /root/egress/dns-only.tsv 에 host queries nxdomain 으로 적고, 이 파드의 이름 해석을 직접 관찰해 /root/egress/resolver.txt 에 남긴다.
6. 세 기록을 시각으로 이어 /root/egress/timeline.tsv 에 host change_id first_dns first_proxy 로 적는다.
7. 원본을 두고 /root/egress/conf-after/ 에서 구성을 끈 뒤 python3 /root/egress/collect.py 로 기록을 다시 뽑고, /root/egress/after.txt 에 끄기 전후의 숫자를 적는다.
8. /root/egress/egress-report.json 과 /root/egress/egress-report.txt 에 감리 제출용 요약을 낸다.
참고
- 재료는 전부
/root/egress아래에 만들어진다. 구성은conf/agent.conf,conf/collector.conf,conf/plugins.json세 개이고 허용 목록은allowlist.txt, 기록은proxy.log,dns.log,change.log다. - 도구 두 개가 함께 만들어진다.
mkdata.py는 자료를 만들고,collect.py는conf-after/의 구성으로 기록을 다시 뽑아proxy-after.log와dns-after.log를 남긴다. 둘 다 난수를 쓰지 않아 몇 번을 돌려도 같은 결과가 나온다. - 표는 탭이나 공백으로 칸을 나누고 머리글 줄은 두지 않는다. 빈 칸은 하이픈 하나로 적는다.
- ini 구성은 절 단위로
url과enabled를 짝짓는다. 절에enabled가 없으면 켜진 것으로 본다(제품 설명서 4.3절, 이 실습의 가정). jq로 JSON 을 읽는다면.enabled // true를 쓰지 않는다. 대체 연산자는 값이 정확히false일 때도 오른쪽을 쓴다.has("enabled")로 키의 유무를 먼저 본다.- 응답 코드 200 은 실제로 나간 것, 407 은 프록시가 인증을 요구한 것, 403 은 프록시가 막은 것이다. 셋을 뭉뚱그리지 않는다.
- 흔한 실수: 주석으로 가려 둔 목적지를 목록에서 빼기, 프록시 기록만 보고 UDP 통신을 놓치기, 주소로 적힌 목적지를 허용이나 미허용 한쪽으로 몰기, 기록을 지워서 0건 만들기.
단계 8개
- 판정의 바탕이 될 자료를 망 안에서 만들기
- 구성에서 바깥 주소를 빠짐없이 뽑기
- 허용 목록과 대조해 세 갈래로 가르기
- 프록시 기록에서 실제 시도를 응답별로 세기
- 연결은 없고 이름만 물어본 목적지 찾기
- 세 기록을 시각으로 이어 언제부터인지 짚기
- 끄고 다시 수집해 사라졌음을 보이기
- 감리 제출용 요약 내기