Khoá API, mật khẩu cơ sở dữ liệu và mọi chuỗi bí mật phải nằm ngoài mã nguồn: ứng dụng đọc chúng từ biến môi trường, khi phát triển thì nạp từ tệp .env không bao giờ được đưa vào git, còn trên máy chủ thì lấy từ cấu hình máy chủ hoặc kho bí mật. Khi làm cùng trợ lý AI, cần thêm một lớp: không để khoá thật xuất hiện trong khung chat, trong tệp mà tác tử AI được đọc, hay trong mã AI viết ra.
Bài này hướng dẫn cách bố trí tệp cho một dự án mới hoặc đang chạy, cách viết tệp mẫu để người mới và AI biết cần những biến gì mà không thấy giá trị thật, cách cấu hình để trợ lý không đọc tệp bí mật, và những lỗi hay gặp khi AI tự “giúp” bằng cách viết khoá thẳng vào mã.
Vì sao khoá trong mã nguồn là lỗi nặng hơn bạn nghĩ
Một khoá nằm trong tệp mã sẽ đi theo tệp đó tới mọi nơi: mọi máy đã kéo kho mã, mọi bản sao lưu, lịch sử git vĩnh viễn, ảnh chụp màn hình gửi trong nhóm chat, và cả những lần bạn dán tệp đó vào chatbot để hỏi. Khi kho mã chuyển sang công khai, có người mới rời công ty, hay một máy tính bị mất, khoá đó coi như đã lộ. Các công cụ quét tự động trên kho mã công khai tìm khoá rất nhanh sau khi chúng xuất hiện.
Hậu quả tuỳ loại khoá. Khoá dịch vụ AI hay dịch vụ đám mây bị lộ có thể bị dùng để chạy việc của người khác trên tài khoản của bạn, hoá đơn đến cuối tháng. Khoá cơ sở dữ liệu hay khoá cổng thanh toán lộ ra còn nặng hơn, vì chạm tới dữ liệu khách hàng và tiền.
Trợ lý AI làm tăng nguy cơ theo hai cách. Một, khi gặp lỗi kết nối, AI hay đề xuất cách nhanh nhất là gán khoá vào một biến ngay trong tệp để “thử cho chạy”, và bản thử đó dễ bị đẩy lên kho chung. Hai, tác tử AI có quyền đọc thư mục dự án sẽ đọc luôn tệp .env nếu không bị chặn, và nội dung đó đi vào ngữ cảnh gửi lên máy chủ của nhà cung cấp.
Bố trí tệp cho một dự án
Bảng dưới là cách bố trí phổ biến, áp dụng được cho Python, Node, PHP. Tên tệp có thể khác theo khuôn khổ, nguyên tắc giữ nguyên.
| Tệp | Chứa gì | Đưa vào git? |
|---|---|---|
| .env | Giá trị thật cho máy của bạn: khoá thử nghiệm, mật khẩu cơ sở dữ liệu cục bộ | Không bao giờ |
| .env.example | Đủ tên biến cần có, giá trị để trống hoặc là chuỗi giả như thay-bang-khoa-cua-ban, kèm chú thích từng biến dùng làm gì | Có, đây là tài liệu |
| .gitignore | Dòng loại trừ .env và mọi biến thể như .env.local, .env.production, trừ tệp mẫu | Có |
| Tệp cấu hình của ứng dụng | Mã đọc biến môi trường, đặt giá trị mặc định an toàn cho biến không bí mật, báo lỗi rõ ràng khi thiếu biến bí mật | Có, vì không chứa giá trị thật |
| Cấu hình trên máy chủ | Biến môi trường do hệ thống quản lý dịch vụ, nền tảng triển khai hoặc kho bí mật cung cấp | Không, nằm ngoài kho mã |
Một chi tiết hay bị bỏ: ứng dụng nên dừng ngay khi thiếu biến bí mật, với thông báo nêu tên biến bị thiếu, thay vì chạy tiếp với giá trị rỗng. AI hay viết kiểu đọc biến với giá trị mặc định là một khoá mẫu, khiến ứng dụng chạy âm thầm với khoá sai hoặc, tệ hơn, với một khoá thật bị ai đó dán vào làm mặc định.
Quy tắc loại trừ trong .gitignore chỉ có tác dụng với tệp chưa từng được theo dõi. Nếu .env đã lỡ được thêm vào git trước đó, phải gỡ khỏi chỉ mục bằng lệnh git rm --cached .env rồi mới có tác dụng, và khoá trong lịch sử vẫn phải coi là đã lộ.
Chặn trợ lý AI đọc và chép khoá thật
Các công cụ khác nhau có cách cấu hình khác nhau, và menu thay đổi theo phiên bản; kiểm tài liệu chính thức của công cụ bạn đang dùng. Nguyên tắc chung như sau.
- Tìm trong cài đặt của tiện ích hoặc tác tử mục loại trừ tệp khỏi ngữ cảnh. Nhiều công cụ có tệp cấu hình loại trừ riêng theo cú pháp giống .gitignore, hoặc có danh sách tệp cấm đọc trong phần quyền. Thêm .env, thư mục chứa chứng chỉ, tệp khoá riêng.
- Kiểm lại bằng cách hỏi trợ lý liệt kê những tệp nó thấy trong thư mục gốc. Nếu .env vẫn hiện trong danh sách đọc được, cấu hình chưa ăn.
- Trong tệp hướng dẫn dự án cho AI, ghi rõ: không đọc, không in, không sao chép nội dung tệp .env; khi cần biết biến nào tồn tại thì đọc .env.example.
- Với tác tử chạy lệnh, không cho phép các lệnh in toàn bộ biến môi trường của tiến trình nếu phiên đó có biến bí mật. Nhiều công cụ cho bạn duyệt từng lệnh trước khi chạy; dùng chế độ đó cho dự án có khoá quan trọng.
- Khi dán đoạn mã hay nhật ký vào khung chat, soát một lượt tìm chuỗi dài bất thường, đoạn bắt đầu bằng tiền tố hay gặp của khoá, chuỗi kết nối cơ sở dữ liệu có mật khẩu. Thay bằng giá trị giả trước khi gửi.
- Dùng khoá riêng cho môi trường phát triển, quyền hẹp và hạn mức thấp. Nếu khoá đó có lỡ lọt vào ngữ cảnh AI, thiệt hại cũng nhỏ.
Không có cấu hình nào tuyệt đối. Tác tử có quyền chạy lệnh trên máy vẫn có thể đọc tệp qua lệnh hệ thống dù tệp bị loại khỏi danh sách đọc trực tiếp. Lớp chặn cuối cùng vẫn là khoá phát triển có quyền hẹp và bạn duyệt lệnh trước khi chạy.
Lỗi hay gặp khi AI “giúp” xử lý khoá
Viết khoá vào mã để thử nhanh. Bạn báo lỗi xác thực, AI đề nghị gán khoá trực tiếp để loại trừ nguyên nhân. Nếu làm thì làm trong tệp nháp ngoài kho mã, và xoá ngay sau khi thử. Tốt hơn, trả lời AI rằng biến môi trường đã có, yêu cầu nó viết đoạn in ra độ dài và vài ký tự đầu của giá trị đọc được để kiểm, không in toàn bộ.
In biến môi trường ra nhật ký để gỡ lỗi. Dòng ghi nhật ký kiểu in cả đối tượng cấu hình sẽ in luôn khoá. Nhật ký thường được giữ lâu, gửi sang dịch vụ theo dõi bên thứ ba, và được dán vào chatbot khi gỡ lỗi. Yêu cầu che giá trị bí mật khi in cấu hình.
Đưa khoá vào mã chạy phía trình duyệt. Mọi thứ nằm trong mã JavaScript gửi xuống trình duyệt đều đọc được bởi người dùng. Một số công cụ dựng giao diện có quy ước tiền tố cho biến môi trường được đưa xuống trình duyệt; AI đôi khi đặt khoá bí mật vào biến có tiền tố đó cho tiện. Khoá dịch vụ phải ở phía máy chủ, trình duyệt gọi qua máy chủ của bạn.
Chép khoá thật vào tệp mẫu. Khi nhờ AI tạo .env.example từ .env, nó có thể chép nguyên giá trị. Tự tạo tệp mẫu, hoặc chỉ đưa cho AI danh sách tên biến.
Đặt khoá trong tệp cấu hình của công cụ dựng hay tệp ảnh chứa. Khoá ghi trong tệp dựng ảnh chứa sẽ nằm lại trong các lớp của ảnh dù bạn xoá ở bước sau. Truyền bí mật lúc chạy, hoặc dùng cơ chế bí mật chuyên dùng khi dựng mà công cụ hỗ trợ.
Từ tệp .env lên kho bí mật: khi nào cần nâng cấp
Với một người làm dự án nhỏ, tệp .env trên máy và biến môi trường cấu hình tay trên máy chủ là đủ. Khi nhóm có nhiều người, nhiều môi trường, nhiều dịch vụ, việc gửi khoá qua tin nhắn để đồng nghiệp điền vào .env bắt đầu trở thành rủi ro: tin nhắn nằm lại mãi, không biết ai đang giữ khoá nào, đổi khoá thì phải nhắn từng người.
Lúc đó nên chuyển sang kho bí mật: dịch vụ quản lý bí mật của nhà cung cấp đám mây, tính năng bí mật của nền tảng triển khai hay của hệ thống tích hợp liên tục, hoặc phần mềm quản lý bí mật tự vận hành. Điểm chung của chúng là phân quyền ai đọc được bí mật nào, ghi nhật ký truy cập, và đổi khoá ở một nơi.
Dù ở mức nào, nên có thói quen xoay vòng khoá định kỳ và ngay khi có người rời nhóm. Một bảng nhỏ ghi tên khoá, dịch vụ, ai tạo, ngày tạo, nơi lưu, quyền gì, giúp việc xoay khoá mất vài phút thay vì vài ngày dò tìm. Bảng này ghi thông tin về khoá, tuyệt đối không ghi giá trị khoá.
Danh sách kiểm cho dự án đang chạy
Chạy qua danh sách dưới một lần cho mỗi dự án, đặc biệt dự án có phần mã do AI viết trong vài tháng gần đây.
- Tìm trong toàn bộ kho mã và lịch sử git các chuỗi trông như khoá bằng công cụ quét bí mật, không chỉ thư mục hiện tại.
- Kiểm .gitignore có loại trừ mọi biến thể .env, tệp khoá riêng, thư mục chứng chỉ.
- Kiểm .env.example không chứa giá trị thật nào.
- Kiểm mã phía trình duyệt không chứa khoá dịch vụ.
- Kiểm nhật ký ứng dụng không in cấu hình hay phần đầu yêu cầu chứa mã xác thực.
- Kiểm cài đặt loại trừ tệp của trợ lý AI và tác tử trong dự án.
- Kiểm khoá dùng cho phát triển và khoá dùng thật là hai khoá khác nhau, với quyền khác nhau.
- Lên lịch xoay khoá và ghi người chịu trách nhiệm.
Nếu bước đầu tiên tìm thấy khoá trong lịch sử git, đừng chỉ xoá tệp ở lần đẩy tiếp theo. Làm theo quy trình xử lý khoá lộ ở bài riêng trong danh mục này: thu hồi trước, dọn lịch sử sau.
Khoá trong kiểm thử và dữ liệu mẫu
Một nơi khoá hay trú ẩn mà ít ai soát là bộ kiểm thử. Khi nhờ AI viết kiểm thử gọi tới dịch vụ ngoài, nó có thể đặt khoá thật vào tệp cấu hình kiểm thử để các ca chạy được, hoặc ghi lại phản hồi thật của dịch vụ vào tệp mẫu, trong đó có mã xác thực và dữ liệu khách. Các tệp ghi lại phản hồi này thường được đưa vào git vì người ta coi chúng là một phần của kiểm thử.
Cách làm an toàn hơn là kiểm thử đơn vị dùng bản giả của dịch vụ, không cần khoá nào; kiểm thử tích hợp thật thì đọc khoá từ biến môi trường của quy trình tích hợp liên tục, và tự bỏ qua khi biến đó không có trên máy người chạy. Nếu dùng thư viện ghi và phát lại yêu cầu mạng, cấu hình để nó che phần đầu yêu cầu chứa mã xác thực trước khi ghi tệp, rồi mở thử một tệp đã ghi để chắc không còn khoá.
Sổ tay dữ liệu dạng ô lệnh chạy từng bước cũng là chỗ dễ lọt: khoá được gán trong một ô, kết quả in ra lưu luôn trong tệp. Xoá đầu ra và chuyển khoá sang biến môi trường trước khi chia sẻ sổ tay hay đưa vào kho mã.
Câu hỏi thường gặp
Tệp .env có an toàn tuyệt đối khi đã nằm trong .gitignore không?
Không tuyệt đối. Nó vẫn nằm trên ổ đĩa, vẫn đi theo bản sao lưu máy, vẫn có thể bị công cụ khác hay tác tử AI đọc. .gitignore chỉ ngăn nó vào git. Vì vậy khoá trên máy phát triển nên là khoá quyền hẹp.
Có nên mã hoá tệp .env rồi đưa vào git không?
Có những công cụ làm việc này và nhiều nhóm dùng được. Điều kiện là khoá giải mã được quản lý riêng và nghiêm ngặt. Nếu khoá giải mã nằm cạnh tệp mã hoá thì không được gì. Với nhóm nhỏ, kho bí mật của nền tảng thường đơn giản hơn.
Dán khoá vào chatbot rồi xoá cuộc trò chuyện có đủ không?
Không nên coi là đủ. Bạn không kiểm soát được nội dung đã gửi được lưu ở đâu và bao lâu theo chính sách của nhà cung cấp. Cách an toàn là thu hồi khoá đó và tạo khoá mới.
Biến môi trường trên máy chủ có lộ được không?
Có thể, nếu ứng dụng có trang gỡ lỗi in môi trường, nếu nhật ký in cấu hình, hoặc nếu có lỗ hổng đọc tệp. Biến môi trường là nơi chứa tốt hơn mã nguồn, không phải nơi bất khả xâm phạm. Tắt trang gỡ lỗi và che bí mật trong nhật ký.
Khoá cho dịch vụ AI dùng trong ứng dụng có cần quản lý khác không?
Cùng nguyên tắc như mọi khoá, thêm hai điều: đặt hạn mức chi tiêu và cảnh báo trên tài khoản nhà cung cấp nếu có, và không bao giờ gọi dịch vụ AI trực tiếp từ trình duyệt bằng khoá của bạn.
Người mới vào nhóm lấy khoá phát triển bằng cách nào cho an toàn?
Tốt nhất là cấp quyền đọc trong kho bí mật hoặc tạo khoá riêng cho người đó. Tránh gửi khoá qua tin nhắn hay thư điện tử. Khi người đó rời nhóm, thu hồi đúng khoá của họ mà không ảnh hưởng người khác.