안내서 업데이트를 승인한 발행자 확인하기

사이버 보안Beginner
지금 연습하기

소개

Waymark는 도보 축제 안내서를 발행합니다. 공급업체가 여러 업데이트 묶음을 전달했습니다. 여러분의 일은 체크섬이 일치한다는 이유만으로 묶음을 신뢰하지 않고, 주최자가 요청한 릴리스를 받아들이는 것입니다.

독립적으로 제공된 발행자 공개 키를 사용해 Cosign으로 실제 서명을 검증하고, 요청된 제품과 버전을 비교한 뒤 아카이브 다이제스트를 확인합니다. 기본적인 터미널 및 경로 사용 능력이 필요하며 프로그래밍이나 클라우드 계정은 필요하지 않습니다. 이 실습에서는 업데이트를 선택합니다. 다음 가이드 실습에서는 이 판단을 재사용 가능한 수신 스크립트로 만듭니다.

축제 안내서와 업데이트 요청부터 살펴보기

이 단계에서는 업데이트를 선택하기 전에 작동 중인 서비스와 주최자의 요청을 확인합니다. Event Guide 탭을 여세요. 현재 event-guide 판은 2.0입니다. Old Mill Walk를 열면 집결 시각은 11:00입니다. 페이지의 All walks 링크로 돌아온 뒤 경로표를 다운로드하세요. 웹사이트와 CSV에는 같은 두 산책 경로가 나옵니다.

안내서 홈 페이지는 제목 위에 판을 표시하고 각 산책 카드에 집결 시각을 보여 줍니다.

업데이트 전 작동 중인 Waymark 안내서

이제 Workspace로 전환하세요. 이 터미널은 안내서와 같은 컨테이너를 사용합니다. 탭은 서로 다른 진입점이며 서로 다른 컴퓨터가 아닙니다. cd는 터미널의 현재 디렉터리를 변경합니다. 절대 경로는 어느 디렉터리에서도 사용할 수 있습니다.

cd /home/labex/project/waymark

cat은 작은 텍스트 파일을 출력합니다. 전달된 묶음과는 독립적으로 주최자가 제공한 요청을 읽으세요.

cat /opt/labex-waymark/trust/request.json

이 JSON 객체에는 이름이 지정된 필드 두 개가 있습니다.

{
  "product": "event-guide",
  "version": "2.1"
}

제품은 업데이트할 안내서를 식별하고, 버전은 요청한 판을 식별합니다. 진짜 이전 판이라도 이번 업데이트는 아닙니다. 독립적으로 고정된 공개 키는 /opt/labex-waymark/trust/publisher.pub입니다. 이 키와 요청을 변경하지 마세요.

ls는 디렉터리 항목을 나열합니다. 전달 디렉터리를 살펴보세요.

ls candidates

묶음에는 parcel-101 같은 전달 라벨이 붙어 있으며, 이름은 승인 증거가 아닙니다. 각 묶음에는 manifest.json, manifest.sigstore.json, guide.tar.gz, SHA256SUMS가 들어 있습니다. 매니페스트는 제품, 버전, 아카이브 다이제스트를 설명합니다. 번들에는 서명이, 아카이브에는 실제 안내서 파일이 들어 있습니다. 원본 묶음, 현재 안내서, 이전 릴리스, 방문객 공지를 그대로 보존하세요. 선택한 묶음의 복사본은 accepted/에 넣습니다.

명령에서 No such file or directory가 나오면 위의 절대 경로 cd 명령을 실행하고 ls candidates로 철자를 확인한 뒤 다시 시도하세요. 이 실습에서 환경을 초기화할 필요는 없습니다.

일치하는 체크섬으로 알 수 있는 것 이해하기

이 단계에서는 옆에 있는 체크섬 검사를 모두 통과하는 묶음 두 개를 비교합니다. Workspace에 머무르세요.

SHA-256 다이제스트는 파일 바이트로 계산한 지문입니다. 예상 지문 자체를 신뢰할 수 있다면 지문 일치는 바이트 변경을 감지하는 데 도움이 됩니다. sha256sum -c는 체크섬 목록을 읽고 지정된 파일과 비교합니다. 여기서 -c는 “검사”를 뜻합니다. 목록이 상대 파일명을 사용하므로 묶음 안에서 실행하세요.

cd candidates/parcel-103
sha256sum -c SHA256SUMS

