안녕하세요.
이번 시간에는 이전 포스팅에 이어서 KMS와 Secret Manager를 이용해서 API 키를 저장하는 실습을 진행하겠습니다.
AWS Access Key를 암호화하지 않고 퍼블릭한 환경에 노출하는 것은 좋은 아이디어가 아닙니다.
AWS에서는 이런 Key 들을 암호화하여 저장할 수 있도록 KMS와 Secret Manager라는 서비스를 제공하고 있습니다.
1. AWS KMS(Key Management Service)와 Secret Manager
AWS Secrets Manager는 암호를 암호화 및 저장하고 투명하게 해독한 다음 일반 텍스트로 반환하는 AWS 서비스입니다. 이 서비스는 애플리케이션에서 일반 텍스트로 저장되거나 하드 코딩되지 않아야 하며 정기적 변경되는 로그인 자격 증명과 같은 애플리케이션 암호를 저장하기 위해 특별히 설계되었습니다. 애플리케이션에서는 하드 코딩된 자격 증명이나 테이블 조회 대신에 Secrets Manager를 호출합니다.
Secrets Manager는 AWS Key Management Service(AWS KMS)와 통합되어 AWS KMS key로 보호되는 고유한 데이터 키로 모든 비밀 값의 모든 버전을 암호화합니다. 이 통합은 암호화 키로 암호를 보호하여 AWS KMS를 암호화되지 않은 상태로 방치되지 않도록 합니다. 또한 KMS 키에 대한 사용자 지정 권한을 설정하고 암호를 보호하는 데이터 키를 생성, 암호화 및 해독하는 작업을 감사할 수 있도록 합니다.
2. AWS KMS 생성하기
다음과 같이 AWS KMS를 이용해서 고객 관리형 키를 생성합니다. 키 유형은 사용성을 위해 대칭 키로 선택했고 키 관리, 사용자에 저를 추가한 후 생성하였습니다. 키는 생성하면 삭제할 때 키 관리자가 할 수 있으며 즉시 삭제되지는 않습니다.
3. Secrets Manager 생성하기
다음과 같이 Secrets Manager를 선택한 후 API 키가 포함된 다른 유형의 보안 암호를 선택해 줍니다. 키/값 페어값이 Key-Value 형태로 되어 있기 때문에 행 추가를 해준 후 API 키에서 Access Key/Secret Key를 적어줍니다. 암호화 키는 앞서 생성한 KMS의 대칭 키를 넣어줍니다. 보안 암호 이름은 식별하기 위한 이름이기 때문에 생성해 주면 다음과 같이 Key, Value 값을 호출할 수 있는 코드를 제공합니다.
4. Lambda 함수에 Secrets Manager 호출 코드 등록하기
현재 서비스 로직이 들어가 있는 Lambda 함수에서 구성탭에 있는 권한을 보시면 Lambda-role이 있습니다. 기본적으로 Lambda-role에는 CloudWatch Logs 권한 밖에 들어가 있지 않기 때문에 Secrets Manager를 read/write 할 수 없습니다. 해당 역할로 들어가서 권한을 추가해야 합니다.
다음과 같이 해당 역할에서 SecretsManagerReadWrite 권한을 추가한 후 저장합니다.
import json
def get_secret():
secret_name = "<내 Secrets Manager 보안 이름>"
region_name = "ap-northeast-2"
session = boto3.session.Session()
client = session.client(
service_name='secretsmanager',
region_name=region_name
)
try:
get_secret_value_response = client.get_secret_value(
SecretId=secret_name
)
except ClientError as e:
raise e
secret = get_secret_value_response['SecretString']
return json.loads(secret)
그러면 다음과 같이 제공받은 Secrets Manager 코드를 사용할 수 있습니다. Secrets Manager 가장 마지막에 언어별로 호출할 수 있는 코드를 제공받았습니다. 저는 함수의 런타임을 Python으로 생성하였기 때문에 파이썬 코드를 사용하여 값을 반환받으려고 합니다. json.loads를 이용하여 현재 문자열 형태로 반환된 값을 json 형태로 변환합니다.
value = get_secret()
# 데이터 추출
access_key = value['access_key']
secret_key = value['secret_key']
다음과 같이 get_secret() 함수를 호출하여 해당 변수에 json 형태의 value 값을 저장합니다. 이 access_key와 secret_key를 통해 boto3에서 해당 계정 리소스에 접근할 수 있는 세션을 얻을 수 있습니다. 추가적으로 애플리케이션에서 하드코딩 시 노출의 위험성이 있는 Slack Bot Token 역시 Secrets Manager를 통해 관리할 수 있습니다.
5. Lambda 파일 시스템 및 스토리지 사용하기
KMS, Secrets Manager를 사용하지 않고 암호화해서 그냥 스토리지에 저장해서 사용하면 안되나요?
=> 사용해도 됩니다.
1. 임시 스토리지
Lamabda에서는 2022년부터 임시 스토리지를 제공하고 있습니다. 이 임시 스토리지는 다음과 같은 특성을 가지고 있습니다.
말 그대로 임시 스토리지이기 때문에 새로운 실행이 있을 때 기존에 있던 파일들이 휘발성으로 지워지기 때문에 키 보관에 적합하지 않습니다.
2. EFS (Elastic File System)
EFS는 공유 가능한 파일 시스템입니다. 해당 기능을 사용하기 위해서는 구성에서 파일 시스템을 편집해야 하는데 Lambda를 VPC에 포함시켜야 하고 EFS를 사용하기 위해 최소 2개의 서브넷을 필요로 합니다. EFS에 파일을 암호화하여 저장한 후 호출해서 사용할 수 있습니다.
3. S3 (Simple Storage Service)
마찬가지로 S3를 퍼블릭한 환경에 노출시키지 않는다면 오브젝트 스토리지에 암호화된 키 값을 파일에 저장하여 호출해서 사용할 수도 있습니다.
이번 시간에는 이전 포스팅에 이어서 KMS와 Secret Manager를 이용해서 API 키를 저장하는 실습을 진행해 봤습니다.
다음 포스팅에서는 이어서 Slack Block Kit과 Slack-SDK, Boto3를 사용하여 간단한 실습을 진행하겠습니다.
감사합니다.
'Cloud > Amazon Cloud' 카테고리의 다른 글
[AWS] ECR에 이미지 올려서 ECS Fargate Redis 구성하고 접속하기 (0) | 2024.08.06 |
---|---|
[AWS] CodePipeline에서 다른 VPC에 있는 사내 GitLab에 연동하는 방법 (0) | 2024.06.26 |
[AWS] EC2에서 라이브러리를 S3에 저장하여 S3 업로드로 Lambda에 적용하기 (0) | 2023.11.30 |
[AWS] Lambda에서 Timeout 걸릴 때 해결 가능한 방법 알아보기 (0) | 2023.11.30 |
[AWS] Lambda에서 Slack 이벤트 Payload를 JSON 형태로 사용하기 (0) | 2023.11.30 |
클라우드, 개발, 자격증, 취업 정보 등 IT 정보 공간
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!