20.6. Autenticación GSSAPI #

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 servicename/hostname@realm. 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.

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.org
kadmin% 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_realm

Establece 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.