1. Класифікувати те, що описує обчислення, і те, що надає доступ
Почніть з інформації, яку ваша програма справді споживає. Розмір пакета, назва моделі та режим обробки описують досвід. Токен, що дозволяє завантаження, або ключ, що відкриває сховище, надає доступ. Перший набір має бути пояснюваним; другий повинен залишатися доступним лише там, де він потрібен.
Межа не зводиться до назв змінних. Шлях може викрити клієнта, URL може містити ідентифікатор, а невелика вибірка даних може бути конфіденційною. Тому оцінюйте також вміст параметрів, якими можна поділитися. Опублікувати конфігурацію та опублікувати всі її абсолютні шляхи — це не одне й те саме рішення.
Таблиця пропонує робочу класифікацію. Вона не описує сервіси, встановлені на машині Kernodeck. Визначте для свого проєкту, хто може читати кожен елемент, коли і в якій копії; не залишайте це рішення на останній експорт із ноутбука.
Прокрутіть таблицю, щоб побачити всі стовпці.| Елемент | Роль | Пропонована обробка |
|---|---|---|
| Розмір пакета, режим, поріг | Параметри обчислення | Версіонувати та перевіряти їхні значення. |
| Токен, приватний ключ, пароль | Засоби доступу | Надавати окремо і не включати у вивід. |
| Шлях, URL, ідентифікатор корпусу | Потенційно чутливий контекст | Перевірити перед поширенням; надавати перевагу логічному ідентифікатору. |
| Результати та журнали | Докази виконання | Обрати поля, які зберігаються, і контролювати переданий каталог. |
2. Обрати єдине правило пріоритету
Параметр, наявний у коді, файлі та опції запуску, стає неоднозначним, якщо ніхто не знає, який перемагає. Встановіть просте правило, наприклад: задокументовані значення за замовчуванням, потім файл конфігурації, потім публічні опції команди. Це контракт вашої програми, а не універсальний пріоритет, наданий Python.
Перевіряйте після цього узгодження. Відхиляйте невідомий ключ, щоб помилка на кшталт batch_szie не була непомітно замінена значенням за замовчуванням. Розрізняйте ціле число, рядок, що представляє ціле число, і булеве значення. Потім додайте корисні обмеження: додатне значення, дозволений режим, узгоджена комбінація параметрів.
Насамкінець збережіть дійсну конфігурацію, обмежену дозволеними полями. Вона пояснює, що програма використала, навіть коли опція замінила файл. Не отримуйте цей документ, серіалізуючи весь об'єкт конфігурації перед тим, як прибрати з нього кілька відомих паролів: спершу виберіть те, що може в ньому бути.
3. Працювати з прикладом без підключення сервісу
Наступний приклад є навчальним і не виконується. Він описує вигадану операцію створення векторів із пакетом із восьми елементів. Слово embedding тут є вибором інтерфейсу; жодна модель не завантажується і жодна залежність від GPU не передбачається встановленою. Для читання чи перевірки цього файлу жодних секретів не потрібно.
Стандартний модуль tomllib, доступний починаючи з Python 3.11, читає формат TOML. Він перетворює значення документа в об'єкти Python; він не вирішує, що пакет із нулем заборонений у вашій програмі. Перевірка діапазону залишається явною після читання.
Цей фрагмент приймає рівно два ключі та два режими. Щоб використати його в проєкті, згодом під'єднайте аргументи, обробку помилок і шляхи виводу. Очікувані відхилення легко зрозуміти: batch_size рівний нулю, batch_size у вигляді рядка або додавання ключа token. Це випадки для перевірки у вас, а не результати, виміряні тут.
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. Надавати секрет лише на тому етапі, де він потрібен
Крок, який працює з уже наявним файлом, не повинен вимагати токена для завантаження. Запитуйте секрет на тій межі, де доступ стає необхідним. Якщо цей крок увімкнено, але його доступ відсутній, зупиніть його з повідомленням, яке вказує очікуваний канал, не показуючи отриманого значення й не відтворюючи весь запит.
Канал залежить від доступного середовища: менеджер секретів, файл облікових даних з обмеженим доступом або механізм ін'єкції, передбачений вашою організацією. Змінна середовища може слугувати інтерфейсом, але вона залишається даними, доступними процесу, і може з'явитися в діагностиці. Не плутайте зручність ін'єкції з повним захистом.
Обмежте доступ корисним периметром і передбачте його заміну. Запит на підготовку програмного забезпечення не гарантує наявності менеджера секретів. Перевірте фактично доступний механізм, перш ніж будувати навколо нього свій запуск, а потім уникайте передавання секрету підпроцесам, яким він не потрібен.
5. Проєктування корисного журналу без копіювання вхідних даних
Визначте кілька подій: конфігурацію прийнято, файл перевірено, розбиття завершено, вихідні дані підтверджено. Додайте до них ідентифікатор виконання, крок і лічильник. Помилки CONFIG_BATCH_SIZE достатньо, щоб знайти відповідне правило; їй не потрібно містити повний файл.
OWASP рекомендує, зокрема, виключати паролі, токени доступу та ключі з журналів. Застосовуйте це правило також до винятків, об'єктів, що виводяться для налагодження, і результатів комірок. Маскування, застосоване на останньому екрані, не прибирає того, що вже було записано у файл чи знімок екрана.
Щоб поділитися інцидентом, підготуйте невелику вибірку: корисні версії, дозволені параметри, помилку та синтетичний приклад, що відтворює проблему. Уникайте автоматичного архівування всієї папки. Також перевірте URL-адреси, заголовки, шляхи та рядки, суміжні з помилкою; довкола, здавалося б, невинного повідомлення можуть бути чутливі дані.
6. Перевірка розділення перед поширенням
Підготуйте три спроби: чинна конфігурація без віддаленого кроку, недійсна конфігурація та крок, що вимагає відсутнього доступу. Перша має дійти до своєї функціональної межі без зайвих секретів; дві інші мають давати різні помилки. Також перевірте, що публічна зміна розміру пакета з'являється в чинній конфігурації.
Щоб перевірити вашу процедуру поширення, використайте вочевидь фіктивний сигнальний рядок без прав доступу. Пропустіть його через те саме місце, що й секрет, під час ізольованого навчання, а потім знайдіть його в журналах, експортах і вибраних файлах. Його відсутність — це обмежена перевірка цього шляху, а не доказ того, що будь-які витоки неможливі.
Додайте відповідні приватні файли до своїх виключень Git, але також перевірте файли, які вже відстежуються. Документація Git зазначає, що gitignore стосується файлів, які не відстежуються; додавання шаблону не прибирає секрет, уже збережений. Перегляньте те, що ви збираєтеся передати, а не лише правила, покликані це виключити.
7. Реагування на розголошення та збереження придатного до використання сліду
Якщо доступ було розкрито, припиніть його повторно використовувати та відкличте або замініть його в системі, яка його надала. Видалення рядка з поточного файлу не робить попередні копії нешкідливими. Визначте відповідні місця, щоб прибрати те, що можна, і зрозуміти обсяг розголошення.
Ваша відтворювана папка може надалі зберігати назву використаного каналу та дозволені параметри, не зберігаючи самого секрету. Майбутній запуск вимагатиме чинного доступу у потрібний момент. Так ви отримуєте процедуру, яку можна передавати, не перетворюючи архів експерименту на зв'язку ключів доступу.
Цей метод стосується вашого застосунку та його результатів. Він не гарантує ані ізоляції всього середовища, ані відсутності технічних слідів деінде. Щоб перейти до виконання, поєднайте його з документованим середовищем, контрольованими даними та відстеженням, яке розрізняє прогрес і підтверджений результат.