소개
비공개 내보내기 파일은 저장하기 전에 암호화해야 합니다. 작은 테스트 파일을 암호화하고 읽기 수행자 하나가 원래 바이트를 복구하도록 허용하며 복호화 실패를 진단하고 키 정리를 예약합니다.
LabEx에서 AWS 시작, 보고서 읽기 신원에 최소 권한 부여하기, IAM 역할로 임시 자격 증명 사용을 먼저 완료하세요. 이 새 VM에는 독립적인 파일, 읽기 역할 세션과 참조 키가 제공됩니다.
인증 시험 관련 주제
이 실습은 다음 시험 주제에 대한 실습 경험을 제공합니다.
- Cloud Practitioner (CLF-C02) · 태스크 2.2: KMS 암호화, 복호화 권한과 키 상태.
- Solutions Architect – Associate (SAA-C03) · 태스크 1.3: KMS 암호화, 복호화 권한과 키 상태.
- Developer – Associate (DVA-C02) · 태스크 2.2: KMS 암호화, 복호화 권한과 키 상태.
- CloudOps Engineer – Associate (SOA-C03) · 태스크 4.2: KMS 암호화, 복호화 권한과 키 상태.
- Security – Specialty (SCS-C03) · 태스크 5.3: 기초 실습: KMS 암호화, 복호화 권한과 키 상태.
- Data Engineer – Associate (DEA-C01) · 태스크 4.3: 기초 실습: KMS 암호화, 복호화 권한과 키 상태.
- DevOps Engineer – Professional (DOP-C02) · 태스크 6.2: 기초 실습: KMS 암호화, 복호화 권한과 키 상태.
- Solutions Architect – Professional (SAP-C02) · 태스크 2.3: 기초 실습: KMS 암호화, 복호화 권한과 키 상태.
비공개 내보내기 파일 암호화
이 단계에서는 AWS Key Management Service (KMS) 키를 만들고 제공된 내보내기 파일을 암호문으로 변환합니다. 개인 데이터 대신 제공된 테스트용 private-export.json을 사용하세요. export-reader 프로필은 준비된 읽기 역할의 임시 세션을 사용하며 처음에는 KMS 권한이 없습니다. alias/labex-sec01-reference를 유지하세요.
Terminal 옆에서 AWS View를 열어 키 상태, 읽기 수행자에게 부여된 권한과 암호화 요청 결과를 비교하세요. 바이트 해시를 통해 비공개 데이터를 표시하지 않고 결과를 비교할 수 있습니다.
대칭 키는 암호화와 복호화에 동일한 보호된 키 자료를 사용합니다. KMS는 키 자료를 서비스 내부에 보관합니다. 별칭은 고유한 키 ARN을 대체하지 않으면서 키에 읽기 쉬운 이름을 부여합니다.
제공된 프로젝트 디렉터리에서 시작하세요. cd는 현재 디렉터리를 변경합니다. 호출자 쿼리는 자격 증명을 출력하지 않고 준비된 운영자 신원을 확인합니다.
cd /home/labex/project
aws sts get-caller-identity --query Arn --output text
labex-sec01-operator 사용자 ARN이 나와야 합니다. 본인 소유의 키를 만드세요. --query는 응답에서 필드 하나를 선택하고 --output text는 JSON 따옴표를 제거하며 $(...)는 이후 명령에서 사용할 셸 변수에 결과를 저장합니다.
KEY_ARN=$(aws kms create-key --description labex-sec01-owned-export --query KeyMetadata.Arn --output text)
aws kms create-alias --alias-name alias/labex-sec01-private-export --target-key-id "$KEY_ARN"
aws kms describe-key --key-id "$KEY_ARN" --query 'KeyMetadata.[KeyState,KeySpec]' --output text
Enabled와 SYMMETRIC_DEFAULT가 나와야 합니다. 참조 키를 사용하거나 변경하지 마세요.

