다크 모드
코드 스캔
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 증적단계별 안내
- 개발팀에게 안내 전송 — 좌측 메뉴 코드 스캔(통제 점검 섹션,
/code-scan) 페이지의 안내 카드에서 OS 별 docker 명령어를 복사해 Slack/메일로 전달. - 결과 zip 회수 — 개발팀이
docker run실행 후./isms-output/isms-scan-*.zip을 보내옴. - 웹 업로드 — 같은 코드 스캔 페이지의 업로드 카드에 zip 을 drag-drop(또는 클릭). 진행 단계(① 업로드 → ② 파싱 → ③ 완료)를 확인.
- 결과 검토 — 이력 카드의 "상세" 버튼으로 PII 컬럼 / 시큐어코딩 항목 확인.
- 보고서 재생성 — 개인정보 흐름표(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:latestWindows PowerShell:
powershell
docker run --rm `
-v "${PWD}:/code:ro" `
-v "${PWD}/isms-output:/output" `
ghcr.io/isms-doctor/scan:latest동작 보장
- ✅ 외부 통신 0회 — 소스코드는 고객 환경 밖으로 나가지 않음 (
-v $(pwd):/code:roread-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.ingest | zip 파싱 + DB 기록 완료 |
code-scan.delete | 사용자가 이력 항목 삭제 |
각 기록에 사용자 ID + IP 주소 + User-Agent + 작업 시각이 남아, "누가 언제 어떤 코드 스캔 결과를 처리했는지" 추적할 수 있습니다. 삭제는 soft-delete 로 처리되어 감사 흔적이 보존되며, 보고서에는 노출되지 않습니다.