Bài 11. Password không nên nằm trong Git - Secret sinh ra để làm gì?
"Chỉ là môi trường test thôi, cứ commit luôn password lên Git."
Đây là một trong những câu nói khiến không ít dự án phải trả giá.
Một tình huống rất quen thuộc
Bạn có một ứng dụng cần kết nối đến MySQL.
DB_HOST=mysql
DB_USER=root
DB_PASSWORD=123456
Lúc đầu, bạn viết trực tiếp vào file cấu hình và commit lên Git.
Mọi thứ đều hoạt động.
Cho đến một ngày...
- Có thêm lập trình viên mới vào dự án.
- Repository được chia sẻ cho nhiều người.
- Hoặc tệ hơn, repository vô tình chuyển sang chế độ Public.
Lúc này, password của database đã xuất hiện trước mắt tất cả mọi người.
Vấn đề không còn là ứng dụng có chạy hay không, mà là dữ liệu của bạn có còn an toàn hay không.
Vậy ConfigMap có dùng được không?
Ở bài trước, chúng ta đã biết đến ConfigMap để lưu các cấu hình như:
- Tên ứng dụng
- Port
- URL API
- Feature Flag
Ví dụ:
APP_NAME=my-app
SERVER_PORT=8080
Những thông tin này không nhạy cảm nên hoàn toàn phù hợp với ConfigMap.
Nhưng password, API Key hay Token thì khác.
Đó là lúc Secret xuất hiện.
1. Secret là gì?
Secret là nơi Kubernetes dùng để lưu trữ các thông tin nhạy cảm, chẳng hạn:
- Password Database
- API Key
- Access Token
- SSH Key
- TLS Certificate
Thay vì ghi trực tiếp password vào Pod, chúng ta lưu nó trong Secret rồi để Pod sử dụng khi cần.
Secret
┌──────────────┐
│ DB_PASSWORD │
│ API_KEY │
│ TOKEN │
└──────┬───────┘
│
▼
Pod / Container
Nhờ đó, file cấu hình của ứng dụng không còn chứa những thông tin quan trọng.
2. Secret có "bí mật" thật không?
Đây là điểm mà nhiều người mới thường hiểu nhầm.
Trong Kubernetes, dữ liệu trong Secret được mã hóa Base64, ví dụ:
123456
↓
MTIzNDU2
Base64 không phải là mã hóa bảo mật.
Bất kỳ ai có quyền đọc Secret đều có thể giải mã rất dễ dàng.
Vì vậy, Secret không làm password trở nên bất khả xâm phạm. Nó chỉ giúp:
- Không hard-code password trong ứng dụng.
- Quản lý thông tin nhạy cảm tập trung.
- Dễ dàng thay đổi mà không cần build lại image.
Để bảo vệ Secret tốt hơn trong môi trường Production, Kubernetes thường kết hợp với các hệ thống như HashiCorp Vault, AWS Secrets Manager hoặc Azure Key Vault.
3. Khi nào nên dùng Secret?
Hãy dùng Secret khi dữ liệu thuộc một trong các nhóm sau:
- Password
- API Key
- Access Token
- SSH Key
- TLS Certificate
- OAuth Client Secret
Một mẹo đơn giản là:
Nếu bạn không muốn đăng thông tin đó lên Facebook hoặc GitHub, hãy lưu nó trong Secret.
Tổng kết
ConfigMap và Secret đều dùng để tách cấu hình ra khỏi ứng dụng, nhưng mục đích hoàn toàn khác nhau:
- ConfigMap lưu cấu hình thông thường.
- Secret lưu thông tin nhạy cảm.
Đừng commit password vào Git chỉ vì "cho tiện". Một thói quen nhỏ hôm nay có thể giúp bạn tránh được những sự cố bảo mật lớn sau này.
Bài tiếp theo
Đến đây, ứng dụng của chúng ta đã có cấu hình và password riêng.
Nhưng vẫn còn một vấn đề:
Nếu Pod bị xóa thì dữ liệu trong database sẽ đi đâu?
Trong bài tiếp theo, chúng ta sẽ tìm hiểu Volume và lý do vì sao dữ liệu có thể "biến mất" sau mỗi lần Pod khởi động lại.
All rights reserved