1. Phân loại những gì mô tả phép tính và những gì cấp quyền truy cập
Hãy bắt đầu với những thông tin mà chương trình của bạn thực sự tiêu thụ. Kích thước lô, tên mô hình và chế độ xử lý mô tả một trải nghiệm. Một token cho phép tải xuống hoặc một khóa mở kho lưu trữ mang lại quyền truy cập. Nhóm đầu tiên phải có thể giải thích được; nhóm thứ hai chỉ nên hiện diện ở nơi cần thiết.
Ranh giới không chỉ nằm ở tên biến. Một đường dẫn có thể tiết lộ khách hàng, một URL có thể chứa định danh, và một mẫu dữ liệu nhỏ cũng có thể là thông tin mật. Vì vậy hãy đánh giá cả nội dung của các tham số có thể chia sẻ. Công bố cấu hình và công bố toàn bộ đường dẫn tuyệt đối của nó là hai quyết định khác nhau.
Bảng này đưa ra một cách phân loại để làm việc. Nó không mô tả các dịch vụ được cài đặt trên một máy Kernodeck. Hãy xác định cho dự án của bạn ai được đọc từng mục, vào thời điểm nào và trong bản sao nào; đừng để quyết định đó cho lần xuất cuối cùng của một notebook.
Cuộn bảng để xem tất cả các cột.| Thành phần | Vai trò | Cách xử lý đề xuất |
|---|---|---|
| Kích thước lô, chế độ, ngưỡng | Tham số tính toán | Quản lý phiên bản và xác thực các giá trị của chúng. |
| Token, khóa riêng tư, mật khẩu | Phương tiện truy cập | Cung cấp riêng và không đưa vào kết quả đầu ra. |
| Đường dẫn, URL, định danh corpus | Ngữ cảnh có khả năng nhạy cảm | Kiểm tra trước khi chia sẻ; ưu tiên một định danh logic. |
| Kết quả và nhật ký | Bằng chứng thực thi | Chọn các trường được giữ lại và kiểm soát thư mục được truyền đi. |
2. Chọn một quy tắc ưu tiên duy nhất
Một tham số xuất hiện trong mã, trong tệp và trong tùy chọn khởi chạy sẽ trở nên mơ hồ nếu không ai biết cái nào thắng. Hãy đặt một quy tắc đơn giản, ví dụ: giá trị mặc định được ghi lại trong tài liệu, rồi đến tệp cấu hình, rồi đến các tùy chọn công khai của lệnh. Đây là một cam kết của ứng dụng bạn, không phải một thứ tự ưu tiên phổ quát do Python cung cấp.
Hãy xác thực sau khi giải quyết xong thứ tự đó. Từ chối một khóa không xác định để một lỗi như batch_szie không bị âm thầm thay bằng giá trị mặc định. Phân biệt số nguyên, chuỗi biểu diễn số nguyên và boolean. Sau đó thêm các ràng buộc hữu ích: giá trị dương, chế độ được phép, tổ hợp tham số nhất quán.
Cuối cùng, hãy lưu lại một cấu hình hiệu lực chỉ giới hạn ở các trường được phép. Nó giải thích chương trình đã dùng gì, ngay cả khi một tùy chọn đã thay thế tệp. Đừng tạo tài liệu này bằng cách tuần tự hóa toàn bộ đối tượng cấu hình rồi mới loại bỏ vài mật khẩu đã biết: trước tiên hãy chọn những gì được phép xuất hiện trong đó.
3. Làm việc với một ví dụ mà không kết nối dịch vụ nào
Ví dụ sau mang tính minh họa và không được thực thi. Nó mô tả một thao tác hư cấu tạo vector với một lô tám phần tử. Từ embedding ở đây là một lựa chọn giao diện; không có mô hình nào được tải và không giả định rằng có phụ thuộc GPU nào được cài đặt. Không cần bí mật nào để đọc hoặc xác thực tệp này.
Mô-đun chuẩn tomllib, có từ Python 3.11, đọc định dạng TOML. Nó chuyển các giá trị của tài liệu thành đối tượng Python; nó không quyết định rằng lô bằng không bị cấm trong ứng dụng của bạn. Việc kiểm tra miền vẫn phải rõ ràng sau khi đọc.
Đoạn trích này chấp nhận đúng hai khóa và hai chế độ. Để dùng nó trong một dự án, sau đó hãy kết nối các đối số, xử lý lỗi và đường dẫn đầu ra. Các trường hợp bị từ chối đều dễ suy luận: batch_size bằng không, batch_size ở dạng chuỗi hoặc thêm một khóa token. Đây là những trường hợp cần kiểm tra ở phía bạn, không phải kết quả được đo tại đây.
batch_size = 8
mode = "embedding"import tomllib
with open("config.toml", "rb") as source:
config = tomllib.load(source)
if set(config) != {"batch_size", "mode"}:
raise ValueError("CONFIG_KEYS")
if type(config["batch_size"]) is not int or config["batch_size"] <= 0:
raise ValueError("CONFIG_BATCH_SIZE")
if config["mode"] not in ("embedding", "classification"):
raise ValueError("CONFIG_MODE")
public_config = {
"batch_size": config["batch_size"],
"mode": config["mode"],
}4. Chỉ cung cấp bí mật cho bước cần đến nó
Một bước xử lý trên tệp đã tồn tại không được yêu cầu token tải xuống. Hãy yêu cầu bí mật tại ranh giới nơi quyền truy cập trở nên cần thiết. Nếu bước này được bật nhưng thiếu quyền truy cập, hãy dừng nó với thông báo cho biết kênh mong đợi, mà không hiển thị giá trị nhận được cũng không sao chép toàn bộ yêu cầu.
Kênh phụ thuộc vào môi trường sẵn có: trình quản lý bí mật, tệp thông tin đăng nhập có quyền truy cập hạn chế hoặc cơ chế tiêm truyền do tổ chức của bạn quy định. Một biến môi trường có thể dùng làm giao diện, nhưng nó vẫn là dữ liệu mà tiến trình có thể truy cập và có khả năng xuất hiện trong chẩn đoán. Đừng nhầm lẫn giữa sự tiện lợi khi tiêm truyền và sự bảo vệ toàn diện.
Hãy giới hạn quyền truy cập trong phạm vi cần thiết và dự phòng việc thay thế. Yêu cầu chuẩn bị phần mềm không đảm bảo có trình quản lý bí mật. Hãy kiểm tra cơ chế thực sự sẵn có trước khi xây dựng cách khởi chạy dựa trên nó, rồi tránh truyền bí mật cho các tiến trình con không cần đến nó.
5. Thiết kế nhật ký hữu ích mà không sao chép dữ liệu đầu vào
Hãy định nghĩa một vài sự kiện: cấu hình được chấp nhận, tệp được kiểm tra, phân đoạn hoàn tất, đầu ra được xác thực. Gán cho chúng một mã định danh thực thi, một bước và một bộ đếm. Một lỗi CONFIG_BATCH_SIZE là đủ để tìm ra quy tắc liên quan; nó không cần chứa toàn bộ tệp.
OWASP khuyến nghị loại trừ khỏi nhật ký, đặc biệt là mật khẩu, token truy cập và khóa. Hãy áp dụng quy tắc này cả cho các ngoại lệ, đối tượng được hiển thị để gỡ lỗi và đầu ra của ô. Việc che giấu ở màn hình cuối không xóa đi những gì đã được ghi vào tệp hoặc ảnh chụp.
Để chia sẻ một sự cố, hãy chuẩn bị một lựa chọn nhỏ: các phiên bản cần thiết, tham số được phép, lỗi và ví dụ tổng hợp tái hiện vấn đề. Tránh lưu trữ tự động toàn bộ thư mục. Hãy xem lại cả URL, tiêu đề, đường dẫn và các dòng xung quanh lỗi; một thông báo trông có vẻ vô hại có thể được bao quanh bởi dữ liệu nhạy cảm.
6. Kiểm tra sự tách biệt trước khi chia sẻ
Hãy chuẩn bị ba bài thử: cấu hình hợp lệ không có bước từ xa, cấu hình không hợp lệ và bước yêu cầu quyền truy cập bị thiếu. Bài đầu phải có thể đi đến ranh giới chức năng của nó mà không cần bí mật không cần thiết; hai bài còn lại phải cho ra các lỗi khác nhau. Cũng hãy kiểm tra rằng một thay đổi công khai về kích thước lô xuất hiện trong cấu hình hiệu lực.
Để kiểm soát quy trình chia sẻ của bạn, hãy dùng một chuỗi sentinel rõ ràng là hư cấu và không có quyền truy cập. Hãy cho nó đi qua cùng vị trí như một bí mật trong một bài tập tách biệt, rồi tìm nó trong nhật ký, bản xuất và các tệp được chọn. Sự vắng mặt của nó là một kiểm tra có giới hạn cho đường đi này, không phải bằng chứng rằng mọi rò rỉ đều không thể xảy ra.
Hãy thêm các tệp riêng tư phù hợp vào danh sách loại trừ Git của bạn, nhưng cũng kiểm tra các tệp đã được theo dõi. Tài liệu của Git nêu rõ rằng gitignore áp dụng cho các tệp chưa được theo dõi; thêm một mẫu không xóa đi một bí mật đã được ghi lại. Hãy xem xét những gì bạn sắp truyền đi, chứ không chỉ các quy tắc được cho là loại trừ nó.
7. Phản ứng khi bị phát tán và lưu giữ một dấu vết có thể khai thác
Nếu một quyền truy cập đã bị lộ, hãy ngừng sử dụng lại nó và yêu cầu thu hồi hoặc thay thế tại hệ thống đã cấp nó. Xóa một dòng khỏi tệp hiện tại không làm cho các bản sao trước đó trở nên vô hại. Hãy xác định các vị trí liên quan để loại bỏ những gì có thể và hiểu được phạm vi phát tán.
Sau đó, thư mục tái lập được của bạn có thể lưu giữ tên của kênh đã dùng và các tham số được phép, mà không lưu giữ chính bí mật. Một lần khởi chạy sau này sẽ yêu cầu quyền truy cập hợp lệ vào đúng thời điểm. Như vậy bạn có được một quy trình có thể chuyển giao mà không biến kho lưu trữ của thí nghiệm thành một chùm chìa khóa truy cập.
Phương pháp này liên quan đến ứng dụng của bạn và các sản phẩm bàn giao của nó. Nó không đảm bảo việc cô lập toàn bộ môi trường cũng như không có dấu vết kỹ thuật ở nơi khác. Để chuyển sang thực thi, hãy kết hợp nó với một môi trường được ghi lại tài liệu, dữ liệu được kiểm soát và một quy trình theo dõi phân biệt tiến trình với kết quả được xác thực.