GPU для ваших проектов · оплата криптовалютой без KYC Как арендовать
Русский
Открыть консоль
Практическое руководство / KERNODECK

Общая конфигурация не содержит ваши доступы.

Храните параметры вычислений в версионируемом файле, а секреты передавайте по отдельному каналу во время выполнения. Определите приоритет между источниками конфигурации, проверьте результат и записывайте только разрешённые значения. Такое разделение упрощает повторный запуск эксперимента; оно не превращает ни переменную окружения, ни файл, игнорируемый Git, в сейф.

6 мин чтения · Руководство для разработчиков

1. Разделить то, что описывает вычисление, и то, что даёт доступ

Начните с информации, которую ваша программа действительно потребляет. Размер пакета, имя модели и режим обработки описывают эксперимент. Токен, разрешающий загрузку, или ключ, открывающий хранилище, дают доступ. Первый набор должен быть объяснимым; второй должен оставаться доступным только там, где он необходим.

Граница не сводится к именам переменных. Путь может выдать клиента, URL может содержать идентификатор, а небольшая выборка данных может быть конфиденциальной. Поэтому оценивайте также содержимое параметров, которыми можно делиться. Опубликовать конфигурацию и опубликовать все её абсолютные пути — не одно и то же решение.

Таблица предлагает рабочий подход к классификации. Она не описывает сервисы, установленные на машине Kernodeck. Определите для своего проекта, кто может читать каждый элемент, в какой момент и в какой копии; не оставляйте это решение на последний экспорт из блокнота.

Прокрутите таблицу, чтобы увидеть все столбцы.
Классификация, которую следует адаптировать под доступы и данные проекта.
ЭлементРольПредлагаемая обработка
Размер пакета, режим, порогПараметры вычисленияВерсионировать и проверять их значения.
Токен, приватный ключ, парольСредства доступаПредоставлять отдельно и не включать в выходные данные.
Путь, URL, идентификатор корпусаПотенциально чувствительный контекстПроверить перед тем, как делиться; предпочесть логический идентификатор.
Результаты и журналыСвидетельства выполненияВыбрать сохраняемые поля и проконтролировать передаваемую папку.

2. Выберите единственное правило приоритета

Параметр, присутствующий в коде, файле и опции запуска, становится неоднозначным, если никто не знает, какой из них побеждает. Задайте простое правило, например: документированные значения по умолчанию, затем файл конфигурации, затем публичные опции команды. Это контракт вашего приложения, а не универсальный приоритет, предоставляемый Python.

Проверяйте после такого разрешения. Отклоняйте неизвестный ключ, чтобы опечатка вроде batch_szie не была молча заменена значением по умолчанию. Различайте целое число, строку, представляющую целое число, и булево значение. Затем добавьте полезные ограничения: положительное значение, разрешённый режим, согласованная комбинация параметров.

В завершение сохраните действующую конфигурацию, ограниченную разрешёнными полями. Она объясняет, что использовала программа, даже когда какая-то опция заменила файл. Не получайте этот документ путём сериализации всего объекта конфигурации с последующим удалением нескольких известных паролей: сначала выберите, что может в нём находиться.

3. Поработайте с примером, не подключая сервисов

Следующий пример носит обучающий характер и не выполняется. Он описывает вымышленную операцию получения векторов с пакетом из восьми элементов. Слово embedding здесь — выбор интерфейса; никакая модель не загружается и не предполагается, что установлены какие-либо зависимости для GPU. Для чтения или проверки этого файла никакие секреты не нужны.

Стандартный модуль tomllib, доступный начиная с Python 3.11, читает формат TOML. Он преобразует значения документа в объекты Python; он не решает, что пакет размером ноль запрещён в вашем приложении. Проверка допустимости значений остаётся явной после чтения.

Этот фрагмент принимает ровно два ключа и два режима. Чтобы использовать его в проекте, далее подключите аргументы, обработку ошибок и пути вывода. Ожидаемые отказы легко осмыслить: batch_size равный нулю, batch_size в виде строки или добавление ключа token. Это случаи для проверки у вас, а не результаты, измеренные здесь.

Учебные параметры config.toml — без секретов
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. Реагирование на распространение и сохранение пригодного к использованию следа

Если доступ был раскрыт, прекратите его повторное использование и добейтесь его отзыва или замены в системе, которая его выдала. Удаление строки из текущего файла не делает предыдущие копии безвредными. Определите затронутые места, чтобы убрать то, что можно, и понять масштаб распространения.

Затем ваш воспроизводимый набор может сохранить имя использованного канала и разрешённые параметры, не сохраняя сам секрет. Будущий запуск запросит действительный доступ в нужный момент. Так вы получаете передаваемую процедуру, не превращая архив эксперимента в связку ключей доступа.

Этот метод касается вашего приложения и его результатов. Он не гарантирует ни изоляции всей среды, ни отсутствия технических следов в других местах. Чтобы перейти к выполнению, сочетайте его с документированной средой, контролируемыми данными и отслеживанием, которое различает прогресс и подтверждённый результат.

Ваши вопросы

Достаточно ли файла .env для защиты секретов?

Нет. Это способ сгруппировать значения, а не самостоятельная защита. Контролируйте, кто может его читать, как его значения внедряются и какие файлы копируются. Не выводите ни его содержимое, ни полное окружение процесса.

Удаляет ли добавление секрета в gitignore его присутствие в Git?

Нет. Исключения не удаляют уже отслеживаемые файлы и старые копии. Если доступ был распространён, отзовите или замените его; отдельно разберитесь с затронутыми файлами и историей.

Можно ли поделиться экспериментом, не передавая доступы?

Да. Передайте код, зависимости, разрешённые параметры и описание ожидаемого канала доступа. Каждый запуск получает свой доступ отдельно. Также проверьте, что пути, URL, данные и журналы не раскрывают конфиденциальную информацию.