Security & Encryption
Security & Encryption
01พื้นฐาน Encryption (In-flight vs At-rest)
ก่อนเข้าเรื่อง KMS ต้องเข้าใจสองโหมดของการเข้ารหัสก่อน คือ Encryption in flight (in transit) กับ Encryption at rest เพราะข้อสอบ DVA-C02 มักถามว่าจะป้องกันข้อมูลในสถานการณ์ไหนด้วยวิธีใด
02AWS KMS Fundamentals & Key Types
AWS KMS (Key Management Service) คือบริการจัดการ encryption key แบบ centralized โดย AWS ดูแลความปลอดภัยและ availability ให้ จุดสำคัญคือ KMS keys (เดิมเรียก CMK) ไม่เคยถูก export ออกจาก KMS ทุกการเข้ารหัสต้องเรียก API ของ KMS และทุก request ถูก log ใน CloudTrail ทำให้ audit ได้
Symmetric vs Asymmetric keys
ประเภทการเป็นเจ้าของ Key
| ประเภท | ใครจัดการ | key rotation | มองเห็น/ปรับ policy ได้ไหม | ค่าใช้จ่าย |
|---|---|---|---|---|
| AWS Owned Keys | AWS ทั้งหมด (ใช้ร่วมหลาย account) | AWS จัดการ | ไม่เห็นในบัญชีคุณ | ฟรี |
| AWS Managed Keys (aws/<service>) | AWS สร้างให้ตอนใช้บริการ เช่น aws/s3, aws/rds | หมุนอัตโนมัติทุก 1 ปี (เปิดให้อยู่แล้ว) | เห็นได้ แต่ปรับ policy ไม่ได้ | ฟรี (จ่ายเฉพาะ API calls) |
| Customer Managed Keys (CMK) | คุณสร้างและจัดการเอง | ตั้ง automatic rotation ได้ (default ทุก 1 ปี) หรือ on-demand | ปรับ key policy ได้เต็มที่ | $1/เดือน/key + API calls |
03Envelope Encryption & Data Keys
เพราะ KMS Encrypt API จำกัดที่ 4 KB การเข้ารหัสไฟล์ใหญ่ (เช่น 1 GB) ต้องใช้ Envelope Encryption คือใช้ KMS สร้าง Data Key แล้วเอา Data Key ไปเข้ารหัสข้อมูลจริงที่ฝั่ง client เอง ส่วน Data Key ที่ encrypted แล้วก็เก็บคู่ไปกับ ciphertext
GenerateDataKey flow (Encrypt ข้อมูลใหญ่)
- เรียก GenerateDataKey API → KMS คืนมา 2 อย่าง: Plaintext Data Key (DEK) และ Encrypted Data Key
- ใช้ Plaintext Data Key เข้ารหัสไฟล์ใหญ่ที่ฝั่ง client (เร็ว ไม่ติดลิมิต 4 KB)
- ทิ้ง Plaintext Data Key ออกจาก memory ทันทีหลังใช้เสร็จ
- เก็บ Encrypted Data Key ฝังไว้กับ ciphertext (envelope)
- ตอนถอดรหัส: เรียก Decrypt บน Encrypted Data Key เพื่อได้ Plaintext Data Key กลับมา แล้วใช้ถอดไฟล์
AWS Encryption SDK & Data Key Caching
AWS Encryption SDK เป็น library ที่ทำ envelope encryption ให้อัตโนมัติ (มีทั้ง Java, Python, C, JavaScript และ CLI) ฟีเจอร์เด่นคือ Data Key Caching ที่ reuse data key เดิมแทนการเรียก GenerateNewDataKey ทุกครั้ง — ช่วย ลดจำนวน KMS API calls (ลดค่าใช้จ่ายและเลี่ยง throttling) แลกกับ security ที่ลดลงเล็กน้อย ควบคุมด้วย LocalCryptoMaterialsCache (ตั้ง max age, max bytes, max messages)
# Envelope encryption ด้วย AWS CLI
# 1) สร้าง data key (ได้ทั้ง plaintext และ ciphertext blob)
aws kms generate-data-key \
--key-id alias/my-cmk \
--key-spec AES_256
# 2) เข้ารหัสข้อมูลเล็ก (<=4KB) ตรงๆ ด้วย KMS
aws kms encrypt \
--key-id alias/my-cmk \
--plaintext fileb://secret.txt \
--output text --query CiphertextBlob | base64 --decode > secret.enc
# 3) ถอดรหัส
aws kms decrypt \
--ciphertext-blob fileb://secret.enc \
--output text --query Plaintext | base64 --decode04Key Policies, IAM & Grants
ต่างจาก service อื่น การเข้าถึง KMS key ถูกควบคุมด้วย Key Policy เป็นหลัก (resource-based policy ที่ติดกับตัว key) — ถ้าไม่มี Key Policy ที่อนุญาต จะไม่มีใครเข้าถึง key ได้เลย แม้จะเป็น root ดังนั้น key policy คือ gatekeeper ตัวจริงของ KMS
{
"Sid": "Allow use of the key cross-account",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:role/AppRole"
},
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:GenerateDataKey",
"kms:DescribeKey"
],
"Resource": "*"
}05Key Rotation, Multi-Region & Deletion
Automatic Key Rotation
- AWS Managed Keys: หมุนอัตโนมัติทุก 1 ปี (เปิดอยู่แล้ว แก้ไม่ได้)
- Customer Managed Keys: เปิด automatic rotation ได้เอง default ทุก 1 ปี และตั้ง custom period ได้ (90–2560 วัน) รวมทั้งหมุนแบบ on-demand ได้
- Imported key material / Asymmetric keys: ต้องหมุนแบบ manual (สร้าง key ใหม่ + เปลี่ยน alias) เพราะ automatic rotation รองรับเฉพาะ symmetric ที่ KMS สร้างเอง
- ตอนหมุน key, key ID และ ARN เดิมไม่เปลี่ยน KMS เก็บ backing key เก่าไว้ถอด ciphertext เดิมได้
Multi-Region Keys
Multi-Region Keys คือชุด key ที่มี key ID เดียวกัน (มี prefix mrk-) ใน primary region และ replica ในหลาย region โดยทุกตัวมี key material เดียวกัน ทำให้ ciphertext ที่ encrypt ใน region หนึ่ง decrypt ได้ใน region อื่นโดยไม่ต้องเรียก cross-region API เหมาะกับ Global DynamoDB tables, Global Aurora, disaster recovery สำคัญ: key เหล่านี้ถูก manage แยกอิสระแต่ละ region (policy/grant แยกกันได้)
Disable & Delete Key
- Disable key ได้ทันที (กลับมา enable ภายหลังได้)
- Schedule deletion: ต้องตั้ง waiting period 7–30 วัน (default 30 วัน) ระหว่างนี้ยกเลิกได้
- ลบ key แล้ว = ข้อมูลที่เข้ารหัสด้วย key นั้นถอดไม่ได้ตลอดกาล จึงมี waiting period บังคับเป็น safety net
- Multi-region replica key ลบได้เร็วกว่า (waiting period สั้นได้) แต่ primary จะลบไม่ได้ถ้ายังมี replica อยู่
06KMS Request Quotas & Throttling
KMS มี shared request quota ต่อ region ต่อ account สำหรับ cryptographic operations เมื่อเกิน quota จะได้ error ThrottlingException สถานการณ์นี้พบบ่อยตอนหลายบริการ decrypt พร้อมกันจำนวนมาก
- เมื่อโดน throttle จะได้ ThrottlingException — วิธีแก้คือใช้ exponential backoff retry
- ถ้าโดน throttle เป็นประจำ สามารถ ขอเพิ่ม quota ผ่าน Service Quotas / Support ticket
- ทางแก้เชิงสถาปัตยกรรมที่ดีที่สุดสำหรับ workload ที่ encrypt/decrypt ถี่มากๆ คือ Data Key Caching (ลดจำนวน call ไปที่ KMS โดยตรง)
07SSM Parameter Store
SSM Parameter Store เป็นที่เก็บ configuration และ secrets แบบ serverless มี versioning, จัด hierarchy ด้วย path และ integrate กับ KMS สำหรับ encryption (SecureString) ราคาถูกกว่า Secrets Manager มาก
Parameter Types
--with-decryption และ caller ต้องมีสิทธิ์ใช้ KMS key ที่เกี่ยวข้องStandard vs Advanced Tier
| คุณสมบัติ | Standard Tier | Advanced Tier |
|---|---|---|
| จำนวน parameter/account/region | 10,000 | 100,000 |
| ขนาดสูงสุดต่อ parameter | 4 KB | 8 KB |
| Parameter policies (TTL/expiration) | ไม่มี | มี |
| ค่าใช้จ่าย | ฟรี (storage) | มีค่าใช้จ่ายต่อ parameter |
Hierarchy, Path & Public Parameters
- จัดเป็น path เช่น
/my-app/dev/db-url,/my-app/prod/db-passwordแล้วใช้ GetParametersByPath ดึงทั้ง branch ได้ทีเดียว - เข้าถึงได้ผ่าน IAM โดยกำหนด policy ตาม path
- Public parameters เช่น AMI ล่าสุดของ Amazon Linux:
/aws/service/ami-amazon-linux-latest/...ใช้ใน CloudFormation/automation ได้
# CloudFormation อ้างอิง SSM Parameter (dynamic reference)
Resources:
MyInstance:
Type: AWS::EC2::Instance
Properties:
# ดึง AMI ล่าสุดจาก public parameter
ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64}}'
# ดึง secure password (ssm-secure)
KeyName: '{{resolve:ssm:/my-app/prod/keyname:1}}'
# CLI ตัวอย่าง
# เขียน SecureString
# aws ssm put-parameter --name /my-app/prod/db-password \
# --value 'P@ssw0rd' --type SecureString --key-id alias/my-cmk
# อ่านพร้อม decrypt
# aws ssm get-parameter --name /my-app/prod/db-password --with-decryptionget-parameter ถ้าไม่ใส่ --with-decryption จะได้ค่าที่ยังเข้ารหัสอยู่ (ciphertext) และ principal ต้องมีสิทธิ์ kms:Decrypt บน key ที่ใช้ มิฉะนั้น AccessDenied08AWS Secrets Manager & Rotation
AWS Secrets Manager ออกแบบมาเพื่อเก็บ secrets โดยเฉพาะ จุดขายหลักคือ automatic rotation ทุก X วันผ่าน Lambda function และ integrate กับ RDS / Redshift / DocumentDB โดยตรง secrets ถูกเข้ารหัสด้วย KMS เสมอ (บังคับ)
- Automatic rotation: ตั้งให้หมุน secret ทุก N วัน Secrets Manager เรียก Lambda ที่ทำหน้าที่สร้าง credential ใหม่และอัปเดตทั้งใน secret และใน database
- Native integration กับ RDS/Aurora: มี Lambda rotation template ให้เลย ไม่ต้องเขียน rotation logic เอง
- เข้ารหัสด้วย KMS อัตโนมัติ (ใช้ aws/secretsmanager หรือ CMK ของคุณ)
- Multi-region replication ของ secret รองรับ (สำหรับ DR / global apps)
{
"SecretId": "prod/myapp/db",
"RotationLambdaARN": "arn:aws:lambda:ap-southeast-1:111122223333:function:SecretsManagerRDSRotation",
"RotationRules": {
"AutomaticallyAfterDays": 30
}
}09Secrets Manager vs Parameter Store
นี่คือหัวข้อที่ออกสอบบ่อยที่สุดในกลุ่มนี้ ต้องเลือกได้ว่าเมื่อไหร่ใช้ตัวไหน โดยดูที่ rotation, cost และ integration
| ปัจจัย | Secrets Manager | Parameter Store (SecureString) |
|---|---|---|
| Automatic rotation | มี (built-in ผ่าน Lambda, native กับ RDS) | ไม่มี built-in (ต้องทำเองด้วย Lambda + EventBridge) |
| ราคา | แพงกว่า (จ่ายต่อ secret/เดือน + API calls) | ถูกกว่า (Standard tier ฟรี) |
| การเข้ารหัส | KMS เสมอ | KMS เฉพาะ SecureString |
| Native RDS/Redshift integration | มี | ไม่มี |
| Cross-account / replication | รองรับ | จำกัดกว่า |
| เหมาะกับ | DB credentials, secrets ที่ต้อง rotate | config ทั่วไป, feature flags, secrets แบบประหยัด |
/aws/reference/secretsmanager/<secret-name>10AWS CloudHSM
CloudHSM ต่างจาก KMS ตรงที่ AWS จัดหา hardware (dedicated HSM device) ให้ แต่ คุณจัดการ encryption key เองทั้งหมด AWS ไม่มีสิทธิ์เข้าถึง key เลย เป็น single-tenant, FIPS 140-2 Level 3 เหมาะกับองค์กรที่ต้องการ control key เต็มที่หรือมีข้อกำหนด compliance เข้มงวด
| ปัจจัย | AWS KMS | CloudHSM |
|---|---|---|
| Tenancy | Multi-tenant (managed service) | Single-tenant dedicated HSM |
| ใครถือ key | AWS managed (คุณไม่เห็น plaintext) | คุณ control เองทั้งหมด (AWS เข้าไม่ถึง) |
| Key types | Symmetric + Asymmetric (RSA/ECC) | Symmetric + Asymmetric + SSL/TLS offload |
| Access | AWS API | PKCS#11, JCE, CNG (industry SDK) |
| เหมาะกับ | งานทั่วไปบน AWS | compliance เข้ม / ควบคุม key เอง / cross-account แชร์ key |
11AWS Certificate Manager (ACM)
ACM ใช้จัดการ TLS/SSL certificate สำหรับ encryption in-flight (HTTPS) ออก public certificate ฟรี และ auto-renew ให้ จุดที่ออกสอบคือ certificate ของ ACM ใช้กับ service ไหนได้บ้าง และ region constraint
- Integrate กับ ELB (ALB/NLB), CloudFront, API Gateway — terminate TLS ที่ระดับ load balancer/edge
- Public certificate ฟรี และ AWS จัดการ renewal อัตโนมัติ (ลดความเสี่ยง cert หมดอายุ)
- รองรับ import certificate จากภายนอกได้ แต่ตัวที่ import เอง ไม่ auto-renew ต้อง renew เอง
- รองรับ ACM Private CA สำหรับออก private certificate ภายในองค์กร
คำถามทบทวน
ทดสอบความเข้าใจหัวข้อ Security & Encryption
23 ข้อ · เลือกคำตอบเพื่อดูเฉลยและคำอธิบาย
1.แอปต้องเข้ารหัสไฟล์ขนาด 500 MB ก่อนเก็บลง S3 โดยใช้ KMS key. วิธีใดถูกต้องที่สุด?
2.ทีมต้องการแชร์ encrypted EBS snapshot ไปยังอีก AWS account ได้สำเร็จ ต้องทำอย่างไร?
3.ต้องการ 'หยุดใช้งาน KMS key ทันที' แต่ยังเก็บไว้กลับมาใช้ได้ภายหลัง ควรทำอย่างไร?
4.Application เรียก KMS Decrypt ถี่มากภายใต้โหลดสูงจนได้ ThrottlingException บ่อย ทางเลือกใดช่วยลดปัญหาได้ดีที่สุดเชิงสถาปัตยกรรม?
5.ต้องการ automatic rotation ของ RDS database credentials ทุก 30 วัน โดยไม่ต้องเขียน rotation logic เอง ควรใช้บริการใด?
6.โจทย์: ต้องเก็บ application config และ secret จำนวนมาก เน้น cost-effective ที่สุด และ 'ไม่ต้องการ' automatic rotation. ควรใช้อะไร?
7.การดึงค่า SecureString จาก Parameter Store แล้วได้ค่าที่ยังเป็น ciphertext เกิดจากสาเหตุใด?
8.ผู้ใช้ภายนอกที่อยู่นอก AWS และไม่สามารถเรียก KMS API ได้ ต้องการเข้ารหัสข้อมูลส่งกลับมาให้คุณถอดรหัส ควรใช้ key แบบใด?
9.องค์กรมีข้อกำหนด compliance ที่ AWS 'ห้ามเข้าถึง encryption key เลย' และต้องการ FIPS 140-2 Level 3 ควรเลือกบริการใด?
10.ต้องการให้ CloudFront ใช้ HTTPS ด้วย custom domain certificate ที่ออกโดย ACM ต้องสร้าง certificate ใน region ใด?
11.ข้อใดอธิบาย Key Policy ของ KMS ได้ถูกต้องที่สุด?
12.ต้องการให้ ciphertext ที่เข้ารหัสใน ap-southeast-1 สามารถ decrypt ได้ใน us-east-1 โดยไม่ต้องเรียก cross-region API สำหรับ Global DynamoDB DR ควรใช้อะไร?
13.ต้องการ delegate สิทธิ์ใช้ KMS key ให้ AWS service ใช้แทนแบบชั่วคราว/programmatic โดยไม่อยากแก้ key policy ทุกครั้ง ควรใช้อะไร?
14.เมื่อ Customer Managed Key ถูกหมุน (automatic rotation) ข้อใดถูกต้อง?
15.Parameter Store Standard tier มีขีดจำกัดขนาดต่อ parameter เท่าใด และ Advanced tier เท่าใด?
16.อยากให้แอปอ้างอิง secret ที่อยู่ใน Secrets Manager ผ่าน Parameter Store API ที่มีอยู่แล้ว ทำได้อย่างไร?
17.schedule deletion ของ KMS key มี waiting period ในช่วงใด?
18.ALB ต้องการ terminate HTTPS ด้วย public certificate ที่ auto-renew และไม่มีค่าใช้จ่ายสำหรับ public cert ควรใช้บริการใด?
19.อยากลดจำนวน KMS API calls ขณะ encrypt ข้อความจำนวนมหาศาล แต่ยอมรับ trade-off ด้าน security เล็กน้อยได้ ควรใช้อะไร?
20.ข้อใดอธิบายความแตกต่างระหว่าง AWS Managed Key กับ Customer Managed Key ได้ถูกต้อง?
21.Encryption SDK GenerateDataKey คืนค่าอะไรกลับมาบ้าง?
22.ทีมต้องการ audit ทุกครั้งที่มีการเรียกใช้ KMS key เพื่อ compliance ควรใช้บริการใด?
23.ต้องการดึง AMI ล่าสุดของ Amazon Linux มาใช้ใน CloudFormation template แบบไม่ hardcode AMI ID ควรใช้อะไร?