KMS and AWS Lambda
ในการฝึกนี้ เราจะเรียนรู้วิธีการใช้ AWS Lambda ร่วมกับ Key Management Service (KMS) เพื่อจัดการข้อมูลลับ เช่น รหัสผ่านฐานข้อมูล ให้ปลอดภัยภายใน Lambda function โดยใช้ KMS สำหรับการเข้ารหัส
การสร้าง Lambda Function และระบุปัญหา
- เริ่มจากสร้าง Lambda function ใหม่ ตั้งชื่อว่า
Lambda KMSและเลือก runtime เป็น Python - โฟกัสที่การเข้ารหัส environment variables ภายใน Lambda โดยใช้ KMS key ที่สร้างไว้ก่อนหน้า
ตัวอย่างปัญหา:
- Lambda ต้องใช้รหัสผ่านฐานข้อมูล
- วิธีง่าย ๆ คือเขียนรหัสผ่านลงใน code เช่น
DB_PASSWORD = 'super_secret' - ปัญหา: ใครก็ตามที่เข้าถึง code จะเห็นรหัสผ่านได้ → ไม่ปลอดภัย
การใช้ Environment Variables สำหรับเก็บ Secrets
- วิธีที่ดีกว่าคือเก็บรหัสผ่านใน environment variable
- ตัวอย่าง Python:
import os
db_password = os.getenv('DB_PASSWORD')
- ตั้งค่า environment variable
DB_PASSWORDใน Lambda configuration เป็นsuper_secret - ข้อดี: รหัสผ่านไม่อยู่ใน code
- ข้อเสีย: ใครเข้าถึง Lambda configuration ก็ยังเห็นรหัสผ่านแบบ plain text
การเข้ารหัส Environment Variables ด้วย KMS
- Lambda มีฟีเจอร์เข้ารหัส environment variables
- สามารถเลือก KMS key เพื่อเข้ารหัสค่าที่เก็บอยู่
- หลังจากกด encrypt → environment variable จะถูกเข้ารหัส
การถอดรหัส Environment Variable ใน Lambda
- ใน Lambda function เราต้องถอดรหัสด้วย AWS SDK
- ตัวอย่าง Python:
import boto3
import os
import base64
def decrypt_env_var():
encrypted = os.environ['DB_PASSWORD']
kms_client = boto3.client('kms')
decrypted = kms_client.decrypt(
CiphertextBlob=base64.b64decode(encrypted),
EncryptionContext={'LambdaFunctionName': os.environ['AWS_LAMBDA_FUNCTION_NAME']}
)['Plaintext'].decode('utf-8')
return decrypted
- สามารถ print ค่าที่เข้ารหัสและถอดรหัสเพื่อยืนยัน
- Deploy และทดสอบ Lambda ด้วย sample events
การจัดการ Timeout และ IAM Permissions
- หาก Lambda timeout (เช่น 3 วินาที) → เพิ่มเป็น 10 วินาที
- หากเจอ access denied → Lambda role ไม่มีสิทธิ์ถอดรหัส KMS
การมอบสิทธิ์ KMS Decrypt ให้ Lambda Role
- ไปที่ Lambda configuration → Permissions → แก้ไข execution role
- เพิ่ม inline policy สำหรับ kms:Decrypt ของ KMS key ที่กำหนด
ตัวอย่าง JSON Policy:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "kms:Decrypt",
"Resource": "<KMS_KEY_ARN>"
}
]
}
- หลังจากแนบ policy → ทดสอบ Lambda อีกครั้ง → ถอดรหัส environment variable ได้สำเร็จ
การตรวจสอบผลลัพธ์
- ตรวจสอบ Lambda logs
- จะเห็น environment variable ที่เข้ารหัสและค่าที่ถอดรหัส (
super_secret) - วิธีนี้ทำให้ code และ configuration ปลอดภัย และถอดรหัสได้เฉพาะผู้ที่มีสิทธิ์เข้าถึง KMS key
สรุป
- การเก็บรหัสผ่านหรือข้อมูลลับตรง ๆ ใน Lambda code หรือ environment variables ไม่ปลอดภัย
- Lambda สามารถ เข้ารหัส environment variables ด้วย KMS key
- การถอดรหัสใน Lambda ต้องมี IAM permission สำหรับ KMS key
- การรวม Lambda กับ KMS ทำให้ข้อมูลลับถูกปกป้องทั้งใน code และ configuration
Key Takeaways
- เก็บข้อมูลลับใน code หรือ environment variables แบบ plain text ไม่ปลอดภัย
- Lambda รองรับการเข้ารหัส environment variables ด้วย KMS
- การถอดรหัสต้องมี IAM permission สำหรับ KMS key
- การรวม Lambda กับ KMS ช่วยปกป้อง secrets ทั้งใน code และ configuration