화이트햇 스쿨 4기 2인 팀 프로젝트 · stacknoah/ismsp-asset
AWS 계정의 정보자산을 boto3로 훑어 ISMS-P 인증기준 1.2.1(정보자산 식별) 대응 자산관리대장을 만든다. 수집은 팀원이, 판정·출력은 내가 맡았다. 두 파트는 데이터 계약 문서 하나로만 연결된다.
| |
리소스 덤프와 갈리는 지점
인증기준 1.2.1은 범위 내 모든 정보자산을 식별·분류하고 중요도를 산정한 목록을 최신으로 관리하라고 요구한다.
API로 얻을 수 있는 건 전부 자동으로 긁는다. 여기까지는 도구가 다 한다.
문제는 나머지다. 결함사례 1(출력물 보안·DRM·USB 통제 누락)과 결함사례 4(위탁 IT 서비스 누락)는 AWS API로 절대 해결되지 않는다. 이 칸들을 빈칸으로 남기면 담당자는 대장을 받아도 어디서부터 채워야 할지 모른다.
그래서 자동화할 수 없는 부분에 누가, 왜, 어떻게 채워야 하는지를 같이 실었다. 이걸 빼면 남는 건 리소스 덤프 도구다.
수집과 추출을 나눈 이유
| |
수집 시점에 필드를 골라 버리면, 나중에 “이 필드도 필요하다"가 나올 때 AWS를 다시 불러야 한다. 자격증명이 필요하고 전 리전 순회에 수 분이 걸리며 그 사이 리소스가 바뀌어 비교 기준선이 흔들린다.
원본이 남아 있으면 재추출이 초 단위로 끝나고 자격증명도 필요 없다. 그리고 원본 덤프 자체가 증적이다. 대장의 각 칸이 어디서 왔는지 추적하려면 “이 시점에 AWS가 이렇게 응답했다"는 기록이 있어야 한다.
모른다와 없다를 가르는 사유 코드
값이 없다는 사실만 넘기면 뒷단이 판단할 수 없다. 왜 없는지를 같이 실어야 한다.
| reason | 의미 | 대장 표기 |
|---|---|---|
null | 정상 수집 | 값 |
TAG_ABSENT | 태그 미입력 | 미식별 |
NOT_CONFIGURED | AWS 설정 없음. 사실 자체가 등급 근거 | 미설정 |
API_NULL | API가 값을 안 줌 | API 미제공 |
NOT_APPLICABLE | 이 자산유형에 개념이 없음 (S3 버킷의 IP주소) | - |
PERMISSION_DENIED | 권한 부족으로 조회 실패 | 미확인 |
COLLECT_ERROR | 조회 자체 실패 | 미확인 |
OUT_OF_SCOPE | 개념은 있는데 그 API를 아직 안 부름 | 범위 밖 |
뒤의 셋을 따로 두는 게 핵심이다. 권한이 없어서 암호화 설정을 못 읽은 걸 미암호화로 기록하면 기밀성 등급이 통째로 틀린다. 조회에 실패한 걸 자산 없음으로 세면 자산 목록 전체가 거짓이 된다.
NOT_APPLICABLE은 반대 방향이다. 이게 없으면 갭 리포트가 “S3 버킷의 IP주소 미확인” 같은 행으로 채워져 리포트 전체가 못 믿을 것이 된다.
asset_count == 0도 collector_exists와 같이 본다. false면 없는 게 아니라 확인하지 않은 것이므로 그렇게 적는다.
판정이 한 곳에만 있어야 하는 이유
사유 코드 판독은 advisor/resolve.py 한 파일에만 있고 등급 사유·갭 집계·대장 표기가 전부 여기를 거친다.
판정이 흩어지면 세 곳의 숫자가 어긋난다. 대장에는 미확인 2337건인데 갭 리포트에는 2340건인 상태. 이게 제일 잡기 어려운 버그다.
등급 룰을 yaml에 둔 이유
| |
statement는 별지 원문을 그대로 옮기고 어떤 값으로 확인했는지만 괄호로 덧붙인다. 심사에서 “왜 상인가"에 조항으로 답이 되어야 하므로 문구를 임의로 바꾸지 않는다.
룰과 매핑을 코드가 아니라 yaml에 둔 건 지침이나 양식이 개정될 때 코드를 안 고치기 위해서다. ruleset_version을 레코드에 남기므로 “같은 자산인데 지난달과 등급이 다르다"가 추적된다.
지키는 원칙 하나. 등급을 확정하려면 자산 속성 근거가 최소 1건 있어야 한다. 통제 상태만 보고 중요도를 정하지 않는다.
산출물
| |
갭 리포트는 서버 없이 열리는 HTML 한 장이다. 심사 담당자에게 파일 하나만 보내면 되게.