sql >> Base de Datos >  >> RDS >> PostgreSQL

Auditoría de PostgreSQL usando pgAudit

La auditoría en tecnología de la información (TI) es un proceso de examen de la infraestructura de TI de una organización para garantizar el cumplimiento de los requisitos impuestos por estándares reconocidos o políticas establecidas. Las reglas de protección de datos, como las nuevas regulaciones GDPR, son cada vez más estrictas para proteger los datos de los usuarios, por lo que es importante que las auditorías de su base de datos estén configuradas correctamente para garantizar que tanto su aplicación como los datos de los usuarios estén protegidos contra vulnerabilidades. En esta publicación de blog, hablaremos sobre pgAudit, una herramienta que genera los registros de auditoría necesarios para facilitar la auditoría de PostgreSQL.

¿Qué es pgAudit?

La extensión de auditoría de PostgreSQL, pgAudit, es una extensión de código abierto que registra los eventos en una base de datos de PostgreSQL en un registro de auditoría detallado. Utiliza la función de registro nativo de PostgreSQL, por lo que los registros de auditoría serán parte de los registros de PostgreSQL. La extensión se basa en el proyecto 2ndQuadrant pgAudit creado por Simon Riggs, Abhijit Menon-Sen e Ian Barwick, e incluye mejoras de David Steele de Crunchy Data.

¿Por qué pgAudit sobre log_statement=all?

Podemos registrar todas las declaraciones en PostgreSQL simplemente configurando log_statement=all . Entonces, ¿por qué usar pgAudit? El registro básico de declaraciones (usando log_statement ) solo enumerará las operaciones realizadas contra la base de datos. No proporcionará la capacidad de filtrar operaciones y los registros no tendrán el formato adecuado requerido para la auditoría. pgAudit también proporciona granularidad para registrar clases específicas de declaraciones como READ (SELECT y COPY ), WRITE (INSERT , UPDATE , DELETE , etc.), DDL etc. Además, proporciona auditoría a nivel de objeto donde solo se registrarán operaciones en relaciones específicas.

Otra ventaja de pgAudit sobre el registro básico de sentencias es que proporciona los detalles de la operación realizada en lugar de simplemente registrar la operación solicitada. Por ejemplo, considere ejecutar el bloque de código anónimo usando una instrucción DO.

DO $$
BEGIN
	EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
END $$;

El registro básico de sentencias dará como resultado:

2020-12-20 23:40:11 UTC:157.230.232.139(53064):sgpostgres@test:[9091]: LOG:  statement: DO $$
        BEGIN
            EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
        END $$;

pgAudit registrará la misma operación que:

2020-12-20 23:40:11 UTC:157.230.232.139(53064):sgpostgres@test:[9091]: LOG:  AUDIT: SESSION,4,1,FUNCTION,DO,,,"DO $$
        BEGIN
            EXECUTE 'CREATE TABLE import' || 'ant_table (id INT)';
        END $$;",<not logged>
2020-12-20 23:40:11 UTC:157.230.232.139(53064):sgpostgres@test:[9091]: LOG:  AUDIT: SESSION,4,2,DDL,CREATE TABLE,TABLE,public.important_table,CREATE TABLE important_table (id INT),<not logged>

Lo anterior indica claramente la funcionalidad pgAudit que registra la operación y sus partes internas con resultados estructurados que facilitan la búsqueda.

Cómo auditar PostgreSQL usando pgAuditClick To Tweet

¿Cómo instalar pgAudit?

pgAudit es una extensión que está disponible para descargar desde el repositorio de PostgreSQL, o puede compilarse y construirse desde la fuente. Como primer paso, el paquete debe descargarse e instalarse en la máquina que ejecuta PostgreSQL (este paquete de extensión está preinstalado en todas las implementaciones de ScaleGrid PostgreSQL).