guide.tar.gz: OK가 나와야 합니다. 프로젝트로 돌아가 다른 묶음도 검사하세요.

cd /home/labex/project/waymark/candidates/parcel-104
sha256sum -c SHA256SUMS

다시 guide.tar.gz: OK가 나와야 합니다. 두 목록 모두 해당 아카이브와 함께 전달되었습니다. 아카이브를 교체한 사람은 옆에 놓을 새 체크섬도 계산할 수 있습니다. OK는 두 파일이 서로 일치함을 보여 줄 뿐, 발행자가 누구인지나 요청한 업데이트인지 증명하지 않습니다.

프로젝트로 돌아가세요.

cd /home/labex/project/waymark

다음에는 주최자가 이미 신뢰하는 공개 키로 매니페스트를 검증합니다. 그러면 아카이브의 예상 다이제스트는 서명되지 않은 옆 목록 대신 검증된 매니페스트에서 가져오게 됩니다.

독립적인 공개 키로 발행자 검증하기

이 단계에서는 진짜 서명과 승인되지 않은 키로 만든 서명을 구분합니다. Workspace의 /home/labex/project/waymark에서 시작하세요.

발행자는 개인 키로 파일에 서명합니다. 대응하는 공개 키를 가진 수신자는 서명을 검증하고 서명된 파일의 변경을 감지할 수 있습니다. 공개 키는 이미 신뢰하는 경로로 받아야 합니다. 묶음이 자기 키를 스스로 승인할 수는 없습니다. 이 연습은 /opt/labex-waymark/trust/ 아래에 별도로 제공된 합성 발행자 키를 고정해 사용합니다. 발행자의 개인 키는 제공되지 않습니다.

Cosign은 준비된 서명 도구입니다. verify-blob은 파일을 검증하고, --key는 신뢰하는 공개 키를, --bundle은 서명 번들을 선택합니다. 마지막 인수는 서명 대상 바이트를 가진 정확한 매니페스트를 지정합니다.

이 합성 묶음들은 공개 투명성 로그 없이 서명되었습니다. --insecure-ignore-tlog는 의도적으로 로그 포함 검증을 생략합니다. 그래도 선택한 키의 유효한 서명은 필요합니다. 이 로컬 연습에서는 공개 OIDC 신원, 인증서 서비스, 투명성 로그를 검증하지 않습니다. 이러한 서비스를 요구하는 정책에 이 예외를 그대로 복사하지 마세요.

다음 묶음은 다른 키로 서명되었습니다. 이 검증은 0이 아닌 종료 상태와 서명 검증 오류로 실패해야 합니다.

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-102/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-102/manifest.json

echo는 값을 출력하고, $?는 바로 앞 명령의 종료 상태입니다. 0은 성공, 0이 아닌 수는 실패입니다. 즉시 확인하세요.

echo $?

이제 고정된 발행자가 서명한 묶음을 검증하세요.

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-104/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-104/manifest.json

투명성 로그 경고와 Verified OK가 나와야 합니다.

WARNING: Skipping tlog verification is an insecure practice that lacks transparency and auditability verification for the blob.
Verified OK

바로 앞 명령의 상태를 확인하세요.

echo $?

0이 나와야 합니다. 매니페스트가 신뢰하는 키로 서명되었습니다. 이는 한 가지 판단일 뿐이며, 매니페스트가 무엇을 승인하는지는 아직 확인해야 합니다.

서명된 제품, 버전, 아카이브 다이제스트 확인하기

이 단계에서는 검증된 매니페스트를 사용해 진짜 묶음이 요청한 릴리스인지 판단합니다. Workspace에 머무르세요.

먼저 진짜 이전 릴리스를 검증하세요. 이 명령은 성공해야 합니다.

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-101/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-101/manifest.json

jq는 JSON을 읽습니다. 필터 .product, .version은 두 필드를 출력합니다. 작은따옴표는 셸이 구두점을 해석하지 않도록 필터를 하나의 인수로 유지합니다.

jq '.product, .version' candidates/parcel-101/manifest.json

"event-guide"와 "2.0"이 나와야 합니다. 진짜 안내서이지만 요청한 2.1은 아닙니다. 서명이 있다고 해서 이전 릴리스가 자동으로 적합해지지는 않습니다.

앞 단계에서 검증한 후보를 살펴보세요.

cat candidates/parcel-104/manifest.json

