Rapport d'Audit CIS - PostgreSQL 17

Date du rapport : 14/08/2026 12:17:25

Local Bare-Metal CIS Benchmark v1.0.0 v2.3.0
Score Global
14.3%
Succès
4

Vérifications conformes

Échecs
24

Non-conformités détectées

Erreurs Commande
8

Échecs d'exécution technique

Manuels
31

À vérifier manuellement

Métriques par Thématiques de Sécurité

Authentification & Accès 85%
Chiffrement & TLS/SSL 90%
Audits & Logs Système 75%

Répartition Automatisée

14.3% Score Global
Réussi (PASS) : 4
Échoué (FAIL) : 24
Erreur (Error) : 8
Non Applicable (N/A) : 0

Analyse par Catégorie

Répartition des contrôles automatisés par catégorie

Réussi
Échoué
Erreur
N/A
1. Installation et correctifs 25.0% (1/4)
2. Permissions de répertoires et fichiers 100.0% (1/2)
3. Journalisation et audit 0.0% (0/3)
3.1. Journalisation des erreurs serveur 10.0% (2/21)
4. Accès et autorisations utilisateur 0.0% (0/1)
5. Connexion et authentification 0.0% (0/0)
6. Paramètres PostgreSQL 0.0% (0/6)
7. Réplication 0.0% (0/2)
8. Considérations spéciales de configuration 0.0% (0/1)

1. Installation et correctifs

25.00%

des contrôles automatisés réussis dans cette catégorie (1/4 vérifiés).

3 contrôles nécessitent une vérification manuelle.

0 controls encountered an execution error.

0 contrôles ne sont pas applicables.

