Авторизация и аутентификация. Защита аутентификационной информации
Идентификация и аутентификация
Идентификация — действия по присвоению субъектам и объектам доступа идентификаторов и (или) действия по сравнению предъявляемого идентификатора (определение имени пользователя базы данных) с перечнем присвоенных идентификаторов. При работе в среде SQL по имени пользователя определяются права доступа к объектам базы данных для конкретного пользователя.
Запуск клиентских утилит (к которым относится psql) доступен под любым пользователем ОС начиная с Pangolin 6.2.0.
Аутентификация — это действия по проверке подлинности субъекта доступа в информационной системе. Определение того, может ли клиентское приложение (или пользователь запустивший приложение) подключиться под указанным именем пользователя.
При аутентификации пользователя определяется логин пользователя, который далее идентифицирует его. Межсервисная идентификация осуществляется с помощью свойств сессии application_name
(может быть задано аутентифицирующимся приложением для того, чтобы в логе СУБД отображалась данная информация), а также IP-адрес и клиентский порт.
При использовании сертификатов, сертификат безопасности клиента должен содержать поле CN
, содержащее логин клиента и, опционально, поле SubjectAltName
, содержащее один или несколько IP-адресов (возможен вариант указания подсети) и (или) DNS-имен клиента.
Критерии параметра application_name
: любая строка, не превышающая 64 печатных ASCII символов (остальные символы будут заменены знаками вопроса).
СУБД Pangolin поддерживает несколько методов аутентификации пользователей и сервисов:
trust
— любой пользователь, подключающийся к серверу, авторизован для доступа;password
— авторизация с помощью пароля, передаваемого в виде хеша MD5 или открытым текстом;GSSAPI
— протокол авторизации по стандарту RFC 2743;SSPI
— технология защищенной аутентификации Windows;ident
— аутентификация с использованием сервераident
по стандарту RFC 1413;peer
— получение имени пользователя клиента из ядра и использование его в качестве авторизованного имени пользователя БД;LDAP
— аналогичноpassword
, но для подтверждения пары «имя пользователя/пароль» используется метод LDAP;RADIUS
— аналогичноpassword
, но для подтверждения пары «имя пользователя/пароль» используется метод RADIUS;cert
— аутентификация с использованием клиентского сертификата TLS. Применимо только для TLS-подключений;PAM
— аналогичноpassword
, но для подтверждения пары «имя пользователя/пароль» используется метод PAM. Также поддерживается проверка имени и IP удаленного компьютера;BSD
— аналогичноpassword
, но для подтверждения пары «имя пользователя/пароль» используется метод BSD;2f-scram-sha-256
,2f-md5
,2f-password
или2f-ldap
— методы двухфакторной аутентификации (см. раздел «Двухфакторная аутентификация»).
Метод аутентификации конкретного клиентского соединения может основываться на адресе компьютера клиента, имени базы данных, имени пользователя. Более детально описано в разделе документации PostgreSQL «Аутентификация клиента».
Файл pg_hba.conf
Аутентификация клиентов управляется конфигурационным файлом pg_hba.conf
(либо секцией pg_hba
, конфигурационного файла postgres.yml
кластерной конфигурации), он расположен в каталоге с данными кластера базы данных. Файл pg_hba.conf
со стандартным содержимым создается командой initdb
при инициализации каталога с данными. Располагается в каталоге PGDATA
.
Общий формат файла pg_hba.conf
— набор записей, по одной на строку. Пустые строки игнорируются, как и любой текст комментария после знака #
. Запись может быть продолжена на следующей строке, для этого нужно завершить строку обратной косой чертой (обратная косая черта является спецсимволом только в конце строки). Запись состоит из нескольких полей, разделенных пробелами и/или табуляциями. Обратная косая черта обозначает перенос строки даже в тексте в кавычках или комментариях.
Каждая запись обозначает тип соединения, диапазон IP-адресов клиента (если он соотносится с типом соединения), имя базы данных, имя пользователя, и способ аутентификации, который будет использован для соединения в соответствии с этими параметрами.
Описание возможных полей и примеры заполнения представлены в разделе «Файл pg_hba.conf» документации PostgreSQL.
Сквозная аутентификация между Pangolin Pooler и Pangolin DBMS
В Pangolin Pooler и Pangolin DBMS реализован механизм сквозной аутентификации. Программа Pangolin Pooler выступает в режиме проксирования данных аутентификации от клиента к Pangolin и обратно, аутентификация пользователя выполняется только на Pangolin.
Данная функциональность позволяет избежать:
- порождения процессов на СУБД для целей аутентификации в избыточном количестве - в случае неуспешной аутентификации процесс, порожденный клиентским подключением, терминируется;
- избыточных пользовательских аутентификаций;
- хранения паролей в открытом виде с использованием параметра
auth_file
файлаuserlist.txt
; - использования слабых типов аутентификации:
trust
,plain
,password
иpeer
; - рассинхронизации информации об имени и пароле пользователя;
- ограничений ядра Pangolin Pooler в части аудирования действий пользователя.
Дополнительно она позволяет:
- выполнять аутентификацию пользователей в Pangolin Pooler всеми поддерживаемыми способами СУБД Pangolin, включая LDAP;
- повышает безопасность;
- упрощает конфигурирование кластера СУБД.
Подробнее в разделе «Сквозная аутентификация».
Двухфакторная аутентификация
Двухфакторная аутентификация – это технология, обеспечивающая идентификацию пользователей при помощи запроса аутентификационных данных двух разных типов. Она обеспечивает двухслойную, а значит, более эффективную защиту СУБД от несанкционированного проникновения.
Подключение пользователя к СУБД с помощью двухфакторной аутентификации может осуществляться:
- непосредственно (или напрямую) к Pangolin;
- через Pangolin Pooler с включенной сквозной аутентификацией;
- через Pangolin Pooler с выключенной сквозной аутентификацией.
Подробнее в разделе «Двухфакторная аутентификация».
Авторизация
Авторизация – предоставление субъекту прав на доступ, а также предоставление доступа в соответствии с установленными правами на доступ.
Предоставление прав пользователям в СУБД Pangolin осуществляется в соответствии с ролевой моделью и механизмом защиты данных от привилегированных пользователей.
Системный каталог pg_authid
содержит информацию об идентификаторах авторизации базы данных (роли). Роли включают понятия «пользователи» и «группы».
Механизм реализации авторизации (присвоения ролей, выдачи прав пользователям, занесение DN/CN сертификата в списки доступа, настройки списков доступа) реализуется на стороне администратора системы.
Ролевая модель и права доступа
Для обеспечения контроля доступа к защищаемым объектам базы данных применяется система разграничения доступа, основанная на ролях.
Права доступа пользователей устанавливаются политиками защиты (безопасности) в соответствии с ролевой моделью. Управление политиками, ролевая модель и ее настройки описаны в подразделе «Управление» раздела «Защита от привилегированных пользователей. Разграничение доступа к данным. Управление политиками безопасности» документа «Администрирование функциональностей».
Автоматическое завершение неактивных соединений
Соединения, остающиеся неактивными определенное время, подлежат принудительному завершению. Для завершения таких соединений используется фоновый процесс, осуществляющий мониторинг и завершение бездействующих клиентских сеансов. Этот процесс запускается при старте сервера Pangolin и завершается вместе с остановкой сервера.
Процесс регулируется двумя параметрами:
check_idle_time_delay
— интервал мониторинга в миллисекундах;backend_idle_alive_time
— допустимое время бездействия в секундах.
Если хотя бы один из этих параметров равен нулю, неактивные соединения завершаться не будут.
Внешняя авторизация через LDAP
Функциональность позволяет настраивать в централизованном LDAP-хранилище атрибуты прав пользователей (SUPERUSER, LOGIN, REPLICATION и т.д.) и вложенность ролей. После чего атрибуты и зависимость ролей можно получать из централизованного хранилища для всех экземпляров СУБД.
В LDAP-хранилище для каждой роли так же хранится список родительских ролей, в которые она входит (по аналогии с pg_auth_members
), но конкретные полномочия всех этих ролей хранятся в СУБД. При этом из хранилища можно получать роли, которые не заведены в самой СУБД, и выполнять операции от их имени.
Функциональность не позволяет управлять через LDAP полномочиями отдельных ролей — только их вложенностью.
В Pangolin реализована возможность настроить засекречивание запросов от сервера СУБД к AD (Active Directory). Для этого нужно настроить протокол LDAPS, использующий LDAP поверх SSL с протоколом шифрования TLS.
Далее приведены шаги для включения TLS соединения с LDAP:
-
Набор имеющихся корневых AD сертификатов скопируйте на сервер, где будет производиться установка (в случае кластера - и на мастер, и на реплику). Примером директории может быть:
etc/pki/ca-trust/source/anchors
. -
Выполните команду
sudo update-ca-trust
для обновления списка доверенных сертификатов. -
В файле конфигурации
etc/openldap/ldap.conf
укажите путь к сертификатам в параметреTLS_CACERTDIR
. Также добавьте набор шифров, используемых сервером AD:TLS_CIPHER_SUITE TLSv1.2:!NULL
. -
Отредактируйте раздел
hba_rules
конфигурационного файла инсталлятораcustom_file_template.yml
. В нем пропишите параметры подключения к серверу:ldapserver="{{ ldap_server }}" ldapport=3268 ldapbasedn="" ldapprefix="cn=" ldapsuffix=" OU=NPA OU=PAM OU=ALL DC=MustBeFilled dc=ru ldap_tls=1
-
Запустите установку/обновление Pangolin. Ниже приведен пример строки
pg_hba.conf
при включенномldaptls
:host all +all-sa-pam-group 0.0.0.0/0 ldap ldaptls=1 ldapserver=X.XX.ru ldapport=389 ldapprefix="cn=" ldapsuffix=", OU=NPA, OU=PAM, OU=ALL, OU=XX, DC=X, dc=ru
Более подробно в разделе «Внешняя авторизация через LDAP. Управление протоколом LDAPS».
Защита аутентификационной информации
В утилите psql
имелся механизм запоминания ранее выполненных запросов. Этот механизм позволял просмотреть историю ранее выполненных команд и повторно вызвать ранее выполненные запросы.
История запросов хранилась в открытом виде в файле ~/.psql_history
. При выполнении запросов, содержащих пароли это могло представлять угрозу безопасности, так как пароли хранились так же в незасекреченном виде.
В Pangolin реализована защита аутентификационной информации в процессе ее ввода. При аутентификации через утилиту psql
вводимые пользователем символы пароля не отображаются.
Не рекомендуется передавать или хранить пароль в открытом виде в:
- файле
pgpass
; - строке параметров подключения (Connection string);
- переменной окружения
PGPASSWORD
.
В связи с новой функциональностью изменяется поведение утилиты psql
по сравнению с имеющимся:
- создание и чтение файла
~/.psql_history
не производится; - влияние переменной окружения
PSQL_HISTORY
на работу утилитыpsql
отсутствует; - установка переменной
HISTFILE
в утилитеpsql
не дает эффекта.
В файле конфигурации postgresql.conf
вводится новый параметр psql.save_history
, регулирующий сохранение истории. Если установить этот параметр в значение off
, то создание, обновление и чтение файла ~/.psql_history
производиться не будет.
Реализованная функциональность не приводит к удалению или очищению ранее созданных файлов истории запросов. После обновления продукта рекомендуется (если необходимо) удалить ранее созданные файлы истории, выполнив команду:
rm -f ~/.psql_history
При использовании оригинального libpq
история запросов сохраняется, что создает угрозу безопасности. Обратите внимание, не гарантируется работоспособность сторонних решений.
Рекомендации
При реализации TLS/SSL-соединений в СУБД доступно использование как сгенерированных сертификатов, так и сертификатов PKCS#12.
Pangolin Pooler
При большом количестве клиентских подключений, рекомендуется использование компонента Pangolin Pooler.
Компонент Pangolin Pooler – это менеджер пулов соединений Pangolin DBMS.
Предназначение компонента — минимизировать издержки, связанные с установлением новых подключений к Pangolin DBMS. Pangolin Pooler позволяет уменьшить накладные расходы на базу данных в случае, когда огромное количество физических соединений ведет к падению производительности СУБД Pangolin.
Любое клиентское приложение может подключиться к Pangolin Pooler, как если бы это был непосредственно сервер DBMS, и Pooler создаст подключение к реальному серверу, либо задействует одно из ранее установленных подключений.
Информация по установке, настройке и управлению данного компонента представлена в разделе «Администрирование Pangolin Pooler» документа «Руководство администратора».
Правила задания и смены паролей
Пароль считается стойким, если он удовлетворяет следующим условиям:
- должен изменяться не менее 1 раза в 80 дней с момента последнего изменения;
- должен быть сложен (обязательно использование строчных и прописных букв и цифр);
- длина пароля — минимум 12 символов;
- должен быть уникален, недопустимо использование одного и того же пароля для нескольких УЗ одного пользователя;
- не должен содержать имя УЗ пользователя или какую-либо его часть;
- в случае компрометации пароля необходимо незамедлительно его сменить;
- должен храниться в засекреченном виде.
Парольные политики для Pangolin по умолчанию настроены следующим образом:
-
выключены для пользователей, проходящих внешнюю аутентификацию LDAP;
-
для локальных УЗ включено использование библиотеки
zxcvb
; -
для специальных УЗ выключены проверки времени жизни пароля:
SELECT * FROM set_role_policies('masteromni', max_age('0 sec'), min_age('0 sec'), check_syntax('1'), policy_enable('1'), lockout('0'), illegal_values('1'), use_password_strength_estimator('1'), password_strength_estimator_score('3'));
SELECT * FROM set_role_policies('zabbix_oasubd', max_age('0 sec'), min_age('0 sec'), check_syntax('1'), policy_enable('1'), lockout('0'), illegal_values('1'), use_password_strength_estimator('1'), password_strength_estimator_score('3'));
SELECT * FROM set_role_policies('monitoring_php', max_age('0'), min_age('0'), check_syntax('1'), policy_enable('1'), lockout('0'), illegal_values('1'), use_password_strength_estimator('1'), password_strength_estimator_score('3'));
SELECT * FROM set_role_policies('auditor', max_age('0'), min_age('0'), check_syntax('1'), policy_enable('1'), lockout('0'), illegal_values('1'), use_password_strength_estimator('1'), password_strength_estimator_score('3'));
SELECT * FROM set_role_policies('pstgcmdb', max_age('0'), min_age('0'), check_syntax('1'), policy_enable('1'), lockout('0'), illegal_values('1'), use_password_strength_estimator('1'), password_strength_estimator_score('3'));
SELECT * FROM set_role_policies('as_TUZ', max_age('0'), min_age('0'), check_syntax('1'), policy_enable('1'), lockout('0'), illegal_values('1'), use_password_strength_estimator('1'), password_strength_estimator_score('3'));
SELECT * FROM set_role_policies('as_admin', max_age('0'), min_age('0'), check_syntax('1'), policy_enable('1'), lockout('0'), illegal_values('1'), use_password_strength_estimator('1'), password_strength_estimator_score('3'));
SELECT * FROM set_role_policies('db_admin', max_age('0'), min_age('0'), check_syntax('1'), policy_enable('1'), lockout('0'), illegal_values('1'), use_password_strength_estimator('1'), password_strength_estimator_score('3'));
SELECT * FROM set_role_policies('postgres', max_age('0'), min_age('0'), check_syntax('1'), policy_enable('1'), lockout('0'), illegal_values('1'), use_password_strength_estimator('1'), password_strength_estimator_score('3'));
Утилиты засекречивания и хранения паролей
Для исключения хранения паролей в открытом виде и предотвращения компрометации паролей в СУБД Pangolin подготовлен набор утилит, позволяющих засекречивать и хранить пароли в закодированном виде:
pg_auth_config
— утилита засекречивания/хранения параметров подключения к БД;pg_auth_password
— утилита засекречивания паролей. Позволяет получить пароль в засекреченном виде после ввода исходного пароля;pangolin-auth-reencrypt
– утилита перекодирования паролей, которая используется для восстановления работоспособности узла кластера при смене параметров сервера;psql_get_password_hash
- утилита для получения хеш-сумм паролей для заполнения пользовательского конфигурационного файла.
Более подробно о работе и установке данных утилит в разделе «Утилиты засекречивания и хранения параметров подключения».