공식 Console 참고 이미지: 별칭, Enabled 상태와 ARN은 방금 쿼리한 키의 신원과 상태에 대응합니다. 이는 AWS 예시 값입니다. Terminal에서는 계속 본인의 KEY_ARN을 사용하세요.
출처: AWS KMS.
암호화 컨텍스트는 암호문에 연결되는 비밀이 아닌 레이블 집합입니다. 복호화할 때 같은 레이블을 제공해야 합니다. 여기서 Purpose=private-export는 이 내보내기 파일의 의도한 용도를 식별합니다. 컨텍스트 값에는 비밀번호나 개인 데이터를 넣지 않습니다.
KMS Encrypt는 작은 평문을 처리합니다. 준비된 내보내기 파일은 4 KiB 제한보다 훨씬 작습니다. fileb://는 입력을 바이너리 바이트로 읽습니다. CLI는 반환된 암호문을 base64로 표현하며 base64 --decode는 이를 다시 바이너리 파일로 변환합니다. 파이프는 출력을 다음 명령으로 보내고 >는 결과를 지정된 파일에 씁니다.
aws kms encrypt --key-id "$KEY_ARN" --plaintext fileb://private-export.json --encryption-context Purpose=private-export --query CiphertextBlob --output text | base64 --decode > private-export.kms
sha256sum으로 바이트 해시를 비교하세요. 해시가 다르면 암호문이 원래 데이터와 다르다는 것을 보여 줍니다. 이것만으로 권한을 증명하지는 않습니다.
sha256sum private-export.json private-export.kms
AWS View를 여세요. Customer key inventory에는 활성화된 키가 표시되어야 하며 Cryptographic requests에는 입력이 내보내기 파일과 일치하는 허용된 운영자 Encrypt 요청이 표시되어야 합니다.
읽기 역할 하나에 접근 권한 부여
이 단계에서는 애플리케이션 읽기 수행자가 내보내기 키로만 복호화할 수 있도록 합니다. IAM 역할 권한은 작업과 해당 작업이 적용되는 리소스를 모두 지정합니다. kms:Decrypt는 바이트 복구를 허용하며 암호화나 키 관리 권한을 부여하지는 않습니다.

읽기 수행자는 내보내기 파일을 복구하기 위해 올바른 컨텍스트, Decrypt 권한과 활성화된 키가 필요합니다.
권한을 추가하기 전에 먼저 읽기 수행자 프로필로 시도하세요. --profile export-reader는 운영자 대신 준비된 임시 역할 세션을 선택합니다. 명령은 접근 거부 응답으로 실패해야 하며 평문을 반환해서는 안 됩니다.
aws kms decrypt --profile export-reader --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=private-export --query KeyId --output text
정책 문서를 만드세요. here-document는 <<EOF와 EOF 사이의 줄을 read-export.json에 씁니다. 셸은 $KEY_ARN을 정확한 키 ARN으로 확장합니다. 이 권한 부여는 와일드카드 작업이나 와일드카드 리소스를 사용하지 않습니다.
cat > read-export.json <<EOF
{
"Version": "2012-10-17",
"Statement": [{"Effect": "Allow", "Action": "kms:Decrypt", "Resource": "$KEY_ARN"}]
}
EOF
이 인라인 정책을 읽기 역할에 연결하세요. 인라인 정책은 이 역할에 속하며 정리할 때 독립적으로 제거할 수 있습니다. 제공된 키는 같은 계정의 표준 키 정책을 사용하며 이 정책은 IAM 권한을 통해 이 역할에 권한을 부여할 수 있게 합니다.
aws iam put-role-policy --role-name labex-sec01-export-reader --policy-name ReadPrivateExport --policy-document file://read-export.json
이제 읽기 수행자 세션으로 암호화된 바이트를 복구하세요. 명령은 base64 평문 필드를 선택하고 디코딩하여 내용을 표시하지 않고 복구된 내보내기 파일을 씁니다.
aws kms decrypt --profile export-reader --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=private-export --query Plaintext --output text | base64 --decode > restored-export.json
cmp는 실제 파일 바이트를 비교합니다. &&를 사용하면 비교가 성공할 때만 메시지가 출력됩니다.
cmp private-export.json restored-export.json && echo "Original export bytes recovered"
Original export bytes recovered가 나와야 합니다. AWS View에는 정확한 키에 한정된 읽기 수행자 정책과 복구된 바이트가 내보내기 파일과 일치하는 허용된 읽기 역할 Decrypt가 표시되어야 합니다. 이 역할은 본인 키의 Decrypt로 제한하세요.

