GSSAPI es un protocolo estándar del sector para la autenticación segura definido en RFC 2743. PostgreSQL admite GSSAPI para la autenticación, el cifrado de las comunicaciones o ambos. GSSAPI proporciona autenticación automática (inicio de sesión único o single sign-on) para los sistemas que lo admiten. La autenticación en sí es segura. Si se utiliza el cifrado GSSAPI o el cifrado SSL, los datos enviados a lo largo de la conexión de la base de datos se cifrarán; de lo contrario, no.
El soporte de GSSAPI tiene que estar habilitado cuando se construye PostgreSQL; consulta la sección Chapter 17 para obtener más información.
Cuando GSSAPI utiliza Kerberos,
utiliza un nombre de principal de servicio estándar (identidad de autenticación) con el formato
.
El nombre del principal utilizado por una instalación concreta no está codificado en
el servidor de PostgreSQL de ninguna manera; más bien se especifica
en el archivo keytab que lee el servidor para determinar su identidad.
Si en el archivo keytab figuran varios principales, el servidor aceptará cualquiera de ellos.
El nombre del reino (realm) del servidor es el reino preferido especificado en los archivos
de configuración de Kerberos accesibles al servidor.
servicename/hostname@realm
Al conectarse, el cliente debe conocer el nombre del principal del servidor al que
pretende conectarse. La parte servicename del principal
suele ser postgres, pero se puede seleccionar otro valor a
través del parámetro de conexión krbsrvname de
libpq. La parte hostname es
el nombre de host completamente cualificado al que se le indica a libpq
que se conecte. El nombre del reino es el reino preferido especificado en los archivos
de configuración de Kerberos accesibles al cliente.
El cliente también dispondrá de un nombre de principal para su propia identidad
(y debe tener un ticket válido para este principal). Para utilizar
GSSAPI para la autenticación, el principal del cliente
debe estar asociado a un nombre de usuario de la base de datos de
PostgreSQL. El archivo de configuración
pg_ident.conf se puede utilizar para asignar principales
a nombres de usuario; por ejemplo, pgusername@realm se podría
asignar a solo pgusername. Alternativamente, se puede
utilizar el principal completo username@realm como nombre de
rol en PostgreSQL sin ninguna asignación.
PostgreSQL también admite la asignación de principales
de cliente a nombres de usuario simplemente eliminando el reino del principal.
Este método se admite por compatibilidad con versiones anteriores y se desaconseja
encarecidamente, ya que entonces es imposible distinguir a diferentes usuarios con el
mismo nombre de usuario pero que provienen de reinos diferentes. Para habilitar esto,
configura include_realm a 0. Para instalaciones sencillas de un
solo reino, hacer eso combinado con la configuración del parámetro krb_realm
(que comprueba que el reino del principal coincide exactamente con lo que hay en el parámetro
krb_realm) sigue siendo seguro; pero este es un enfoque menos capaz
en comparación con la especificación de una asignación explícita en
pg_ident.conf.
La ubicación del archivo keytab del servidor se especifica mediante el parámetro de configuración krb_server_keyfile. Por razones de seguridad, se recomienda utilizar una keytab independiente solo para el servidor de PostgreSQL en lugar de permitir que el servidor lea el archivo keytab del sistema. Asegúrate de que el archivo keytab del servidor sea legible (y preferiblemente solo legible, no modificable) por la cuenta del servidor PostgreSQL. (Consulta también la sección Section 18.1).
El archivo keytab se genera utilizando el software Kerberos; consulta la documentación de Kerberos para obtener más detalles. El siguiente ejemplo muestra cómo hacer esto utilizando la herramienta kadmin de MIT Kerberos:
kadmin%addprinc -randkey postgres/server.my.domain.orgkadmin%ktadd -k krb5.keytab postgres/server.my.domain.org
Se admiten las siguientes opciones de autenticación para el método de autenticación GSSAPI:
include_realm
Si se configura como 0, el nombre del reino del principal de usuario autenticado se
elimina antes de pasarse a través del mapa de nombres de usuario
(Section 20.2). Esto se desaconseja y está disponible
principalmente por compatibilidad con versiones anteriores, ya que no es seguro en entornos
multirreino a menos que también se utilice krb_realm. Se recomienda
dejar include_realm configurado con el valor por defecto (1) y
proporcionar una asignación explícita en pg_ident.conf para convertir
los nombres de principal en nombres de usuario de PostgreSQL.
map
Permite la asignación de principales de cliente a nombres de usuario de la base de datos.
Consulta la sección Section 20.2 para más detalles. Para un principal de
GSSAPI/Kerberos, como [email protected] (o, menos comúnmente,
username/[email protected]), el nombre de usuario utilizado para la
asignación es [email protected] (o
username/[email protected], respectivamente), a menos que
include_realm se haya configurado como 0, en cuyo caso
username (o username/hostbased) es lo que se ve como
nombre de usuario del sistema al realizar la asignación.
krb_realmEstablece el reino con el que se compararán los nombres de los principales de los usuarios. Si se configura este parámetro, solo se aceptarán los usuarios de ese reino. Si no se configura, pueden conectarse usuarios de cualquier reino, sujetos a la asignación de nombres de usuario que se realice.
Además de estos ajustes, que pueden ser diferentes para diferentes entradas de
pg_hba.conf, existe el parámetro de configuración global del
servidor krb_caseins_users. Si se configura como true, los
principales de los clientes se comparan con las entradas del mapa de usuarios sin distinguir
entre mayúsculas y minúsculas. El reino krb_realm, si está
configurado, también se compara sin distinguir entre mayúsculas y minúsculas.