IREX - Tests de sécurité à réaliser sur la plateforme ACRA selon les référentiels open source
Tests de sécurité à réaliser sur la plateforme ACRA selon les référentiels open source .sommaire { bo
1. Introduction
2. Démarche de test
3. Tests par référentiel
4. Outils utilisés
5. Synthèse
6. Limites
Annexe : sources à citer
- Introduction
- Démarche de test
- Périmètre et conditions
- Cycle de test
- Format d'un test
- Niveau de vérification ASVS
- Tests par référentiel
- OWASP ASVS 5.0 : les exigences à contrôler
- OWASP WSTG 4.2 : la méthode de test
- Guide ANSSI sur TLS et recommandations TLSRef : la configuration TLS
L'article précédent a sélectionné les référentiels open source qui servent de critères d'évaluation pour ACRA. Un référentiel ne protège pourtant rien tant que ses exigences ne sont pas vérifiées : il faut des tests, avec des moyens précis et des preuves. Cet article indique, pour chaque référentiel retenu, quels tests réaliser, sur quels composants, avec quels outils et quelle preuve conserver.
ACRA est une plateforme de surveillance réseau : sa compromission donnerait à un attaquant une vue complète de l'infrastructure surveillée. Les tests portent uniquement sur les composants déployés (Nginx, Keycloak, Grafana, Prometheus, Zabbix, Thanos, SeaweedFS, Jenkins) et sur les deux serveurs qui les hébergent. Les composants prévus mais non déployés seront ajoutés après leur mise en service.
L'article présente d'abord la démarche de test, puis les tests regroupés par référentiel, les outils utilisés, une synthèse et les limites.
Les tests suivent le périmètre fixé lors du cadrage. Le tableau suivant en rappelle le contenu et les conditions d'exécution.
| Élément | Contenu |
|---|---|
| Dans le périmètre | Nginx (frontal et internes), Keycloak, Grafana, Prometheus, Zabbix, Thanos, SeaweedFS, Jenkins et son pipeline, serveur d'applications (Debian), serveur d'automatisation, flux HTTP entre composants, quatre profils utilisateurs |
| Hors périmètre | Composants non déployés, ingénierie sociale, scan sans fil, déni de service, destruction de données |
| Environnement | Préproduction, après sauvegarde |
| Comptes de test | Un par profil : profane, administrateur système, administrateur sécurité, administrateur réseau |
| Nature des tests | Non destructifs |
| Autorisation | Périmètre validé par écrit avant le premier test |
Le cycle suit les quatre phases du guide NIST SP 800-115, appliquées à ACRA comme suit.
| Phase | Objectif | Activités pour ACRA |
|---|---|---|
| 1. Planification | Fixer règles et objectifs | Périmètre, comptes de test, niveau ASVS |
| 2. Découverte | Identifier cibles et vulnérabilités potentielles | Ports et services, configurations, scans |
| 3. Attaque | Vérifier les vulnérabilités en les exploitant | Tests de cette partie 3, scénarios combinés |
| 4. Rapport | Consigner constats et corrections | En parallèle des autres phases, avec les preuves |
Chaque test est consigné avec six champs : Réf. (identifiant dans le référentiel), Contrôle, Description, Vérifications à effectuer, Moyen de vérification et Preuves. Un test donne un résultat parmi : conforme, non conforme, partiellement conforme, non applicable.
L'ASVS 5.0.0 définit trois niveaux. Le tableau suivant compte les exigences des neuf chapitres retenus (V3, V4, V6, V7, V8, V9, V10, V12, V13), d'après le fichier officiel.
| Niveau | Exigences propres au niveau | Cumul |
|---|---|---|
| 1 | 46 | 46 |
| 2 | 101 | 147 |
| 3 | 55 | 202 |
Le niveau 2 : il est usuel pour une plateforme avec authentification, et il ajoute des exigences directement utiles à ACRA, comme V12.3.3 (chiffrement entre services internes) et V13.4.5 (endpoints de supervision non exposés).
L'ASVS fournit les exigences. Les tests ci-dessous en reprennent une sélection : 26 exigences de niveau 1 et 7 de niveau 2. Les autres exigences des neuf chapitres suivent la même procédure, à partir du fichier officiel. Le premier tableau couvre le point d'entrée et les communications.
Tableau 1 : Nginx, communications et configuration (V12, V13)
| Réf. | Contrôle | Description | Vérifications à effectuer | Moyen de vérification | Preuves |
|---|---|---|---|---|---|
| V12.1.1 (N1) | Versions TLS | Seules les versions de TLS recommandées (1.2 et 1.3) sont activées | Protocoles acceptés par le Nginx frontal (port 4443) | testssl.sh | Rapport de l'outil |
| V12.2.1 (N1) | TLS pour les accès externes | TLS pour toute connexion vers un service HTTP exposé, sans repli en clair | Tentative de connexion en HTTP, redirection | curl, testssl.sh | Requêtes et réponses |
| V12.2.2 (N1) | Certificat de confiance publique | Les services exposés présentent un certificat de confiance publique (si exposition publique) | Émetteur et chaîne du certificat | testssl.sh | Détail du certificat |
| V12.1.2 (N2) | Suites de chiffrement | Seules les suites recommandées sont activées, les plus fortes en priorité | Liste et ordre des suites | testssl.sh | Rapport de l'outil |
| V12.3.1 (N2) | Chiffrement de toutes les connexions | Protocole chiffré sur toutes les connexions entrantes et sortantes, y compris supervision et gestion | Chiffrement des flux du Nginx frontal vers les services | Capture réseau | Capture |
| V12.3.3 (N2) | Chiffrement entre services internes | Chiffrement de transport sur toute connectivité entre services internes | Flux HTTP vers Keycloak (8080), Grafana (8089), Prometheus (9090), Zabbix (8080), Thanos et SeaweedFS (8089) | Capture réseau | Capture montrant le trafic en clair ou chiffré |
| V13.4.1 (N1) | Métadonnées de contrôle de source | Aucun dossier .git ou .svn déployé | Requêtes sur ces chemins | curl, ZAP | Réponses |
| V13.4.2 (N2) | Modes de débogage | Désactivés en production | Paramètres de débogage de chaque composant | Revue des configurations | Extraits de configuration |
| V13.4.3 (N2) | Listage de répertoires | Non exposé | Requêtes sur des répertoires | ZAP, curl | Réponses |
| V13.4.4 (N2) | Méthode HTTP TRACE | Non prise en charge | Requête TRACE sur chaque Nginx | curl | Réponse |
| V13.4.5 (N2) | Endpoints de supervision et de documentation | Non exposés sauf nécessité | Accès aux interfaces et aux métriques depuis l'extérieur et depuis chaque profil | curl, ZAP | Réponses, matrice d'accès |
Le deuxième tableau concerne Keycloak, qui gère l'authentification, les sessions et les jetons. Les exigences V9 et V10 ne s'appliquent que si Keycloak est utilisé avec des jetons autonomes et OAuth/OIDC (à confirmer).
Tableau 2 : Keycloak, authentification et sessions (V6, V7, V9, V10)
| Réf. | Contrôle | Description | Vérifications à effectuer | Moyen de vérification | Preuves |
|---|---|---|---|---|---|
| V6.2.1 (N1) | Longueur des mots de passe | Au moins 8 caractères, 15 fortement recommandés | Politique de mots de passe, tentative de création | Revue de configuration | Capture de configuration |
| V6.3.1 (N1) | Résistance au brute force | Contrôles contre le bourrage d'identifiants et la force brute | Verrouillage ou limitation après échecs répétés | ZAP (rejeu d'authentification) | Journal du test |
| V6.3.2 (N1) | Comptes par défaut | Comptes de type admin ou root absents ou désactivés | Liste des comptes, essai des identifiants par défaut | Console Keycloak | Liste des comptes |
| V7.2.4 (N1) | Nouveau jeton à l'authentification | Un nouveau jeton de session est généré à chaque authentification | Comparer les identifiants de session avant et après connexion | ZAP, navigateur | Requêtes |
| V7.4.1 (N1) | Fin de session | Après déconnexion ou expiration, le jeton ne peut plus servir | Rejouer le jeton après déconnexion | ZAP, curl | Requêtes et réponses |
| V7.4.2 (N1) | Désactivation d'un compte | Toutes les sessions actives du compte sont terminées | Désactiver un compte de test et rejouer sa session | Console Keycloak, curl | Journal |
| V9.1.1 (N1) | Signature des jetons autonomes | Signature ou MAC vérifiés avant acceptation | Modifier le contenu d'un jeton et le présenter | Scripts ZAP | Requêtes et réponses |
| V9.1.2 (N1) | Algorithmes autorisés | Liste blanche d'algorithmes pour créer et vérifier les jetons | Présenter un jeton avec un algorithme non autorisé | Scripts ZAP | Requêtes et réponses |
| V9.2.1 (N1) | Validité temporelle | Jeton rejeté hors de sa période de validité | Présenter un jeton expiré | Scripts ZAP | Requêtes et réponses |
| V10.4.1 (N1) | URI de redirection | Validées sur une liste blanche pré-enregistrée | Modifier le paramètre redirect_uri | ZAP | Requêtes et réponses |
| V10.4.2 (N1) | Code d'autorisation à usage unique | Le code ne peut être utilisé qu'une fois | Rejouer un code | ZAP, curl | Requêtes et réponses |
| V10.4.3 (N1) | Durée du code d'autorisation | 10 minutes au plus pour les niveaux 1 et 2 | Mesurer la durée de validité | ZAP, curl | Horodatages |
Le troisième tableau vérifie le cloisonnement entre les quatre profils, test central pour ACRA : un profane ne doit pas atteindre les fonctions de Prometheus, de Zabbix ou des alertes.
Tableau 3 : Cloisonnement des profils (V8)
| Réf. | Contrôle | Description | Vérifications à effectuer | Moyen de vérification | Preuves |
|---|---|---|---|---|---|
| V8.1.1 (N1) | Règles d'autorisation documentées | La documentation définit les restrictions d'accès par fonction et par donnée | Comparer la documentation aux droits réels de chaque profil | Revue de la documentation | Matrice des rôles |
| V8.2.1 (N1) | Accès aux fonctions | Réservé aux consommateurs explicitement autorisés | Tenter, avec chaque profil, les fonctions des autres profils sur Grafana, Prometheus et Zabbix | Navigateur et ZAP avec les 4 comptes | Matrice d'accès |
| V8.2.2 (N1) | Accès aux données | Réservé aux consommateurs autorisés pour des données précises | Accès à des dashboards ou données non autorisés | Navigateur et ZAP | Captures, requêtes |
| V8.3.1 (N1) | Contrôle côté serveur | Règles appliquées par une couche de confiance, sans dépendre du client | Contourner l'interface en modifiant les requêtes | ZAP | Requêtes et réponses |
Le quatrième tableau couvre la sécurité des interfaces web et des API de Grafana, Prometheus et Zabbix.
Tableau 4 : Interfaces web et API (V3, V4)
| Réf. | Contrôle | Description | Vérifications à effectuer | Moyen de vérification | Preuves |
|---|---|---|---|---|---|
| V3.2.2 (N1) | Rendu sûr du texte | Le contenu texte n'est pas interprété comme du HTML | Injecter des balises dans les champs saisis | ZAP | Requêtes et réponses |
| V3.3.1 (N1) | Attribut Secure des cookies | Présent sur les cookies | Examiner les en-têtes Set-Cookie | Navigateur, ZAP | En-têtes |
| V3.4.1 (N1) | HSTS | En-tête Strict-Transport-Security sur toutes les réponses | Examiner les en-têtes | curl, testssl.sh | En-têtes |
| V3.4.2 (N1) | CORS | Access-Control-Allow-Origin à valeur fixe | Envoyer des origines non prévues | curl, ZAP | Requêtes et réponses |
| V3.5.3 (N1) | Méthodes HTTP | Méthodes appropriées pour les fonctions sensibles (pas GET) | Requêtes GET sur des fonctions de modification | ZAP | Requêtes et réponses |
| V4.1.1 (N1) | Type de contenu | Chaque réponse avec corps porte un Content-Type exact | En-têtes des réponses d'API | curl, ZAP | En-têtes |
Le WSTG donne la manière de conduire les tests applicatifs. Le tableau suivant en sélectionne 15 et les relie à l'exigence ASVS correspondante.
Tableau 5 : Tests WSTG sélectionnés
| Réf. | Test | Composants | Exigence ASVS liée |
|---|---|---|---|
| WSTG-CONF-01 | Configuration de l'infrastructure réseau | Nginx, serveurs | V13 |
| WSTG-CONF-07 | HTTP Strict Transport Security | Nginx, interfaces web | V3.4.1 |
| WSTG-CRYP-01 | Transport (TLS) faible | Nginx frontal | V12.1.1 |
| WSTG-ATHN-01 | Identifiants transmis sur un canal chiffré | Keycloak, interfaces web | V12.2.1 |
| WSTG-ATHN-02 | Identifiants par défaut | Keycloak, Grafana, Zabbix | V6.3.2 |
| WSTG-ATHN-03 | Verrouillage faible | Keycloak | V6.3.1 |
| WSTG-ATHN-07 | Politique de mots de passe faible | Keycloak | V6.2.1 |
| WSTG-ATHZ-02 | Contournement du schéma d'autorisation | Grafana, Prometheus, Zabbix | V8.2.1 |
| WSTG-ATHZ-03 | Élévation de privilèges | Tous les profils | V8.2.1 |
| WSTG-ATHZ-04 | Références directes d'objets non sécurisées | Grafana, Zabbix | V8.2.2 |
| WSTG-SESS-03 | Fixation de session | Keycloak | V7.2.4 |
| WSTG-SESS-05 | Falsification de requête inter-sites (CSRF) | Grafana, Zabbix | V3.5.3 |
| WSTG-INPV-01 | Injection de script réfléchie (XSS) | Grafana, Zabbix | V3.2.2 |
| WSTG-INPV-05 | Injection SQL | Zabbix, Grafana | Chapitre V1 (hors sélection) |
| WSTG-ERRH-01 | Gestion des erreurs | Interfaces web | Chapitre V16 (hors sélection) |
Ces deux documents fixent la configuration attendue du chiffrement. Les tests portent sur le Nginx frontal et sont réalisés avec testssl.sh. Les recommandations de l'ANSSI portent les numéros du guide (v1.2).
Tableau 6 : Tests de configuration TLS
| Réf. | Contrôle | Description | Vérifications à effectuer | Moyen de vérification | Preuves |
|---|---|---|---|---|---|
| ANSSI R3 | Versions de TLS | Privilégier TLS 1.3 et accepter TLS 1.2 | Versions acceptées | testssl.sh | Rapport |
| ANSSI R4 | Versions interdites | Ne pas utiliser SSLv2, SSLv3, TLS 1.0 et 1.1 | Refus de ces versions | testssl.sh | Rapport |
| ANSSI R9, R10 | Chiffrement symétrique | AES ou ChaCha20, avec un mode de chiffrement intègre | Suites acceptées | testssl.sh | Rapport |
| ANSSI R11 | Fonction de hachage | Utiliser SHA-2 | Algorithmes de hachage | testssl.sh | Rapport |
| ANSSI R13 | Ordre des suites | Préférer l'ordre de suites du serveur | Option de préférence | testssl.sh | Rapport |
| ANSSI R19 | Compression TLS | Ne pas utiliser la compression | Compression désactivée | testssl.sh | Rapport |
| ANSSI R22 | Renégociation | Extension de renégociation sécurisée activée | Prise en charge | testssl.sh | Rapport |
| ANSSI R24, R25, R26 | Certificat | Signé avec SHA-2, valide 3 ans ou moins, clés de taille suffisante | Détail du certificat | testssl.sh, openssl | Détail du certificat |
| ANSSI R29 | SubjectAlternativeName | Présenter un SAN approprié | Noms du certificat | testssl.sh | Détail du certificat |
| ANSSI R34 | Chaîne de certificats | Transmettre une chaîne complète et ordonnée | Chaîne envoyée | testssl.sh | Rapport |
| ANSSI R35 | Agrafage OCSP | Préférer l'agrafage OCSP | Prise en charge | testssl.sh | Rapport |
| TLSRef v6.0 | Profil Intermediate | Comparer la configuration réelle au profil généré pour Nginx | Écarts avec le profil | Générateur TLSRef, testssl.sh | Tableau d'écarts |
| Voir ASVS V12.3.3 | Flux internes en HTTP | Les recommandations TLS ne s'appliquent qu'une fois TLS activé : constat attendu, absence de chiffrement | Trafic entre le Nginx frontal et les services | Capture réseau | Capture |
No comments yet. Start a new discussion.