반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

Devsecops로 발전하는 엔지니어

AWS Secrets Manager – 3부: 콘솔 및 CLI 실습 가이드 본문

cloud

AWS Secrets Manager – 3부: 콘솔 및 CLI 실습 가이드

cloud/devops/opensource 관심 많은 곰 2025. 6. 26. 10:40
반응형

1. 보안 암호 생성 (Secret 생성)

 [AWS Console]

 

  1. AWS 콘솔 → Secrets Manager → "보안 암호 생성" 클릭
  2. 보안 암호 유형 선택 (예: 기타 유형 또는 RDS 선택)
  3. 사용자 이름 / 암호 / 키-값 쌍 입력
  4. 암호 이름 입력
  5. 암호화 키(KMS 키)는 기본값인 aws/secretsmanager 또는 사용자 정의 키 선택
  6. "보안 암호 생성" 클릭 → 완료

 

[CLI]

aws secretsmanager create-secret --name my-database-secret --description " IAM pw change test" --secret-string '{"username":"admin","password":"MySecurePass123"}'


2. 보안 암호 값 업데이트

[AWS Console]

  1. 콘솔에서 Secret 선택
  2. "보안 암호 값 편집" 클릭
  3. 수정 후 저장 → 자동으로 AWSCURRENT 버전으로 적용됨

[CLI]

aws secretsmanager put-secret-value --secret-id my-database-secret --secret-string '{"username":"admin","password":"MyNewPass456"}'

 

3. 자동 교체(Rotation) 설정

[AWS Console]

 

  • Secret 선택 후 "교체 구성" 클릭
  • Lambda 함수 선택 (직접 작성하거나 템플릿 사용 가능)
  • 교체 주기 선택 (예: 30일, cron 형식도 가능)
  • 저장

 

Lambda의 경우 추가로 생성해줘야합니다.

lambda_function.py

import boto3
import json

def lambda_handler(event, context):
arn = event['SecretId']
token = event['ClientRequestToken']
step = event['Step']
print(f"Step: {step}")
 
if step == 'createSecret':
create_secret(arn, token)
elif step == 'setSecret':
pass # Not used in this rotation template
elif step == 'testSecret':
test_secret(arn, token)
elif step == 'finishSecret':
finish_secret(arn, token)

def create_secret(secret_arn, token):
sm = boto3.client('secretsmanager')
iam = boto3.client('iam')

# ✅ 실제 교체 대상 IAM 사용자명 명시
username = 'UserName'

# 새 Access Key 생성
response = iam.create_access_key(UserName=username)
access_key = response['AccessKey']['AccessKeyId']
secret_key = response['AccessKey']['SecretAccessKey']

# 새 키를 "AWSPENDING" 버전으로 저장
sm.put_secret_value(
SecretId=secret_arn,
ClientRequestToken=token,
SecretString=json.dumps({
'AccessKeyId': access_key,
'SecretAccessKey': secret_key
}),
VersionStages=['AWSPENDING']
)

def test_secret(secret_arn, token):
sm = boto3.client('secretsmanager')
secret = sm.get_secret_value(
SecretId=secret_arn,
VersionId=token,
VersionStage='AWSPENDING'
)
creds = json.loads(secret['SecretString'])

# 여기에 실제 테스트 로직 추가 가능 (예: 특정 서비스 호출 테스트)
print(f"Test AccessKeyId: {creds['AccessKeyId']}")

def finish_secret(secret_arn, token):
sm = boto3.client('secretsmanager')
metadata = sm.describe_secret(SecretId=secret_arn)
 
current = None
for version, stages in metadata['VersionIdsToStages'].items():
if 'AWSCURRENT' in stages:
current = version
break

# 새 버전을 AWSCURRENT로 승격
sm.update_secret_version_stage(
SecretId=secret_arn,
VersionStage='AWSCURRENT',
MoveToVersionId=token,
RemoveFromVersionId=current
)

[CLI]

aws secretsmanager rotate-secret --secret-id my-database-secret

aws secretsmanager update-secret-version-stage --secret-id my-database-secret --version-stage AWSPENDING --move-to-version-id <new-version-id>

 

4. 보안 암호 복제 (다중 리전)

[AWS Console]

 

  • Secret 상세 화면 → "리전 복제 추가" 클릭
  • 대상 리전 선택, 암호화 키(KMS) 선택
  • "복제 추가" 클릭

[CLI]

aws secretsmanager replicate-secret-to-regions --secret-id my-database-secret --add-replica-regions Region=us-west-2

※IAM에 부여해야하는 최소 권한

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetSecretValue"
      ],
      "Resource": "arn:aws:secretsmanager:ap-northeast-2:123456789012:secret:my-database-secret-123"
    }
  ]
}

 

Secrets Manager 버전 관리 ->새 버전이 생성될 때마다 version stage가 붙음

  • AWSCURRENT: 현재 사용 중
  • AWSPENDING: 교체 중
  • AWSPREVIOUS: 이전 값

마무리 요약

  • Secrets Manager는 콘솔과 CLI 모두 강력한 기능 제공
  • 민감 정보를 하드코딩하지 않고 안전하게 저장, 검색, 교체 가능
  • 교체 자동화, 복제, IAM 정책 설정, 버전 관리까지 포함한 통합 관리 가능
  • CodeGuru, AWS Config, CloudTrail, CloudWatch 등과 연계하여 보안 강화 가능

 

반응형