AWS Key Management Service(AWS KMS)

kauze98·2025년 5월 7일

AWS 실습

목록 보기
7/16

1. 개요

AWS Key Management Service(AWS KMS)를 통해 클라우드에서 데이터를 안전하게 보호하는 방법을 배워보려고합니다. KMS는 AWS에서 제공하는 완전관리형 암호화 키 서비스로, 민감한 정보를 안전하게 저장하고 접근을 제어할 수 있게 해줍니다.

2. KMS 기본 키 생성

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": "*"
    }
  ]
}

 

키 생성 완료

 


3. 로그를 새 S3 버킷에 저장하도록 CloudTrail 구성

AWS CloudTrail을 설정하여 AWS 계정 내 API 활동을 감시하고 그 기록을 새로 만든 S3 버킷에 저장했습니다.

CloudTrail은 AWS 리소스에 대한 누가, 언제, 어떤 API 요청을 보냈는지 추적해주는 서비스입니다. 이 실습에서는 KMS 키의 사용 기록을 남기기 위한 사전 준비 작업으로 CloudTrail을 설정했습니다. 즉, "누가 내 암호화 키를 사용했는가?", "S3 버킷에 어떤 조작이 있었는가?" 같은 질문에 답하기 위한 보안 감사의 기반입니다.

또한 로그 저장 위치로 새 S3 버킷을 생성함으로써, 로그의 보관, 분석, 감사 목적의 관리 편의성도 확보했습니다.

CloudTrail은 기본적으로 관리 이벤트, 데이터 이벤트, 이상 탐지(Insights) 이벤트까지 설정해둘 수 있는데, 여기서는 그 세 가지를 모두 켜서 보다 정밀한 활동 추적이 가능하도록 구성한 것입니다.

추정 속성 선택

로그 이벤트 생성



Trail 생성

 


4. S3 버킷에 이미지 업로드 및 암호화

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

버킷 자체에 암호화 기본 설정이 존재하더라도, 이 실습에서는 그것을 명시적으로 오버라이드(override) 하여, 암호화 키를 직접 지정하는 방법을 배운 것입니다.

이미지를 S3에 업로드하고 암호화했습니다.

 

이렇게 지정하면 다음과 같은 장점이 있습니다:

  • 접근 통제: 해당 키를 사용할 수 있는 사용자, 역할을 IAM이나 키 정책으로 세분화 가능

  • 감사 로그 추적: 이 키가 사용된 모든 이벤트는 CloudTrail에 기록됨 → 나중에 '누가 이 객체를 읽었는가'까지 확인 가능

  • S3 + KMS 통합 시나리오에 대한 실습 체감: 실제 환경에서는 고객 데이터, 민감 정보, 로그 파일 등을 이렇게 암호화함

또한 마지막 단계에서 기록한 Last modified 타임스탬프는 CloudTrail 로그에서 해당 이벤트를 정확히 찾아낼 수 있는 기준값으로, 이후 모니터링 및 감사 단계에서 사용됩니다.

정리하자면 이 태스크는 단순 업로드가 아니라:

  • 특정 KMS 키로 S3 객체를 직접 암호화

  • 보안 감사 및 접근 제어까지 고려한 데이터 저장 방법을 실습

  • CloudTrail 로그 분석을 위한 타임스탬프 확보

 


5. 암호화된 이미지에 액세스

단계의 목적은 SSE-KMS(S3 + KMS 키로 암호화된 객체)가

  1. 누가 접근할 수 있는지,
  2. 어떻게 접근해야 하는지,
  3. 기본적으로 어떤 제한이 걸려 있는지
    직접 경험해 보는 것이었습니다.


mycloudtrailbucket1 권한 퍼블릭 액세스 차단 해제

 

객체 소유권 편집

 

이미지 ACL을 사용하여 퍼블릭으로 설정


 

AWS Management Console에서는 로그인한 사용자가 KMS 키 권한을 갖고 있기 때문에 이미지를 정상적으로 볼 수 있었습니다.

하지만 퍼블릭 URL로 접속했을 때는 "Access Denied" 또는 "Signature Version 4 required" 오류가 발생했습니다.

왜냐하면, SSE-KMS 암호화 객체는 퍼블릭 접근을 허용하지 않으며, 요청 시 서명이 반드시 필요한 보안 모델을 따르기 때문입니다.

 

