Comment utiliser l'extension pgaudit pour auditer mon instance de base de données Amazon RDS qui exécute PostgreSQL ?

Date de la dernière mise à jour : 03/10/2019

Je souhaite auditer toutes mes bases de données, rôles, relations ou colonnes, et je souhaite fournir différents niveaux d'audit pour différents rôles. Comment configurer l'extension pgaudit pour différents niveaux de rôle sur une instance de base de données Amazon Relational Database Service (Amazon RDS) exécutant PostgreSQL ?

Brève description

Il existe différents paramètres que vous pouvez définir pour consigner l'activité sur votre instance de base de données PostgreSQL. Pour auditer différents bases de données, rôles, tables ou colonnes, vous pouvez utiliser l'extension pgaudit. Une fois que vous avez activé l'extension pgaudit, vous pouvez configurer le paramètre pgaudit.log pour auditer des bases de données, des rôles, des tables et des colonnes spécifiques.

Résolution

Activation de l'extension pgaudit sur une instance Amazon RDS exécutant PostgreSQL

1.    Créez un rôle de base de données spécifique appelé rds_pgaudit en exécutant la commande suivante :

CREATE ROLE rds_pgaudit;
CREATE ROLE

2.    Modifiez le groupe de paramètres de base de données associé à votre instance de base de données pour utiliser les bibliothèques partagées qui contiennent pgaudit et définissez le paramètre pgaudit.role. Ensuite, définissez pgaudit.role sur le rôle que vous avez créé, rds_pgaudit.

3.    Redémarrez l'instance afin que les modifications apportées au groupe de paramètres soient appliquées à l'instance.

4.    Vérifiez que pgaudit est initialisé en exécutant la commande suivante :

show shared_preload_libraries;
shared_preload_libraries 
--------------------------
rdsutils,pgaudit
(1 row)

5.    Créez l'extension pgaudit en exécutant la commande suivante :

CREATE EXTENSION pgaudit;
CREATE EXTENSION

6.    Vérifiez que pgaudit.role est défini sur rds_pgaudit en exécutant la commande suivante :

show pgaudit.role;
pgaudit.role 
------------------
rds_pgaudit

7.    Configurez le paramètre pgaudit.log de manière à auditer l'un des éléments suivants :

  • ALL audite les commandes suivantes.
  • MISC_SET audite diverses commandes SET, telles que SET ROLE.
  • MISC audite diverses commandes, telles que DISCARD, FETCH, CHECKPOINT, VACUUM, SET.
  • DDL audite tout langage de description de données (DDL) qui n'est pas inclus dans la classe ROLE.
  • ROLE audite les instructions liées aux rôles et privilèges, telles que GRANT, REVOKE, CREATE/ALTER/DROP ROLE.
  • FUNCTION audite les appels de fonction et les blocs DO.
  • WRITE audite INSERT, UPDATE, DELETE, TRUNCATE et COPY lorsque la destination est une relation.
  • READ audite SELECT et COPY lorsque la source est une relation ou une requête.

En fonction de ce que vous souhaitez auditer, définissez la valeur du paramètre pgaudit.log pour une base de données, un rôle ou une table.

Utilisation de l'extension pgaudit pour auditer les bases de données

1.    Pour définir la valeur du paramètre pgaudit.log pour une base de données, un rôle ou une table, définissez le paramètre pgaudit.log sur none au niveau du groupe de paramètres :

> show pgaudit.log
+---------------+
| pgaudit.log   |
|---------------|
| none          |
+---------------+
SHOW

2.    Exécutez la commande suivante pour remplacer la configuration système pour ce paramètre dans cette base de données uniquement :

ALTER DATABASE test_database set pgaudit.log='All';

Cela modifie la valeur du paramètre pgaudit.log en All, de sorte que test_database soit la seule base de données auditée dans l'instance de base de données RDS.

3.    Connectez-vous à test_database et exécutez la requête suivante :

select * from test_table;

La sortie du journal des erreurs est similaire à ce qui suit :

2019-06-25 19:21:35 UTC:192.0.2.7(39330):testpar@test_database:[21638]:LOG: AUDIT: SESSION,2,1,READ,SELECT,,,select * from test_table;,<not logged>

Utilisation de l'extension pgaudit pour auditer les rôles

De même que pour configurer le paramètre pgaudit.log au niveau de la base de données, le rôle est modifié pour avoir une autre valeur pour le paramètre pgaudit.log. Dans les exemples de commandes suivants, les rôles test1 et test2 sont modifiés pour avoir différentes configurations pgaudit.log.

1.    Définissez différentes valeurs pour le paramètre pgaudit.log pour test1 et test2 en exécutant les commandes suivantes :

