PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como auditar um banco de dados PostgreSQL

A auditoria é uma boa maneira de manter seus dados o mais seguros possível e saber o que está acontecendo em seus bancos de dados. Também é necessário para muitos regulamentos ou padrões de segurança, como PCI - Payment Card Industry. Esta não é uma exceção para seu banco de dados PostgreSQL.

O PostgreSQL conquistou uma forte reputação por sua arquitetura comprovada, confiabilidade, integridade de dados, conjunto robusto de recursos, extensibilidade e dedicação da comunidade de código aberto por trás do software para fornecer soluções inovadoras e de desempenho consistentes.

Dito isso, deveria ser uma opção auditar um banco de dados PostgreSQL, certo? Bem, a resposta é sim. Neste blog, veremos o que é a extensão pgAudit e como instalá-la e usá-la em seu banco de dados PostgreSQL.

O que é pgAudit?

A Extensão de Auditoria do PostgreSQL (pgAudit) fornece registro detalhado de auditoria de sessão e objeto por meio do recurso de registro padrão do PostgreSQL.

O log de instrução básico pode ser fornecido pelo recurso de log padrão com log_statement =all. Isso é aceitável para monitoramento e outros usos básicos, mas não fornece o nível de detalhes geralmente necessário para auditoria. Não é suficiente ter uma lista de todas as operações realizadas no banco de dados. Também deve ser possível encontrar declarações particulares que sejam de interesse de um auditor. O recurso de registro padrão mostra o que o usuário solicitou, enquanto o pgAudit se concentra nos detalhes do que aconteceu enquanto o banco de dados atendeu à solicitação.

Como instalar o pgAudit no PostgreSQL

Para este exemplo, usaremos uma instalação do CentOS 7. Neste ponto, supomos que você tenha seu banco de dados PostgreSQL instalado, caso contrário, você pode seguir este post do blog para instalá-lo e executá-lo de maneira fácil usando o ClusterControl.

Agora, você deve ter o repositório PostgreSQL em seu SO, algo assim:

$ 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

Se você verificar os pacotes pgaudit disponíveis, deverá ter:

pgaudit14_12.x86_64 : PostgreSQL Audit Extension

Então, vamos instalá-lo:

$ yum install pgaudit14_12

Agora, você precisará adicioná-lo ao arquivo de configuração postgresql.conf, localizado por padrão em /var/lib/pgsql/12/data/postgresql.conf, e reiniciar o serviço PostgreSQL para aplicar o troco.

shared_preload_libraries = 'pgaudit, pg_stat_statements'

Após reiniciar seu serviço de banco de dados, você precisa criar a extensão:

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)

Configuração do pgAudit

Você pode verificar a configuração atual executando a seguinte 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)

Vamos ver esses parâmetros um por um.

  • pgaudit.log :Especifica quais classes de instruções serão registradas pelo log de auditoria de sessão. O padrão é nenhum. Os valores possíveis são:
    • LER:SELECT e COPY quando a fonte for uma relação ou uma consulta.
    • WRITE:INSERT, UPDATE, DELETE, TRUNCATE e COPY quando o destino for uma relação.
    • FUNCTION:chamadas de função e blocos DO.
    • ROLE:Declarações relacionadas a funções e privilégios:GRANT, REVOKE, CREATE/ALTER/DROP ROLE.
    • DDL:todos os DDL que não estão incluídos na classe ROLE.
    • MISC:Comandos diversos, ex. DESCARTAR, BUSCAR, PONTO DE VERIFICAÇÃO, VÁCUAR, DEFINIR.
    • MISC_SET:Comandos SET diversos, ex. DEFINIR PAPEL.
    • TODOS:inclua todos os itens acima.
  • pgaudit.log_catalog :especifica que o log de sessão deve ser habilitado no caso de todas as relações em uma instrução estarem em pg_catalog. Desabilitar esta configuração reduzirá o ruído no log de ferramentas como psql e PgAdmin que consultam muito o catálogo. O padrão é ativado.
  • pgaudit.log_client :Especifica se as mensagens de log serão visíveis para um processo cliente, como psql. Essa configuração geralmente deve ser deixada desativada, mas pode ser útil para depuração ou outros propósitos. O padrão é desativado.
  • pgaudit.log_level :especifica o nível de log que será usado para entradas de log. Essa configuração é usada para testes de regressão e também pode ser útil para usuários finais para testes ou outros fins. O padrão é log.
  • pgaudit.log_parameter :especifica que o log de auditoria deve incluir os parâmetros que foram passados ​​com a instrução. Quando os parâmetros estiverem presentes, eles serão incluídos no formato CSV após o texto da instrução. O padrão é desativado.
  • pgaudit.log_relation :especifica se o log de auditoria de sessão deve criar uma entrada de log separada para cada relação (TABLE, VIEW, etc.) referenciada em uma instrução SELECT ou DML. Este é um atalho útil para log exaustivo sem usar log de auditoria de objeto. O padrão é desativado.
  • pgaudit.log_statement_once :especifica se o log incluirá o texto e os parâmetros da instrução com a primeira entrada de log para uma combinação de instrução/substatement ou com cada entrada. Desabilitar essa configuração resultará em um log menos detalhado, mas pode tornar mais difícil determinar a instrução que gerou uma entrada de log, embora o par instrução/substatement junto com o ID do processo seja suficiente para identificar o texto da instrução registrado com uma entrada anterior. O padrão é desativado.
  • pgaudit.role :especifica a função de mestre a ser usada para log de auditoria de objeto. Várias funções de auditoria podem ser definidas concedendo-as à função mestre. Isso permite que vários grupos sejam responsáveis ​​por diferentes aspectos do registro de auditoria. Não há padrão.

Uso do pgAudit

Agora que revisamos os parâmetros de configuração, vamos ver um exemplo de como usá-lo no mundo real.

Para auditar todas as leituras, gravações e consultas DDL, execute:

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

SET

E então, execute as seguintes frases:

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)

Se você verificar o arquivo de log do PostgreSQL, verá isto:

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>

Claro, este é um exemplo básico. Você pode usar os parâmetros de configuração descritos na seção anterior para se adequar ao seu negócio.

Ativando pgAudit com ClusterControl

Em vez de instalar e habilitar o pgAudit manualmente, outra opção é usar a CLI do ClusterControl para fazer o trabalho para você. Para isso, você pode executar o seguinte comando do seu servidor ClusterControl:

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

Onde ID é o ID do cluster PostgreSQL.

Enquanto estiver em execução, você pode monitorar o status verificando o trabalho ClusterControl. Primeiro, você precisará do ID do trabalho, que pode ser obtido na lista de trabalhos:

$ s9s job --list

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

Agora, verifique os detalhes do trabalho:

$ 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 ação exigirá uma reinicialização do serviço de banco de dados que será executada pelo ClusterControl na mesma tarefa. Após reiniciá-lo, a extensão pgAudit está habilitada e pronta para uso:

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)

É isso! Agora você pode configurar e usar o pgAudit da mesma forma que mostramos anteriormente.

Conclusão

A auditoria é necessária para muitas regulamentações de segurança e também é útil se você quiser saber o que aconteceu em seu banco de dados, quando e quem foi responsável por isso.

Neste blog, falamos sobre a extensão pgAudit PostgreSQL como uma boa maneira de auditar seus bancos de dados PostgreSQL e também mostramos como implementá-la manualmente e usando a CLI do ClusterControl.

Tenha em mente que, dependendo da configuração, é possível que o pgAudit gere um enorme volume de dados. Portanto, você deve ter cuidado para determinar o que precisa auditar e por quanto tempo.