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로 이를 쉽게 관리할 수 있다.
'AWS' 카테고리의 다른 글
AWS Route53 records, alias_records, subject_alternative_names 설명 (0) | 2024.10.24 |
---|---|
AWS VPC, 2개 AZ, Subnet, Internet G/W, Application LB, Route53, DirectConnect, Transit G/W 연결 IaC 테스트 방법 (0) | 2024.10.23 |
AWS 사용자 관리 정책 aws_iam_policy와 aws_iam_role_policy_attachment 사용법 (1) | 2024.10.23 |
AWS Roles(역할) aws_iam_role의 assume_role_policy 사용법 (0) | 2024.10.23 |
AWS IAM 관리형 정책 (Managed Policies) (0) | 2024.10.23 |