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

Cómo auditar una base de datos PostgreSQL

La auditoría es una buena forma de mantener sus datos lo más seguros posible y de saber qué sucede en sus bases de datos. También se requiere para muchas normas o estándares de seguridad, como PCI - Industria de tarjetas de pago. Esta no es una excepción para su base de datos PostgreSQL.

PostgreSQL se ha ganado una sólida reputación por su arquitectura comprobada, confiabilidad, integridad de datos, conjunto de características sólidas, extensibilidad y la dedicación de la comunidad de código abierto detrás del software para ofrecer soluciones innovadoras y de rendimiento constante.

Dicho esto, debería ser una opción para auditar una base de datos PostgreSQL, ¿verdad? Bueno, la respuesta es sí. En este blog, veremos qué es la extensión pgAudit y cómo instalarla y usarla en su base de datos PostgreSQL.

¿Qué es pgAudit?

La Extensión de Auditoría de PostgreSQL (pgAudit) proporciona un registro detallado de sesión y auditoría de objetos a través de la función de registro estándar de PostgreSQL.

El registro de declaraciones básico puede proporcionarse mediante la función de registro estándar con log_statement =all. Esto es aceptable para el monitoreo y otros usos básicos, pero no brinda el nivel de detalle que generalmente se requiere para la auditoría. No es suficiente tener una lista de todas las operaciones realizadas contra la base de datos. También debe ser posible encontrar declaraciones particulares que sean de interés para un auditor. La función de registro estándar muestra lo que solicitó el usuario, mientras que pgAudit se enfoca en los detalles de lo que sucedió mientras la base de datos satisfacía la solicitud.

Cómo instalar pgAudit en PostgreSQL

Para este ejemplo, usaremos una instalación de CentOS 7. En este punto, suponemos que tiene instalada su base de datos PostgreSQL, de lo contrario, puede seguir esta publicación de blog para tenerla en funcionamiento de una manera fácil usando ClusterControl.

Ahora, debe tener el repositorio de PostgreSQL en su sistema operativo, algo como esto:

$ cat /etc/yum.repos.d/postgresql.repo

# PGDG Red Hat Enterprise Linux / CentOS stable common repository for all PostgreSQL versions

[pgdg-common]

name=PostgreSQL common for RHEL/CentOS $releasever - $basearch

baseurl=http://download.postgresql.org/pub/repos/yum/common/redhat/rhel-$releasever-$basearch

enabled=1

gpgcheck=0

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG

# PGDG Red Hat Enterprise Linux / CentOS stable repositories:

[pgdg]

name=PostgreSQL 12 $releasever - $basearch

#baseurl=http://yum.postgresql.org/12/redhat/rhel-$releasever-$basearch

baseurl=http://download.postgresql.org/pub/repos/yum/12/redhat/rhel-$releasever-$basearch/

enabled=1

gpgcheck=0

[pgdg-source]

name=PostgreSQL 12 $releasever - $basearch - Source

baseurl=http://yum.postgresql.org/srpms/12/redhat/rhel-$releasever-$basearch

enabled=0

gpgcheck=0

Si revisa los paquetes de pgaudit disponibles, debería tener:

pgaudit14_12.x86_64 : PostgreSQL Audit Extension

Vamos a instalarlo:

$ yum install pgaudit14_12

Ahora, deberá agregarlo en el archivo de configuración postgresql.conf, ubicado de forma predeterminada en /var/lib/pgsql/12/data/postgresql.conf, y reiniciar el servicio PostgreSQL para aplicar el cambio.

shared_preload_libraries = 'pgaudit, pg_stat_statements'

Después de reiniciar su servicio de base de datos, necesita crear la extensión:

postgres=# CREATE EXTENSION pgaudit;

CREATE EXTENSION

And now, you can run the following query to check the new extension created:

postgres=# SELECT * FROM pg_available_extensions WHERE name LIKE '%audit%';

  name   | default_version | installed_version |             comment

---------+-----------------+-------------------+---------------------------------

 pgaudit | 1.4.1           | 1.4.1             | provides auditing functionality

(1 row)

Configuración pgAudit

Puede verificar la configuración actual ejecutando la siguiente consulta:

postgres=# SELECT name,setting FROM pg_settings WHERE name LIKE 'pgaudit%';

            name            | setting

----------------------------+---------

 pgaudit.log                | none

 pgaudit.log_catalog        | on

 pgaudit.log_client         | off

 pgaudit.log_level          | log

 pgaudit.log_parameter      | off

 pgaudit.log_relation       | off

 pgaudit.log_statement_once | off

 pgaudit.role               |