세 가지 복호화 실패 진단
이 단계에서는 컨텍스트, 권한과 키 상태 실패를 구별합니다. 각 결과의 원인이 분명하도록 계속 같은 암호문을 사용하세요. 아래 실패 명령은 의도적으로 평문이 아닌 키 식별자만 선택합니다.
먼저 컨텍스트 값만 변경하세요. 권한이 있는 읽기 수행자도 잘못된 컨텍스트로 암호문을 복호화할 수는 없습니다.
aws kms decrypt --profile export-reader --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=wrong-context --query KeyId --output text
InvalidCiphertextException이 나와야 합니다. 키와 역할 권한은 여전히 존재하지만 컨텍스트가 Encrypt에 사용한 컨텍스트와 일치하지 않습니다.
다음으로 역할에 부여한 권한을 제거하고 올바른 컨텍스트 요청을 반복하세요. 인라인 정책을 제거하면 키나 암호문을 변경하지 않고 권한 부여를 변경합니다.
aws iam delete-role-policy --role-name labex-sec01-export-reader --policy-name ReadPrivateExport
aws kms decrypt --profile export-reader --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=private-export --query KeyId --output text
접근 거부 응답이 나와야 합니다. 다음 테스트 전에 제한된 권한을 복구하세요.
aws iam put-role-policy --role-name labex-sec01-export-reader --policy-name ReadPrivateExport --policy-document file://read-export.json
마지막으로 키를 비활성화하세요. 비활성화된 키는 인벤토리에 남지만 암호화 작업을 수행할 수 없습니다. 권한이 있는 운영자 프로필을 사용하여 키 상태 실패를 따로 확인하세요.
aws kms disable-key --key-id "$KEY_ARN"
aws kms decrypt --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=private-export --query KeyId --output text
DisabledException이 나와야 합니다. 키를 활성화하고 읽기 수행자의 성공적인 복구를 반복하여 정상 동작이 돌아왔는지 확인하세요.
aws kms enable-key --key-id "$KEY_ARN"
aws kms decrypt --profile export-reader --key-id "$KEY_ARN" --ciphertext-blob fileb://private-export.kms --encryption-context Purpose=private-export --query Plaintext --output text | base64 --decode > restored-export.json
cmp private-export.json restored-export.json && echo "Reader access restored"
AWS View의 Cryptographic requests 테이블을 확인하세요. 거부된 요청의 호출자, 컨텍스트와 결과를 비교하세요. 역할 권한으로 컨텍스트 불일치나 비활성화된 키를 해결할 수는 없습니다.

소유한 키의 사용을 안전하게 종료
이 단계에서는 읽기 권한과 별칭을 제거한 다음 본인의 내보내기 키만 삭제 예약합니다. KMS 키 삭제에는 대기 기간이 있습니다. PendingDeletion은 예상되는 즉시 상태이며 키가 이미 사라졌다는 증거가 아닙니다. 이 기간에는 키로 복호화할 수 없습니다.
삭제를 예약하기 전에 ARN이 여전히 소유한 내보내기 키에 해당하는지 확인하세요.
aws kms describe-key --key-id "$KEY_ARN" --query 'KeyMetadata.[Description,KeyState]' --output text
labex-sec01-owned-export와 Enabled가 나와야 합니다. 추가한 역할 권한과 만든 별칭만 제거하세요.
aws iam delete-role-policy --role-name labex-sec01-export-reader --policy-name ReadPrivateExport
aws kms delete-alias --alias-name alias/labex-sec01-private-export
최소 대기 기간인 7일로 키 삭제를 예약하세요.
aws kms schedule-key-deletion --key-id "$KEY_ARN" --pending-window-in-days 7 --query DeletionDate --output text
명령은 예약된 삭제 날짜를 반환합니다. 별도의 읽기로 실제 키 상태를 확인하고 관련 없는 참조 키를 유지하세요.
aws kms describe-key --key-id "$KEY_ARN" --query KeyMetadata.KeyState --output text
aws kms describe-key --key-id alias/labex-sec01-reference --query KeyMetadata.KeyState --output text
본인 키는 PendingDeletion, 참조 키는 Enabled여야 합니다. AWS View에는 읽기 권한이 없고 Reference preserved가 표시되어야 합니다. rm -f로 이름이 지정된 로컬 내보내기 산출물만 제거하세요. 이 명령은 파일이 없어도 오류를 내지 않으며 다른 프로젝트 파일을 삭제하지 않습니다.
rm -f private-export.json private-export.kms restored-export.json read-export.json
운영자 프로필을 아직 사용할 수 있을 때 이 단계의 검증을 실행하세요. 통과한 후 이 VM의 일회용 CLI 프로필을 제거하고 키 변수를 해제하세요. 이는 로컬 세션 자격 증명을 제거하며 예약된 클라우드 키 삭제를 취소하지 않습니다.
rm -f /home/labex/.aws/credentials /home/labex/.aws/config
unset KEY_ARN
요약
고객 KMS 키와 비밀이 아닌 컨텍스트로 실제 내보내기 바이트를 암호화하고 읽기 역할 하나에 정확한 키의 Decrypt를 부여하여 원래 바이트를 복구했습니다. 잘못된 컨텍스트, 제거된 권한과 비활성화된 키는 각각 다른 실패를 일으켰습니다. 이후 관련 없는 참조 키를 유지하면서 삭제 대기 기간을 통해 소유한 키의 사용을 종료했습니다.



