AWS Key Management Service(AWS KMS)를 통해 클라우드에서 데이터를 안전하게 보호하는 방법을 배워보려고합니다. KMS는 AWS에서 제공하는 완전관리형 암호화 키 서비스로, 민감한 정보를 안전하게 저장하고 접근을 제어할 수 있게 해줍니다.
AWS Key Management Service(KMS)를 통해 사용자 관리형 암호화 키(Customer Managed Key)를 처음으로 생성했습니다.
KMS 키는 AWS 리소스의 데이터 보안을 강화하기 위한 핵심 도구입니다. 특히, Amazon S3와 같은 저장 서비스에 있는 데이터를 암호화하거나 복호화할 때 사용되며, 민감한 정보 보호, 규정 준수(Compliance), 데이터 유출 방지 등을 위해 필수적입니다.
이 실습에서는 S3 데이터를 암호화할 목적이기 때문에, 그 데이터에 대한 암호화 정책을 제어하고 추적할 수 있는 내 키(myFirstKey)를 직접 만들었습니다.
이 키는 KMS 키 ID라는 고유 식별자를 가지며, 이후 CloudTrail을 통해 누가, 언제, 어떤 리소스를 암호화하거나 복호화했는지 기록하는 데도 사용됩니다.



{
"Id": "key-consolepolicy-3",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::154779494721:root"
},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "Allow access for Key Administrators",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::154779494721:role/AWSLabsUser-vrN9b64Efgv9JzsEaW6nLU"
},
"Action": [
"kms:Create*",
"kms:Describe*",
"kms:Enable*",
"kms:List*",
"kms:Put*",
"kms:Update*",
"kms:Revoke*",
"kms:Disable*",
"kms:Get*",
"kms:Delete*",
"kms:TagResource",
"kms:UntagResource",
"kms:ScheduleKeyDeletion",
"kms:CancelKeyDeletion",
"kms:RotateKeyOnDemand"
],
"Resource": "*"
}
]
}

AWS CloudTrail을 설정하여 AWS 계정 내 API 활동을 감시하고 그 기록을 새로 만든 S3 버킷에 저장했습니다.
CloudTrail은 AWS 리소스에 대한 누가, 언제, 어떤 API 요청을 보냈는지 추적해주는 서비스입니다. 이 실습에서는 KMS 키의 사용 기록을 남기기 위한 사전 준비 작업으로 CloudTrail을 설정했습니다. 즉, "누가 내 암호화 키를 사용했는가?", "S3 버킷에 어떤 조작이 있었는가?" 같은 질문에 답하기 위한 보안 감사의 기반입니다.
또한 로그 저장 위치로 새 S3 버킷을 생성함으로써, 로그의 보관, 분석, 감사 목적의 관리 편의성도 확보했습니다.
CloudTrail은 기본적으로 관리 이벤트, 데이터 이벤트, 이상 탐지(Insights) 이벤트까지 설정해둘 수 있는데, 여기서는 그 세 가지를 모두 켜서 보다 정밀한 활동 추적이 가능하도록 구성한 것입니다.





이 단계의 핵심 목적은 정적 데이터(S3에 저장된 객체)를 안전하게 보호하기 위해 암호화 설정을 적용하는 것이었습니다. 단순히 파일을 올리는 작업이 아니라, SSE-KMS (서버 측 KMS 암호화) 방식을 명시적으로 지정해, 업로드한 객체가 특정 KMS 키(myFirstKey)로 암호화되도록 설정한 것입니다.
버킷 자체에 암호화 기본 설정이 존재하더라도, 이 실습에서는 그것을 명시적으로 오버라이드(override) 하여, 암호화 키를 직접 지정하는 방법을 배운 것입니다.

이미지를 S3에 업로드하고 암호화했습니다.
이렇게 지정하면 다음과 같은 장점이 있습니다:
접근 통제: 해당 키를 사용할 수 있는 사용자, 역할을 IAM이나 키 정책으로 세분화 가능
감사 로그 추적: 이 키가 사용된 모든 이벤트는 CloudTrail에 기록됨 → 나중에 '누가 이 객체를 읽었는가'까지 확인 가능
S3 + KMS 통합 시나리오에 대한 실습 체감: 실제 환경에서는 고객 데이터, 민감 정보, 로그 파일 등을 이렇게 암호화함
또한 마지막 단계에서 기록한 Last modified 타임스탬프는 CloudTrail 로그에서 해당 이벤트를 정확히 찾아낼 수 있는 기준값으로, 이후 모니터링 및 감사 단계에서 사용됩니다.
정리하자면 이 태스크는 단순 업로드가 아니라:
특정 KMS 키로 S3 객체를 직접 암호화
보안 감사 및 접근 제어까지 고려한 데이터 저장 방법을 실습
CloudTrail 로그 분석을 위한 타임스탬프 확보
단계의 목적은 SSE-KMS(S3 + KMS 키로 암호화된 객체)가