제품과 버전이 독립적인 요청과 일치합니다. sha256 필드는 guide.tar.gz의 64자리 16진수 다이제스트이며 외울 필요가 없습니다. jq -r은 JSON 따옴표 없이 필드를 출력합니다. 예상 다이제스트를 출력하세요.

jq -r .sha256 candidates/parcel-104/manifest.json

이제 실제 아카이브 다이제스트를 계산하세요.

sha256sum candidates/parcel-104/guide.tar.gz

첫 번째 필드가 검증된 매니페스트의 다이제스트와 일치해야 합니다. 그 뒤에 출력된 파일명은 다이제스트의 일부가 아닙니다.

앞서 살펴본 변경된 아카이브에도 진짜 서명된 매니페스트가 있지만, 현재 바이트는 더 이상 매니페스트와 일치하지 않습니다. 매니페스트를 검증한 뒤 두 다이제스트를 비교해 확인하세요.

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle candidates/parcel-103/manifest.sigstore.json --insecure-ignore-tlog candidates/parcel-103/manifest.json
jq -r .sha256 candidates/parcel-103/manifest.json
sha256sum candidates/parcel-103/guide.tar.gz

서명은 통과하지만 다이제스트는 다릅니다. 이 묶음은 거부하세요. 이제 신뢰하는 서명자, 요청한 제품/버전, 일치하는 아카이브 바이트라는 세 가지 별도 판단이 있습니다. 하나라도 실패하면 업데이트를 받아들일 준비가 되지 않은 것입니다.

실행 중인 안내서를 변경하지 않고 요청된 묶음 받아들이기

이 단계에서는 검증된 요청 묶음을 인계용으로 저장합니다. Workspace의 /home/labex/project/waymark에서 시작하세요.

accepted/는 이미 있습니다. cp는 파일을 복사하며 마지막 인수는 대상 디렉터리입니다. 검증한 매니페스트, 서명 번들, 아카이브를 복사하세요.

cp candidates/parcel-104/manifest.json candidates/parcel-104/manifest.sigstore.json candidates/parcel-104/guide.tar.gz accepted/

복사하면 별도의 파일 세트가 생깁니다. 이전 검증이 나중 복사본에도 적용된다고 가정하지 말고 그 세트를 검증하세요.

/opt/labex-waymark/bin/cosign verify-blob --key /opt/labex-waymark/trust/publisher.pub --bundle accepted/manifest.sigstore.json --insecure-ignore-tlog accepted/manifest.json
jq '.product, .version' accepted/manifest.json
jq -r .sha256 accepted/manifest.json
sha256sum accepted/guide.tar.gz

유효한 서명, event-guide, 2.1, 일치하는 아카이브 다이제스트가 나와야 합니다. 준비된 읽기 전용 자체 검사는 실제 파일, 독립적인 키/요청, 예상 안내서 내용을 사용합니다.

python3 /opt/labex-waymark/verify.py selected

예상 출력:

The accepted parcel is the independently signed, requested release with matching archive bytes.

실패하면 세 가지 판단 중 무엇이 실패했는지 확인한 뒤 올바른 원본 묶음에서 다시 복사하고 복사본을 다시 검증하세요. 독립적인 신뢰 파일은 변경하지 마세요. 검사는 여러분 대신 묶음을 선택하거나 배포하지 않습니다.

Event Guide로 전환해 페이지를 새로 고치세요. 여전히 판은 2.0이고 Old Mill Walk의 집결 시각은 11:00이어야 합니다. Visitor notice를 열고 원래의 실용적인 안내가 남아 있는지 확인하세요. 이 단원은 인계할 전달물을 받아들이며, 업데이트 발행은 다음에 배울 별도 작업입니다.

요약

독립적으로 신뢰하는 발행자 키, 주최자의 제품/버전 요청, 실제 아카이브의 다이제스트를 결합해 실제 서명된 전달물을 받아들였습니다. 또한 옆에 있는 체크섬, 이전 릴리스의 유효한 서명, 변경된 바이트 옆의 서명된 매니페스트가 각각 단독으로는 충분하지 않은 이유도 살펴보았습니다.

현재 안내서는 계속 사용할 수 있습니다. 다음 가이드 실습에서는 이 판단을 재사용 가능한 수신 스크립트에 포함하고, 검증한 아카이브 바이트만 실행 중인 안내서에 반영되도록 합니다.