LabHub
学习 学习路径 课程

闭网现场 — 国防领域

做一张把一条要求接到一个文件的对照表

在 LabHub 中继续学习

한국어 원문으로 표시합니다.

목표

요구사항마다 어떤 파일이 근거인지를 묶은 증거 색인을 만들고, 해시로 봉인하고, 검증기로 끊어진 곳을 세고, 반출 심사를 거친 사본으로 감사 대응 꾸러미를 닫습니다.

왜 중요한가

감사에서 떨어지는 항목은 대개 하지 않은 일이 아니라 보이지 못한 일입니다. 요구 한 줄과 파일 한 곳 사이에 길이 놓여 있지 않으면 그 자리에서 답할 수 없고, 답하지 못한 항목은 하지 않은 것과 같게 기록됩니다. 그 길은 감사 전날 놓을 수 없습니다 — 근거 파일은 시간이 지나면 덮이고 사라지기 때문입니다. 그래서 색인에는 경로만이 아니라 그때 그 파일의 해시가 들어가고, 내보낼 때 값을 가리면 해시도 함께 바뀝니다. 이 실습에서 어려운 부분은 규칙이 아니라 이 일관성입니다.

단계

  1. python3/root/audit/data 에 요구사항·근거 파일 14개·정책·지난 색인을 만듭니다. 생성 스크립트를 그대로 쓰세요.
  2. 근거 파일의 머리말을 읽어 요구별 근거 목록을 /root/audit/index.json 에 적습니다.
  3. 근거마다 SHA-256 을 붙여 /root/audit/index-sealed.json 으로 봉인합니다.
  4. 지난 점검 때 낸 /root/audit/data/snapshot.json 을 검증해 결과를 /root/audit/verify.json 에 적습니다.
  5. 근거를 설계와 운영으로 나눠 요구별 판정을 /root/audit/strength.csv 에 적습니다.
  6. 같은 수집을 다시 돌려 /root/audit/index-rerun.json 을 만들고 결정성을 /root/audit/determinism.json 에 적습니다.
  7. 반출 심사 규칙으로 가린 사본을 /root/audit/submit/evidence/ 에 만들고 /root/audit/redaction.csv 를 남깁니다.
  8. 가린 사본의 해시로 /root/audit/submit/index.json 을 봉인하고 /root/audit/submit/verify.json/root/audit/submit/INDEX.md 로 꾸러미를 닫습니다.

참고

요구사항과 근거 파일 만들기

python3/root/audit/datarequirements.json·policy.json·snapshot.json·asof.txtevidence/ 아래 근거 파일 14개를 만듭니다. 난수를 쓰지 않는 생성 스크립트를 그대로 쓰세요.

폐쇄망에는 내려받을 표본이 없으니 자료부터 직접 만듭니다. 난수를 쓰지 않아야 누가 몇 번을 돌려도 같은 자료가 나오고, 서로의 판정을 대조할 수 있습니다. 채점기는 자료를 표준형으로 바꿔 지문을 대조하므로 자료를 손으로 고치면 뒤 단계가 전부 막힙니다.

요구마다 근거를 잇는 색인 만들기

/root/audit/index.jsongenerated_at·asof·entries 세 열쇠를 두고, entries 는 요구 id 마다 근거 항목 목록(evidence_id·path·kind·collected_at)을 담습니다. 근거가 없는 요구도 빈 목록으로 넣으세요.

근거 파일이 스스로 어떤 요구를 덮는지 머리말에 적어 두었습니다. 디렉터리를 훑어 머리말을 읽고 뒤집으면 색인이 됩니다. 형식이 두 가지라는 점을 잊지 마세요. 항목은 근거 id 순으로 정렬하고, path 는 /root/audit 기준 상대 경로로 적습니다.

근거의 해시를 색인에 못박기

/root/audit/index-sealed.json 에 색인을 그대로 옮기되 근거 항목마다 sha256 을 더합니다. generated_at 은 2단계 색인의 값을 그대로 둡니다.