Una vez instalado, debe cargarse en PostgreSQL. Esto se logra agregando pgaudit a las shared_preload_libraries parámetro de configuración. Se requiere reiniciar PostgreSQL para que este cambio de configuración sea efectivo. El siguiente paso es habilitar la extensión en la base de datos ejecutando CREATE EXTENSION pgaudit .

Ahora que la extensión está lista, debemos asegurarnos de establecer los parámetros de configuración para que la extensión comience a iniciar sesión. Esto puede ser tan simple como configurar el parámetro pgaudit.log para valorar all y pgAudit comenzará a iniciar sesión en session modo.

Ahora que sabemos cómo instalar y habilitar pgAudit, analicemos los dos modos de registro de auditoría que ofrece, sesión y objeto.

Registro de auditoría de sesión

En el modo de sesión, pgAudit registrará todas las operaciones realizadas por un usuario. Configuración de pgaudit.log parámetro a cualquiera de los valores definidos, excepto NONE , habilitará el registro de auditoría de sesión. El pgaudit.log El parámetro especifica las clases de instrucciones que se registrarán en el modo de sesión. Los valores posibles son:READ , WRITE , FUNCTION , FUNCTION , DDL , MISC , MISC_SET , ALL y NONE .

Configuración de pgaudit.log parámetro a ALL registrará todas las declaraciones. El parámetro puede aceptar varias clases utilizando una lista separada por comas y las clases específicas se pueden excluir con un signo –. Por ejemplo, si desea registrar todas las declaraciones excepto MISC clase, el valor de pgaudit.log será ALL, -MISC, -MISC_SET . También puede habilitar pgAudit para crear una entrada de registro separada para cada referencia de relación en una declaración configurando pgaudit.log_relation para activar.

Considere un ejemplo de cómo crear una tabla. La declaración SQL sería:

CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));

Las entradas de registro de auditoría correspondientes son:

2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG:  AUDIT: SESSION,5,1,DDL,CREATE SEQUENCE,SEQUENCE,public.persons_id_seq,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged>
2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG:  AUDIT: SESSION,5,1,DDL,CREATE TABLE,TABLE,public.persons,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged>
2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG:  AUDIT: SESSION,5,1,DDL,CREATE INDEX,INDEX,public.persons_pkey,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged>
2020-12-21 00:00:11 UTC:157.230.232.139(53178):sgpostgres@test:[11514]: LOG:  AUDIT: SESSION,5,1,DDL,ALTER SEQUENCE,SEQUENCE,public.persons_id_seq,"CREATE TABLE persons(ID SERIAL PRIMARY KEY, LNAME varchar(20), FNAME varchar(20));",<not logged>

Registro de auditoría de objetos

En casos particulares, puede ser necesario auditar solo un conjunto específico de relaciones. En tales casos, el uso del modo de sesión solo dará como resultado una cantidad innecesariamente grande de registros de auditoría que no corresponden a las relaciones requeridas. El modo de objeto es especialmente adecuado para este propósito y solo puede auditar un conjunto específico de relaciones.

El registro de auditoría de objetos se logra mediante los roles de PostgreSQL. Se puede crear un rol y asignarle los permisos para acceder solo a un conjunto específico de relaciones. Este rol debe especificarse en el parámetro de configuración pgaudit.role . El modo de objeto solo admite SELECT , INSERT , UPDATE y DELETE declaraciones. Las clases de declaraciones que se registran dependen de los permisos otorgados al rol. Por ejemplo, si el rol tiene permisos para realizar solo SELECT , entonces solo SELECT se registrarán las declaraciones.

A continuación se muestra un ejemplo de registro de auditoría de objetos:

Cree un rol y otorgue solo SELECT permisos Establecer el pgaudit.role a ese rol y ejecute SELECT Sentencia SQL:

CREATE ROLE audit_person;
GRANT SELECT ON persons TO audit_person;
SET pgaudit.role = 'audit_person';
SELECT * FROM persons WHERE ID=404;