이 작업의 의미는?

  • S3의 객체 공개 설정만으로는 KMS 암호화 객체에 대한 접근이 허용되지 않습니다.
  • KMS 키에 대한 적절한 권한 + 서명된 요청(Signature v4) 이 필요합니다.
  • 즉, "보기만 하게 해도 되는데"가 통하지 않는 구조입니다.
    이는 보안을 위한 매우 강력한 설계입니다.

 

실습을 통해 얻은 인사이트

  1. 단순히 S3 버킷 퍼블릭 액세스를 허용한다고 해서 KMS로 암호화된 객체를 URL로 누구나 열어볼 수 있는 건 아님.
  2. KMS를 통해 객체를 암호화할 경우, 데이터 접근 시점마다 인증과 권한이 다시 검증됨.
  3. KMS와 S3는 단순한 저장소 이상의 '정교한 접근 제어 시스템'으로 통합됨.

6. CloudTrail 로그를 사용하여 KMS 활동 모니터링

KMS 키를 사용한 암호화 작업이 실제로 CloudTrail에 기록되는지 확인하고,
이 로그를 통해 누가 언제 무슨 작업을 했는지 감시할 수 있다는 걸 체감하는 데 있습니다.

  • CloudTrail은 AWS 리소스에 대한 모든 API 호출을 로그로 남깁니다.
  • 이미지 업로드 → KMS 키로 암호화 → 이 작업은 Encrypt API 호출로 기록됩니다.
  • 우리는 이 로그를 직접 찾아 KMS 키 사용 내역이 실제로 남아 있는지 확인했습니다.
  • 로그 파일은 .json.gz 형식이며, 내부에는 keyId, eventName, userIdentity 등 중요한 정보가 포함됩니다.
{
  "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는 단순 암호화 도구가 아니라 감사 가능성을 보장하는 보안 시스템입니다.
  • 감사(Auditing)나 규정 준수(Compliance)가 중요한 보안 환경에서 CloudTrail과 KMS의 조합은 매우 강력합니다.
  • 향후 문제 발생 시 "누가 어떤 키로 무엇을 암호화했는가"를 추적 가능하게 만드는 핵심 근거가 됩니다.

 


7. 암호화 키 관리

KMS 키를 누가 사용할 수 있는지를 직접 제어할 수 있다는 점을 체험하는 데 있습니다.
단순히 키를 만든다고 모두가 사용할 수 있는 게 아니라, 정확하게 ‘누가(Key User)’ 이 키로 데이터를 암호화/복호화할 수 있는지 명시해야만 작동합니다.

업로드중..

 

핵심 포인트

  • KMS 키에는 두 가지 권한 관리 대상이 있다:
    - Key administrators: 키 설정을 관리할 수 있음
    - Key users: 키를 사용해서 암호화·복호화할 수 있음
  • 실습에서는 Key user 권한을 제거하고 다시 부여함으로써
    해당 IAM 사용자(또는 역할)의 키 사용 권한을 실시간으로 제어 가능함을 확인함

실습을 통해 알게 된 점

  • KMS 키를 생성해도 아무나 사용할 수 없다. 권한이 있어야만 동작한다.
  • 이를 통해 IAM + KMS의 조합으로 보안성과 통제를 강화할 수 있다.
  • 특정 상황(예: 직원 퇴사, 부서 이동 등)에서 즉시 키 사용을 차단할 수 있다

 


마무리

이번 실습을 통해 AWS Key Management Service(KMS)는 단순히 데이터를 암호화하는 기능 그 이상이라는 걸 확인할 수 있었습니다.

키 생성부터 사용, 접근 통제, 로그 추적까지 전 과정을 직접 다뤄보며, 보안 통제의 핵심은 '누가', '언제', '어떻게' 키를 쓰는지 제어하는 것임을 체감했습니다.

또한, CloudTrail과 연동해 키 사용 내역을 감시할 수 있다는 점에서 단순한 암호화뿐 아니라 추적 가능성과 책임성(auditing)까지 보장된다는 것도 확인했습니다.

SSE-KMS로 암호화된 객체는 URL로 단순 접근이 불가능하다는 점은 보안 정책이 AWS 전반에 얼마나 강하게 적용되는지를 보여주는 예였습니다.

profile

0개의 댓글