#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