La declaración de selección anterior se registrará como:

2020-12-21 00:27:09 UTC:157.230.232.139(54900):sgpostgres@test:[21835]: LOG:  AUDIT: OBJECT,10,1,READ,SELECT,TABLE,public.persons,select * from persons where ID=404;,<not logged>

¿Interesado en una solución PostgreSQL totalmente administrada?

Para obtener más información sobre cómo un proveedor de DBaaS como ScaleGrid puede ayudarlo a administrar sus bases de datos de PostgreSQL, consulte nuestra página de PostgreSQL. Vea cómo ScaleGrid puede permitirle concentrarse más en desarrollar su producto y menos en administrar bases de datos.

¿Cómo interpretar la entrada del registro de auditoría?

Hasta ahora, hemos proporcionado detalles sobre cómo se ve la entrada del registro de auditoría, ahora echemos un vistazo al formato de la entrada del registro de auditoría. Cada entrada comienza con log_line_prefix mencionado para el registro de PostgreSQL, y luego el resto de la salida estará en formato CSV. Considere la siguiente entrada de registro de auditoría simple:

2020-12-21 00:27:09 UTC:157.230.232.139(54900):sgpostgres@test:[21835]: LOG:  AUDIT: OBJECT,10,1,READ,SELECT,TABLE,public.persons,select * from persons where ID=404;,<not logged>

En la entrada anterior, el valor

2020-12-21 00:27:09 UTC:157.230.232.139(54900):sgpostgres@test:[21835]: 

es del formato log_line_prefix %t:%r:%u@%d:[%p]: . El contenido de la entrada de auditoría comienza desde LOG: AUDIT: valor y sigue el formato CSV. El formato del valor es de la forma:

AUDIT_TYPE,STATEMENT_ID,SUBSTATEMENT_ID,CLASS,COMMAND,OBJECT_TYPE,OBJECT_NAME,STATEMENT,PARAMETER

Echemos un vistazo a cada uno de los campos uno por uno:

Campo Descripción Valor de entrada de auditoría de ejemplo
AUDIT_TYPE Indica el modo de auditoría:SESIÓN u OBJETO OBJETO
STATEMENT_ID Identificador de declaración único para cada sesión 10
SUBSTATEMENT_ID Un identificador para cada declaración secundaria dentro de la declaración principal 1
CLASE Indica la clase de declaraciones como READ, WRITE, etc. que son valores definidos para el parámetro pgaudit.log. LEER
COMANDO El comando utilizado en la instrucción SQL SELECCIONAR
TIPO_OBJETO Puede ser TABLA, ÍNDICE, VISTA, etc. TABLA
NOMBRE_OBJETO El nombre completo del objeto público.personas
DECLARACIÓN La declaración real ejecutada seleccione * de personas donde ID=404;
PARÁMETRO Cuando pgaudit.log_parameter se establece en verdadero, el CSV citado de los parámetros aparece en la lista si está presente, o "ninguno" si no hay parámetros. Cuando el parámetro pgaudit.log_parameter no está configurado, el valor será ""

Inferencia

pgAudit, con todas sus capacidades, simplifica el proceso de auditoría al generar el registro de seguimiento de auditoría. Aunque hay algunas advertencias, como el registro de objetos renombrados con el mismo nombre, sigue siendo una herramienta robusta que proporciona la funcionalidad requerida. Sin embargo, la información de auditoría escrita en los registros puede no ser solo ideal para el proceso de auditoría:el proceso de auditoría es aún mejor cuando esos registros se pueden convertir en un esquema de base de datos y los datos de auditoría se pueden cargar en la base de datos para que pueda consultar fácilmente el información. Aquí es donde el Analizador de registro de auditoría de PostgreSQL (pgAudit Analyze) es útil. Para obtener más información, consulte las páginas de github de pgAudit y pgAudit Analyze.