LabHub
배우기 러닝패스 코스

폐쇄망 현장 — 방산·국방 도메인 · 증빙은 서명만 맞으면 되는 것이 아니다 · 실습

서명 OK · 대조 FAIL — 증빙이 다른 산출물을 가리킬 때

LabHub 에서 이어서 보기

목표

폐쇄망에 들어온 산출물과 함께 온 증빙 세 종(CycloneDX SBOM · in-toto Statement · SLSA Provenance)이 정말로 그 산출물을 가리키는지 인터넷 없이 대조하고, 확인한 것과 확인 못 한 것을 나눠 적은 반입 심사 보고서를 남긴다.

왜 중요한가

반입 심사에서 "서명 검증 통과" 는 생각보다 훨씬 좁은 사실이다. 그 명령이 확인한 것은 증빙 문서가 서명된 뒤로 바뀌지 않았다는 것뿐이고, 산출물은 명령에 등장하지도 않는다.
증빙과 산출물을 잇는 것은 subject 의 digest 다. 그래서 문서를 고칠 수 있는 쪽이 서명도 다시 붙일 수 있는 상황에서는, 지문을 다시 계산해 맞춰 보는 한 줄이 절차의 유일한 방어가 된다.
이 실습은 그 한 줄이 없을 때 무슨 일이 일어나는지를 직접 만들어 본다. 서명이 유효한 채로 subject 만 이미 승인된 옛 판을 가리키는 증빙을 만들고, 서명 층과 결속 층이 서로 다른 말을 하는 것을 기록으로 남긴다.
마지막 단계의 보고서는 형식 맞추기가 아니다. 확인한 것과 이 망에서는 확인할 길이 없는 것을 갈라 놓지 않으면, 읽는 사람에게는 전부 확인된 것으로 읽히고 그 오해가 승인 서명까지 따라간다.

단계

1. 생성 스크립트를 그대로 돌려 /root/supply/drop/ 아래 산출물과 /root/supply/evidence/ 아래 증빙 다섯 장, 그리고 서명 두 개를 만든다.
2. 산출물 지문을 다시 계산해 Statement 의 subject 와 맞춰 보고 /root/supply/check/subject.txt 에 적는다.
3. SBOM 의 구성품 목록과 실제 트리를 양방향으로 대조해 /root/supply/check/sbom-diff.json 에 적는다.
4. Provenance 에서 사실을 뽑고 /root/supply/QUESTIONS.txt 의 질문 여섯 개를 /root/supply/check/provenance.json 에서 가른다.
5. openssl dgst -sha256 -verify 로 증빙 서명을 확인하고 /root/supply/check/signature.txt 에 적는다.
6. /root/supply/swap/statement-swapped.json 에 서명은 유효한데 subject 가 옛 판을 가리키는 증빙을 만들고 결과를 /root/supply/check/swap.txt 에 두 층으로 적는다.
7. 증빙 세 장의 술어를 보고 /root/supply/check/predicates.json 에 accept · hold · reject 를 가른다.
8. /root/supply/check/attestation-report.json 에 반입 심사용 증빙 대조 보고서를 쓴다.

참고

단계 8개

  1. 산출물과 증빙 묶음을 망 안에 재현하기
  2. 받은 파일의 지문을 다시 계산해 subject 와 맞추기
  3. SBOM 과 실제 트리를 양방향으로 대조하기
  4. Provenance 로 답할 수 있는 질문과 없는 질문 가르기
  5. 서명이 무엇을 덮고 무엇을 덮지 않는지 확인하기
  6. 서명은 유효한데 subject 가 다른 것을 가리키는 증빙 만들기
  7. 모르는 술어를 통과도 거절도 아닌 자리에 두기
  8. 반입 심사에 붙일 증빙 대조 보고서 쓰기