폐쇄망 현장 — 방산·국방 도메인 · 반입 번들과 무결성 · 실습
반입 번들 만들고 서명 검증이 깨지는 자리 찾기
목표
폐쇄망에 넣을 반입 번들을 처음부터 만들어 서명하고, 받는 쪽이 되어 검증하고, 검증이 어디서 깨지는지를 두 가지 변조로 직접 확인합니다.
왜 중요한가
이 파드에는 gpg 가 없고 설치할 수도 없습니다. 실제 폐쇄망도 대개 그렇습니다 — 인가 목록에 없는 소프트웨어는 그것부터 반입 심사이기 때문입니다. 그래서 어디에나 있는 openssl 로 서명과 검증을 합니다. 그리고 무결성은 한 층이 아니라 두 층입니다. 파일 해시는 '목록이 말한 그 파일인가' 를, 서명은 '그 목록을 아는 사람이 만들었는가' 를 지킵니다. 한 층만 보면 반드시 하나를 통과시키고, 그 사실은 두 경우를 직접 만들어 보기 전에는 실감이 안 납니다.
단계
1. python3 로 /root/bundle/payload/ 아래 여섯 개 파일을 만듭니다. 둘은 바이너리입니다.
2. /root/bundle/stage/MANIFEST.sha256 에 파일별 SHA-256 을 상대 경로로 뜹니다.
3. /root/bundle/keys/ 에 RSA 2048 키쌍을 만들고 개인키 권한을 600 으로, 공개키 지문을 release.pub.sha256 에 남깁니다.
4. openssl dgst -sha256 -sign 으로 /root/bundle/stage/MANIFEST.sig 를 만듭니다.
5. /root/bundle/out/intake-2609-01.tar.gz 로 묶고 같은 이름의 .sha256 을 뜹니다. 키 파일은 넣지 않습니다.
6. /root/bundle/recv/ 에 풀어 번들 해시 → 서명 → 파일 해시 순으로 검증하고 결과를 receipt.txt 에 적습니다.
7. /root/bundle/tamper-a/ 와 /root/bundle/tamper-b/ 에 두 가지 변조를 넣고 결과를 /root/bundle/tamper.txt 에 적습니다. A 는 payload/deps/libpq.so.5.bin 한 바이트만, B 는 거기에 더해 매니페스트의 그 줄까지 고칩니다.
8. /root/bundle/intake.md 에 일곱 절짜리 반입 승인 요청서를 씁니다.
참고
- 바이너리는
head나grep으로 열지 마세요. NUL 이 섞여 있어 결과를 믿을 수 없습니다.file,sha256sum,openssl만 씁니다. sha256sum -c는 매니페스트에 적힌 경로를 현재 디렉터리 기준으로 찾습니다. 페이로드 디렉터리 안에서 실행하세요.- 한 바이트만 바꾸는 데는
printf '\xff' | dd of=파일 bs=1 seek=1024 count=1 conv=notrunc가 편합니다. - 흔한 실수 1:
openssl dgst -sign에-out을 빼고>로 리다이렉트하는 것. 바이너리가 깨집니다. - 흔한 실수 2: 번들을 다시 묶고
.sha256을 다시 뜨지 않는 것. 묶기와 해시 뜨기를 한 스크립트에 붙여 두세요.
단계 8개
- 반입할 트리 만들기
- 파일별 해시 매니페스트 뜨기
- 서명 키쌍 만들고 지문 남기기
- 매니페스트에 서명하기
- 번들로 묶기 (키는 넣지 않는다)
- 받는 쪽 절차를 순서대로 밟기
- 검증이 어디서 깨지는지 두 경우로 확인하기
- 반입 승인 요청서 쓰기