LabHub
学习 学习路径 课程

闭网现场 — 国防领域

用材料证明没有对外通信

在 LabHub 中继续学习

한국어 원문으로 표시합니다.

목표

제품 구성 파일과 세 가지 기록만으로 "인가받지 않은 바깥 통신이 없다" 를 판정하고, 감리에 그대로 낼 수 있는 요약을 만든다. 확인한 범위와 확인하지 못한 것이 같은 문서에 들어 있어야 한다.

왜 중요한가

망 분리 환경의 인도에서 "밖으로 나가지 않습니다" 는 문장으로 받아들여지지 않는다. 제품에는 업데이트 확인, 라이선스 검사, 원격 진단, 사용 통계, 시각 동기가 들어 있고 대부분 기본값이 켜짐이다. 이 실습 파드에는 커널 권한이 하나도 없어 tcpdumpiptables 도 동작하지 않는다. 패킷을 잡아 보이는 길이 애초에 없다는 뜻이다. 실제 현장에서도 그 자리는 네트워크 팀이 내주는 방화벽 정책 사본과 장비 로그가 채우고, 개발자가 낼 수 있는 자료는 구성과 기록이다. 그래서 이 실습은 설정과 기록을 근거로 판정한다. 이것이 이 실습의 가정이다. 숫자를 맞히는 것보다 세 가지를 구분하는 일이 중요하다. 주석으로 가려 둔 항목과 기본값으로 켜져 있는 항목, 막힌 시도와 나간 통신, 그리고 이름으로 대조할 수 없어 아직 모르는 것.

단계

  1. python3 /root/egress/mkdata.py 로 판정의 바탕이 될 자료를 만든다. 구성 3개, 허용 목록, 프록시·DNS·형상 변경 기록이 나온다.
  2. 구성에서 바깥을 가리키는 주소를 전부 뽑아 /root/egress/endpoints.tsvhost port scheme state source 로 적는다.
  3. 허용 목록과 대조해 /root/egress/classify.tsvhost port state verdict 로 세 갈래로 가른다.
  4. 프록시 기록에서 미허용 목적지로 간 시도를 세어 /root/egress/attempts.tsvhost port attempts ok auth blocked 로 적는다.
  5. 질의 기록에만 있는 목적지를 /root/egress/dns-only.tsvhost queries nxdomain 으로 적고, 이 파드의 이름 해석을 직접 관찰해 /root/egress/resolver.txt 에 남긴다.
  6. 세 기록을 시각으로 이어 /root/egress/timeline.tsvhost 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/mkdata.py 를 저장해 실행하고, 재수집 도구 /root/egress/collect.py 도 함께 받아 두세요.

폐쇄망이라 자료를 밖에서 받아 올 수 없습니다. 생성 스크립트는 이 단계의 정답 보기에 그대로 들어 있으니 저장해서 실행하세요. 난수를 쓰지 않는 스크립트를 그대로 써야 누가 돌려도 같은 자료가 나오고, 서로의 판단을 대조할 수 있습니다. 파일을 손으로 고치면 뒤 단계의 숫자가 전부 어긋납니다.

구성에서 바깥 주소를 빠짐없이 뽑기

구성 파일 세 개에서 바깥을 가리키는 주소를 전부 찾아 /root/egress/endpoints.tsvhost port scheme state source 로 적으세요.

절 밖에 있는 listen 은 받는 자리라 바깥 주소가 아닙니다. 주석으로 가려 둔 목적지는 꺼짐으로 표에 올리되 빼지 않습니다. plugins.json 에서는 enabled 키가 없는 것과 값이 false 인 것이 다릅니다. source 는 파일 이름만 적습니다.

허용 목록과 대조해 세 갈래로 가르기

/root/egress/classify.tsvhost port state verdict 로 적으세요. verdict 는 allowed, denied, unknown 중 하나입니다.

허용 목록은 이름과 포트로 적혀 있습니다. 구성에 주소가 곧바로 적힌 목적지는 그 목록과 대조할 방법이 없으니 허용도 미허용도 아닙니다. 사설 대역이라 밖으로 나갔을 가능성이 낮다는 것과 확인했다는 것은 다른 말입니다.

프록시 기록에서 실제 시도를 응답별로 세기

/root/egress/attempts.tsv 에 미허용 목적지로 간 시도를 host port attempts ok auth blocked 로 적으세요.

ok 는 200, auth 는 407, blocked 는 403 의 건수이고 attempts 는 셋의 합입니다. 허용 목록에 있는 목적지는 이 표에 넣지 않습니다. 구성에는 없는데 기록에만 나오는 목적지가 있다면 그것도 미허용입니다.

연결은 없고 이름만 물어본 목적지 찾기

/root/egress/dns-only.tsvhost queries nxdomain 을 적고, /root/egress/resolver.txt 에 이 파드의 이름 해석을 직접 관찰한 결과를 적으세요.

프록시를 거치지 않는 통신은 접속 기록에 아무것도 남기지 않습니다. 질의 기록에는 있고 접속 기록에는 없는 이름이 그 흔적입니다. 승인된 목적지는 빼세요. resolver.txt 는 nameserver, query, status 세 줄이고 status 는 dig 이 내놓은 문자열 그대로 적습니다.

세 기록을 시각으로 이어 언제부터인지 짚기

/root/egress/timeline.tsv 에 미허용 목적지마다 host change_id first_dns first_proxy 를 적으세요. 없는 칸은 하이픈 하나로 둡니다.

대상은 4단계와 5단계에서 나온 목적지를 합친 것입니다. change.log 의 item 값이 구성의 어느 절을 가리키는지 보면 변경과 목적지가 이어집니다. 짝지을 변경이 없으면 하이픈입니다. 형상 관리 밖에서 생긴 목적지를 드러내는 것이 이 표의 쓸모입니다.

끄고 다시 수집해 사라졌음을 보이기

/root/egress/conf-after/ 에서 미허용 목적지를 끄고 python3 /root/egress/collect.py 로 기록을 다시 뽑은 뒤, /root/egress/after.txt 에 네 개의 숫자를 적으세요.

원본 구성은 증거이니 사본에서 고칩니다. 항목을 지우지 말고 끄기만 하세요. 꼭 필요한 기능은 끄는 대신 허용 목록 안의 목적지로 돌립니다. 기록을 손으로 지워서 0건을 만들 수는 없습니다. 채점기는 승인된 목적지가 그대로 남아 있는지도 봅니다.

감리 제출용 요약 내기

/root/egress/egress-report.json/root/egress/egress-report.txt 에 확인한 범위와 확인하지 못한 것을 함께 적은 요약을 내세요.

숫자는 전부 앞 단계의 표에서 나옵니다. unverified_hosts 에는 이름으로 대조할 수 없었던 목적지만 넣습니다. direct_egress_checked 와 packet_capture_checked 는 이 자료로 확인하지 못한 것이니 정직하게 적습니다. 사람이 읽는 표에는 기록에만 나온 목적지까지 한 줄씩 들어가야 합니다.