Secrets Manager และ Parameter Store
หมุนเวียนข้อมูลรับรองฐานข้อมูลโดยอัตโนมัติด้วย Secrets Manager จัดเก็บการกำหนดค่าที่ไม่ใช่ความลับใน Parameter Store และผสานการทำงานทั้งสองเข้ากับ Lambda และ ECS
Secrets Manager และ Parameter Store เป็นบทเรียน Cloud & IT Cert Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Cloud & IT Cert Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Cloud & IT Cert Prep มีบทเรียนทั้งหมด 4 บทเรียน
ปัญหาของข้อมูลลับในโค้ด
รูปแบบต่อต้านที่พบบ่อยและเป็นอันตรายคือการจัดเก็บข้อมูลลับ (รหัสผ่านฐานข้อมูล คีย์ API โทเค็น OAuth) ไว้ในซอร์สโค้ดของแอปพลิเคชัน ตัวแปรสภาพแวดล้อม หรือไฟล์การกำหนดค่าที่ถูกบันทึกไว้ในระบบควบคุมเวอร์ชัน เมื่อที่เก็บเหล่านี้ถูกเปิดเผย ไม่ว่าจะเกิดจากการทำให้เป็นสาธารณะโดยไม่ตั้งใจหรือการถูกผู้โจมตีเข้าถึง ข้อมูลลับทั้งหมดจะถูกบุกรุกทันที AWS มีบริการที่มีการจัดการ 2 บริการเพื่อขจัดปัญหานี้ ได้แก่ AWS Secrets Manager สำหรับข้อมูลประจำตัวที่ต้องมีการหมุนเวียนโดยอัตโนมัติ และ AWS Systems Manager Parameter Store สำหรับค่าการกำหนดค่าและข้อมูลลับที่ไม่ต้องหมุนเวียน
# Anti-pattern: secrets in code (NEVER do this)
# db_password = 'supersecret123'
# api_key = 'sk-abc123def456'
# Best practice: retrieve at runtime
import boto3
client = boto3.client('secretsmanager', region_name='us-east-1')
response = client.get_secret_value(SecretId='prod/myapp/db-password')
password = response['SecretString'] # fresh value, always currentภาพรวม AWS Secrets Manager
AWS Secrets Manager เป็นบริการที่มีการจัดการสำหรับจัดเก็บ เรียกดู และ หมุนเวียนข้อมูลลับโดยอัตโนมัติ บริการเข้ารหัสข้อมูลลับทั้งหมดด้วย KMS (โดยค่าเริ่มต้นจะใช้คีย์ที่ AWS จัดการ หรือใช้ CMK ของคุณ) ข้อมูลลับสามารถจัดเก็บข้อมูลที่มีโครงสร้างใด ๆ ในรูปสตริง JSON แบบคีย์-ค่า Secrets Manager คิดค่าบริการ 0.40 ดอลลาร์สหรัฐต่อข้อมูลลับต่อเดือน และ 0.05 ดอลลาร์สหรัฐต่อการเรียก API 10,000 ครั้ง จุดแตกต่างสำคัญจาก Parameter Store คือ การหมุนเวียนอัตโนมัติในตัวสำหรับ RDS, Redshift, DocumentDB และข้อมูลลับแบบกำหนดเองผ่านฟังก์ชัน Lambda สำหรับการหมุนเวียน โดยไม่ต้องเปลี่ยนแปลงแอปพลิเคชันระหว่างการหมุนเวียน
# Create a secret in Secrets Manager
aws secretsmanager create-secret \
--name 'prod/myapp/database' \
--description 'Production MySQL credentials' \
--secret-string '{"username":"admin","password":"changeme123","host":"mydb.rds.amazonaws.com","port":3306,"dbname":"orders"}'
# Retrieve the secret (by application)
aws secretsmanager get-secret-value \
--secret-id 'prod/myapp/database' \
--query 'SecretString' \
--output text | python3 -c 'import sys,json; s=json.load(sys.stdin); print(s["password"])'การ Rotation แบบ Automatic ด้วย Secrets Manager
การ Rotation แบบ Automatic เป็นฟีเจอร์ที่ทรงพลังที่สุดของ Secrets Manager สำหรับฐานข้อมูล RDS นั้น Secrets Manager จะ Rotation รหัสผ่านโดยอัตโนมัติผ่านขั้นตอนต่อไปนี้: 1) สร้างรหัสผ่านใหม่ 2) อัปเดตรหัสผ่านของผู้ใช้ฐานข้อมูลใน RDS 3) อัปเดตข้อมูลลับด้วยรหัสผ่านใหม่ 4) ตรวจสอบว่าข้อมูลรับรองใหม่ใช้งานได้ กระบวนการทั้งหมดนี้เกิดขึ้นขณะที่แอปพลิเคชันยังทำงานอยู่ — ไม่มีช่วงหยุดทำงานและไม่ต้องดำเนินการด้วยตนเอง แอปพลิเคชันจะเรียกใช้ get-secret-value เพื่อดึงรหัสผ่านปัจจุบันเสมอ จึงใช้ข้อมูลรับรองที่ผ่านการ Rotation แล้วโดยอัตโนมัติ
# Enable automatic rotation for RDS secret
aws secretsmanager rotate-secret \
--secret-id 'prod/myapp/database' \
--rotation-rules AutomaticallyAfterDays=30 \
--rotation-lambda-arn arn:aws:lambda:us-east-1:123:function:SecretsManagerRDSMySQLRotationSingleUser
# AWS provides pre-built rotation Lambda functions for:
# - RDS MySQL/PostgreSQL/MariaDB/Oracle/SQL Server
# - DocumentDB
# - Redshift
# - Custom: write your own Lambda for other services
# Application code: always call GetSecretValue, never cache long-termการแคชข้อมูลลับไว้ภายในเครื่อง
การเรียกใช้ Secrets Manager ในทุกคำค้นหาฐานข้อมูลจะมีค่าใช้จ่ายสูงและทำงานช้า แนวทางปฏิบัติที่ดีที่สุดคือ แคชข้อมูลลับไว้ภายในเครื่องในหน่วยความจำเป็นระยะเวลาสั้น ๆ AWS มีไคลเอ็นต์แคช Secrets Manager อย่างเป็นทางการสำหรับ Java และ Python ซึ่งแคชข้อมูลลับตาม TTL ที่กำหนดค่าได้ เมื่อแคชหมดอายุ ไคลเอ็นต์จะดึงข้อมูลลับจาก Secrets Manager อีกครั้ง หากแอปพลิเคชันได้รับข้อผิดพลาดด้านการตรวจสอบสิทธิ์ (แสดงว่ารหัสผ่านผ่านการ Rotation แล้ว) แอปพลิเคชันจะรีเฟรชแคชทันทีแล้วลองใหม่ รูปแบบนี้ให้ทั้งประสิทธิภาพและความเป็นปัจจุบัน โดยไม่เรียกใช้ Secrets Manager API ถี่เกินไป
# Python: Secrets Manager caching client
# pip install aws-secretsmanager-caching
from botocore.session import get_session
from aws_secretsmanager_caching import SecretCache, SecretCacheConfig
client = get_session().create_client('secretsmanager')
cache = SecretCache(
config=SecretCacheConfig(secret_refresh_interval=3600), # cache 1 hour
client=client
)
# Returns cached value unless refresh interval expired
secret = cache.get_secret_string('prod/myapp/database')AWS Systems Manager Parameter Store
AWS ตัวจัดการระบบ (SSM) Parameter Store เป็นที่จัดเก็บข้อมูลแบบคีย์-ค่าในลำดับชั้นสำหรับข้อมูลการกำหนดค่าและข้อมูลลับ โดยไม่มีค่าใช้จ่าย (สำหรับพารามิเตอร์ Standard) รองรับประเภทพารามิเตอร์ String, StringList และ SecureString โดย SecureString จะเข้ารหัสค่าด้วย KMS ซึ่งแตกต่างจาก Secrets Manager ตรงที่ Parameter Store ไม่รองรับการ Rotation แบบ Automatic — ระบบนี้ออกแบบมาสำหรับค่าการกำหนดค่าที่เปลี่ยนแปลงไม่บ่อย พารามิเตอร์ Standard ไม่มีค่าใช้จ่ายและจัดเก็บข้อมูลได้สูงสุด 4 KB ส่วนพารามิเตอร์ Advanced รองรับค่าที่มีขนาดใหญ่กว่า (สูงสุด 8 KB) นโยบายพารามิเตอร์ (การหมดอายุและการแจ้งเตือนเรื่อง Rotation) และมีค่าใช้จ่าย $0.05/พารามิเตอร์/เดือน
# Create Parameter Store parameters
aws ssm put-parameter \
--name '/prod/myapp/db-host' \
--value 'mydb.cluster-abc.us-east-1.rds.amazonaws.com' \
--type String
aws ssm put-parameter \
--name '/prod/myapp/db-password' \
--value 'mysecretpassword' \
--type SecureString \
--key-id alias/my-kms-key
# Retrieve parameter
aws ssm get-parameter \
--name '/prod/myapp/db-password' \
--with-decryption \
--query 'Parameter.Value' --output textลำดับชั้นของ Parameter Store และ IAM
จัดระเบียบค่าของ Parameter Store ด้วย โครงสร้างเส้นทางแบบลำดับชั้น ที่สะท้อนสภาพแวดล้อมและสถาปัตยกรรมของแอปพลิเคชัน วิธีนี้ช่วยให้สร้างนโยบาย IAM ที่ให้สิทธิ์อย่างละเอียด โดยอนุญาตให้เข้าถึงพารามิเตอร์ตามคำนำหน้าเส้นทางได้ ตัวอย่างเช่น ให้ฟังก์ชัน Lambda เข้าถึงได้เฉพาะพารามิเตอร์ภายใต้ /prod/payment-service/ — ฟังก์ชันจะไม่สามารถเข้าถึงพารามิเตอร์ของบริการอื่นได้ หลักการให้สิทธิ์เท่าที่จำเป็นที่สุดสำหรับการกำหนดค่านี้ช่วยป้องกันไม่ให้บริการหนึ่งที่ถูกโจมตีอ่านข้อมูลลับของบริการอื่น
# Parameter hierarchy
/prod/payment-service/db-password
/prod/payment-service/stripe-api-key
/prod/order-service/db-password
/prod/order-service/redis-url
/staging/payment-service/db-password
# IAM policy: payment-service Lambda can ONLY read its params
{
'Effect': 'Allow',
'Action': ['ssm:GetParameter', 'ssm:GetParameters', 'ssm:GetParametersByPath'],
'Resource': 'arn:aws:ssm:us-east-1:123:parameter/prod/payment-service/*'
}
# Get all parameters for an app at once
aws ssm get-parameters-by-path \
--path '/prod/payment-service/' \
--with-decryption --recursiveSecrets Manager กับ Parameter Store: ควรใช้แต่ละบริการเมื่อใด
เลือกใช้บริการใดบริการหนึ่งตามข้อกำหนดของคุณ: Use Secrets Manager เมื่อคุณต้องการ Rotation ของข้อมูลลับแบบ Automatic จัดเก็บข้อมูลรับรองฐานข้อมูล ต้องแชร์ข้อมูลลับระหว่างหลายบัญชี AWS หรือข้อกำหนดด้านการปฏิบัติตามกฎระเบียบกำหนดให้มีนโยบาย Rotation ที่จัดทำเป็นเอกสาร Use Parameter Store เมื่อคุณต้องการค่าการกำหนดค่า (ที่ไม่ใช่ข้อมูลลับ) ต้องการโซลูชันฟรีสำหรับการจัดเก็บคีย์-ค่าแบบง่าย ต้องการการกำหนดค่าแบบลำดับชั้นพร้อมการควบคุมการเข้าถึงตามเส้นทาง หรือต้องการจัดเก็บประวัติเวอร์ชันของพารามิเตอร์ สถาปัตยกรรมจำนวนมากใช้ทั้งสองบริการร่วมกัน: Parameter Store สำหรับการกำหนดค่า และ Secrets Manager สำหรับข้อมูลรับรอง
# Usage comparison:
# Secrets Manager:
# Cost: $0.40/secret/month
# Rotation: Automatic (RDS, custom Lambda)
# Cross-account: Yes
# Best for: Database passwords, API keys, OAuth tokens
# Parameter Store:
# Cost: Free (standard) / $0.05/month (advanced)
# Rotation: Manual only
# Cross-account: No (use Secrets Manager)
# Best for: Config values, feature flags, non-rotating secretsการผสานรวมกับ Lambda และ ECS
ฟังก์ชัน Lambda และงาน ECS ควรดึงข้อมูลลับเมื่อเริ่มต้นทำงาน ไม่ใช่ทุกครั้งที่มีการเรียกใช้ สำหรับ Lambda: ดึงข้อมูลลับใน โค้ดเริ่มต้นระบบ (อยู่นอกฟังก์ชันตัวจัดการ) แล้วแคชไว้ในตัวแปรส่วนกลาง — สภาพแวดล้อมการทำงานของ Lambda จะคงอยู่ระหว่างการเรียกใช้ ดังนั้นข้อมูลลับจะถูกดึงเพียงครั้งเดียวต่ออายุการใช้งานของสภาพแวดล้อม สำหรับ ECS: ใช้ฟิลด์ secrets ในคำจำกัดความงานเพื่อแทรกค่าจาก Secrets Manager หรือ SecureStrings ของ Parameter Store เป็นตัวแปรสภาพแวดล้อม — ECS จะดึงและแทรกค่าเหล่านี้เมื่อเริ่มงาน โดยไม่ต้องเปลี่ยนแปลงโค้ดแอปพลิเคชัน
# ECS task definition: inject secret as environment variable
{
'containerDefinitions': [{
'name': 'api',
'image': 'my-api:latest',
'secrets': [
{
'name': 'DB_PASSWORD',
'valueFrom': 'arn:aws:secretsmanager:us-east-1:123:secret:prod/myapp/database:password::'
},
{
'name': 'API_KEY',
'valueFrom': '/prod/myapp/api-key'
}
]
}]
}
# Application reads DB_PASSWORD from env var
# ECS injects the current secret value at task startParameter Store สำหรับ ID ของ EC2 AMI
การใช้งาน Parameter Store ที่เป็นประโยชน์แต่ถูกมองข้ามบ่อยครั้ง คือการจัดเก็บ ID ของ AMI และข้อมูลอ้างอิงการปรับใช้ แทนที่จะฝัง ID ของ AMI ไว้ในเทมเพลต CloudFormation ซึ่งจะล้าสมัยเมื่อมีการเผยแพร่ AMI ใหม่ ให้ใช้อ้างอิงค่าจาก Parameter Store แทน pipeline CI/CD ของคุณจะอัปเดต ID ของ AMI ใน Parameter Store ทุกครั้งที่สร้าง AMI มาตรฐานใหม่ CloudFormation จะอ่าน ID ของ AMI ล่าสุดจาก Parameter Store ในเวลาปรับใช้ AWS ยังเผยแพร่ ID ของ Amazon Linux AMI ล่าสุด ไว้ในเส้นทางสาธารณะของ Parameter Store ซึ่งคุณสามารถอ้างอิงได้โดยตรง
# Get AWS public AMI ID from Parameter Store
aws ssm get-parameter \
--name '/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64' \
--query 'Parameter.Value' --output text
# CloudFormation: reference public AMI parameter
Parameters:
LatestAmiId:
Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
Default: '/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64'
Resources:
MyEC2:
Type: AWS::EC2::Instance
Properties:
ImageId: !Ref LatestAmiIdการตรวจสอบและการปฏิบัติตามกฎระเบียบสำหรับข้อมูลลับ
การกำกับดูแลข้อมูลลับจำเป็นต้องทราบว่าใครเข้าถึงข้อมูลลับและเข้าถึงเมื่อใด AWS CloudTrail จะบันทึกการเรียกใช้ API ทุกครั้งไปยัง Secrets Manager และ Parameter Store ได้แก่ GetSecretValue, PutParameter, GetParameter ทำให้คุณมีบันทึกการตรวจสอบที่ครบถ้วนสำหรับการปฏิบัติตามกฎระเบียบ Use การแจ้งเตือนของ CloudWatch กับเมตริกของ CloudTrail เพื่อแจ้งเตือนเมื่อมีการเข้าถึงข้อมูลลับนอกเหนือจากรูปแบบปกติ — ตัวอย่างเช่น หากมีการเข้าถึงข้อมูลลับของระบบจริงจาก Principal ของ IAM ที่ไม่คุ้นเคย หรือจาก IP ที่ไม่อยู่ในช่วงที่ทราบ ให้ส่งการแจ้งเตือนเพื่อทำการตรวจสอบ
# CloudTrail metric filter: alert on unexpected secret access
aws logs put-metric-filter \
--log-group-name CloudTrail/management-events \
--filter-name 'SecretAccessOutsideHours' \
--filter-pattern '{ $.eventSource = "secretsmanager.amazonaws.com" && $.eventName = "GetSecretValue" && $.userAgent != "lambda.amazonaws.com" }' \
--metric-transformations \
metricName=UnexpectedSecretAccess,metricNamespace=Security,metricValue=1
# Then create CloudWatch alarm on this metric
# Alert fires when non-Lambda principal accesses secretsการแชร์ข้อมูลลับข้ามบัญชี
ในสถาปัตยกรรมแบบหลายบัญชี บางครั้งแอปพลิเคชันในบัญชีหนึ่งจำเป็นต้องใช้ข้อมูลลับที่จัดการโดยอีกบัญชีหนึ่ง (เช่น บัญชี Security ส่วนกลางจัดการรหัสผ่าน RDS ทั้งหมด) นโยบายทรัพยากรของ Secrets Manager อนุญาตให้เข้าถึงข้ามบัญชีได้ กำหนดนโยบายตามทรัพยากรบนข้อมูลลับเพื่อให้สิทธิ์แก่บทบาทในบัญชีผู้ใช้บริการให้เรียกใช้ GetSecretValue ได้ นอกจากนี้ บทบาทของบัญชีผู้ใช้บริการต้องมีนโยบาย IAM ที่อนุญาตให้เรียกใช้ ARN ของข้อมูลลับด้วย และนโยบายคีย์ KMS ต้องให้สิทธิ์บัญชีผู้ใช้บริการเข้าถึง CMK ที่ใช้เข้ารหัสข้อมูลลับด้วย
# Secret resource policy: allow cross-account access
aws secretsmanager put-resource-policy \
--secret-id 'prod/shared/rds-password' \
--resource-policy '{
"Statement": [{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::999999999999:role/AppRole"
},
"Action": "secretsmanager:GetSecretValue",
"Resource": "*"
}]
}'
# KMS key policy must also allow account 999999999999
# IAM policy in 999999999999 must allow GetSecretValue on ARNตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจแนวคิด AWS Solutions Architect (SAA-C03) จากบทเรียนนี้
สรุปบทเรียน
ในบทเรียนนี้ คุณได้เรียนรู้ว่า: Secrets Manager มีการ Rotation แบบ Automatic สำหรับข้อมูลรับรองฐานข้อมูลและคีย์ API และเป็นตัวเลือกที่แนะนำสำหรับข้อมูลลับที่ต้อง Rotation Parameter Store ให้พื้นที่จัดเก็บการกำหนดค่าแบบลำดับชั้นโดยไม่มีค่าใช้จ่าย พร้อมการควบคุมการเข้าถึง IAM ตามเส้นทาง และ ECS กับ Lambda สามารถแทรกข้อมูลลับเป็นตัวแปรสภาพแวดล้อมได้โดยไม่ต้องเปลี่ยนแปลงโค้ดแอปพลิเคชัน CloudTrail ให้บันทึกการตรวจสอบสำหรับการเข้าถึงข้อมูลลับทั้งหมด บทถัดไปเราจะศึกษา WAF, Shield และ Network Firewall
คำถามที่พบบ่อย
บทเรียน “Secrets Manager และ Parameter Store” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “Secrets Manager และ Parameter Store” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Cloud & IT Cert Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Cloud & IT Cert Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “Secrets Manager และ Parameter Store”
หมุนเวียนข้อมูลรับรองฐานข้อมูลโดยอัตโนมัติด้วย Secrets Manager จัดเก็บการกำหนดค่าที่ไม่ใช่ความลับใน Parameter Store และผสานการทำงานทั้งสองเข้ากับ Lambda และ ECS คุณปฏิบัติ Cloud & IT Cert Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Cloud & IT Cert Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Cloud & IT Cert Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “Secrets Manager และ Parameter Store” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Cloud & IT Cert Prep นี้ได้ไหม
ได้ บทเรียน Cloud & IT Cert Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- KMS, ACM และรูปแบบการเข้ารหัส
- GuardDuty, Inspector และ Macie
- Secrets Manager และ Parameter Store
- WAF, Shield และ Network Firewall