18.7. Prevenir la suplantación de identidad del servidor #

Mientras el servidor se está ejecutando, no es posible que un usuario malicioso tome el lugar del servidor de bases de datos normal. Sin embargo, cuando el servidor está apagado, es posible que un usuario local suplante al servidor normal iniciando su propio servidor. El servidor suplantador podría leer las contraseñas y las consultas enviadas por los clientes, pero no podría devolver ningún dato porque el directorio PGDATA seguiría estando protegido gracias a los permisos del directorio. La suplantación es posible porque cualquier usuario puede iniciar un servidor de bases de datos; un cliente no puede identificar un servidor inválido a menos que esté configurado de forma especial.

Una forma de evitar la suplantación de conexiones local es utilizar un directorio de sockets de dominio Unix (unix_socket_directories) que tenga permisos de escritura únicamente para un usuario local de confianza. Esto evita que un usuario malicioso cree su propio archivo de socket en ese directorio. Si te preocupa que algunas aplicaciones todavía hagan referencia a /tmp para el archivo de socket y por lo tanto sean vulnerables a la suplantación, durante el inicio del sistema operativo crea un enlace simbólico /tmp/.s.PGSQL.5432 que apunte al archivo de socket reubicado. También es posible que necesites modificar el script de limpieza de /tmp para evitar la eliminación del enlace simbólico.

Otra opción para las conexiones local es que los clientes utilicen requirepeer para especificar el propietario requerido del proceso del servidor conectado al socket.

Para evitar la suplantación en conexiones TCP, puedes utilizar certificados SSL y asegurarte de que los clientes verifiquen el certificado del servidor, o utilizar cifrado GSSAPI (o ambos, si se encuentran en conexiones independientes).

Para evitar la suplantación con SSL, el servidor debe estar configurado para aceptar únicamente conexiones hostssl (Section 20.1) y disponer de los archivos de clave y certificado SSL (Section 18.9). El cliente TCP debe conectarse utilizando sslmode=verify-ca o verify-full y tener instalado el archivo de certificado raíz correspondiente (Section 32.19.1). Alternativamente, se puede utilizar el pool de CA del sistema, tal como lo define la implementación de SSL, mediante sslrootcert=system; en este caso, se fuerza sslmode=verify-full por seguridad, ya que generalmente es trivial obtener certificados firmados por una CA pública.

Para evitar que se produzca la suplantación del servidor cuando utilizas la autenticación por contraseña scram-sha-256 a través de una red, debes asegurarte de conectarte al servidor utilizando SSL y con uno de los métodos contra la suplantación descritos en el párrafo anterior. Además, la implementación de SCRAM en libpq no puede proteger todo el intercambio de autenticación, pero el uso del parámetro de conexión channel_binding=require proporciona una mitigación contra la suplantación del servidor. Un atacante que utilice un servidor falso para interceptar un intercambio SCRAM puede utilizar análisis fuera de línea para determinar potencialmente la contraseña con hash del cliente.

Para evitar la suplantación con GSSAPI, el servidor debe estar configurado para aceptar únicamente conexiones hostgssenc (Section 20.1) y utilizar la autenticación gss con ellas. El cliente TCP debe conectarse utilizando gssencmode=require.