AWS Management Console에서는 로그인한 사용자가 KMS 키 권한을 갖고 있기 때문에 이미지를 정상적으로 볼 수 있었습니다.
하지만 퍼블릭 URL로 접속했을 때는 "Access Denied" 또는 "Signature Version 4 required" 오류가 발생했습니다.
왜냐하면, SSE-KMS 암호화 객체는 퍼블릭 접근을 허용하지 않으며, 요청 시 서명이 반드시 필요한 보안 모델을 따르기 때문입니다.
이 작업의 의미는?
실습을 통해 얻은 인사이트
KMS 키를 사용한 암호화 작업이 실제로 CloudTrail에 기록되는지 확인하고,
이 로그를 통해 누가 언제 무슨 작업을 했는지 감시할 수 있다는 걸 체감하는 데 있습니다.
{
"Records": [
{
"eventVersion": "1.11",
"userIdentity": {
"type": "AssumedRole",
"principalId": "AROASICMTVFA6FJ4DVD2B:e7d9b1d2-9499-4258-a2ce-52ce1fd8efa0",
"arn": "arn:aws:sts::154779494721:assumed-role/AWSLabsUser-vrN9b64Efgv9JzsEaW6nLU/e7d9b1d2-9499-4258-a2ce-52ce1fd8efa0",
"accountId": "154779494721",
"accessKeyId": "ASIASICMTVFA2RL32CPV",
"sessionContext": {
"sessionIssuer": {
"type": "Role",
"principalId": "AROASICMTVFA6FJ4DVD2B",
"arn": "arn:aws:iam::154779494721:role/AWSLabsUser-vrN9b64Efgv9JzsEaW6nLU",
"accountId": "154779494721",
"userName": "AWSLabsUser-vrN9b64Efgv9JzsEaW6nLU"
},
"attributes": {
"creationDate": "2025-05-07T00:25:53Z",
"mfaAuthenticated": "false"
}
}
},
"eventTime": "2025-05-07T01:46:33Z",
"eventSource": "s3.amazonaws.com",
"eventName": "ListObjects",
"awsRegion": "ap-northeast-1",
"sourceIPAddress": "112.76.111.10",
"userAgent": "[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36]",
"requestParameters": {
"list-type": "2",
"bucketName": "mycloudtrailbucket1",
"encoding-type": "url",
"max-keys": "1000",
"fetch-owner": "true",
"prefix": "",
"delimiter": "/",
"Host": "mycloudtrailbucket1.s3.ap-northeast-1.amazonaws.com"
},
"responseElements": null,
"additionalEventData": {
"SignatureVersion": "SigV4",
"CipherSuite": "TLS_AES_128_GCM_SHA256",
"bytesTransferredIn": 0,
"AuthenticationMethod": "AuthHeader",
"x-amz-id-2": "uOyHkRL9VagkHEr2P+Nco94WyVoAa6ECzRfMJ8EXb1S5vzSQxuB7C6gpbdVef1D2nunE+usjBU8=",
"bytesTransferredOut": 821
},
"requestID": "SBX9C5AY1F0H11JE",
"eventID": "f9079a80-1587-4bcb-9c70-23028d8760b6",
"readOnly": true,
"resources": [
{
"accountId": "154779494721",
"type": "AWS::S3::Bucket",
"ARN": "arn:aws:s3:::mycloudtrailbucket1"
},
{
"type": "AWS::S3::Object",
"ARNPrefix": "arn:aws:s3:::mycloudtrailbucket1/"
}
],
"eventType": "AwsApiCall",
"managementEvent": false,
"recipientAccountId": "154779494721",
"eventCategory": "Data",
"tlsDetails": {
"tlsVersion": "TLSv1.3",
"cipherSuite": "TLS_AES_128_GCM_SHA256",
"clientProvidedHostHeader": "mycloudtrailbucket1.s3.ap-northeast-1.amazonaws.com"
}
},
{
"eventVersion": "1.11",
"userIdentity": {
"type": "AWSAccount",
"principalId": "",
"accountId": "anonymous"
},
"eventTime": "2025-05-07T01:47:16Z",
"eventSource": "s3.amazonaws.com",
"eventName": "GetObject",
"awsRegion": "ap-northeast-1",
"sourceIPAddress": "112.76.111.10",
"userAgent": "[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36]",
"errorCode": "AccessDenied",
"errorMessage": "Access Denied",
"requestParameters": {
"bucketName": "mycloudtrailbucket1",
"Host": "mycloudtrailbucket1.s3.ap-northeast-1.amazonaws.com",
"key": "favicon.ico"
},
"responseElements": null,
"additionalEventData": {
"CipherSuite": "TLS_AES_128_GCM_SHA256",
"bytesTransferredIn": 0,
"x-amz-id-2":
}
.
.
.
.
.
}
}
}
실습을 통해 알게 된 점
KMS 키를 누가 사용할 수 있는지를 직접 제어할 수 있다는 점을 체험하는 데 있습니다.
단순히 키를 만든다고 모두가 사용할 수 있는 게 아니라, 정확하게 ‘누가(Key User)’ 이 키로 데이터를 암호화/복호화할 수 있는지 명시해야만 작동합니다.

핵심 포인트
실습을 통해 알게 된 점
이번 실습을 통해 AWS Key Management Service(KMS)는 단순히 데이터를 암호화하는 기능 그 이상이라는 걸 확인할 수 있었습니다.
키 생성부터 사용, 접근 통제, 로그 추적까지 전 과정을 직접 다뤄보며, 보안 통제의 핵심은 '누가', '언제', '어떻게' 키를 쓰는지 제어하는 것임을 체감했습니다.
또한, CloudTrail과 연동해 키 사용 내역을 감시할 수 있다는 점에서 단순한 암호화뿐 아니라 추적 가능성과 책임성(auditing)까지 보장된다는 것도 확인했습니다.
SSE-KMS로 암호화된 객체는 URL로 단순 접근이 불가능하다는 점은 보안 정책이 AWS 전반에 얼마나 강하게 적용되는지를 보여주는 예였습니다.