
Extensión de auditoría de PostgreSQL
La Extensión de Auditoría de PostgreSQL (pgAudit) proporciona un registro de auditoría detallado de sesión y/u objeto a través del sistema de registro estándar de PostgreSQL.
El objetivo de pgAudit es ofrecer a los usuarios de PostgreSQL la capacidad de generar registros de auditoría que a menudo se requieren para cumplir con certificaciones gubernamentales, financieras o ISO.
Una auditoría es una inspección oficial de las cuentas de un individuo u organización, generalmente realizada por un organismo independiente. La información recopilada por pgAudit se denomina correctamente pista de auditoría o registro de auditoría. En esta documentación se utiliza el término registro de auditoría.
El registro básico de sentencias puede ser proporcionado por la facilidad de registro estándar con log_statement = all. Esto es aceptable para monitoreo y otros usos, pero no proporciona el nivel de detalle generalmente requerido para una auditoría. No basta con tener una lista de todas las operaciones realizadas contra la base de datos. También debe ser posible encontrar sentencias particulares que sean de interés para un auditor. La facilidad de registro estándar muestra lo que el usuario solicitó, mientras que pgAudit se enfoca en los detalles de lo que sucedió mientras la base de datos satisfacía la solicitud.
Por ejemplo, un auditor puede querer verificar que una tabla en particular fue creada dentro de una ventana de mantenimiento documentada. Esto podría parecer un trabajo sencillo para grep, pero ¿qué sucede si se presenta algo como este ejemplo (intencionalmente ofuscado)?
DO $$
BEGIN
EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
END $$;
El registro estándar le dará esto:
LOG: statement: DO $$
BEGIN
EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
END $$;
Parece que encontrar la tabla de interés puede requerir algo de conocimiento del código en los casos en que las tablas se crean dinámicamente. Esto no es ideal ya que sería preferible buscar simplemente por el nombre de la tabla. Aquí es donde entra pgAudit. Para la misma entrada, producirá esta salida en el registro:
AUDIT: SESSION,33,1,FUNCTION,DO,,,"DO $$
BEGIN
EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
END $$;"
AUDIT: SESSION,33,2,DDL,CREATE TABLE,TABLE,public.important_table,CREATE TABLE important_table (id INT)
No solo se registra el bloque DO, sino que la sub-sentencia 2 contiene el texto completo de CREATE TABLE con el tipo de sentencia, tipo de objeto y nombre completamente calificado para facilitar las búsquedas.
Al registrar sentencias SELECT y DML, pgAudit se puede configurar para registrar una entrada separada para cada relación referenciada en una sentencia. No se requiere análisis para encontrar todas las sentencias que tocan una tabla en particular. De hecho, el objetivo es que el texto de la sentencia se proporcione principalmente para análisis forense profundo y no debería ser necesario para una auditoría.
Dependiendo de la configuración, es posible que pgAudit genere un volumen enorme de registros. Tenga cuidado de determinar exactamente qué necesita ser auditado en su entorno para evitar registrar demasiado.
Por ejemplo, cuando se trabaja en un entorno OLAP, probablemente no sea prudente registrar auditorías de inserciones en una tabla de hechos grande. El tamaño del archivo de registro probablemente será varias veces el tamaño real de los datos de las inserciones, ya que el archivo de registro se expresa como texto. Dado que los registros generalmente se almacenan con el sistema operativo, esto puede llevar a que el espacio en disco se agote muy rápidamente. En los casos en que no sea posible limitar el registro de auditoría a ciertas tablas, asegúrese de evaluar el impacto en el rendimiento durante las pruebas y asigne suficiente espacio en el volumen de registros. Esto también puede ser cierto para entornos OLTP. Incluso si el volumen de inserción no es tan alto, el impacto en el rendimiento del registro de auditoría aún puede afectar notablemente la latencia.
Para limitar la cantidad de relaciones auditadas registradas para sentencias SELECT y DML, considere usar el registro de auditoría de objetos (consulte Auditoría de objetos). El registro de auditoría de objetos permite seleccionar las relaciones a registrar, lo que permite reducir el volumen total de registros. Sin embargo, cuando se agregan nuevas relaciones, deben agregarse explícitamente al registro de auditoría de objetos. Una solución programática donde se excluyen del registro tablas específicas y se incluyen todas las demás podría ser una buena opción en este caso.
pgAudit es compatible con PostgreSQL 14 o superior.
Para admitir la nueva funcionalidad introducida en cada versión de PostgreSQL, pgAudit mantiene una rama separada para cada versión principal de PostgreSQL (actualmente PostgreSQL 14 - 19) que se mantendrá de manera similar al proyecto PostgreSQL.
Aparte de las correcciones de errores, no se permite desarrollo adicional para las ramas estables. El nuevo desarrollo, si lo hay, será estrictamente para la próxima versión principal no publicada de PostgreSQL.
Las versiones de pgAudit se relacionan con las versiones principales de PostgreSQL de la siguiente manera:
pgAudit v19.X está diseñado para ser compatible con PostgreSQL 19.
pgAudit v18.X está diseñado para ser compatible con PostgreSQL 18.
pgAudit v17.X está diseñado para ser compatible con PostgreSQL 17.
pgAudit v16.X está diseñado para ser compatible con PostgreSQL 16.
pgAudit v1.7.X está diseñado para ser compatible con PostgreSQL 15.
pgAudit v1.6.X está diseñado para ser compatible con PostgreSQL 14.
pgAudit se puede compilar frente a una copia instalada de PostgreSQL con paquetes de desarrollo usando PGXS. Las siguientes instrucciones deberían funcionar en la mayoría de los sistemas operativos tipo Unix.
Clone la extensión pgAudit:
git clone https://github.com/pgaudit/pgaudit.git
Cambie al directorio pgAudit:
cd pgaudit
Obtenga la rama REL_19_STABLE (tenga en cuenta que la rama estable puede no existir para versiones no publicadas de PostgreSQL):
git checkout REL_19_STABLE
Construya e instale pgAudit:
make install USE_PGXS=1 PG_CONFIG=/usr/pgsql-19/bin/pg_config
Las instrucciones para pruebas y desarrollo se pueden encontrar en test.
Los ajustes solo pueden ser modificados por un superusuario. Permitir que los usuarios normales cambien su configuración anularía el propósito de un registro de auditoría.
Los ajustes se pueden especificar globalmente (en postgresql.conf o usando ALTER SYSTEM ... SET), a nivel de base de datos (usando ALTER DATABASE ... SET) o a nivel de rol (usando ALTER ROLE ... SET). Tenga en cuenta que los ajustes no se heredan a través de la herencia de roles normal y SET ROLE no alterará la configuración de pgAudit de un usuario. Esta es una limitación del sistema de roles y no inherente a pgAudit.
La extensión pgAudit debe cargarse en shared_preload_libraries. De lo contrario, se generará un error al cargar y no se producirá ningún registro de auditoría.
Además, se debe llamar a CREATE EXTENSION pgaudit antes de que se establezca pgaudit.log para garantizar la funcionalidad adecuada de pgaudit. La extensión instala disparadores de eventos que agregan auditoría adicional para DDL. pgAudit funcionará sin la extensión instalada, pero las sentencias DDL no tendrán información sobre el tipo y nombre del objeto.