(8 rows)

Veamos estos parámetros uno por uno.

  • pgaudit.log :especifica qué clases de declaraciones se registrarán mediante el registro de auditoría de sesión. El valor predeterminado es ninguno. Los valores posibles son:
    • LEER:SELECCIONAR y COPIAR cuando la fuente es una relación o una consulta.
    • ESCRIBA:INSERTAR, ACTUALIZAR, ELIMINAR, TRUNCAR y COPIAR cuando el destino es una relación.
    • FUNCIÓN:llamadas a funciones y bloques DO.
    • ROLE:Declaraciones relacionadas con roles y privilegios:GRANT, REVOKE, CREATE/ALTER/DROP ROLE.
    • DDL:Todo DDL que no está incluido en la clase ROLE.
    • MISC:Comandos misceláneos, p. DESECHAR, RECOGER, PUNTO DE CONTROL, VACÍO, FIJAR.
    • MISC_SET:Varios comandos SET, p. ESTABLECER ROL.
    • TODOS:incluye todo lo anterior.
  • pgaudit.log_catalog :especifica que el registro de sesión debe habilitarse en el caso de que todas las relaciones en una declaración estén en pg_catalog. Deshabilitar esta configuración reducirá el ruido en el registro de herramientas como psql y PgAdmin que consultan mucho el catálogo. El valor predeterminado es activado.
  • pgaudit.log_client :especifica si los mensajes de registro serán visibles para un proceso de cliente como psql. Por lo general, esta configuración debe dejarse deshabilitada, pero puede ser útil para la depuración u otros fines. El valor predeterminado es desactivado.
  • pgaudit.log_level :especifica el nivel de registro que se utilizará para las entradas de registro. Esta configuración se usa para pruebas de regresión y también puede ser útil para los usuarios finales para realizar pruebas u otros fines. El valor predeterminado es registro.
  • pgaudit.log_parameter :especifica que el registro de auditoría debe incluir los parámetros que se pasaron con la declaración. Cuando los parámetros están presentes, se incluirán en formato CSV después del texto de la declaración. El valor predeterminado es desactivado.
  • pgaudit.log_relation :especifica si el registro de auditoría de sesión debe crear una entrada de registro independiente para cada relación (TABLA, VISTA, etc.) a la que se hace referencia en una instrucción SELECT o DML. Este es un atajo útil para un registro exhaustivo sin utilizar el registro de auditoría de objetos. El valor predeterminado es desactivado.
  • pgaudit.log_statement_once :Especifica si el registro incluirá el texto de la declaración y los parámetros con la primera entrada de registro para una combinación de declaración/subdeclaración o con cada entrada. Deshabilitar esta configuración dará como resultado un registro menos detallado, pero puede dificultar la determinación de la declaración que generó una entrada de registro, aunque el par de declaración/subdeclaración junto con la identificación del proceso debería ser suficiente para identificar el texto de la declaración registrada con una entrada anterior. El valor predeterminado es desactivado.
  • pgaudit.role :especifica la función principal que se usará para el registro de auditoría de objetos. Se pueden definir múltiples roles de auditoría otorgándoselos al rol maestro. Esto permite que varios grupos estén a cargo de diferentes aspectos del registro de auditoría. No hay ningún valor predeterminado.

Uso de pgAudit

Ahora que hemos revisado los parámetros de configuración, veamos un ejemplo de cómo usarlo en el mundo real.

Para auditar todas las lecturas, escrituras y consultas DDL, ejecute:

test1=# set pgaudit.log = 'read,write,ddl';

SET

Y luego, ejecuta las siguientes oraciones:

test1=# CREATE TABLE table1 (id int, name text);

CREATE TABLE

test1=# INSERT INTO table1 (id, name) values (1, 'name1');

INSERT 0 1

test1=# INSERT INTO table1 (id, name) values (2, 'name2');

INSERT 0 1

test1=# INSERT INTO table1 (id, name) values (3, 'name3');

INSERT 0 1

test1=# SELECT * FROM table1;

 id | name

----+-------

  1 | name1

  2 | name2

  3 | name3

(3 rows)

Si revisa el archivo de registro de PostgreSQL, verá esto:

2020-11-20 19:17:13.848 UTC [25142] LOG:  AUDIT: SESSION,3,1,DDL,CREATE TABLE,,,"CREATE TABLE table1 (id int, name text);",<not logged>

