과제

PII 위험도 기준

werty2 2026. 5. 7. 22:28

개인정보별 점수화

  • 10점: 고유 식별 정보 및 민감 정보 → 권장 조치: 업로드 차단 / 암호화 저장 / 일정 기간 내 삭제 권고 등.
    • 주민등록번호, 여권번호, 운전면허번호 등
  • 8점: 금융 정보 및 생체 정보 → 권장 조치: 업로드 차단 / 암호화 저장 / 일정 기간 내 삭제 권고 등.
    • 신용카드 번호, 계좌번호, 지문, 얼굴 인식 데이터 등
  • 5점: 직접 식별 가능 정보 → 권장 조치: 불필요한 항목 삭제, 마스킹, 최소한의 공유 범위 설정 등.
    • 전체 이름, 상세 주소, 휴대폰 번호
  • 3점: 간접 식별 정보 (다른 정보와 결합 시 식별 가능한 정보) → 권장 조치: 보관 기간 축소, 접근 권한 최소화 등.
    • IP 주소, MAC 주소, 접속 기록(로그), 쿠키

파일을 스캔할 수 없을 때 → 가이드라인에 따로 경고 메시지 추가

  • 암호화/비밀번호가 걸려있어서 내용을 볼 수 없는 경우
    • 경고 메시지 예시) 이 파일은 암호화되어 있어 자동 검사에 실패했습니다. 민감한 개인정보가 포함되었을 수 있으므로, 꼭 필요한 경우에만 제한된 범위에서 공유하고, 불필요하다면 삭제를 권장합니다.
  • 단순 미지원/손상된 파일이어서 내용을 볼 수 없는 경우
    • 경고 메시지 예시) 현재 지원하지 않는 형식이거나 손상된 파일이라 자동 검사에 실패했습니다. 신뢰할 수 있는 출처인지 확인하고, 필요하지 않다면 삭제를 권장합니다.

각 식별자 정규식 개요

※지문과 얼굴 인식은 정규식이 없음

{
  "KR_RRN": {
    "label": "주민등록번호",
    "regex": "(?:[0-9]{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12][0-9]|3[01]))-[1-4][0-9]{6}",
    "score": 10
  },
  "PASSPORT": {
    "label": "여권번호",
    "regex": "[MS][A-Z0-9]{8,9}",
    "score": 10
  },
  "DRIVER_LICENSE": {
    "label": "운전면허번호",
    "regex": "[0-9]{2}-[0-9]{2}-[0-9]{6}-[0-9]{2}",
    "score": 10
  },

  "CREDIT_CARD": {
    "label": "신용카드번호",
    "regex": "(?:4\\\\d{3}|5[1-5]\\\\d{2}|3[47]\\\\d{2}|6(?:011|5\\\\d{2}))-?\\\\d{4}-?\\\\d{4}-?\\\\d{4}",
    "score": 8
  },
  "BANK_ACCOUNT": {
    "label": "계좌번호",
    "regex": "\\\\d{2,4}-?\\\\d{3,6}-?\\\\d{3,6}",
    "score": 8
  },

  "NAME": {
    "label": "이름(한글)",
    "regex": "(?<![가-힣])[가-힣]{2,4}(?![가-힣])",
    "score": 5
  },
  "PHONE_NUMBER": {
    "label": "전화번호",
    "regex": "(?:01[016789]-\\\\d{3,4}-\\\\d{4})|(?:0[2-8]\\\\d?-\\\\d{3,4}-\\\\d{4})",
    "score": 5
  },
  "ADDRESS": {
    "label": "주소(상세)",
    "regex": "(?:[가-힣0-9]+(시|도)\\\\s*[가-힣0-9]+(구|군)|[가-힣0-9]+(동|읍|면)\\\\s*\\\\d+-?\\\\d*)",
    "score": 5
  },

  "IP_ADDRESS": {
    "label": "IP 주소",
    "regex": "\\\\b(?:\\\\d{1,3}\\\\.){3}\\\\d{1,3}\\\\b",
    "score": 3
  },
  "MAC_ADDRESS": {
    "label": "MAC 주소",
    "regex": "\\\\b(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}\\\\b",
    "score": 3
  },

  "COOKIE": {
    "label": "쿠키 / 세션 ID",
    "regex": "(?i)\\\\b(?:JSESSIONID|SESSIONID|SID|SESSION_TOKEN)=([A-Za-z0-9\\\\-_]{16,})",
    "score": 3
  },
  "LOG_ENTRY": {
    "label": "접속 기록(로그)",
    "regex": "\\\\b(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS)\\\\s+\\\\/[^\\\\s]*\\\\s+HTTP\\\\/1\\\\.[01]\\\\b",
    "score": 3
  }
}

