Bảo mật tệp tin cấu hình nhạy cảm tránh bị lộ lọt
Để bảo mật tệp cấu hình nhạy cảm, hãy tách bí mật (mật khẩu, khóa API, khóa ký) khỏi mã nguồn, không bao giờ đưa chúng vào kho Git, đặt tệp cấu hình ngoài thư mục web công khai, phân quyền đọc tối thiểu, và ưu tiên dùng dịch vụ quản lý bí mật cho môi trường sản xuất. Khi một bí mật đã lộ, xóa tệp thôi là không đủ; bạn phải thu hồi và cấp lại bí mật đó.
Tệp cấu hình nhạy cảm gồm những gì
- Tệp biến môi trường như .env, .env.production.
- Tệp cấu hình ứng dụng: config.php, settings.py, appsettings.json, application.yml.
- Tệp chứa khóa riêng: khóa SSH, khóa TLS, tệp tài khoản dịch vụ đám mây dạng JSON.
- Tệp thông tin đăng nhập công cụ: cấu hình CLI đám mây, .npmrc, .pypirc, .git-credentials.
- Tệp sao lưu và bản tạm: config.php.bak, config.old, tệp swap của trình soạn thảo, bản dump cơ sở dữ liệu.
Nhóm cuối cùng hay bị quên nhất: lập trình viên sửa cấu hình trực tiếp trên máy chủ, trình soạn thảo để lại bản sao với đuôi khác, và máy chủ web phục vụ nó như tệp văn bản thường.
Các con đường lộ lọt phổ biến
| Con đường | Ví dụ |
|---|---|
| Kho mã công khai | Commit nhầm .env lên GitHub; công cụ tự động quét kho công khai tìm khóa chỉ trong thời gian rất ngắn |
| Lịch sử Git | Đã xóa tệp ở commit sau nhưng nội dung vẫn còn trong lịch sử |
| Thư mục .git trên máy chủ web | Triển khai bằng cách clone vào thư mục web, ai cũng tải được toàn bộ mã nguồn |
| Cấu hình web server | Tệp .env, .bak nằm trong thư mục gốc web và được phục vụ trực tiếp |
| Trang lỗi chi tiết | Chế độ debug bật ở sản xuất, in cả biến môi trường khi có lỗi |
| Ảnh container | Bí mật được sao chép vào image và đẩy lên registry công khai |
| Log và công cụ CI | Script in biến môi trường ra log build công khai |
Nguyên tắc 1: Bí mật không thuộc về mã nguồn
Mã nguồn được chia sẻ, sao chép, lưu trữ ở nhiều nơi; bí mật thì không nên. Ứng dụng nên đọc cấu hình nhạy cảm từ biến môi trường hoặc dịch vụ quản lý bí mật lúc chạy. Kho mã chỉ chứa tệp mẫu như .env.example với giá trị giả để người mới biết cần khai báo gì.
- Thêm .env, tệp khóa, thư mục cấu hình cục bộ vào .gitignore ngay từ commit đầu tiên.
- Dùng công cụ quét bí mật ở pre-commit hook để chặn commit chứa chuỗi giống khóa.
- Bật tính năng quét bí mật của nền tảng lưu trữ mã nếu có.
Nguyên tắc 2: Tệp cấu hình nằm ngoài vùng web
Cấu trúc thư mục nên tách rõ: thư mục public chỉ chứa tệp cần phục vụ (index, CSS, JS, ảnh), còn mã nguồn và cấu hình nằm một cấp phía trên. Bổ sung quy tắc ở web server để từ chối mọi yêu cầu tới tệp bắt đầu bằng dấu chấm (.env, .git, .htpasswd) và các đuôi sao lưu (.bak, .old, .swp, .sql).
Không triển khai bằng cách git clone trực tiếp vào thư mục web. Nếu bắt buộc, chặn truy cập thư mục .git ở cấu hình máy chủ.
Nguyên tắc 3: Phân quyền tối thiểu
- Tệp cấu hình chỉ cho phép tài khoản chạy ứng dụng đọc, không cho người dùng khác trên máy.
- Tài khoản cơ sở dữ liệu trong cấu hình chỉ có quyền cần thiết, không dùng tài khoản quản trị.
- Khóa API đám mây giới hạn đúng dịch vụ, đúng tài nguyên mà ứng dụng cần.
- Tách bí mật theo môi trường: lộ khóa môi trường thử nghiệm không ảnh hưởng sản xuất.
Nguyên tắc 4: Dùng công cụ quản lý bí mật
Với hệ thống có nhiều dịch vụ, nhiều máy chủ, quản lý bí mật bằng tệp trở nên khó kiểm soát. Các dịch vụ quản lý bí mật của nhà cung cấp đám mây hoặc giải pháp mã nguồn mở cho phép lưu bí mật mã hóa, phân quyền truy cập theo dịch vụ, ghi nhật ký ai đọc gì, và hỗ trợ luân chuyển tự động. Trong Kubernetes, nên mã hóa Secret khi lưu trữ và giới hạn quyền đọc chúng.
Nguyên tắc 5: Tắt chế độ gỡ lỗi ở sản xuất
Trang lỗi chi tiết của framework có thể hiển thị biến môi trường, đường dẫn, truy vấn SQL. Bảo đảm chế độ debug tắt ở môi trường sản xuất và lỗi chỉ hiển thị thông báo chung cho người dùng.
Khi bí mật đã bị lộ
- Thu hồi ngay: vô hiệu hóa khóa, đổi mật khẩu, tạo khóa mới. Đây là bước quan trọng nhất và phải làm trước.
- Kiểm tra lạm dụng: xem nhật ký của dịch vụ liên quan để biết khóa đã bị dùng chưa, dùng làm gì. Tài khoản đám mây bị lộ khóa thường bị dùng để chạy máy đào tiền mã hóa, xem thêm bài phát hiện đào coin trộm.
- Dọn lịch sử: dùng công cụ viết lại lịch sử Git để xóa bí mật, nhưng nhớ rằng bản sao, fork, bộ nhớ đệm có thể vẫn còn, nên bước thu hồi mới là quyết định.
- Tìm nguyên nhân: sửa quy trình để không lặp lại, ví dụ thêm hook quét bí mật.
Cơ sở dữ liệu là đích đến phổ biến khi chuỗi kết nối bị lộ. Mã hóa dữ liệu ở cấp cơ sở dữ liệu giúp giảm thiệt hại trong tình huống này, như phân tích trong bài nguyên tắc mã hóa cơ sở dữ liệu.
Đưa vào quy trình rà soát
Kiểm tra tệp cấu hình nên là một mục cố định trong danh sách rà soát trước khi phát hành: thử truy cập /.env, /.git/config, /config.php.bak trên môi trường thật; xem tệp nào được đóng gói vào image; kiểm tra log CI có in bí mật không. Danh sách đầy đủ hơn có trong bài các bước rà soát lỗ hổng bảo mật ứng dụng. Đây cũng là một trong các nguyên tắc nền tảng của lập trình an toàn.
Câu hỏi thường gặp
Đã xóa tệp .env khỏi kho Git thì có an toàn chưa?
Chưa. Nội dung vẫn nằm trong lịch sử commit và có thể đã bị sao chép. Bạn phải thu hồi và tạo lại mọi bí mật trong tệp đó, sau đó mới dọn lịch sử.
Mã hóa tệp .env có cần thiết không?
Có thể hữu ích khi phải lưu tệp cấu hình trong kho mã, nhưng khi đó khóa giải mã lại trở thành bí mật cần bảo vệ. Với hệ thống sản xuất, dịch vụ quản lý bí mật thường là cách gọn hơn.
Biến môi trường có an toàn tuyệt đối không?
Không. Biến môi trường có thể lộ qua trang lỗi, log, công cụ giám sát hoặc tiến trình con. Chúng tốt hơn mã cứng trong mã nguồn nhưng vẫn cần kết hợp tắt debug và kiểm soát log.
Làm sao biết website của mình có đang lộ tệp cấu hình?
Thử truy cập trực tiếp các đường dẫn như /.env, /.git/HEAD hay tệp sao lưu phổ biến trên chính website của bạn. Nếu nhận được nội dung thay vì lỗi 403 hoặc 404, cần chặn ngay và thu hồi bí mật.
Bài liên quan

Bảo mật API trong môi trường phát triển ứng dụng Web
Các nguyên tắc bảo mật API cho lập trình viên web: xác thực, phân quyền theo đối tượng, kiểm tra đầu vào, giới hạn tần suất, quản lý khóa, nhật ký và kiểm thử.

Các bước cơ bản để rà soát lỗ hổng bảo mật ứng dụng
Quy trình rà soát lỗ hổng ứng dụng web: xác định phạm vi, lập danh mục tài sản, quét tự động, rà soát mã, kiểm thử thủ công và theo dõi khắc phục.

Các chương trình tìm lỗi nhận thưởng Bug Bounty và lưu ý
Bug Bounty hoạt động thế nào, các dạng chương trình, quy tắc phạm vi và safe harbor, cách viết báo cáo tốt và lưu ý pháp lý cho người mới.

Lập trình an toàn và các nguyên tắc bảo mật phần mềm
Nguyên tắc lập trình an toàn cốt lõi: không tin đầu vào, quyền tối thiểu, phòng thủ nhiều lớp, mặc định an toàn, xử lý lỗi và quản lý bí mật.