Skip to content

코드 스캔

ISMS Doctor 의 코드 스캔은 고객 개발팀 랩탑에서 1회 실행하는 Docker 스캐너가 소스코드를 정적 분석해 (1) PII 컬럼 매트릭스, (2) 시큐어코딩 위반의 zip 결과물을 만들고, 보안담당자가 ISMS Doctor 웹에 업로드하면 개인정보 흐름표 자동 채움 + 통제 2.8/3.1/3.2 의 증적 자동 부여가 일어나는 기능입니다.

자동화의 의의:

  • 인증 준비 1~2주 전 1회 실행 → 흐름표 초안 80% 자동 + 시큐어코딩 점검 증적 자동 누적
  • 개발팀 부담은 5분~1시간 1회
  • 🔐 외부 통신 0회 — 코드는 고객 환경 밖으로 나가지 않음

⚠️ 코드 스캔은 자동 점검 보조 도구이지 사람 검토를 완전히 대체하지 않습니다. 발견된 PII 컬럼은 "추정", 시큐어코딩 위반은 "조치 요구"입니다.

의존성 CVE 는 코드 스캐너 범위 밖입니다 — GitHub Dependabot 또는 AWS Inspector 룰이 통제 2.10.2(취약점 점검 및 조치) 평가를 담당합니다. (GitHub 연동 참조)

보안담당자 입장

흐름 한눈에 보기

[개발팀]                       [보안담당자 — 본인]
docker run …  →  zip 회수  →  Slack/메일  →  웹 업로드  →  자동 처리

                                          개인정보 흐름표 docx 자동 채움
                                          통제 2.8.4/2.8.5/2.8.6 자동 증적
                                          통제 3.1.1/3.2.1 증적

단계별 안내

  1. 개발팀에게 안내 전송 — 좌측 메뉴 코드 스캔(통제 점검 섹션, /code-scan) 페이지의 안내 카드에서 OS 별 docker 명령어를 복사해 Slack/메일로 전달.
  2. 결과 zip 회수 — 개발팀이 docker run 실행 후 ./isms-output/isms-scan-*.zip 을 보내옴.
  3. 웹 업로드 — 같은 코드 스캔 페이지의 업로드 카드에 zip 을 drag-drop(또는 클릭). 진행 단계(① 업로드 → ② 파싱 → ③ 완료)를 확인.
  4. 결과 검토 — 이력 카드의 "상세" 버튼으로 PII 컬럼 / 시큐어코딩 항목 확인.
  5. 보고서 재생성 — 개인정보 흐름표(privacy-flow.docx) 다시 다운로드 → 4번 섹션 "개인정보 처리 항목(코드 스캔 기준)" 자동 채움 확인.

결과 해석

종류의미사람 검토
PII 컬럼ORM 스키마(Prisma · SQLAlchemy · JPA)에서 키워드 기반으로 "개인정보 추정" 컬럼필수 — 컬럼명만으로 판단, 실제 데이터 확인은 사람
시큐어코딩 위반정규식 매칭으로 발견된 secret 하드코딩 / eval / SQL concat 등즉시 조치 (위반 자체가 보안 사고)

PII 컬럼의 신뢰도(confidenceScore)는 0.5 이상만 표시됩니다. 0.5–0.6 은 사람 검토 우선, 0.9 이상은 거의 확실.

보고서(privacy-flow.docx) 자동 채움

코드 스캔 zip 을 한 번이라도 업로드(ingest)했으면, 다음 보고서 다운로드부터 4번 섹션 "개인정보 처리 항목(코드 스캔 기준)"이 자동으로 6열 표(프레임워크 / 모델 / 컬럼 / 데이터타입 / 일치 키워드 / 추천 통제)로 채워집니다. 기존 3번 "개인정보 보유 가능 인프라 자산"(RDS/S3 자동 추출)은 그대로 유지됩니다 — 인프라 vs 코드 양 관점 병존.

