Rapport d'Audit CIS - PostgreSQL 17
Date du rapport : 14/08/2026 12:17:25
Vérifications conformes
Non-conformités détectées
Échecs d'exécution technique
À vérifier manuellement
Métriques par Thématiques de Sécurité
Répartition Automatisée
Analyse par Catégorie
Répartition des contrôles automatisés par catégorie
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. |