20.2. Mapas de nombres de usuario #

Cuando se utiliza un sistema de autenticación externo como Ident o GSSAPI, el nombre del usuario del sistema operativo que inició la conexión puede no ser el mismo que el del usuario (rol) de la base de datos que se va a utilizar. En este caso, se puede aplicar un mapa de nombres de usuario para asignar el nombre de usuario del sistema operativo a un usuario de la base de datos. Para utilizar la asignación de nombres de usuario, especifica map=map-name en el campo de opciones en pg_hba.conf. Esta opción es compatible con todos los métodos de autenticación que reciben nombres de usuario externos. Dado que pueden ser necesarias diferentes asignaciones para diferentes conexiones, el nombre del mapa a utilizar se especifica en el parámetro map-name en pg_hba.conf para indicar qué mapa utilizar para cada conexión individual.

Los mapas de nombres de usuario se definen en el archivo de mapas ident, que por defecto se denomina pg_ident.conf y se almacena en el directorio de datos del clúster. (Sin embargo, es posible colocar el archivo de mapas en otro lugar; consulta el parámetro de configuración ident_file). El archivo de mapa ident contiene líneas con las siguientes formas generales:

map-name system-username database-username
include file
include_if_exists file
include_dir directory

Los comentarios, los espacios en blanco y las continuaciones de línea se manejan de la misma manera que en pg_hba.conf. El map-name es un nombre arbitrario que se utilizará para referirse a esta asignación en pg_hba.conf. Los otros dos campos especifican un nombre de usuario del sistema operativo y un nombre de usuario de la base de datos coincidente. El mismo map-name puede ser utilizado repetidamente para especificar múltiples asignaciones de usuario dentro de un mismo mapa.

Al igual que para pg_hba.conf, las líneas de este archivo pueden ser directivas include, siguiendo las mismas reglas.

El archivo pg_ident.conf se lee al arrancar y cuando el proceso principal del servidor recibe una señal SIGHUP. Si editas el archivo en un sistema activo, tendrás que enviar una señal al postmaster (utilizando pg_ctl reload, llamando a la función SQL pg_reload_conf(), o utilizando kill -HUP) para que vuelva a leer el archivo.

La vista del sistema pg_ident_file_mappings puede ser útil para probar previamente los cambios en el archivo pg_ident.conf, o para diagnosticar problemas si la carga del archivo no tuvo los efectos deseados. Las filas de la vista con campos error no nulos indican problemas en las líneas correspondientes del archivo.

No existe ninguna restricción sobre a cuántos usuarios de la base de datos puede corresponder un usuario del sistema operativo determinado, ni viceversa. Por lo tanto, las entradas de un mapa deben entenderse como este usuario del sistema operativo tiene permitido conectarse como este usuario de la base de datos, en lugar de implicar que son equivalentes. La conexión se permitirá si existe alguna entrada en el mapa que empareje el nombre de usuario obtenido del sistema de autenticación externo con el nombre de usuario de la base de datos con el que el usuario ha solicitado conectarse. El valor all puede utilizarse como database-username para especificar que si el system-username coincide, entonces este usuario tiene permitido iniciar sesión como cualquiera de los usuarios de base de datos existentes. Poner all entre comillas hace que la palabra clave pierda su significado especial.

Si el campo database-username comienza con un carácter +, entonces el usuario del sistema operativo puede iniciar sesión como cualquier usuario perteneciente a ese rol, de forma similar a cómo se tratan los nombres de usuario que comienzan con + en pg_hba.conf. De este modo, una marca + significa coincidir con cualquiera de los roles que son miembros directos o indirectos de este rol, mientras que un nombre sin la marca + coincide solo con ese rol específico. Poner entre comillas un nombre de usuario que comience con + hace que el + pierda su significado especial.

Si el campo system-username comienza con una barra diagonal (/), el resto del campo se trata como una expresión regular. (Consulta la sección Section 9.7.3.1 para más detalles sobre la sintaxis de expresiones regulares de PostgreSQL). La expresión regular puede incluir una única captura, o subexpresión entre paréntesis. La parte del nombre de usuario del sistema que coincide con la captura se puede referenciar en el campo database-username como \1 (barra invertida-uno). Esto permite la asignación de múltiples nombres de usuario en una sola línea, lo que es particularmente útil para sustituciones sintácticas sencillas. Por ejemplo, estas entradas:

mymap   /^(.*)@mydomain\.com$      \1
mymap   /^(.*)@otherdomain\.com$   guest

eliminarán la parte del dominio para los usuarios cuyos nombres de usuario del sistema terminen con @mydomain.com, y permitirán a cualquier usuario cuyo nombre de sistema termine con @otherdomain.com iniciar sesión como guest. Poner entre comillas un database-username que contenga \1 no hace que \1 pierda su significado especial.

Si el campo database-username comienza con una barra diagonal (/), el resto del campo se trata como una expresión regular. Cuando el campo database-username es una expresión regular, no es posible utilizar \1 dentro de él para referirse a una captura del campo system-username.

Tip

Ten en cuenta que, por defecto, una expresión regular puede coincidir solo con una parte de una cadena. Normalmente es aconsejable utilizar ^ y $, como se muestra en el ejemplo anterior, para forzar que la coincidencia sea con todo el nombre de usuario del sistema.

Un archivo pg_ident.conf que podría utilizarse en conjunción con el archivo pg_hba.conf de la sección Example 20.1 se muestra en la sección Example 20.2. En este ejemplo, a cualquier persona conectada a una máquina de la red 192.168 que no tenga el nombre de usuario del sistema operativo bryanh, ann o robert no se le concederá acceso. El usuario de Unix robert solo tendría permitido el acceso cuando intente conectarse como el usuario de PostgreSQL bob, no como robert ni como nadie más. A ann solo se le permitiría conectarse como ann. Al usuario bryanh se le permitiría conectarse como bryanh o como guest1.

Example 20.2. Un ejemplo de archivo pg_ident.conf

# MAPNAME       SYSTEM-USERNAME         PG-USERNAME

omicron         bryanh                  bryanh
omicron         ann                     ann
# bob tiene el nombre de usuario robert en estas máquinas
omicron         robert                  bob
# bryanh también puede conectarse como guest1
omicron         bryanh                  guest1