화이트햇 스쿨 4기 2인 팀 프로젝트 · stacknoah/ismsp-asset

AWS 계정의 정보자산을 boto3로 훑어 ISMS-P 인증기준 1.2.1(정보자산 식별) 대응 자산관리대장을 만든다. 수집은 팀원이, 판정·출력은 내가 맡았다. 두 파트는 데이터 계약 문서 하나로만 연결된다.

1
2
python demo.py                                            # 수집 (moto로 AWS 접속 없이)
python main.py snapshots/normalized/<run_id>/assets.json   # 판정·출력

리소스 덤프와 갈리는 지점

인증기준 1.2.1은 범위 내 모든 정보자산을 식별·분류하고 중요도를 산정한 목록을 최신으로 관리하라고 요구한다.

API로 얻을 수 있는 건 전부 자동으로 긁는다. 여기까지는 도구가 다 한다.

문제는 나머지다. 결함사례 1(출력물 보안·DRM·USB 통제 누락)과 결함사례 4(위탁 IT 서비스 누락)는 AWS API로 절대 해결되지 않는다. 이 칸들을 빈칸으로 남기면 담당자는 대장을 받아도 어디서부터 채워야 할지 모른다.

그래서 자동화할 수 없는 부분에 누가, 왜, 어떻게 채워야 하는지를 같이 실었다. 이걸 빼면 남는 건 리소스 덤프 도구다.

수집과 추출을 나눈 이유

1
2
3
4
5
① collect   AWS 응답을 손대지 않고 그대로 덤프
              ↓ (AWS 접속 없음)
② extract   extract_map.yaml에 선언된 필드만 뽑아 자산유형별 JSON
            판정·출력으로 인계

수집 시점에 필드를 골라 버리면, 나중에 “이 필드도 필요하다"가 나올 때 AWS를 다시 불러야 한다. 자격증명이 필요하고 전 리전 순회에 수 분이 걸리며 그 사이 리소스가 바뀌어 비교 기준선이 흔들린다.

원본이 남아 있으면 재추출이 초 단위로 끝나고 자격증명도 필요 없다. 그리고 원본 덤프 자체가 증적이다. 대장의 각 칸이 어디서 왔는지 추적하려면 “이 시점에 AWS가 이렇게 응답했다"는 기록이 있어야 한다.

모른다와 없다를 가르는 사유 코드

값이 없다는 사실만 넘기면 뒷단이 판단할 수 없다. 왜 없는지를 같이 실어야 한다.

reason의미대장 표기
null정상 수집
TAG_ABSENT태그 미입력미식별
NOT_CONFIGUREDAWS 설정 없음. 사실 자체가 등급 근거미설정
API_NULLAPI가 값을 안 줌API 미제공
NOT_APPLICABLE이 자산유형에 개념이 없음 (S3 버킷의 IP주소)-
PERMISSION_DENIED권한 부족으로 조회 실패미확인
COLLECT_ERROR조회 자체 실패미확인
OUT_OF_SCOPE개념은 있는데 그 API를 아직 안 부름범위 밖

뒤의 셋을 따로 두는 게 핵심이다. 권한이 없어서 암호화 설정을 못 읽은 걸 미암호화로 기록하면 기밀성 등급이 통째로 틀린다. 조회에 실패한 걸 자산 없음으로 세면 자산 목록 전체가 거짓이 된다.

NOT_APPLICABLE은 반대 방향이다. 이게 없으면 갭 리포트가 “S3 버킷의 IP주소 미확인” 같은 행으로 채워져 리포트 전체가 못 믿을 것이 된다.

asset_count == 0collector_exists와 같이 본다. false면 없는 게 아니라 확인하지 않은 것이므로 그렇게 적는다.

판정이 한 곳에만 있어야 하는 이유

사유 코드 판독은 advisor/resolve.py 한 파일에만 있고 등급 사유·갭 집계·대장 표기가 전부 여기를 거친다.

판정이 흩어지면 세 곳의 숫자가 어긋난다. 대장에는 미확인 2337건인데 갭 리포트에는 2340건인 상태. 이게 제일 잡기 어려운 버그다.

등급 룰을 yaml에 둔 이유

1
2
3
4
5
6
7
8
- id: I-BACKUP-01
  axis: integrity
  level: 상
  basis_type: control_state
  when: { infra_facts.backup_exists: false }
  statement: 해당 자산정보에 대한 실시간 백업이 이루어지고 있지 않아 원래의 정보를 복구하기 힘든 경우
  source: 정보자산관리지침 별지 제3호 무결성 상
  evidence_field: infra_facts.backup_exists

statement는 별지 원문을 그대로 옮기고 어떤 값으로 확인했는지만 괄호로 덧붙인다. 심사에서 “왜 상인가"에 조항으로 답이 되어야 하므로 문구를 임의로 바꾸지 않는다.

룰과 매핑을 코드가 아니라 yaml에 둔 건 지침이나 양식이 개정될 때 코드를 안 고치기 위해서다. ruleset_version을 레코드에 남기므로 “같은 자산인데 지난달과 등급이 다르다"가 추적된다.

지키는 원칙 하나. 등급을 확정하려면 자산 속성 근거가 최소 1건 있어야 한다. 통제 상태만 보고 중요도를 정하지 않는다.

산출물

1
2
3
4
5
자산 2380건 판정 완료 (룰팩 1.0.0)
  ② 태그 미입력 4853건 · 관리책임자 미식별 99.8%
  ③ 확정 대기 2380건 · 미확인 2337건
  ① 영구 수기 17항목 · 수집기 없는 자산유형 5종
→ output/자산관리대장.xlsx, 갭리포트.html, graded_assets.json

갭 리포트는 서버 없이 열리는 HTML 한 장이다. 심사 담당자에게 파일 하나만 보내면 되게.