При разработке систем на платформе 1С:Предприятие 8.3 часто возникает задача хранения чувствительных данных: паролей от почтовых ящиков, API-ключей сторонних сервисов или секретов двухфакторной авторизации. Стандартным инструментом для этого в Библиотеке стандартных подсистем (БСП) является Безопасное хранилище данных. Однако многие разработчики сталкиваются с тем, что пользователь с ролью ПолныеПрава может беспрепятственно прочитать эти данные. В этой статье мы разберем, как устроена эта подсистема, и проанализируем реальные способы защиты информации от администраторов системы.
Для начала проанализируем, что представляет собой «Безопасное хранилище» изнутри. По сути, это обычный регистр сведений (например, БезопасноеХранилищеДанных), в котором данные хранятся в поле с типом ХранилищеЗначения. Основной механизм защиты здесь — отсутствие прав на чтение этого регистра у всех ролей, кроме специально предназначенных. Чтение данных происходит в привилегированном модуле.
Рассмотрим типовой код получения данных из хранилища:
Функция ДанныеИзБезопасногоХранилища(Владелец, ИмяБезопасногоХранилищаДанных, Ключ) Экспорт
ТекстЗапроса = "ВЫБРАТЬ
| БезопасноеХранилищеДанных.Данные КАК Данные
|ИЗ
| #ИмяБезопасногоХранилищаДанных КАК БезопасноеХранилищеДанных
|ГДЕ
| БезопасноеХранилищеДанных.Владелец = &Владелец";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ИмяБезопасногоХранилищаДанных", "РегистрСведений." + ИмяБезопасногоХранилищаДанных);
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("Владелец", Владелец);
РезультатЗапроса = Запрос.Выполнить().Выбрать();
// Далее происходит извлечение из ХранилищаЗначения
КонецФункции
Проблема заключается в том, что пользователь с Полными правами игнорирует любые ограничения прав доступа (RLS), наложенные в конфигурации. Для него этот регистр открыт так же, как и любой другой. Следовательно, стандартное «Безопасное хранилище» защищает данные только от рядовых пользователей, но не от администраторов или программистов.
Выясним важный нюанс платформы 1С: существует различие между правами на данные и правами на администрирование. В современных конфигурациях можно настроить профиль так, что у пользователя будут ПолныеПрава (доступ ко всем таблицам), но будет отсутствовать роль АдминистраторСистемы.
Проанализируем преимущества такого подхода:
АдминистраторСистемы не может зайти в Конфигуратор.Комбинируя это с использованием Расширений, мы можем программно запретить доступ к определенным объектам даже для роли ПолныеПрава. В расширении можно прописать логику, которая будет прерывать чтение регистра при определенных условиях. Однако помните: если у пользователя есть доступ к консоли запросов, он все равно сможет извлечь данные, так как консоль работает в контексте текущих прав.
Это самый надежный метод, который делает чтение данных бессмысленным без знания пароля. Рассмотрим алгоритм реализации:
Шаг 1. Шифрование при записи. Когда пользователь вводит секретный ключ (например, API-токен), мы не сохраняем его в чистом виде. Мы просим пользователя ввести дополнительный «пароль расшифровки», который не сохраняется в базе данных. С помощью этого пароля мы шифруем токен и только потом помещаем его в БезопасноеХранилище.
Шаг 2. Расшифровка при использовании. В момент, когда системе нужно отправить запрос к сервису, она запрашивает у пользователя пароль интерактивно. В оперативной памяти происходит дешифровка, данные используются и тут же очищаются.
Посмотрим на пример использования объекта ЗаписьZIPФайла для простого шифрования данных внутри системы:
// Шифрование данных перед помещением в хранилище
Процедура ЗашифроватьИСохранить(ДанныеСтрокой, Пароль)
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("zip");
ЗаписьZip = Новый ЗаписьZipФайла(ИмяВременногоФайла, Пароль);
ИмяТекстовогоФайла = ПолучитьИмяВременногоФайла("txt");
ТекстовыйФайл = Новый ТекстовыйДокумент;
ТекстовыйФайл.УстановитьТекст(ДанныеСтрокой);
ТекстовыйФайл.Записать(ИмяТекстовогоФайла);
ЗаписьZip.Добавить(ИмяТекстовогоФайла);
ЗаписьZip.Записать();
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
// Теперь ДвоичныеДанные можно поместить в БезопасноеХранилище
КонецПроцедуры
При таком подходе даже администратор с полными правами, выгрузив данные из регистра, увидит лишь зашифрованный ZIP-архив, содержимое которого невозможно прочитать без пароля, известного только владельцу данных.
Для более серьезной защиты проанализируем встроенные возможности платформы 1С по работе с сертификатами. Объект МенеджерКриптографии позволяет использовать системные криптопровайдеры.
Рассмотрим преимущества использования СервисКриптографии из БСП:
Нужно понимать, что программист или администратор с правом отладки может обойти многие преграды. Рассмотрим основные риски:
rphost в момент обработки находятся в открытом виде. Снятие дампа памяти позволяет извлечь текстовые строки.Проанализировав ситуацию, можно сделать следующий вывод: абсолютной защиты от пользователя с полными правами внутри 1С не существует, если данные должны обрабатываться автоматически без участия человека. Однако для интерактивных сценариев защиты можно достичь высокого уровня безопасности.
Рекомендуемая стратегия:
АдминистраторСистемы. Если пользователь не может зайти в конфигуратор и запустить внешнюю обработку, его возможности по «взлому» хранилища значительно сужаются.СервисКриптографии из состава БСП — он предоставляет стандартизированный интерфейс для работы с защищенными данными.Таким образом, мы выяснили, что защита данных от администратора — это всегда баланс между удобством использования системы и стоимостью потенциального взлома. Шифрование внешним ключом остается единственным способом, при котором даже прямой доступ к SQL-таблицам не позволит злоумышленнику прочитать ваши секреты.