AWS

AWS KMS(Key Management Service) IaC 사용법과 예시

devfinger 2024. 10. 23. 18:22

AWS Key Management Service (KMS)는 데이터를 암호화하고 키 관리를 자동화하는 보안 서비스이다. 다양한 AWS 서비스에서 암호화 키를 사용하여 데이터를 보호할 수 있다. 아래는 KMS를 사용하여 여러 AWS 서비스와 통합하는 방법과 IaC(Infrastructure as Code)를 사용하여 KMS와 관련된 리소스를 설정하는 예시들을 소개한다.

KMS의 주요 사용 사례

  • S3 버킷: 데이터를 암호화하기 위해 S3 버킷과 통합 가능
  • EBS 볼륨: EC2 인스턴스의 EBS 볼륨을 암호화
  • RDS: RDS에서 저장된 데이터 암호화
  • Lambda 함수: 환경 변수 또는 애플리케이션에서 사용하는 데이터를 암호화.
  • EFS: 파일 시스템 데이터를 암호화
  • Secrets Manager: 암호나 민감한 데이터를 보호

KMS 리소스의 주요 구성 요소

  • 키(KMS Key): 데이터를 암호화/복호화하는 기본 요소
  • 키 정책(Key Policy): 키에 대한 액세스 권한을 제어
  • Alias: 키를 쉽게 참조할 수 있는 사용자 정의 이름

 

KMS를 사용한 주요 서비스와의 연동 및 IaC 예시

1. KMS 키 생성

resource "aws_kms_key" "my_key" {
  description             = "My KMS key"
  deletion_window_in_days = 10

  policy = <<EOF
{
  "Version": "2012-10-17",
  "Id": "key-default-1",
  "Statement": [
    {
      "Sid": "Enable IAM User Permissions",
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::123456789012:root" },
      "Action": "kms:*",
      "Resource": "*"
    }
  ]
}
EOF
}

 

  • description: 키에 대한 설명
  • deletion_window_in_days: 키 삭제 요청 후 몇 일 후에 삭제할지 설정
  • policy: 이 키에 대한 접근 권한을 지정하는 IAM 정책

2. KMS Alias 생성

resource "aws_kms_alias" "my_key_alias" {
  name          = "alias/my-key-alias"
  target_key_id = aws_kms_key.my_key.id
}

 

  • name: 사용자 정의 KMS 키 별칭
  • target_key_id: 위에서 생성한 KMS 키를 참조

3. EFS와 KMS 통합 (암호화 사용)

EFS에서 KMS 키를 사용하여 파일 시스템을 암호화할 수 있다.

# KMS 키 생성
resource "aws_kms_key" "efs_key" {
  description = "KMS key for EFS encryption"
}

# EFS 파일 시스템 생성 (암호화 활성화)
resource "aws_efs_file_system" "example" {
  encrypted = true
  kms_key_id = aws_kms_key.efs_key.arn  # KMS 키로 암호화
  lifecycle_policy {
    transition_to_ia = "AFTER_30_DAYS"
  }
  performance_mode = "generalPurpose"
}

# EFS 마운트 타겟 생성
resource "aws_efs_mount_target" "efs_mount" {
  count = length(var.subnet_ids)
  file_system_id = aws_efs_file_system.example.id
  subnet_id = var.subnet_ids[count.index]
  security_groups = [aws_security_group.efs_sg.id]
}

 

  • encrypted: EFS 파일 시스템을 암호화할지 여부
  • kms_key_id: EFS에서 사용할 KMS 키의 ARN
  • EFS에서 데이터를 저장할 때 자동으로 암호화됩니다

4. S3 버킷과 KMS 통합

S3에서 객체를 업로드할 때 KMS 키로 암호화할 수 있다.

resource "aws_kms_key" "s3_key" {
  description = "KMS key for S3 encryption"
}

resource "aws_s3_bucket" "my_bucket" {
  bucket = "my-bucket"

  server_side_encryption_configuration {
    rule {
      apply_server_side_encryption_by_default {
        sse_algorithm     = "aws:kms"
        kms_master_key_id = aws_kms_key.s3_key.arn
      }
    }
  }
}

 

 

  • server_side_encryption_configuration: S3에서 서버 측 암호화를 활성화
  • sse_algorithm: 암호화 알고리즘, 여기서는 KMS를 사용
  • kms_master_key_id: 사용할 KMS 키의 ARN

5. Lambda 함수와 KMS 연동

Lambda 함수에서 KMS를 사용하여 암호화된 환경 변수를 사용할 수 있다.

# Lambda 역할에 KMS 사용 권한 부여
resource "aws_iam_role" "lambda_role" {
  name = "lambda-role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17",
    Statement = [{
      Action = "sts:AssumeRole",
      Effect = "Allow",
      Principal = {
        Service = "lambda.amazonaws.com"
      }
    }]
  })
}

resource "aws_iam_role_policy_attachment" "lambda_kms_policy" {
  role       = aws_iam_role.lambda_role.name
  policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaKMSExecutionRole"
}

# Lambda 함수 생성
resource "aws_lambda_function" "example" {
  function_name = "my_lambda"
  role          = aws_iam_role.lambda_role.arn
  handler       = "com.example.MyHandler"
  runtime       = "java11"

  environment {
    variables = {
      SECRET_KEY = "arn:aws:kms:region:account-id:key/key-id"
    }
  }
}

 

 

  • KMS 사용 환경 변수: Lambda 함수에서 암호화된 환경 변수를 사용하는 방법
  • Lambda 실행 역할에 KMS 권한을 부여하여 환경 변수를 복호화할 수 있도록 설정

6. EBS와 KMS 통합

EBS 볼륨을 생성할 때 KMS 키로 암호화할 수 있다.

resource "aws_ebs_volume" "example" {
  availability_zone = "us-west-2a"
  size              = 10
  encrypted         = true
  kms_key_id        = aws_kms_key.my_key.arn
}

 

 

  • encrypted: EBS 볼륨 암호화 활성화 여부
  • kms_key_id: KMS 키로 EBS 볼륨 암호화

요약

  • KMS는 AWS 서비스의 데이터 암호화를 관리하며, S3, EFS, Lambda, RDS 등과 통합하여 데이터를 보호한다.
  • IaC로 KMS 리소스 및 통합 서비스 설정: KMS 키 생성, Alias 설정, 그리고 이를 각 서비스(S3, EFS, Lambda, EBS 등)와 연동하는 방식은 Terraform을 통해 자동화할 수 있다.
  • 주요 사용 사례: S3 객체 암호화, EFS 파일 시스템 암호화, Lambda 환경 변수 보호, EBS 볼륨 암호화 등

다양한 AWS 리소스에 KMS를 연동해 데이터 보안과 암호화를 강화할 수 있으며, IaC로 이를 쉽게 관리할 수 있다.