ALTER ROLE test1 set pgaudit.log='All';
ALTER ROLE test2 set pgaudit.log='DDL';

2.    Vérifiez que les modifications sont effectuées au niveau du rôle en exécutant la requête suivante :

> select rolname,rolconfig from pg_roles where rolname in ('test1','
                  test2');
+-----------+----------------------+
| rolname   | rolconfig            |
|-----------+----------------------|
| test1     | [u'pgaudit.log=All'] |
| test2     | [u'pgaudit.log=DDL'] |
+-----------+----------------------+
SELECT 2
Time: 0.010s 

3.    Exécutez les requêtes suivantes pour test1 et test2 :

CREATE TABLE test_table (id int);
CREATE TABLE
select * from test_table;
id 
----
(0 rows)

La sortie du journal est similaire à ce qui suit pour test1 :

...
2019-06-26 14:51:12 UTC:192.0.2.7(44754):test1@postgres:[3547]:LOG:  
AUDIT: SESSION,1,1,DDL,CREATE TABLE,,,CREATE TABLE test_table (id 
int);,<not logged>

2019-06-26 14:51:18 UTC:192.0.2.7(44754):test1@postgres:[3547]:LOG:  
AUDIT: SESSION,2,1,READ,SELECT,,,select * from test_table;,<not 
logged>
...

La sortie du journal est similaire à ce qui suit pour test2 après l'exécution des mêmes requêtes :

...
2019-06-26 14:53:54 UTC:192.0.2.7(44772):test2@postgres:[5517]:LOG:  
AUDIT: SESSION,1,1,DDL,CREATE TABLE,,,CREATE TABLE test_table (id 
int);,<not logged>
... 

Remarque : il n'y a pas d'entrée d'audit pour la requête SELECT, car le paramètre pgaudit.log pour test2 est configuré sur DDL uniquement.

Utilisation de l'extension pgaudit pour auditer les tables

La configuration du paramètre pgaudit.log audite et journalise les instructions qui affectent une relation spécifique. Seules les commandes SELECT, INSERT, UPDATE, et DELETE peuvent être consignées par l'extension pgaudit. TRUNCATE n'est pas incluse dans la journalisation des audits d'objet. Si vous accordez au rôle rds_pgaudit l'accès à une opération (telle que SELECT, DELETE, INSERT, ou UPDATE) sur la table que vous souhaitez auditer, tout audit d'octroi journalise l'instruction correspondante. L'exemple suivant accorde au rôle rds_pgaudit l'accès à SELECT et DELETE, afin que toutes les instructions SELECT et DELETE sur test_table soient auditées.

1.    Accordez au rôle rds_pgaudit l'accès à SELECT et DELETE en exécutant la commande suivante :

grant select, delete on test_table to rds_pgaudit;

2.    Vérifiez que la journalisation d'audit est configurée correctement en exécutant une instruction DELETE sur test_table :

Time: 0.008s 
DELETE 1
>delete from test_table where pid=5050;

La sortie de l'instruction DELETE est similaire à ce qui suit :

2019-06-25 17:13:02 
UTC:192.0.2.7(41810):postgresql104saz@postgresql104saz:[24976]:LOG: 
AUDIT: OBJECT,3,1,WRITE,DELETE,TABLE,public.t1,delete from test_table where 
pid=5050,<not logged>

Utilisation de l'extension pgaudit pour auditer les colonnes

Vous pouvez également définir l'audit au niveau d'une colonne pour une table spécifique, par exemple, lorsque des données sensibles existent dans une seule colonne. Dans l'exemple de commande suivant, une table de paie est créée et la table contient une colonne sensible qui inclut des données de salaires qui doivent être auditées :

create table payroll
(    
    name text,
    salary text
);

1.    Accordez au rôle rds_pgaudit l'accès à SELECT sur la colonne de salaire afin que toute SELECT sur cette colonne soit auditée :

grant select (salary)  on payroll to rds_pgaudit;

2.    Utilisez SELECT sur toutes les colonnes de la table, y compris la colonne de salaire :

select * from payroll;

Dans l'exemple de sortie suivant, toute commande SELECT qui inclut la colonne de salaire est auditée. Cependant, un SELECT qui ne contient pas la colonne de salaire n'est pas audité.

2019-06-25
 18:25:02 
UTC:192.0.2.7(42056):postgresql104saz@postgresql104saz:[4118]:LOG: 
AUDIT: OBJECT,2,1,READ,SELECT,TABLE,public.payroll,select * from 
payroll,<not logged>

Cet article vous a-t-il été utile ?

Cette page peut-elle être améliorée ?


Vous avez besoin d'aide ?