#std740

Безопасное хранение паролей

1.

При разработке подсистем, которые работают с внешними ресурсами (почта, веб-сервисы, FTP и т. п.), обычно нужно передавать данные аутентификации: логин и пароль.

2.

Чтобы минимизировать риск перехвата, не храните пароли и другую конфиденциальную информацию в информационной базе.

Минимальный уровень защищенности - в файловых базах: файл базы может целиком скопировать любой пользователь ИБ. В клиент-серверных базах доступ к данным обычно есть только у администраторов СУБД.

Базовый подход: запрашивать логин и пароль у пользователя и сразу использовать их без сохранения в ИБ.

Проверки

#v8cs:unsafe-password-ib-storage

3.

Иногда это неудобно или невозможно:

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

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

3.1.

Не храните пароли и другие конфиденциальные данные в реквизитах тех же объектов метаданных, с которыми ведется повседневная работа.

Для конфиденциальных данных используйте отдельный объект метаданных (например, регистр сведений) с безопасной настройкой прав доступа.

3.2.

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

  • доступ к объекту метаданных не должен давать чтение пароля;
  • чтение и запись данных выполняются только в привилегированном режиме;
  • данные хранятся в закрытом виде;
  • данные исключаются из планов обмена, что снижает риск утечки при обменах.

Для работы с безопасным хранилищем используются процедуры и функции модуля ОбщегоНазначения:

  • ЗаписатьДанныеВБезопасноеХранилище();
  • ПрочитатьДанныеИзБезопасногоХранилища();
  • УдалитьДанныеИзБезопасногоХранилища().

Подробнее см. комментарии к этим функциям в БСП и раздел 3.4. Базовая функциональность - Использование при разработке конфигурации - Безопасное хранилище паролей документации БСП.

3.3.

Не храните пароль в реквизитах формы. Извлекайте его на сервере непосредственно перед использованием.

Иначе при открытии формы с маскированным вводом пароль передается с сервера на клиент в открытом виде и может быть перехвачен.

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

Пример

Маскировка пароля в обработчике формы ПриСозданииНаСервере():

УстановитьПривилегированныйРежим(Истина);
Пароли = ОбщегоНазначения.ПрочитатьДанныеИзБезопасногоХранилища(
    Объект.Ссылка,
    "Пароль, ПарольSMTP"); // Ключи соответствия данных в безопасном хранилище.
УстановитьПривилегированныйРежим(Ложь);

Пароль = ?(ЗначениеЗаполнено(Пароли.Пароль), ЭтотОбъект.УникальныйИдентификатор, "");
ПарольSMTP = ?(ЗначениеЗаполнено(Пароли.ПарольSMTP), ЭтотОбъект.УникальныйИдентификатор, "");

Запись пароля в обработчике формы ПриЗаписиНаСервере():

Если ПарольИзменен Тогда
    УстановитьПривилегированныйРежим(Истина);
    ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(ТекущийОбъект.Ссылка, Пароль);
    УстановитьПривилегированныйРежим(Ложь);
    Пароль = ?(ЗначениеЗаполнено(Пароль), ЭтотОбъект.УникальныйИдентификатор, "");
КонецЕсли;

Если ПарольSMTPИзменен Тогда
    УстановитьПривилегированныйРежим(Истина);
    ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(ТекущийОбъект.Ссылка, ПарольSMTP, "ПарольSMTP");
    УстановитьПривилегированныйРежим(Ложь);
    ПарольSMTP = ?(ЗначениеЗаполнено(ПарольSMTP), ЭтотОбъект.УникальныйИдентификатор, "");
КонецЕсли;

Пароль и ПарольSMTP в примере - реквизиты формы. Если пароль уже сохранен, в реквизит формы записывается уникальный идентификатор, который эмулирует наличие пароля. После записи объекта пароль сохраняется в безопасном хранилище, а реквизит формы снова затирается уникальным идентификатором.

Проверки

#bslls:UsingHardcodeSecretInformation

#acc:345

Источник

https://its.1c.ru/db/v8std#content:740