데이터 형식 정의

{
  // 사용자가 업로드한 파일 이름
  "filename": "string",

  // 파일의 MIME 타입 (예: text/plain, application/pdf 등)
  "mime_type": "string",

  // 스캔 상태: "ok" | "failed" | "not_supported"
  "scan_status": "ok",

  // 스캔 실패 사유 (scan_status가 "failed"일 때만 사용)
  // 예: "encrypted" | "corrupted" | "unsupported" | "too_large" | "timeout"
  "fail_reason": null,

  // 전체 파일의 위험 점수 (발견된 항목들의 최대값 또는 합산값)
  // 스캔 불가 파일이면 null 또는 0으로 둘 수 있음
  "overall_score": 0,

  // 점수 기반 위험 등급
  // 예: low | medium | high
  "risk_level": "low",

  // 발견된 개인정보 목록
  "findings": [
    {
      // 개인정보 유형 코드 (엔진 내부용)
      // 예: KR_RRN(주민등록번호), CREDIT_CARD(카드 번호), PHONE_NUMBER(전화번호) 등
      "type_code": "KR_RRN",

      // 사람이 읽기 쉽게 표시할 라벨
      "type_label": "주민등록번호",

      // 민감도 점수 (10점/8점/5점/3점)
      "score": 10,

      // 어떤 부분에서 발견되었는지
      // 예: "content" | "filename" | "metadata" | "url_query" 등
      "location": "content",

      // 마스킹 처리된 개인정보 (실제 원본을 그대로 노출하면 안 됨)
      "value_preview": "990101-1******",
    }
  ],

  // 점수 기반 요약 정보
  "summary": {
    // 점수별 발견된 항목 개수
    "score_breakdown": {
      "10": 1,
      "8": 0,
      "5": 0,
      "3": 0
    },

    // 개인정보 유형별 개수
    "by_type": {
      "KR_RRN": 1
    }
  }
}

개인정보가 발견되는 위치

  • 파일명 (업로드된 파일 이름 전체 문자열에서 개인정보 패턴을 1차로 탐지)
  • 파일 내용 (의심스러운 파일명, 확장자일 때 파일 내용 탐색)
    • .csv (고객 정보, 전화번호·이메일 목록이 가장 자주 들어감)
    • .xlsx / .xls (엑셀 파일: 이름·전화번호·주소 같은 개인정보를 표로 관리하는 대표 포맷)
    • .pdf (신분증 스캔, 계약서, 민원 서류 등 민감한 자료가 매우 자주 포함됨)
    • .txt / .doc / .docx / .hwp (자유 형식 텍스트 문서로, 메모·보고서·양식 등에서 개인정보가 섞여 있을 수 있음)
  • 압축 파일
    • .zip / .7z / .rar / .tar / .gz (내부에 민감한 문서·이미지·엑셀 등이 통째로 들어 있어 위험도 최상위 → 가능하면 압축 내부 파일까지 스캔 )
  • 바이오 정보 파일
    • .min (지문 정보 전용 표준 확장자)
    • .face (얼굴 정보 전용 표준 확장자)
  • 메타데이터 (문서 작성자, 제목, 코멘트, 태그, EXIF GPS 좌표 등 파일 메타데이터에 포함된 이름, 이메일, 전화번호, 위치 정보 등을 스캔)
  • 클라우드가 자동 생성하는 로그 (IP 주소, 계정 ID, 쿠키/세션 ID, URL 파라미터에 포함된 개인정보를 탐지)
  • URL 또는 쿼리 파라미터에 포함되는 개인정보 (URL 경로와 쿼리 파라미터에 포함된 전화번호, 이메일, 계정 ID, 토큰 등이 있는지 검사)

PII(개인 식별 정보) 탐지 오픈소스

  • Microsoft Presidio
    • 텍스트·이미지·구조화 데이터에서 이름, 전화번호, 이메일, 카드번호 같은 PII를 탐지·마스킹·익명화까지 해주는 프레임워크.
    • Python 라이브러리로 쓸 수도 있고, Docker로 서비스 띄워서 다른 백엔드에서 API로 호출할 수도 있음.
  • 깃허브 주소: https://github.com/microsoft/presidio
  • Presidio 공식 웹사이트(기능 설명, 설치 방법 등): https://microsoft.github.io/presidio/

'과제' 카테고리의 다른 글

5주차 (Flask, Github)  (0) 2025.05.11
4주차 (pwnable 문제 풀이)  (0) 2025.04.10
3주차 (cheat engine으로 리버싱 문제 풀이)  (0) 2025.04.06
2주차 (FTK Imager과 Volatility 이용한 분석)  (0) 2025.03.31
1주차 (웹 해킹)  (0) 2025.03.24