봉인은 다시 수집하는 일이 아니라 지금 색인에 지문을 더하는 일입니다. 그래서 수집 시각은 바뀌지 않아야 합니다. 해시는 파일 전체 바이트에 대한 SHA-256 을 소문자 16진수로 적습니다.

지난 점검 때 낸 색인을 검증기로 걸러 보기

/root/audit/verify.json/root/audit/data/snapshot.json 을 검증한 결과를 적습니다. missing_file·hash_mismatch·uncovered 세 열쇠에 각각 count 와 목록(evidence_ids 또는 req_ids)을 담으세요.

세 가지는 서로 다른 고장입니다. 가리키는 파일이 없는 것, 파일은 있는데 해시가 어긋난 것, 그리고 근거 항목이 아예 하나도 없는 요구사항입니다. 세 번째는 색인이 그 요구를 아예 적지 않은 경우까지 세야 하니 요구 목록 쪽에서 돌아야 합니다. 항목이 하나 있는데 그것이 끊어진 요구는 근거 없음이 아닙니다.

근거의 세기를 나눠 부족한 자리 찾기

/root/audit/strength.csv 에 첫 줄 req_id,needs,has_design,has_operational,verdict 를 두고 요구 12건을 한 줄씩 적습니다. needs설계 또는 설계+운영, 보유 여부는 /아니오, 판정은 충족·설계근거없음·운영근거없음·근거없음 중 하나입니다.

설정과 정책 문서는 그렇게 되어 있다를 보이고, 로그와 점검 결과는 실제로 그렇게 동작했다를 보입니다. 어느 종류가 어느 쪽인지는 정책 파일에 있습니다. 근거가 아예 없으면 근거없음이 먼저이고, 그 다음 필요한 쪽이 비었는지를 설계부터 봅니다.

다시 수집해도 같은 색인이 나오는지 보기

같은 방법으로 /root/audit/index-rerun.json 을 새로 만들고, /root/audit/determinism.jsongenerated_at_differs·normalized_sha256_first·normalized_sha256_second·same_without_time 네 열쇠를 적습니다.

두 색인에서 수집 시각만 빼고 표준형으로 직렬화해 해시를 견줍니다. 두 해시가 같아야 이 수집은 결정적입니다. 반대로 수집 시각은 달라야 다시 돌린 것이 되므로, 시각은 마이크로초까지 적으세요.

반출 심사로 가린 사본 만들기

정책의 심사 규칙을 규칙 번호 순으로 적용해 근거 14개의 사본을 /root/audit/submit/evidence/ 아래 같은 상대 경로로 만들고, 규칙이 걸린 파일만 /root/audit/redaction.csvevidence_id,rules,hits,sha256_after 로 적습니다.

걸린 것이 없는 파일도 사본은 만들어야 꾸러미가 완성됩니다. rules 는 걸린 규칙 번호를 더하기로 이어 적고, hits 는 바뀐 자리의 총 개수입니다. sha256_after 는 가린 사본의 해시입니다 — 원본은 손대지 마세요.

꾸러미를 닫고 검증기로 스스로 확인하기

/root/audit/submit/index.json 을 가린 사본 기준으로 봉인하고(경로는 /root/audit/submit 기준), 같은 검증기를 돌린 결과를 /root/audit/submit/verify.json 에, 요구별 근거 수와 판정을 표로 정리한 목차를 /root/audit/submit/INDEX.md 에 남기세요.

꾸러미 안 색인은 가린 사본의 해시를 써야 받는 쪽 검증이 통과합니다. 없는 파일과 해시 불일치는 0 이 되지만, 근거가 아예 없는 요구는 그대로 남습니다 — 그 공백은 감추지 말고 목차에 판정으로 적으세요. 목차의 표는 요구 id, 근거 수, 5단계 판정 세 칸입니다.