framework/skills/bsl-practices/security/SKILL.md
Для секретов, токенов, TLS, подписей и привилегий 1С
npx skillsauth add steelmorgan/1c-agent-based-dev-framework securityInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Этот навык — карта тем по безопасности прикладного кода 1С. Конкретика по платформенным API вынесена в references/. Здесь — границы доверия, типовые ошибки и stop-rules, которые должен соблюдать любой агент (architect / developer-code / reviewer) при работе с чувствительными данными.
Безопасность в 1С — не отдельная подсистема, а сквозное свойство кода:
БезопасноеХранилище, а не в коде/конфигурации/логах.МенеджерКриптографии + явный провайдер (CryptoPro CSP / ViPNet) с явной версией ГОСТ.| Триггер | Действие |
|---------|----------|
| Видишь работу с паролем/токеном/секретом в параметре процедуры или в строке кода | Прочитай references/secrets.md, перенеси в БезопасноеХранилище, проверь маскирование в логах |
| Видишь работу с МенеджерКриптографии, СертификатКриптографии, ХранилищеСертификатовКриптографии, ПараметрамиПодписиCMS | Прочитай references/crypto.md, проверь провайдера, версию ГОСТ, контекст (клиент/сервер) и lifecycle закрытого ключа |
| Видишь HTTP-вызов внешнего API, OpenID/OAuth, basic-auth, клиентский TLS-сертификат | Прочитай references/auth.md, проверь error semantics и хранение учётных данных |
| Делаешь ревью кода, который трогает права, RLS, привилегированный режим или внешние интеграции | Используй references/review-checklist.md как обязательный фильтр перед финальным ответом |
| Нужно спроектировать новую интеграцию/сервис с аутентификацией | Сначала определи trust boundary (см. ниже), потом выбирай API |
Перед тем как писать или ревьюить код, явно определи, какую границу он пересекает:
HTTPСоединение, OpenID/OAuth, клиентский сертификат, TLS.МенеджерКриптографии, CryptoPro CSP / ViPNet, доступ к хранилищу сертификатов под учёткой rphost/srv1cv8.БезопасноеХранилище, либо внешний vault через коннектор.Если граница не названа — навык применён неверно: вернись к этапу проектирования.
БезопасноеХранилище → references/secrets.mdОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(Владелец, Данные, Ключ = "Пароль") и ПрочитатьДанныеИзБезопасногоХранилища(Владелец, Ключи = "Пароль", ...); хранение — регистр сведений БезопасноеХранилищеДанных, прямой доступ к нему запрещён.УстановитьПривилегированныйРежим(Истина) точечно (не на весь модуль).references/crypto.mdМенеджерКриптографии(ИмяПровайдера, ТипПровайдера) — провайдер выбирается явно (CryptoPro CSP, ViPNet CSP).СертификатКриптографии, ХранилищеСертификатовКриптографии, ПараметрыПодписиCMS.Хранилище.Значение.ЭлектроннаяПодпись, ЭлектроннаяПодписьСлужебный) — предпочтительный путь, если БСП в конфигурации есть.references/auth.mdHTTPСоединение/HTTPЗапрос, токен и refresh-token хранятся в БезопасноеХранилище.БезопасноеХранилище, заголовок собирается на сервере.СертификатКлиентаФайл, СертификатКлиентаWindows, СертификатКлиентаOpenSSL в HTTPСоединение.missing credentials, expired token, invalid certificate, provider unavailable, denied rights, tenant mismatch, remote auth failure.references/review-checklist.mdСтек-нейтральный чеклист, который агент-reviewer проходит обязательно перед финальным ответом, если код трогает любую из тем выше.
Эти правила — жёсткие. Нарушение = блокирующий комментарий ревью и переписывание кода.
Пароль/токен/приватный ключ нельзя передавать через параметр процедуры, у которой есть граница «клиент ↔ сервер»
Пароль.Приватный ключ / контейнер криптографии не хранится в общем модуле, реквизите справочника или константе
Константа.КлючШифрования, в макете.МенеджерКриптографии.УстановитьПривилегированныйРежим(Истина) вокруг работы с БезопасноеХранилище — обязателен и точечен
УстановитьПривилегированныйРежим ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища упадёт по правам у обычного пользователя.УстановитьПривилегированныйРежим(Ложь) обязательно ставится сразу после чтения, в том же блоке Попытка/Исключение.Логи и журнал регистрации не содержат токены, пароли, приватные ключи и полные заголовки Authorization
ЗаписьЖурналаРегистрации, Сообщить, ответе агента — только маскированные значения (***, последние 4 символа, fingerprint сертификата).Аутентификационная ошибка отличается от валидационной и бизнес-ошибки
401/403 от внешнего API не превращается в «не удалось выполнить операцию». Это отдельный тип ошибки с отдельной обработкой (refresh, повторный логин, эскалация).Контекст: Нужно вызвать внешний REST API с OAuth 2.0 (client credentials).
Шаги:
client_secret и refresh_token — в БезопасноеХранилище, владелец = ссылка элемента справочника.УстановитьПривилегированныйРежим.Authorization — на сервере, заголовок не возвращается на клиент.expired token → refresh, invalid client → ошибка конфигурации (не retry), provider unavailable → retry с backoff.client_id — открыто, client_secret/access_token — маскировано (4 последних символа).references/review-checklist.md.Контекст: Нужно подписать XML/PDF квалифицированной ЭЦП по ГОСТ Р 34.10-2012.
Шаги:
МенеджерКриптографии руками.МенеджерКриптографии("Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider", 80) с явным ТипПровайдера.Отпечаток), не по «первому подходящему».ПараметрыПодписиCMS (открепленная/прикреплённая, кодировка).ДанныеПодписи целиком; логировать Отпечаток сертификата и идентификатор бизнес-объекта.Контекст: В PR появился УстановитьПривилегированныйРежим(Истина).
Шаги:
УстановитьПривилегированныйРежим(Ложь) в той же области видимости и в Попытка/Исключение.references/review-checklist.md.// Сервер. Чтение токена внешнего API из безопасного хранилища.
// Привилегированный режим — точечный, только вокруг чтения секрета.
Функция ПолучитьТокенДоступа(УчётнаяЗапись) Экспорт
УстановитьПривилегированныйРежим(Истина);
Попытка
ДанныеСекрета = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(УчётнаяЗапись, "access_token");
Исключение
УстановитьПривилегированныйРежим(Ложь);
ВызватьИсключение;
КонецПопытки;
УстановитьПривилегированныйРежим(Ложь);
Если ДанныеСекрета = Неопределено Тогда
ВызватьИсключение НСтр("ru = 'Токен не настроен для учётной записи.'");
КонецЕсли;
Возврат ДанныеСекрета;
КонецФункции
// АНТИПАТТЕРН: пароль пересекает границу клиент/сервер в открытом параметре.
// АНТИПАТТЕРН: пароль попадает в журнал регистрации.
&НаСервереБезКонтекста
Функция ОтправитьДокумент(URL, Логин, Пароль, ТелоЗапроса) Экспорт
ЗаписьЖурналаРегистрации("Интеграция",
УровеньЖурналаРегистрации.Информация,
,
,
"Отправка: URL=" + URL + ", Логин=" + Логин + ", Пароль=" + Пароль);
// ... вызов внешнего API ...
КонецФункции
| Ошибка | Последствие | Как избежать |
|--------|-------------|--------------|
| Пароль/токен в параметре экспортной серверной процедуры | Утечка по сети, в дампах, в логах клиента | Передавать только владельца секрета (ссылку), читать секрет на сервере |
| УстановитьПривилегированныйРежим(Истина) на весь модуль/функцию | Обход RLS и проверок ролей по всей бизнес-логике | Точечный блок только вокруг работы с БезопасноеХранилище |
| Хранение access_token в реквизите справочника / константе / макете | Любой пользователь с правом чтения справочника получает токен | БезопасноеХранилище + владелец = ссылка элемента справочника |
| МенеджерКриптографии() без явного провайдера и типа | Код работает на стенде, падает на проде с другим провайдером | Явные ИмяПровайдера + ТипПровайдера, версия ГОСТ зафиксирована |
| Сертификат выбирается «первый из хранилища» | Подпись неверным сертификатом в момент ротации | Поиск строго по Отпечатку |
| 401 от внешнего API → Сообщить("Ошибка при сохранении") | Невозможно отличить истёкший токен от ошибки данных | Отдельный тип ошибки аутентификации + обработка refresh |
| Логирование всего тела HTTP-запроса/ответа | В журнале регистрации лежат пароли/токены/ПДн | Санитизация перед логированием, маскирование чувствительных полей |
error-handling — общая модель ошибок, в т.ч. различение технических и бизнес-ошибок.integration-patterns — паттерны HTTP-сервисов и внешних интеграций, на которые навешивается аутентификация.ssl-patterns — модули БСП (в т.ч. «Электронная подпись», «ИнтернетПользователи»).coding-standards — общие правила оформления серверного кода.development
1C server maintenance webhooks: container restart and external component cache cleanup
development
Interactive DAP debugging of a single BSL procedure
tools
Rules for using RLM tools for project search and navigation in 1C/BSL
development
Creates web applications and routes on Winow (a web server on OneScript and Autumn). Use when working with a web server on OneScript, routing, or Winow controllers.