FDE 캡스톤: 창고가 같은 주문을 세 번 받았다 · 밖으로 못 나가는 로그와 지원 번들 · 실습
고객은 로그를 밖으로 보낼 수 없다고 했다
목표
고객 서버에서 고객 담당자가 직접 돌릴 지원 번들 수집기를 만든다. 허용 목록으로 모으고, 비밀을 가리고, manifest 와 크기 상한을 두고, 같은 입력이면 같은 바이트가 나오는 tar.gz 로 묶는다.
왜 중요한가
로그를 밖으로 보낼 수 없는 고객에게 번들을 받으려면 고객 보안 담당자가 승인해야 한다. 무엇이 들어갔는지, 무엇을 몇 건 가렸는지, 받은 파일이 검토한 그 파일인지를 보여 주지 못하면 번들은 나가지 못한다. 매번 사람이 파일을 고르면 비밀이 새거나 쓸모없는 번들이 나온다.
재료: /opt/lab/p1a-bundle/site — 고객 서버 사본(VERSION, etc, logs, run/environ, data). /opt/lab/p1a-bundle/rules.tsv — 고객 보안팀의 추가 가림 규칙.
작업 디렉터리는 /root/bundle 이다. 예상 60분이고, 세션이 끝나면 /root/bundle 은 사라진다.
수집 규칙(이 실습의 약속):
- 넣는 것:
VERSION,etc/아래 일반 파일(심볼릭 링크 제외),logs/바로 아래*.log,run/environ(stage 에서는env.txt, NUL 을 줄바꿈으로 바꾸고 이름순 정렬). - 가리는 것: 개인키 블록 전체 →
[REDACTED:private_key],Bearer뒤의 값 →[REDACTED:token], 키 이름이 password·passwd·secret 으로 끝나는 값 →[REDACTED:password], token·api_key 로 끝나는 값 →[REDACTED:token], 이메일 →[REDACTED:email]. 키와 값은:또는=로 나뉜다. 키 이름과 구분자는 남긴다. - 로그 상한: 파일마다 65536 바이트. 가린 뒤 에 최근 쪽 온전한 줄만 남긴다.
단계
1. 재료 site 에서 수집 규칙에 맞는 파일의 상대 경로를 /root/bundle/scope.txt 에 한 줄씩 적는다.
2. 표준입력을 가려 표준출력으로 내보내고 표준오류에 redactions=N 을 찍는 /root/bundle/redact.py 를 만든다.
3. python3 collect.py SRC OUT 이 OUT/stage 에 허용 목록 파일을 가려서 두는 /root/bundle/collect.py 를 만든다.
4. collect.py 가 OUT/stage/manifest.json 을 만들게 한다(files 배열: path·size·sha256·redactions·truncated, path 순 정렬, total_redactions).
5. 로그 파일에 65536 바이트 상한을 적용하고 manifest 의 truncated·redactions 를 실제에 맞춘다.
6. collect.py 가 OUT/support-bundle.tar.gz 를 만들게 한다. 항목은 support-bundle/ 아래 이름순이고, 같은 입력이면 언제 어디서 묶어도 sha256 이 같아야 한다.
7. --rules FILE 을 받아 kind<TAB>정규식 규칙을 기본 규칙 뒤에 적용하고 [REDACTED:kind] 로 가리게 한다.
8. 재료 site 와 rules.tsv 로 /root/bundle/delivery/support-bundle.tar.gz, SHA256SUMS, REDACTION-REPORT.tsv 를 만든다.
참고
- 채점기는 여러분의 redact.py·collect.py 를 매번 비밀을 새로 심은 서버 트리로 직접 실행한다. 재료 값에 맞춘 규칙이나 하드코딩은 떨어진다.
- 과잉 가림도 실패다:
password_min_length: 12,token_ttl_sec: 3600,passwordless_login: false,orders-api@sha256:…같은 줄은 그대로 남아야 한다. - 3단계부터 collect.py 한 파일을 계속 키운다. 앞 단계 기능을 지우면 앞 단계 채점이 다시 떨어진다.
- NUL 구분 파일 보기:
tr '\0' '\n' < /opt/lab/p1a-bundle/site/run/environ - 결정성 확인: 같은 명령을 두 번(사이에
touch로 원본 mtime 을 바꿔) 돌리고sha256sum을 비교한다. - 흔한 실수:
tarfile.open(..., "w:gz")그대로 쓰기, manifest 에 생성 시각 넣기, 자른 뒤 가리기.
단계 8개
- 무엇을 넣을지 허용 목록으로 정하기
- 좁고 정확한 가림 필터
- 허용 목록만 모아 가린 stage 만들기
- 검토자가 대조할 manifest
- 큰 로그는 가린 뒤 최근 줄만
- 같은 입력이면 같은 바이트
- 고객 보안팀의 추가 규칙을 파일로 받기
- 전달 번들과 검토용 보고서