20.6. Аутентификация GSSAPI
GSSAPI является протоколом отраслевого стандарта для безопасной авторизации, определённым в RFC 2743. PostgreSQL поддерживает GSSAPI с Kerberos аутентификацией с соответствии с RFC 1964. GSSAPI обеспечивает автоматическую аутентификацию (single sign-on), для систем, которые её поддерживают. Сама по себе аутентификация безопасна, но данные, отсылаемые в ходе подключения к базе данных, не защищены, если не используется SSL.
Поддержка GSSAPI должна быть включена при сборке PostgreSQL; за дополнительными сведениями обратитесь к Главе 16.
При работе с Kerberos GSSAPI использует стандартные учётные записи в формате
. Сервер PostgreSQL примет любого принципала, включённого в используемый сервером файл таблицы ключей, но необходимо проявить осторожность в указании корректных деталей принципала в ходе соединения с клиентом, применяющим параметр подключения servicename
/hostname
@realm
krbsrvname
. (См. также Подраздел 34.1.2.) Значение имени сервиса по умолчанию postgres
может быть изменено во время сборки с помощью ./configure --with-krb-srvnam=
whatever
. В большинстве сред изменять данный параметр не требуется. Однако некоторые реализации Kerberos могут потребовать иного имени сервиса, например, Microsoft Active Directory требует, чтобы имя сервиса было набрано заглавными буквами (POSTGRES
).
hostname
здесь — это полное доменное имя компьютера, где работает сервер. Областью субъекта-службы является предпочитаемая область данного компьютера.
Принципалы клиентов могут быть сопоставлены с различными именами пользователей баз данных PostgreSQL в pg_ident.conf
. Например, принципалу pgusername@realm
может быть сопоставлено просто pgusername
. Так же возможно использовать в качестве имени роли в PostgreSQL полное имя принципала username@realm
без какого-либо сопоставления.
PostgreSQL также поддерживает возможность убирать область из имени принципала. Эта возможность оставлена для обратной совместимости и использовать её крайне нежелательно, так как при этом оказывается невозможно различить разных пользователей, имеющих одинаковые имена, но приходящих из разных областей. Чтобы включить её, установите для include_realm
значение 0. В простых конфигурациях с одной областью исключение области в сочетании с параметром krb_realm
(который позволяет ограничить область пользователя одним значением, заданным в krb_realm
parameter) будет безопасным, но менее гибким вариантом по сравнению с явным описанием сопоставлений в pg_ident.conf
.
Убедитесь, что файл ключей вашего сервера доступен для чтения (и желательно недоступен для записи) учётной записи сервера PostgreSQL. (См. также Раздел 18.1.) Расположение этого файла ключей указывается параметром krb_server_keyfile. По умолчанию это /usr/local/pgsql/etc/krb5.keytab
(каталог может быть другим, в зависимости от значения sysconfdir
при сборке). Из соображений безопасности рекомендуется использовать отдельный файл keytab для сервера PostgreSQL, а не открывать доступ к общесистемному файлу.
Файл таблицы ключей генерируется программным обеспечением Kerberos; подробнее это описано в документации Kerberos. Следующий пример для MIT-совместимых реализаций Kerberos 5:
kadmin%
ank -randkey postgres/server.my.domain.org
kadmin%
ktadd -k krb5.keytab postgres/server.my.domain.org
При подключении к базе данных убедитесь, что у вас есть разрешение на сопоставление принципала с именем пользователя базы данных. Например, для имени пользователя базы данных fred
, принципал fred@EXAMPLE.COM
сможет подключиться. Чтобы дать разрешение на подключение принципалу fred/users.example.com@EXAMPLE.COM
, используйте файл сопоставления имён пользователей, как описано в Разделе 20.2.
Для метода GSSAPI доступны следующие параметры конфигурации:
include_realm
Когда этот параметр равен 0, из принципала аутентифицированного пользователя убирается область, и оставшееся имя проходит сопоставление имён (см. Раздел 20.2). Этот вариант не рекомендуется и поддерживается в основном для обратной совместимости, так как он небезопасен в окружениях с несколькими областями, если только дополнительно не задаётся
krb_realm
. Более предпочтительный вариант — оставить значениеinclude_realm
по умолчанию (1) и задать вpg_ident.conf
явное сопоставление для преобразования имён принципалов в имена пользователей PostgreSQL.map
Разрешает сопоставление имён пользователей системы и пользователей баз данных. За подробностями обратитесь к Разделу 20.2. Для принципала GSSAPI/Kerberos, такого как
username@EXAMPLE.COM
(или более редкогоusername/hostbased@EXAMPLE.COM
), именем пользователя в сопоставлении будетusername@EXAMPLE.COM
(илиusername/hostbased@EXAMPLE.COM
, соответственно), еслиinclude_realm
не равно 0; в противном случае именем системного пользователя в сопоставлении будетusername
(илиusername/hostbased
).krb_realm
Устанавливает область, с которой будут сверяться имена принципалов пользователей. Если этот параметр задан, подключаться смогут только пользователи из этой области. Если не задан, подключаться смогут пользователи из любой области, в зависимости от установленного сопоставления имён пользователей.