2020-11-20 19:18:45.334 UTC [25142] LOG:  AUDIT: SESSION,4,1,WRITE,INSERT,,,"INSERT INTO table1 (id, name) values (1, 'name1');",<not logged>

2020-11-20 19:18:52.332 UTC [25142] LOG:  AUDIT: SESSION,5,1,WRITE,INSERT,,,"INSERT INTO table1 (id, name) values (2, 'name2');",<not logged>

2020-11-20 19:18:58.103 UTC [25142] LOG:  AUDIT: SESSION,6,1,WRITE,INSERT,,,"INSERT INTO table1 (id, name) values (3, 'name3');",<not logged>

2020-11-20 19:19:07.261 UTC [25142] LOG:  AUDIT: SESSION,7,1,READ,SELECT,,,SELECT * FROM table1;,<not logged>

Por supuesto, este es un ejemplo básico. Puede utilizar los parámetros de configuración descritos en la sección anterior para adaptarse a su negocio.

Habilitación de pgAudit con ClusterControl

En lugar de instalar y habilitar pgAudit manualmente, otra opción es usar la CLI de ClusterControl para que haga el trabajo por usted. Para ello, puede ejecutar el siguiente comando desde su servidor ClusterControl:

$ s9s cluster --setup-audit-logging --cluster-id=ID

Donde ID es el ID del clúster de PostgreSQL.

Mientras se ejecuta, puede monitorear el estado verificando el trabajo de ClusterControl. Primero, necesitará la identificación del trabajo, que puede obtener de la lista de trabajos:

$ s9s job --list

163  18 RUNNING  test_dba                     admins 19:41:45            90% Setup Audit Logging

Ahora, verifique los detalles del trabajo:

$ s9s job --log --job-id=163

Using SSH credentials from cluster.

Cluster ID is 18.

The username is 'root'.

10.10.10.129:5432: Configuring audit logging.

10.10.10.129:5432: Installing 'pgaudit14_12'.

10.10.10.129:5432: Setting pgaudit.log to ROLE,DDL,MISC.

Writing file '10.10.10.129:/var/lib/pgsql/12/data/postgresql.conf'.

10.10.10.129:5432: Restarting PostgreSQL node.

10.10.10.129: waiting for server to shut down.... done

server stopped

waiting for server to start....2020-11-20 19:41:52.069 UTC [25137] LOG:  pgaudit extension initialized

2020-11-20 19:41:52.069 UTC [25137] LOG:  starting PostgreSQL 12.5 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit

2020-11-20 19:41:52.069 UTC [25137] LOG:  listening on IPv4 address "0.0.0.0", port 5432

2020-11-20 19:41:52.069 UTC [25137] LOG:  listening on IPv6 address "::", port 5432

2020-11-20 19:41:52.080 UTC [25137] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"

2020-11-20 19:41:52.102 UTC [25137] LOG:  listening on Unix socket "/tmp/.s.PGSQL.5432"

2020-11-20 19:41:52.130 UTC [25137] LOG:  redirecting log output to logging collector process

2020-11-20 19:41:52.130 UTC [25137] HINT:  Future log output will appear in directory "log".

 done

server started

10.10.10.129:5432: Waiting for node to be accessible.

10.10.10.129:5432: pgaudit 1.4.1 is enabled.

Esta acción requerirá un reinicio del servicio de base de datos que será realizado por ClusterControl en la misma tarea. Después de reiniciarlo, la extensión pgAudit está habilitada y lista para usar:

postgres=# SELECT * FROM pg_available_extensions WHERE name LIKE '%audit%';

  name   | default_version | installed_version |             comment

---------+-----------------+-------------------+---------------------------------

 pgaudit | 1.4.1           | 1.4.1             | provides auditing functionality

(1 row)

¡Eso es todo! Ahora puede configurar y usar pgAudit de la misma manera que mostramos anteriormente.

Conclusión

La auditoría es necesaria para muchas normas de seguridad y también es útil si desea saber qué sucedió en su base de datos, cuándo y quién fue el responsable de ello.

En este blog, hablamos sobre la extensión pgAudit PostgreSQL como una buena manera de auditar sus bases de datos PostgreSQL, y también le mostramos cómo implementarla tanto manualmente como usando la CLI de ClusterControl.

Recuerde que, dependiendo de la configuración, es posible que pgAudit genere un enorme volumen de datos. Por lo tanto, debe tener cuidado para determinar qué necesita auditar y por cuánto tiempo.