개발팀 입장

사전 요구사항

  • Docker 설치 (Docker Desktop / Docker Engine)
  • 스캔 대상 repo 의 root 에서 명령 실행

Docker 명령어

macOS / Linux:

bash
docker run --rm \
  -v "$(pwd)":/code:ro \
  -v "$(pwd)/isms-output":/output \
  ghcr.io/isms-doctor/scan:latest

Windows PowerShell:

powershell
docker run --rm `
  -v "${PWD}:/code:ro" `
  -v "${PWD}/isms-output:/output" `
  ghcr.io/isms-doctor/scan:latest

동작 보장

  • 외부 통신 0회 — 소스코드는 고객 환경 밖으로 나가지 않음 (-v $(pwd):/code:ro read-only mount + 모든 룰셋이 image 에 bundle)
  • Public image — anonymous pull (ghcr.io/isms-doctor/scan), 토큰/인증 없음
  • ✅ 5분~30분(코드베이스 크기 대비) 1회만 실행

결과물

  • ./isms-output/isms-scan-{ISO시점}-{repo지문}.zip
  • 같은 repo 여러 번 돌려도 파일명 충돌 없음
  • 보안담당자에게 zip 그대로 전달(Slack/메일/사내 공유드라이브)

결과 zip 은 외부 공개되어도 raw secret 값은 포함되지 않습니다(스캐너가 redact 처리).

문제 해결

"파싱 실패" 토스트

가장 흔한 원인: scanner 와 backend 의 schemaVersion mismatch.

  • 증상: 업로드 성공 → "파싱 실패: schemaVersion x.y.z 는 backend 가 지원하는 major 와 다릅니다"
  • 해결: docker pull ghcr.io/isms-doctor/scan:latest 로 최신 image 받은 후 재실행. 또는 ISMS Doctor 웹의 backend 버전이 따라잡을 때까지 대기.

기타:

  • manifest.json 누락 / JSON 손상 → zip 이 손상됐거나 도중 멈춤. scanner 다시 실행.
  • 이 코드 스캔 결과는 이미 처리되었습니다(409) → 같은 zip 을 두 번 업로드. 새로 스캔하거나 이전 결과 삭제.

업로드가 진행 안 됨

  • 50MB 초과 — 프론트엔드가 즉시 거부. 큰 monorepo 는 패키지별(-v $(pwd)/specific-package:/code:ro)로 나눠 스캔.
  • S3 업로드 timeout — network / IAM 권한 확인.

PII 컬럼이 누락됨

  • 사용 중인 ORM 이 아직 미지원: 현재 Prisma · SQLAlchemy · JPA 어댑터만 제공.
  • TypeORM / Sequelize / Django ORM 어댑터는 후속 지원 예정.
  • 임시: 흐름표 docx 의 4번 섹션은 자동 채움 안 되지만 3번(인프라 자산)은 정상 동작.

결과 표가 보고서에 안 보임

  • 흐름표 docx 는 조회 시점 데이터 — zip 업로드 후 보고서 새로 다운로드 필요.
  • 같은 인증 스코프의 최신 처리완료(READY) 스캔 1개만 보고서에 반영. 스코프 변경 후에는 그 스코프로 스캔을 다시 진행하세요.

감사 로그(Audit Trail)

모든 코드 스캔 작업은 자동으로 감사 로그에 기록됩니다.

Action기록 시점
code-scan.upload-url업로드 URL 발급(zip 업로드 시작 직전)
code-scan.ingestzip 파싱 + DB 기록 완료
code-scan.delete사용자가 이력 항목 삭제

각 기록에 사용자 ID + IP 주소 + User-Agent + 작업 시각이 남아, "누가 언제 어떤 코드 스캔 결과를 처리했는지" 추적할 수 있습니다. 삭제는 soft-delete 로 처리되어 감사 흔적이 보존되며, 보고서에는 노출되지 않습니다.