Можно ли защитить данные в безопасном хранилище от пользователей с полными правами?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке систем на платформе 1С:Предприятие 8.3 часто возникает задача хранения чувствительных данных: паролей от почтовых ящиков, API-ключей сторонних сервисов или секретов двухфакторной авторизации. Стандартным инструментом для этого в Библиотеке стандартных подсистем (БСП) является Безопасное хранилище данных. Однако многие разработчики сталкиваются с тем, что пользователь с ролью ПолныеПрава может беспрепятственно прочитать эти данные. В этой статье мы разберем, как устроена эта подсистема, и проанализируем реальные способы защиты информации от администраторов системы.

Как работает безопасное хранилище БСП

Для начала проанализируем, что представляет собой «Безопасное хранилище» изнутри. По сути, это обычный регистр сведений (например, БезопасноеХранилищеДанных), в котором данные хранятся в поле с типом ХранилищеЗначения. Основной механизм защиты здесь — отсутствие прав на чтение этого регистра у всех ролей, кроме специально предназначенных. Чтение данных происходит в привилегированном модуле.

Рассмотрим типовой код получения данных из хранилища:


Функция ДанныеИзБезопасногоХранилища(Владелец, ИмяБезопасногоХранилищаДанных, Ключ) Экспорт
    ТекстЗапроса = "ВЫБРАТЬ 
                   | БезопасноеХранилищеДанных.Данные КАК Данные 
                   |ИЗ 
                   | #ИмяБезопасногоХранилищаДанных КАК БезопасноеХранилищеДанных 
                   |ГДЕ 
                   | БезопасноеХранилищеДанных.Владелец = &Владелец";
    
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "#ИмяБезопасногоХранилищаДанных", "РегистрСведений." + ИмяБезопасногоХранилищаДанных);
    Запрос = Новый Запрос(ТекстЗапроса);
    Запрос.УстановитьПараметр("Владелец", Владелец);
    
    РезультатЗапроса = Запрос.Выполнить().Выбрать();
    // Далее происходит извлечение из ХранилищаЗначения
КонецФункции

Проблема заключается в том, что пользователь с Полными правами игнорирует любые ограничения прав доступа (RLS), наложенные в конфигурации. Для него этот регистр открыт так же, как и любой другой. Следовательно, стандартное «Безопасное хранилище» защищает данные только от рядовых пользователей, но не от администраторов или программистов.

Решение 1: Разделение ролей «Полные права» и «Администратор системы»

Выясним важный нюанс платформы 1С: существует различие между правами на данные и правами на администрирование. В современных конфигурациях можно настроить профиль так, что у пользователя будут ПолныеПрава (доступ ко всем таблицам), но будет отсутствовать роль АдминистраторСистемы.

Проанализируем преимущества такого подхода:

  1. Пользователь без роли АдминистраторСистемы не может зайти в Конфигуратор.
  2. Он не может запускать внешние обработки (если это ограничено в профиле).
  3. Он не может изменять состав ролей других пользователей или свой собственный.

Комбинируя это с использованием Расширений, мы можем программно запретить доступ к определенным объектам даже для роли ПолныеПрава. В расширении можно прописать логику, которая будет прерывать чтение регистра при определенных условиях. Однако помните: если у пользователя есть доступ к консоли запросов, он все равно сможет извлечь данные, так как консоль работает в контексте текущих прав.

Решение 2: Шифрование данных внешним ключом

Это самый надежный метод, который делает чтение данных бессмысленным без знания пароля. Рассмотрим алгоритм реализации:

Шаг 1. Шифрование при записи. Когда пользователь вводит секретный ключ (например, API-токен), мы не сохраняем его в чистом виде. Мы просим пользователя ввести дополнительный «пароль расшифровки», который не сохраняется в базе данных. С помощью этого пароля мы шифруем токен и только потом помещаем его в БезопасноеХранилище.

Шаг 2. Расшифровка при использовании. В момент, когда системе нужно отправить запрос к сервису, она запрашивает у пользователя пароль интерактивно. В оперативной памяти происходит дешифровка, данные используются и тут же очищаются.

Посмотрим на пример использования объекта ЗаписьZIPФайла для простого шифрования данных внутри системы:


// Шифрование данных перед помещением в хранилище
Процедура ЗашифроватьИСохранить(ДанныеСтрокой, Пароль)
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("zip");
    ЗаписьZip = Новый ЗаписьZipФайла(ИмяВременногоФайла, Пароль);
    
    ИмяТекстовогоФайла = ПолучитьИмяВременногоФайла("txt");
    ТекстовыйФайл = Новый ТекстовыйДокумент;
    ТекстовыйФайл.УстановитьТекст(ДанныеСтрокой);
    ТекстовыйФайл.Записать(ИмяТекстовогоФайла);
    
    ЗаписьZip.Добавить(ИмяТекстовогоФайла);
    ЗаписьZip.Записать();
    
    ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
    // Теперь ДвоичныеДанные можно поместить в БезопасноеХранилище
КонецПроцедуры

При таком подходе даже администратор с полными правами, выгрузив данные из регистра, увидит лишь зашифрованный ZIP-архив, содержимое которого невозможно прочитать без пароля, известного только владельцу данных.

Решение 3: Использование Менеджера криптографии

Для более серьезной защиты проанализируем встроенные возможности платформы 1С по работе с сертификатами. Объект МенеджерКриптографии позволяет использовать системные криптопровайдеры.

Рассмотрим преимущества использования СервисКриптографии из БСП:

Фундаментальные ограничения защиты в 1С

Нужно понимать, что программист или администратор с правом отладки может обойти многие преграды. Рассмотрим основные риски:

  1. Точки останова: Если код расшифровки выполняется на стороне клиента или сервера, администратор может поставить точку останова в момент, когда данные уже расшифрованы, и посмотреть значение переменной.
  2. Дамп памяти: Данные в оперативной памяти процесса rphost в момент обработки находятся в открытом виде. Снятие дампа памяти позволяет извлечь текстовые строки.
  3. Подмена модулей: Если модуль не защищен (не закрыт паролем или не находится в составе поставки без исходных кодов), администратор может временно изменить код, чтобы он записывал расшифрованные данные в лог-файл.

Выводы и рекомендации

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

Рекомендуемая стратегия:

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

← На главную