Docker Secrets คืออะไร?
Docker Secrets เป็นระบบจัดการข้อมูลลับ (secrets) ที่มาคู่มากับ Docker Swarm สำหรับจัดการข้อมูลที่ไวต่อความปลอดภัย เช่น รหัสผ่าน, API keys, คีย์เชื่อมต่อฐานข้อมูล ฯลฯ
ความรู้พื้นฐาน
Docker Secrets ถูกออกแบบมาเพื่อใช้กับ Docker Swarm (orchestration platform) ของ Docker โดย secrets จะถูกเข้ารหัสในการส่งผ่าน ( TLS) และจัดเก็บใน Docker Swarm's Raft log ที่ถูกเข้ารหัส
สิ่งสำคัญคือ secrets จะถูก mount เป็นไฟล์ใน filesystem ของ container (ไม่ใช่ environment variables) ที่ใช้ tmpfs (memory-based filesystem) ซึ่งหมายความว่า secrets จะไม่ถูกจัดเก็บใน disk และจะถูกลบออกเมื่อ container หยุดทำงาน
ทำไมต้องใช้ Docker Secrets? (และทำไมenvironmentตัวแปรไม่ปลอดภัย)
ปัญหาของ Environment Variables
-
ไม่ปลอดภัย: Environment variables สามารถมองเห็นได้จาก
docker inspectหรือdocker ps - ไม่สามารถ rotate ได้ง่าย: ต้อง rebuild/restart container ทั้งหมด
- บันทึกใน image: ค่า environment variables อาจถูกบันทึกใน layer ของ image
- ไม่มี encryption: ไม่มีการเข้ารหัสข้อมูล secrets
- Log potential: ในบางระบบ secrets อาจถูกลlogไว้โดยไม่ตั้งใจ
ประโยชน์ของ Docker Secrets
-
ปลอดภัย: ไม่สามารถดูจาก
docker inspect - เข้ารหัส: ข้อมูล secrets ถูกเข้ารหัสในการส่งผ่านและจัดเก็บ
- tmpfs mount: secrets อยู่ใน memory ไม่เข้า disk
- Controlled access: ใช้ RBAC ควบคุมการเข้าถึง secrets
- Auto-mount: Docker จัดการ mount ให้เองใน /run/secrets/
ตัวอย่างเปรียบเทียบ
Docker Secrets vs Environment Variables
| คุณสมบัติ | Environment Variables | Docker Secrets |
|---|---|---|
| วิธีการส่งผ่าน | -e KEY=value หรือ environment: ใน docker-compose.yml |
--secret หรือ secrets: ใน docker-compose.yml |
| ที่เก็บข้อมูล | Container environment (visible in docker inspect) | tmpfs (memory-based, /run/secrets/) |
| Encryption | ไม่มี encryption | เข้ารหัสใน transit และ at rest |
| Rotation | ยาก (ต้อง rebuild/restart) | ง่ายกว่า (update service) |
| Security | กลางๆ / ไม่ปลอดภัย | สูง (ตัวเลือกที่ปลอดภัยที่สุดสำหรับ Docker Swarm) |
| เหมาะสำหรับใช้ | Configuration settings (ไม่ใช่ secrets), development | Passwords, API keys, certificates, production |
สรุป
สำหรับข้อมูลที่ไวต่อความปลอดภัย (passwords, API keys, certificates) ควรใช้ Docker Secrets เสมอ สำหรับ configuration settings ที่ไม่ใช่ secrets (เช่น DEBUG_MODE, APP_NAME) สามารถใช้ environment variables ได้
Docker Secrets vs External Secrets Management Tools
ตารางเปรียบเทียบเครื่องมือ
| เครื่องมือ | Integration กับ Docker | Scalability | Advanced Features | เหมาะสำหรับ |
|---|---|---|---|---|
| Docker Secrets | Built-in, ง่ายมาก | Medium | Basic (rotation, audit limited) | Swarm clusters, simple apps |
| HashiCorp Vault | ต้องตั้งค่าเอง | สูง (cluster capable) | Full (audit, PKI, dynamic creds) | Enterprise, complex apps |
| AWS Secrets Manager | ผ่าน IAM roles | สูง (AWS-native) | อัตโนมัติ rotation, cross-region | AWS users, cloud-native |
| Azure Key Vault | ผ่าน Managed Identity | สูง (Azure-native) | Hardware security (HSM) | Azure users, enterprise |
| GCP Secret Manager | ผ่าน SERVICE_ACCOUNT | สูง (GCP-native) | Automatic encryption, audit logs | GCP users, cloud-native |
เริ่มต้นเร็ว (Start Fast)
ถ้าใช้ Docker Swarm และต้องการเริ่มต้นเร็ว Docker Secrets คือตัวเลือกที่ดีที่สุด
Enterprise (SCALE)
ถ้าต้องการ advanced features, audit, rotation HashiCorp Vault เป็นตัวเลือกที่ดีที่สุด
Cloud Native
ถ้าใช้ AWS/Azure/GCP ควรเลือก Secrets Manager ของ cloud provider นั้นๆ
วิธีใช้งาน Docker Secrets
5.1 การสร้าง Secrets
Docker Secrets จะถูกสร้างจากไฟล์หรือ string แล้วจึงนำไปใช้กับ services
วิธีที่ 1: จากไฟล์
วิธีที่ 2: จาก STDIN (pipe)
วิธีที่ 3: จาก Environment Variable
วิธีที่ 4: ลบ secrets
5.2 ใช้ Secrets กับ Docker Swarm Service
หลังจากสร้าง secrets แล้ว สามารถนำไปใช้กับ Docker Swarm service ได้
สร้าง service พร้อม secrets
สร้าง service พร้อม secrets หลายตัว
ใช้ secrets ที่มีอยู่กับ service ที่มีอยู่
5.3 ใช้ Secrets กับ Docker Compose
Short Syntax (ง่าย)
Secrets จะถูก mount ที่ /run/secrets/[secret_name]
Long Syntax (ควบคุมได้มากกว่า)
สามารถกำหนด uid, gid, mode ได้
5.4 อ่าน Secrets ในแอปพลิเคชัน
Secrets จะถูก mount ที่ /run/secrets/[secret_name] ใน container
Shell Script
Node.js
Python
5.5 Build Secrets (Docker BuildKit)
Docker BuildKit ช่วยให้สามารถใช้ secrets ระหว่างการ build image โดย secrets จะไม่ถูกบันทึกใน image layers
Using --mount=type=secret (BuildKit)
Build ด้วย --secret
SSH Agent Forwarding
ตัวอย่างการใช้งานจริง
Database Credentials สำหรับ Docker Compose
ตัวอย่างการจัดการ database credentials แบบปลอดภัยด้วย Docker Compose
หมายเหตุ
PostgreSQL รองรับ POSTGRES_PASSWORD_FILE ซึ่งจะอ่านค่าจากไฟล์แทน environment variable ทำให้สามารถใช้ secrets ได้ตามปกติ
API Keys (Stripe, Twilio)
TLS Certificates
ใช้ secrets ในการจัดการ certificates สำหรับ HTTPS
Docker Swarm Stack (Multi-service)
Security Best Practices
1. ใช้ Least Privilege Principle
ไม่ควรให้ container เข้าถึง secrets ที่ไม่จำเป็น ตัวอย่างเช่น ถ้า service A ต้องการใช้ database password แต่ไม่ต้องการใช้ API key ก็ไม่ควรให้ service A เข้าถึง API key
2. ตั้งค่า file permissions (uid, gid, mode)
ใช้ long syntax เพื่อกำหนด file permissions ของ secrets ที่ถูก mount ให้ strictly
หมายเหตุ: ค่า mode: 0400 หมายถึงอ่านได้อย่างเดียวสำหรับ owner เท่านั้น ไม่ควรใช้ 0777 เด็ดขาด!
3. ไม่ควร log secrets
หลีกเลี่ยงการ log secrets โดยตรง ควรใช้ placeholder หรือ mask แทน
❌ ไม่ดี
✅ ดี
4. Secret Rotation (สรุป workaround)
Docker Secrets ไม่มี feature สำหรับ rotation โดยตรง แต่สามารถทำได้ด้วยการ update service ดังนี้:
5. Network Isolation
ใช้ Docker networks เพื่อแยก service ที่ใช้ secrets ออกจาก service อื่นๆ
6. Use Minimal Base Images
ใช้ base images ที่มีขนาดเล็กและปลอดภัย เช่น Alpine Linux จะมี attack surface น้อยกว่า full images
❌ ไม่ดี
✅ ดี
การแก้ไขปัญหาที่พบบ่อย
1. Permission denied when reading secret
ปัญหา: แอปพลิเคชันอ่าน secrets ไม่ได้ด้วยข้อผิดพลาด Permission denied
สาเหตุ:
- File permissions ของ secrets ถูกตั้งไว้แคบเกินไป
- User ที่รันแอปพลิเคชันไม่มีสิทธิ์อ่าน file
วิธีแก้:
แก้ไขด้วยการตั้งค่า mode ให้กว้างขึ้น:
2. Secret not found / Invalid secret
ปัญหา: Service ไม่สามารถสร้างได้ด้วยข้อผิดพลาด secret not found
สาเหตุ:
- Secret ยังไม่ถูกสร้างก่อนใช้งาน
- ชื่อ secret ใน docker-compose.yml ไม่ตรงกับ secret ที่สร้างไว้
- ใช้ secrets ที่สร้างใน Swarm กับ Compose หรือกลับกัน
วิธีแก้:
ตรวจสอบว่า secret ถูกสร้างแล้ว:
3. Cannot update service - secret already in use
ปัญหา: ไม่สามารถลบ secret ที่กำลังใช้อยู่
สาเหตุ:
- Secret ยังถูกใช้อยู่กับ service ใด service หนึ่ง
วิธีแก้:
ต้องลบ secret ออกจากทุก service ก่อน:
4. Secret empty or missing content
ปัญหา: อ่าน secret ได้แต่ content เป็นค่าว่าง
สาเหตุ:
- ไฟล์ source มี newline หรือ carriage return ที่ไม่ต้องการ
- ใช้คำสั่ง echo โดยไม่มีข้อมูลจริง
- File path ไม่ถูกต้อง
วิธีแก้:
ตรวจสอบเนื้อหาไฟล์ก่อนสร้าง secret:
Debugging Commands
สรุป
คำนึงถึงความปลอดภัย
secrets เป็นข้อมูลที่สำคัญและไวต่อความปลอดภัย - ใช้ Docker Secrets หรือ external tools อย่างเหมาะสม
เลือกเครื่องมือที่ถูกต้อง
Docker Secrets สำหรับ Docker Swarm, HashiCorp Vault สำหรับ Enterprise, Cloud services สำหรับ cloud-native
Best Practices
Least privilege, file permissions, no logging, network isolation, และ usage ที่เหมาะสม
สิ่งที่ควรเรียนรู้เพิ่มเติม
Next Steps - ขั้นตอนถัดไป
เรียนรู้เพิ่มเติม: Docker Basics
ถ้ายังไม่แน่ใจเกี่ยวกับ Docker fundamentals ให้กลับไปอ่าน Docker Basics ก่อน
ลึกขึ้น: External Secrets
หากต้องการ advanced features แนะนำให้เรียนรู้ HashiCorp Vault และ cloud services
ลงมือทำ: สร้าง Project จริง
ลองนำความรู้ที่ได้ไปสร้าง project จริงที่ต้องใช้ secrets management
พิมพ์: สร้าง Guide ของคุณ
พิมพ์หน้านี้และเก็บไว้เป็น reference guide สำหรับการใช้งาน Docker Secrets
คำถามที่พบบ่อย (FAQ)
Q1 Docker Secrets ใช้ได้เฉพาะกับ Docker Swarm เท่านั้นหรือไม่?
A: Docker Secrets ถูกออกแบบมาให้ works กับ Docker Swarm เป็นหลัก โดย secrets จะถูกเก็บไว้ใน Swarm's raft log ที่เข้ารหัสแล้ว อย่างไรก็ตาม สำหรับ Docker Compose (standalone) ก็สามารถใช้ secrets ได้แต่จะมีข้อจำกัดกว่า
Q2 Secrets ถูกลบเมื่อ container หยุดทำงานหรือไม่?
A: ใช่! Docker secrets จะถูก mount ใช้ tmpfs (memory-based filesystem) ดังนั้นเมื่อ container หยุดหรือถูกลบ secrets จะถูกลบออกจาก memory ตามด้วย
Q3 สามารถใช้ secrets กับ Docker Compose บน Docker Desktop ได้หรือไม่?
A: ได้! Docker Compose รองรับ secrets syntax ตั้งแต่ version 3 ขึ้นไป แต่ secrets จะถูก mount บน host machine (ไม่ใช่ swarm mode) ซึ่งอาจมีข้อจำกัดด้านความปลอดภัยบางอย่าง
Q4 ถ้าต้องการ rotate secret ต้องทำอย่างไร?
A: Docker Secrets ไม่มี auto-rotation แต่สามารถทำได้โดย: (1) สร้าง secret ใหม่, (2) update service ให้ใช้ secret ใหม่, (3) wait for rolling update, (4) ลบ secret เก่าออก
Q5 แล้ว environment variables ปลอดภัยแค่ไหน?
A: environment variables ไม่ปลอดภัย สำหรับ secrets เพราะ: (1) ดูได้จาก docker inspect, (2) อาจถูกบันทึกใน image layers, (3) ไม่มี encryption, (4) ไม่มี audit trail. ควรใช้ secrets เท่านั้นสำหรับข้อมูลไวต่อความปลอดภัย