Numéro Recommandation Type Test Exécuté Résultat Output / Error / Notes Procédure de Remediation
1.1 Obtenir les paquets depuis des dépôts autorisés Manual echo 'Contrôle Manuel: Vérifier dnf repolist all ou équivalent (apt-file search /usr/pgsql-*/lib/libpq.so.5) pour s’assurer que seuls les dépôts officiels sont activés.' ⚠️ Manuel
This control requires manual verification.
Supprimer/ajouter des dépôts pour n’inclure que les sources valides (p. ex. dnf install -y https://download.postgresql.org/.../pgdg-redhat-repo-latest.noarch.rpm), puis réinstaller.
1.2 Installer uniquement les paquets requis Manual dpkg -l | grep -iE 'postgres|mysql|mariadb' || rpm -qa | grep -iE 'postgres|mysql|mariadb' ⚠️ Manuel
This control requires manual verification.
Purger/effacer les paquets non désirés : apt purge <pkg> ou dnf erase <pkg>.
1.3 Activer le service systemd Automated systemctl is-enabled postgresql@17-main.service || systemctl is-enabled postgresql-17.service ❌ Fail
Stdout:
not-found
not-found
Stderr:

Return Code: 4

Condition de succès non remplie.
systemctl enable postgresql@17-main || systemctl enable postgresql-17
1.4 Initialiser correctement le cluster de données Automated Multiple commandes (voir Sortie) ❌ Fail
--- Command 1: systemctl is-active postgresql@17-main.service || systemctl is-active postgresql-17.service ---
Stdout:
inactive
inactive
Stderr:

Return Code: 4
---
Condition de succès non remplie.
Supprimer le répertoire de données et relancer initdb (avec checksums si souhaité), puis démarrer le service. Assurer les bonnes permissions sur le répertoire de données.
1.5 Appliquer les derniers correctifs de sécurité Manual psql -c 'SHOW server_version' et comparer à la liste des versions disponibles sur la page de news PostgreSQL. ⚠️ Manuel
This control requires manual verification.
sudo apt update && sudo apt upgrade postgresql-17*
1.6 Vérifier que PGPASSWORD n'est pas défini dans les profils Automated ! grep -q PGPASSWORD /home/*/.{bashrc,profile,bash_profile} /etc/environment ✅ Pass
Stdout:

Stderr:
grep: /home/*/.bash_profile: No such file or directory
Return Code: 0
Empêcher le stockage en clair du mot de passe via la variable d’environnement PGPASSWORD. Supprimer toute définition de PGPASSWORD dans les scripts de connexion, utiliser ~/.pgpass ou une méthode sécurisée.
1.7 Vérifier que PGPASSWORD n'est pas utilisé par un processus Automated [[ -f /.dockerenv ]] || grep -qs 'docker\|containerd' /proc/1/cgroup || systemctl is-active postgresql >/dev/null 2>&1 ❌ Fail
Stdout:

Stderr:

Return Code: 4

Condition de succès non remplie.
S’assurer qu’aucun processus n’utilise la variable PGPASSWORD. Identifier et modifier les scripts/processus pour ne plus utiliser PGPASSWORD.

2. Permissions de répertoires et fichiers

100.00%

des contrôles automatisés réussis dans cette catégorie (1/1 vérifiés).

2 contrôles nécessitent une vérification manuelle.

1 controls encountered an execution error.

0 contrôles ne sont pas applicables.

Numéro Recommandation Type Test Exécuté Résultat Output / Error / Notes Procédure de Remediation
2.1 Masque de permissions (umask) Manual su - postgres -c umask || umask ⚠️ Manuel
This control requires manual verification.
Configurer le umask de l’utilisateur postgres à 0077 pour restreindre la création de fichiers. Ajouter umask 077 dans ~postgres/.bash_profile (ou .profile/.bashrc), recharger le profil.
2.2 Propriétaire et permissions du répertoire d’extensions Automated echo 'Contrôle Manuel: ' ❓ Error
--- Command pour obtenir le chemin: sudo -u postgres pg_config --sharedir ---
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1
---
Vérifier que $(pg_config --sharedir)/extension appartient à root:root et chmod 0755. chown root:root $(sudo -u postgres pg_config --sharedir)/extension && chmod 0755 $(sudo -u postgres pg_config --sharedir)/extension.
2.3 Désactiver l’historique des commandes psql Automated ! find /home -name .psql_history -print -quit ✅ Pass
Stdout:
/home/jmren/.psql_history
Stderr:
find: ‘/home/jmren/GIT_REPOS/dbscripts/MariaDB/docker/mariadb/gdatadir_03/test_galera_db’: Permission denied
find: ‘/home/jmren/GIT_REPOS/dbscripts/MariaDB/docker/mariadb/gdatadir_03/performance_schema’: Permission denied
find: ‘/home/jmren/GIT_REPOS/dbscripts/MariaDB/docker/mariadb/gdatadir_03/mysql’: Permission denied
find: ‘/home/jmren/GIT_REPOS/dbscripts/MariaDB/docker/mariadb/gdatadir_03/sys’: Permission denied
find: ‘/home/jmren/GIT_REPOS/dbscripts/MariaDB/docker/mariadb/gdatadir_02/test_galera_db’: Permission denied
find: ‘/home/jmren/GIT_REPOS/dbscripts/MariaDB/docker/mariadb/gdatadir_02/performance_schema’: Permission denied
find: ‘/home/jmren/GIT_REPOS/dbscripts/MariaDB/docker/mariadb/gdatadir_02/mysql’: Permission denied
find: ‘/home/jmren/GIT_REPOS/dbscripts/MariaDB/docker/mariadb/gdatadir_02/sys’: Permission denied
find: ‘/home/jmren/GIT_REPOS/dbscripts/MariaDB/docker/mariadb/gdatadir_01/test_galera_db’: Permission denied
find: ‘/home/jmren/GIT_REPOS/dbscripts/MariaDB/docker/mariadb/gdatadir_01/performance_schema’: Permission denied
find: ‘/home/jmren/GIT_REPOS/dbscripts/MariaDB/docker/mariadb/gdatadir_01/mysql’: Permission denied
find: ‘/home/jmren/GIT_REPOS/dbscripts/MariaDB/docker/mariadb/gdatadir_01/sys’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/datadir_01/performance_schema’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/datadir_01/mysql’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/datadir_01/sys’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/datadir_02/performance_schema’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/datadir_02/#binlog_cache_files’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/datadir_02/mysql’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/datadir_02/sys’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/datadir_03/performance_schema’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/datadir_03/#binlog_cache_files’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/datadir_03/mysql’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/datadir_03/sys’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/gdatadir_03/employees’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/gdatadir_03/test_galera_db’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/gdatadir_03/performance_schema’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/gdatadir_03/mysql’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/gdatadir_03/sys’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/gdatadir_02/employees’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/gdatadir_02/test_galera_db’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/gdatadir_02/performance_schema’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/gdatadir_02/mysql’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/gdatadir_02/sys’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/gdatadir_01/employees’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/gdatadir_01/test_galera_db’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/gdatadir_01/performance_schema’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/gdatadir_01/mysql’: Permission denied
find: ‘/home/jmren/GIT_REPOS/multi-db-docker-env/gdatadir_01/sys’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/datadir_01/employees’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/datadir_01/performance_schema’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/datadir_01/#binlog_cache_files’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/datadir_01/mysql’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/datadir_01/sys’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/datadir_02/performance_schema’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/datadir_02/#binlog_cache_files’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/datadir_02/mysql’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/datadir_02/sys’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/datadir_03/performance_schema’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/datadir_03/#binlog_cache_files’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/datadir_03/mysql’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/datadir_03/sys’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/gdatadir_03/employees’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/gdatadir_03/performance_schema’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/gdatadir_03/mysql’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/gdatadir_03/sys’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/gdatadir_02/employees’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/gdatadir_02/performance_schema’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/gdatadir_02/mysql’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/gdatadir_02/sys’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/gdatadir_01/employees’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/gdatadir_01/performance_schema’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/gdatadir_01/mysql’: Permission denied
find: ‘/home/jmren/GIT_REPOS/MySQLTuner-perl/vendor/multi-db-docker-env/gdatadir_01/sys’: Permission denied
Return Code: 0
Empêcher la création de ~/.psql_history pour limiter l’exposition de données sensibles. Supprimer le fichier .psql_history et ajouter \set HISTFILE /dev/null dans ~/.psqlrc ou créer un lien symbolique vers /dev/null.
2.4 Ne pas stocker de mots de passe dans les fichiers de service Manual grep -H password /etc/postgresql/.../pg_service.conf et dans les home utilisateurs ⚠️ Manuel
This control requires manual verification.
Vérifier qu’aucun .pg_service.conf ne contient password= en clair. Supprimer toutes les lignes password= identifiées.

3. Journalisation et audit

0.00%

des contrôles automatisés réussis dans cette catégorie (0/2 vérifiés).

0 contrôles nécessitent une vérification manuelle.

1 controls encountered an execution error.

0 contrôles ne sont pas applicables.

Numéro Recommandation Type Test Exécuté Résultat Output / Error / Notes Procédure de Remediation
3.1.2 Configurer log_destination Automated sudo -n -u postgres psql -t -c 'SHOW log_destination;' ❌ Fail
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1

Condition de succès non remplie.
Définir la ou les destinations de logs (stderr, csvlog, syslog, jsonlog). ALTER SYSTEM SET log_destination = 'csvlog'; SELECT pg_reload_conf();
3.1.3 Activer logging_collector Automated sudo -n -u postgres psql -t -c 'SHOW logging_collector;' ❌ Fail
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1

Condition de succès non remplie.
Capturer stderr dans des fichiers via le démon collector. ALTER SYSTEM SET logging_collector = 'on'; puis systemctl restart postgresql@17-main || systemctl restart postgresql-17.
3.2 Activer l’extension pgAudit Automated Installer et configurer l’extension d’audit avancé pgAudit pour capturer les activités. SELECT * FROM pg_extension WHERE extname = 'pgaudit'; ❓ Error
Execution error: Command not found.
Stdout:

Stderr:
/bin/bash: line 1: Installer: command not found
/bin/bash: line 2: SELECT: command not found
Return Code: 127

Condition de succès non remplie.
Installer et configurer l’extension d’audit avancé pgAudit pour capturer les activités. CREATE EXTENSION pgaudit; ALTER SYSTEM SET pgaudit.log = 'all'; SELECT pg_reload_conf();

3.1. Journalisation des erreurs serveur

10.00%

des contrôles automatisés réussis dans cette catégorie (2/20 vérifiés).

2 contrôles nécessitent une vérification manuelle.

0 controls encountered an execution error.

1 contrôles ne sont pas applicables.

Numéro Recommandation Type Test Exécuté Résultat Output / Error / Notes Procédure de Remediation
3.1.4 Définir log_directory Automated sudo -n -u postgres psql -t -c 'SHOW log_directory;' ❌ Fail
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1

Condition de succès non remplie.
Spécifier le répertoire de sortie des fichiers de logs (ex. /var/log/postgres). ALTER SYSTEM SET log_directory = '/var/log/postgres'; SELECT pg_reload_conf();
3.1.5 Définir log_filename Automated sudo -n -u postgres psql -t -c 'SHOW log_filename;' ❌ Fail
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1

Condition de succès non remplie.
Choisir un motif de nom de fichier strftime (e.g. postgresql-%Y%m%d.log). ALTER SYSTEM SET log_filename = 'postgresql-%Y%m%d.log'; SELECT pg_reload_conf();
3.1.6 Configurer log_file_mode Automated sudo -n -u postgres psql -t -c 'SHOW log_file_mode;' ❌ Fail
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1

Condition de succès non remplie.
Fixer les permissions des fichiers de log à 0600 (ou 0640 selon le groupe). ALTER SYSTEM SET log_file_mode = '0600'; SELECT pg_reload_conf();
3.1.7 Activer log_truncate_on_rotation Automated sudo -n -u postgres psql -t -c 'SHOW log_truncate_on_rotation;' ❌ Fail
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1

Condition de succès non remplie.
Tronquer les fichiers existants lors de la rotation si même nom. ALTER SYSTEM SET log_truncate_on_rotation = 'on'; SELECT pg_reload_conf();
3.1.8 Définir log_rotation_age Automated sudo -n -u postgres psql -t -c 'SHOW log_rotation_age;' ✅ Pass
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1
Limiter la durée de vie des fichiers de log (ex. 1d). ALTER SYSTEM SET log_rotation_age = '1d'; SELECT pg_reload_conf();
3.1.9 Définir log_rotation_size Automated sudo -n -u postgres psql -t -c 'SHOW log_rotation_size;' ✅ Pass
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1
Limiter la taille des fichiers de log (ex. 1GB). ALTER SYSTEM SET log_rotation_size = '1GB'; SELECT pg_reload_conf();
3.1.10 Choisir syslog_facility Manual SHOW syslog_facility; ⚠️ Manuel
This control requires manual verification.
Définir la facility Syslog (LOCAL0–LOCAL7). ALTER SYSTEM SET syslog_facility = 'LOCAL1'; SELECT pg_reload_conf();
3.1.11 Activer syslog_split_messages Automated sudo -n -u postgres psql -t -c 'SHOW syslog_split_messages;' ❌ Fail
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1

Condition de succès non remplie.
Couper les messages trop longs (>1024 octets) pour Syslog. ALTER SYSTEM SET syslog_split_messages = 'on'; SELECT pg_reload_conf();
3.1.12 Prévenir la perte de messages Syslog Automated sudo -n -u postgres psql -t -c 'SHOW syslog_split_messages;' ❌ Fail
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1

Condition de succès non remplie.
Éviter la suppression des messages volumineux dans Syslog. Même que 3.1.11.
3.1.13 Configurer syslog_ident Automated sudo -n -u postgres psql -t -c 'SHOW syslog_ident;' ❌ Fail
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1

Condition de succès non remplie.
Définir l’identifiant de programme dans Syslog (ex. postgres). ALTER SYSTEM SET syslog_ident = 'proddb'; SELECT pg_reload_conf();
3.1.14 Assurer les bons messages dans le log serveur Manual echo 'Contrôle Manuel: Consulter postgresql.conf et SHOW log_statement;/SHOW log_min_messages;.' ⚠️ Manuel
This control requires manual verification.
Vérifier que seuls les messages pertinents (erreurs, connexions, requêtes) sont enregistrés. ALTER SYSTEM SET log_statement = 'all'; ALTER SYSTEM SET log_min_error_statement = 'error'; etc., puis SELECT pg_reload_conf();.
3.1.15 Enregistrer les SQL en erreur Automated echo 'Contrôle Manuel: ' ➖ N/A
Stdout:
Contrôle Manuel:
Stderr:

Return Code: 0
Consigner les instructions SQL ayant généré des erreurs. ALTER SYSTEM SET log_error_verbosity = 'verbose'; puis SELECT pg_reload_conf();.
3.1.16 Désactiver debug_print_parse Automated sudo -n -u postgres psql -t -c 'SHOW debug_print_parse;' ❌ Fail
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1

Condition de succès non remplie.
Ne pas afficher les arbres d’analyse SQL dans les logs (réduction du bruit). ALTER SYSTEM SET debug_print_parse = 'off'; SELECT pg_reload_conf();
3.1.17 Désactiver debug_print_rewritten Automated sudo -n -u postgres psql -t -c 'SHOW debug_print_rewritten;' ❌ Fail
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1

Condition de succès non remplie.
Ne pas afficher les arbres réécrits SQL dans les logs. ALTER SYSTEM SET debug_print_rewritten = 'off'; SELECT pg_reload_conf();
3.1.18 Désactiver debug_print_plan Automated sudo -n -u postgres psql -t -c 'SHOW debug_print_plan;' ❌ Fail
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1

Condition de succès non remplie.
Ne pas afficher les plans d’exécution SQL dans les logs. ALTER SYSTEM SET debug_print_plan = 'off'; SELECT pg_reload_conf();
3.1.19 Activer debug_pretty_print Automated sudo -n -u postgres psql -t -c 'SHOW debug_pretty_print;' ❌ Fail
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1

Condition de succès non remplie.
Formater lisiblement les arbres d’analyse/réécriture dans les logs. ALTER SYSTEM SET debug_pretty_print = 'on'; SELECT pg_reload_conf();.
3.1.20 Activer log_connections Automated sudo -n -u postgres psql -t -c 'SHOW log_connections;' ❌ Fail
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1

Condition de succès non remplie.
Enregistrer chaque nouvelle connexion à PostgreSQL. ALTER SYSTEM SET log_connections = 'on'; SELECT pg_reload_conf();.
3.1.21 Activer log_disconnections Automated sudo -n -u postgres psql -t -c 'SHOW log_disconnections;' ❌ Fail
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1

Condition de succès non remplie.
Enregistrer chaque déconnexion de PostgreSQL. ALTER SYSTEM SET log_disconnections = 'on'; SELECT pg_reload_conf();.
3.1.22 Configurer log_error_verbosity Automated sudo -n -u postgres psql -t -c 'SHOW log_error_verbosity;' ❌ Fail
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1

Condition de succès non remplie.
Contrôler la verbosité des messages d’erreur (DEFAULT, VERBOSE). ALTER SYSTEM SET log_error_verbosity = 'verbose'; SELECT pg_reload_conf();.
3.1.23 Configurer log_hostname Automated sudo -n -u postgres psql -t -c 'SHOW log_hostname;' ❌ Fail
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1

Condition de succès non remplie.
Indiquer le nom d’hôte ou l’IP dans les logs de connexion. ALTER SYSTEM SET log_hostname = 'off'; SELECT pg_reload_conf();.
3.1.24 Configurer log_line_prefix Automated sudo -n -u postgres psql -t -c 'SHOW log_line_prefix;' ❌ Fail
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1

Condition de succès non remplie.
Définir le préfixe de ligne (timestamp, utilisateur, base, etc.) dans chaque log. ALTER SYSTEM SET log_line_prefix = '%m [%p] user=%u db=%d '; SELECT pg_reload_conf();.
3.1.25 Configurer log_statement Automated sudo -n -u postgres psql -t -c 'SHOW log_statement;' ❌ Fail
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1

Condition de succès non remplie.
Choisir le niveau de requêtes à logger (none, ddl, mod, all). ALTER SYSTEM SET log_statement = 'ddl'; SELECT pg_reload_conf();.
3.1.26 Configurer log_timezone Automated sudo -n -u postgres psql -t -c 'SHOW log_timezone;' ❌ Fail
Stdout:

Stderr:
sudo: unknown user postgres
sudo: error initializing audit plugin sudoers_audit
Return Code: 1

Condition de succès non remplie.
Uniformiser le fuseau horaire des horodatages des logs (ex. UTC). ALTER SYSTEM SET log_timezone = 'UTC'; SELECT pg_reload_conf();.

4. Accès et autorisations utilisateur

0.00%

des contrôles automatisés réussis dans cette catégorie (0/0 vérifiés).

8 contrôles nécessitent une vérification manuelle.

1 controls encountered an execution error.

0 contrôles ne sont pas applicables.

Numéro Recommandation Type Test Exécuté Résultat Output / Error / Notes Procédure de Remediation
4.1 Désactiver la connexion interactive Manual grep -E '^\s*local\s+.*trust' /etc/postgresql/*/*/pg_hba.conf /var/lib/postgresql/data/pg_hba.conf ⚠️ Manuel
This control requires manual verification.
Empêcher les rôles superutilisateurs sans console SSH d’interagir localement. Modifier pg_hba.conf, passer à md5 ou peer, puis SELECT pg_reload_conf();.
4.2 Configurer sudo correctement Manual grep -iE 'postgres|mysql|mariadb' /etc/sudoers /etc/sudoers.d/* ⚠️ Manuel
This control requires manual verification.
Restreindre l’usage de sudo pour l’utilisateur système postgres. Examiner /etc/sudoers et fichiers dans /etc/sudoers.d/ pour la section postgres. Ajuster les droits sudo (ex. postgres ALL=(ALL) NOPASSWD: /usr/pgsql-17/bin/pg_*).
4.3 Révoquer les privilèges administratifs excessifs Manual psql -U postgres -t -A -c 'SELECT rolname, rolsuper, rolcreatedb, rolcreaterole, rolreplication FROM pg_roles;' ⚠️ Manuel
This control requires manual verification.
Retirer aux rôles non justifiés les attributs SUPERUSER, CREATEDB, CREATEROLE, REPLICATION. \du+ doit lister uniquement les rôles autorisés avec ces attributs. ALTER ROLE <user> NOSUPERUSER NOCREATEDB NOCREATEROLE;.
4.4 Verrouiller les comptes inactifs Manual Désactiver les rôles non utilisés depuis un certain temps. SELECT rolname, rolvaliduntil FROM pg_authid; vérifier dates d’expiration. ⚠️ Manuel
This control requires manual verification.
Désactiver les rôles non utilisés depuis un certain temps. SELECT rolname, rolvaliduntil FROM pg_authid; vérifier dates d’expiration. ALTER ROLE <user> NOLOGIN; ou définir VALID UNTIL à une date passée.
4.5 Révoquer les privilèges de fonction excessifs Manual psql -U postgres -t -A -c "SELECT proname FROM pg_proc WHERE pronamespace = 'public'::regnamespace;" ⚠️ Manuel
This control requires manual verification.
Restreindre l’EXECUTE sur les fonctions définies aux seuls rôles nécessaires. Requête sur pg_proc et has_function_privilege(). REVOKE EXECUTE ON FUNCTION <schema>.<func>() FROM <role>;.
4.6 Révoquer les privilèges DML excessifs Manual psql -U postgres -t -A -c "SELECT tablename FROM pg_tables WHERE schemaname = 'public';" ⚠️ Manuel
This control requires manual verification.
Restreindre INSERT/UPDATE/DELETE aux tables selon le besoin des rôles applicatifs. Inventaire via has_table_privilege() pour chaque table et utilisateur. REVOKE INSERT, UPDATE, DELETE ON TABLE <tbl> FROM <role>;.
4.7 Configurer Row Level Security (RLS) Manual psql -U postgres -t -A -c 'SELECT relname, relrowsecurity FROM pg_class WHERE relrowsecurity = true;' ⚠️ Manuel
This control requires manual verification.
Activer RLS pour les tables sensibles et définir des politiques restrictives. \d+ <table> doit indiquer Row Level Security: enabled. ALTER TABLE <tbl> ENABLE ROW LEVEL SECURITY; CREATE POLICY ...;.
4.8 Installer l’extension set_user Automated Utiliser set_user pour l’émulation de rôles et la révocabilité de sessions. SELECT * FROM pg_extension WHERE extname = 'set_user'; ❓ Error
Execution error: Command not found.
Stdout:

Stderr:
/bin/bash: line 1: Utiliser: command not found
/bin/bash: line 2: SELECT: command not found
Return Code: 127

Condition de succès non remplie.
Utiliser set_user pour l’émulation de rôles et la révocabilité de sessions. CREATE EXTENSION set_user;
4.9 Utiliser les rôles prédéfinis Manual psql -U postgres -t -A -c 'SELECT rolname, rolsuper, rolcreatedb, rolcreaterole, rolreplication FROM pg_roles;' ⚠️ Manuel
This control requires manual verification.
Favoriser les rôles intégrés (pg_read_all_data, etc.) plutôt que superuser pour les accès. \du+ vérifie la présence et l’usage des rôles prédéfinis. GRANT pg_read_all_data TO <role>; REVOKE ....

5. Connexion et authentification

0.00%

des contrôles automatisés réussis dans cette catégorie (0/0 vérifiés).

6 contrôles nécessitent une vérification manuelle.

0 controls encountered an execution error.

0 contrôles ne sont pas applicables.

Numéro Recommandation Type Test Exécuté Résultat Output / Error / Notes Procédure de Remediation
5.1 Ne pas passer de mot de passe en ligne de commande Manual echo 'INSPECTION MANUELLE DU CONTRÔLE 5.1 (Ne pas passer de mot de passe en ligne de commande)' && ps -ef | head -n 10 ⚠️ Manuel
This control requires manual verification.
Éviter psql -U user -W password dans les scripts shell. Modifier les scripts pour utiliser ~/.pgpass ou une méthode sécurisée.
5.2 Lier PostgreSQL à une adresse IP Manual Restreindre l’écoute à l’interface prévue (listen_addresses). SHOW listen_addresses; doit afficher l’IP autorisée ou localhost. ⚠️ Manuel
This control requires manual verification.
Restreindre l’écoute à l’interface prévue (listen_addresses). Modifier postgresql.conf (listen_addresses = '192.0.2.1' ou '*') et redémarrer le service.
5.3 Configurer la connexion UNIX locale Manual grep -E '^\s*local\s+.*trust' /etc/postgresql/*/*/pg_hba.conf /var/lib/postgresql/data/pg_hba.conf ⚠️ Manuel
This control requires manual verification.
Sécuriser les entrées local dans pg_hba.conf pour n’autoriser que peer ou md5. Modifier (ou ajouter) local all all peer ou md5 dans pg_hba.conf, puis SELECT pg_reload_conf();.
5.4 Configurer la connexion TCP/IP Manual grep -E '^\s*local\s+.*trust' /etc/postgresql/*/*/pg_hba.conf /var/lib/postgresql/data/pg_hba.conf ⚠️ Manuel
This control requires manual verification.
Sécuriser les entrées host dans pg_hba.conf (CIDR, méthode d’authentification). Modifier pg_hba.conf pour utiliser des CIDR restreints et des méthodes d'authentification fortes (md5, scram-sha-256, cert, etc.), redémarrer ou recharger.
5.5 Limites de connexion par compte Manual Empêcher un même rôle d’ouvrir trop de connexions simultanées. SELECT rolname, rolconnlimit FROM pg_authid;. ⚠️ Manuel
This control requires manual verification.
Empêcher un même rôle d’ouvrir trop de connexions simultanées. ALTER ROLE <user> CONNECTION LIMIT 10;.
5.6 Configurer la complexité des mots de passe Manual echo 'INSPECTION MANUELLE DU CONTRÔLE 5.6 (Configurer la complexité des mots de passe)' && ps -ef | head -n 10 ⚠️ Manuel
This control requires manual verification.
Imposer un contrôle de la complexité (extensions passwordcheck, pam, etc.). Installer/configurer passwordcheck ou pam, définir password_encryption = 'scram-sha-256'.

6. Paramètres PostgreSQL

0.00%

des contrôles automatisés réussis dans cette catégorie (0/0 vérifiés).

5 contrôles nécessitent une vérification manuelle.

4 controls encountered an execution error.

2 contrôles ne sont pas applicables.

Numéro Recommandation Type Test Exécuté Résultat Output / Error / Notes Procédure de Remediation
6.1 Comprendre vecteurs d’attaque et paramètres runtime Manual cat /etc/postgresql/*/*/postgresql.conf /var/lib/postgresql/data/postgresql.conf | grep -v '^\s*#' | head -n 30 ⚠️ Manuel
This control requires manual verification.
Documenter les vecteurs d’attaque possibles et les paramètres ajustables. Mettre à jour la documentation interne, auditer régulièrement.
6.2 Configurer les paramètres backend Automated echo 'Contrôle Manuel: ' ➖ N/A
Stdout:
Contrôle Manuel:
Stderr:

Return Code: 0
Ajuster max_connections, shared_buffers, work_mem, etc., pour limiter l’exposition. ALTER SYSTEM SET max_connections = 100; ALTER SYSTEM SET shared_buffers = '...'; ALTER SYSTEM SET work_mem = '...'; SELECT pg_reload_conf();
6.3 Configurer Postmaster runtime parameters Manual Ajuster data_directory, hba_file, ident_file, etc. Vérifier SHOW data_directory, hba_file, ident_file; ⚠️ Manuel
This control requires manual verification.
Ajuster data_directory, hba_file, ident_file, etc. Modifier postgresql.conf puis redémarrer.
6.4 Configurer les signaux SIGHUP Manual Sécuriser la réaction aux signaux de rechargement de configuration. Tester SELECT pg_reload_conf();. ⚠️ Manuel
This control requires manual verification.
Sécuriser la réaction aux signaux de rechargement de configuration. Aucun changement automatique ; documenter le processus.
6.5 Configurer les paramètres Superuser Manual Restreindre statement_timeout, idle_in_transaction_session_timeout pour les superusers. SHOW statement_timeout, idle_in_transaction_session_timeout;. ⚠️ Manuel
This control requires manual verification.
Restreindre statement_timeout, idle_in_transaction_session_timeout pour les superusers. ALTER SYSTEM SET statement_timeout = '...'; ALTER SYSTEM SET idle_in_transaction_session_timeout = '5min'; puis recharger.
6.6 Configurer les paramètres User Manual Ajuster log_statement, search_path, etc., pour les rôles standards. Vérifier SHOW search_path;. ⚠️ Manuel
This control requires manual verification.
Ajuster log_statement, search_path, etc., pour les rôles standards. ALTER ROLE <user> SET search_path TO '$user', public;.
6.7 Utiliser la cryptographie FIPS 140-2 Automated S’assurer qu’OpenSSL FIPS est utilisé si requis. SHOW ssl_library; et vérifier la version OpenSSL. ❓ Error
Execution error: Command not found.
Stdout:

Stderr:
/bin/bash: line 1: S’assurer: command not found
/bin/bash: line 2: SHOW: command not found
/bin/bash: line 2: et: command not found
Return Code: 127

Condition de succès non remplie.
S’assurer qu’OpenSSL FIPS est utilisé si requis. Recompiler PostgreSQL avec FIPS ou configurer la bibliothèque FIPS.
6.8 Activer et configurer TLS Automated echo 'Contrôle Manuel: ' ➖ N/A
Stdout:
Contrôle Manuel:
Stderr:

Return Code: 0
Installer certificats TLS et configurer ssl_cert_file, ssl_key_file. Copier les certificats, ALTER SYSTEM SET ssl = 'on'; SELECT pg_reload_conf();.
6.9 Configurer TLSv1.3+ Automated Forcer au minimum TLSv1.3. SHOW ssl_min_protocol_version; doit être TLSv1.3. ❓ Error
Execution error: Command not found.
Stdout:

Stderr:
/bin/bash: line 1: Forcer: command not found
/bin/bash: line 2: SHOW: command not found
/bin/bash: line 2: doit: command not found
Return Code: 127

Condition de succès non remplie.
Forcer au minimum TLSv1.3. ALTER SYSTEM SET ssl_min_protocol_version = 'TLSv1.3'; SELECT pg_reload_conf();.
6.10 Désactiver les cipher suites faibles Automated Exclure RC4, DES, etc., dans ssl_cipher_suites. SHOW ssl_cipher_suites; vérifier l’absence de ciphers faibles. ❓ Error
Execution error: Command not found.
Stdout:

Stderr:
/bin/bash: line 1: Exclure: command not found
/bin/bash: line 2: SHOW: command not found
/bin/bash: line 2: vérifier: command not found
Return Code: 127
Exclure RC4, DES, etc., dans ssl_cipher_suites. ALTER SYSTEM SET ssl_cipher_suites = 'HIGH:!aNULL'; SELECT pg_reload_conf();.
6.11 Installer et configurer pgcrypto Automated Activer pgcrypto pour fonctions cryptographiques. SELECT * FROM pg_extension WHERE extname = 'pgcrypto'; ❓ Error
Execution error: Command not found.
Stdout:

Stderr:
/bin/bash: line 1: Activer: command not found
/bin/bash: line 2: SELECT: command not found
Return Code: 127

Condition de succès non remplie.
Activer pgcrypto pour fonctions cryptographiques. CREATE EXTENSION pgcrypto;

7. Réplication

0.00%

des contrôles automatisés réussis dans cette catégorie (0/0 vérifiés).

3 contrôles nécessitent une vérification manuelle.

1 controls encountered an execution error.

1 contrôles ne sont pas applicables.

Numéro Recommandation Type Test Exécuté Résultat Output / Error / Notes Procédure de Remediation
7.1 Créer un utilisateur de réplication dédié Manual Ne pas réutiliser postgres pour la réplication. SELECT rolname, rolreplication FROM pg_roles WHERE rolname = '<user>'; ⚠️ Manuel
This control requires manual verification.
Ne pas réutiliser postgres pour la réplication. CREATE USER repuser REPLICATION LOGIN ENCRYPTED PASSWORD '…';.
7.2 Journaliser les commandes de réplication Automated Activer log_replication_commands pour tracer les actions de réplication. SHOW log_replication_commands; doit être on. ❓ Error
Execution error: Command not found.
Stdout:

Stderr:
/bin/bash: line 1: Activer: command not found
/bin/bash: line 2: SHOW: command not found
/bin/bash: line 2: doit: command not found
Return Code: 127

Condition de succès non remplie.
Activer log_replication_commands pour tracer les actions de réplication. ALTER SYSTEM SET log_replication_commands = 'on'; SELECT pg_reload_conf();.
7.3 Configurer les sauvegardes de base Manual echo 'Contrôle Manuel: Vérifier que pg_basebackup ou équivalent génère des sauvegardes fonctionnelles. Exécuter pg_basebackup -h localhost … et vérifier l’intégrité des fichiers.' ⚠️ Manuel
This control requires manual verification.
Vérifier que pg_basebackup ou équivalent génère des sauvegardes fonctionnelles. Mettre en place un script de sauvegarde automatisée avec pg_basebackup.
7.4 Configurer l’archivage WAL Automated echo 'Contrôle Manuel: ' ➖ N/A
Stdout:
Contrôle Manuel:
Stderr:

Return Code: 0
Activer archive_mode et archive_command pour conserver les WAL. ALTER SYSTEM SET archive_mode = 'on'; ALTER SYSTEM SET archive_command = 'cp %p /archive/%f'; SELECT pg_reload_conf();.
7.5 Configurer les paramètres de streaming Manual Ajuster primary_conninfo, max_wal_senders, hot_standby. SHOW primary_conninfo, max_wal_senders, hot_standby;. ⚠️ Manuel
This control requires manual verification.
Ajuster primary_conninfo, max_wal_senders, hot_standby. ALTER SYSTEM SET max_wal_senders = 3; ALTER SYSTEM SET hot_standby = 'on'; SELECT pg_reload_conf();.

8. Considérations spéciales de configuration

0.00%

des contrôles automatisés réussis dans cette catégorie (0/1 vérifiés).

2 contrôles nécessitent une vérification manuelle.

0 controls encountered an execution error.

0 contrôles ne sont pas applicables.

Numéro Recommandation Type Test Exécuté Résultat Output / Error / Notes Procédure de Remediation
8.1 Emplacements hors du cluster de données Manual Placer les répertoires temporaires et de logs en dehors de $PGDATA pour éviter leur inclusion. Check SHOW temp_tablespaces, log_directory; ⚠️ Manuel
This control requires manual verification.
Placer les répertoires temporaires et de logs en dehors de $PGDATA pour éviter leur inclusion. Set temp_tablespaces and log_directory on another volume and reload.
8.2 Installer/configurer pgBackRest Automated sudo -n pgbackrest info ❌ Fail
Stdout:

Stderr:
sudo: a password is required
Return Code: 1

Condition de succès non remplie.
Utiliser pgBackRest pour des sauvegardes et restaurations robustes. Installer le paquet pgbackrest et configurer au moins une stanza (pgbackrest stanza-create).
8.3 Vérifier autres paramètres divers Manual echo 'Contrôle Manuel: Contrôler toute autre configuration (temp_file_limit, temp_tablespaces, …) selon les besoins. Revoir postgresql.conf pour paramètres personnalisés.' ⚠️ Manuel
This control requires manual verification.
Contrôler toute autre configuration (temp_file_limit, temp_tablespaces, …) selon les besoins. Ajuster manuellement puis recharger la configuration.