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-namesystem-usernamedatabase-usernameincludefileinclude_if_existsfileinclude_dirdirectory
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.
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