Créer et afficher des stratégies de sécurité Cloud Armor

Cette page explique comment créer des stratégies de sécurité Google Cloud Armor pour filtrer le trafic entrant vers votre application. Pour en savoir plus sur les concepts liés aux stratégies de sécurité, consultez la présentation des stratégies de sécurité Cloud Armor.

Avant de commencer

Avant de configurer des stratégies de sécurité, procédez comme suit :

  • Assurez-vous de bien connaître les concepts d'équilibreur de charge d'application externe.

  • Examinez vos services de backend existants pour déterminer ceux qui ne sont pas associés à une stratégie de sécurité. Ces services de backend et leurs backends associés ne sont pas protégés. Pour ajouter la protection Cloud Armor, associez une stratégie de sécurité nouvelle ou existante au service de backend.

Configurer les autorisations IAM pour les stratégies de sécurité Cloud Armor

Les opérations suivantes nécessitent le rôle IAM (Identity and Access Management) Administrateur de sécurité Compute (roles/compute.securityAdmin) :

  • Configurer, modifier, mettre à jour et supprimer une stratégie de sécurité Cloud Armor
  • Avec les méthodes d'API suivantes :
    • SecurityPolicies insert
    • SecurityPolicies delete
    • SecurityPolicies patch
    • SecurityPolicies addRule
    • SecurityPolicies patchRule
    • SecurityPolicies removeRule

Un utilisateur disposant du rôle Administrateur de réseaux Compute (roles/compute.networkAdmin) peut effectuer les opérations suivantes :

  • Définir une stratégie de sécurité Cloud Armor pour un service de backend
  • Avec les méthodes d'API suivantes :
    • BackendServices setSecurityPolicy
    • BackendServices list (gcloud uniquement)

Les utilisateurs disposant du rôle Administrateur de sécurité (roles/iam.securityAdmin) et du rôle Administrateur de réseaux Compute (roles/compute.networkAdmin) peuvent afficher les stratégies de sécurité Cloud Armor à l'aide des méthodes d'API SecurityPolicies get, list et getRule.

Configurer les autorisations IAM pour les rôles personnalisés

Le tableau suivant répertorie les autorisations de base des rôles IAM, les méthodes d'API associées et les rôles qui accordent cette autorisation.

Autorisation IAM Méthodes d'API Rôles
compute.securityPolicies.create SecurityPolicies insert Administrateur de sécurité Compute (roles/compute.securityAdmin)
compute.securityPolicies.delete SecurityPolicies delete Administrateur de sécurité Compute (roles/compute.securityAdmin)
compute.securityPolicies.get SecurityPolicies get
SecurityPolicies getRule
Administrateur de la sécurité (roles/iam.securityAdmin)
compute.securityPolicies.list SecurityPolicies list Administrateur de la sécurité (roles/iam.securityAdmin)
Les deux éléments suivants :
  • compute.securityPolicies.use
  • compute.backendServices.
    setSecurityPolicy
BackendServices
setSecurityPolicy
Administrateur de réseaux Compute (roles/compute.networkAdmin)
compute.securityPolicies.update SecurityPolicies patch
SecurityPolicies addRule
SecurityPolicies patchRule
SecurityPolicies removeRule
Administrateur de sécurité Compute (roles/compute.securityAdmin)

Crée des stratégies de sécurité

Utilisez la console Google Cloud , la Google Cloud CLI ou l'API REST pour configurer les stratégies, les règles et les expressions de sécurité Cloud Armor. Lorsque vous utilisez gcloud CLI, utilisez l'option --type pour spécifier si la stratégie de sécurité est une stratégie de sécurité de backend ou une stratégie de sécurité Edge.

Si vous ne maîtrisez pas la configuration des règles de sécurité, consultez les exemples de règles de sécurité.

Exemples d'expressions

Vous trouverez ci-dessous des exemples d'expressions. Pour en savoir plus, consultez la documentation de référence sur le langage des règles personnalisées Cloud Armor.

Si votre règle ou expression utilise des codes de pays ou de région ISO 3166-1 alpha-2, Cloud Armor traite chaque code indépendamment. Les règles et expressions Cloud Armor utilisent ces codes pour autoriser ou refuser les requêtes.

  • L'expression suivante correspond aux requêtes provenant de l'adresse IP 1.2.3.4 qui contiennent la chaîne example dans l'en-tête User-Agent :

    inIpRange(origin.ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('example')
    

    Vous pouvez également faire correspondre la plage d'adresses IP d'un en-tête d'adresse IP client personnalisé à l'aide de l'attribut origin.user_ip :

    inIpRange(origin.user_ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('example')
    
  • L'expression suivante correspond aux requêtes qui comportent un cookie ayant une valeur spécifique :

    has(request.headers['cookie']) && request.headers['cookie'].contains('cookie_name=cookie_value')
    
  • L'expression suivante correspond aux requêtes provenant de la région AU :

    origin.region_code == 'AU'
    
  • L'expression suivante correspond aux requêtes provenant de la région AU qui ne sont pas comprises dans la plage d'adresses IP spécifiée :

    origin.region_code == "AU" && !inIpRange(origin.ip, '1.2.3.0/24')
    
  • L'expression suivante met en correspondance les requêtes qui ont un chemin d'accès de variable numéroté vers un fichier spécifique si l'URI correspond à une expression régulière :

    request.path.matches('/path/[0-9]+/target_file.html')
    
  • L'expression suivante met en correspondance les requêtes si la valeur décodée en base64 de l'en-tête user-id contient une valeur spécifique :

    has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')
    
  • L'expression suivante utilise un ensemble d'expressions préconfiguré pour mettre en correspondance les attaques SQLi :

    evaluatePreconfiguredWaf('sqli-stable')
    

Traversée et normalisation de répertoire

Normalisez le contenu de vos règles basées sur des chemins d'accès pour gérer les règles de traversée de répertoire et d'encodage, et pour créer des règles généralisées qui évitent la mise en majuscules ou l'encodage spécifique au contenu.

Lorsque vous écrivez des règles qui utilisent startsWith, endsWith ou contains pour correspondre à request.path, utilisez lower et urlDecode pour normaliser le chemin avant la correspondance. Cela permet d'éviter les contournements qui utilisent l'encodage d'URL ou les variations de casse.

Par exemple, pour bloquer l'accès au répertoire /admin, utilisez l'expression suivante :

request.path.lower().urlDecode().startsWith('/admin')

Cette règle bloque les requêtes pour /admin, /Admin, /a%64min et d'autres variantes.

Lorsque vous écrivez des règles qui utilisent matches pour correspondre à request.path, tenez compte du caractère barre oblique inverse (\) dans votre expression régulière.

Par exemple, pour bloquer l'accès au répertoire /admin, utilisez l'expression suivante pour bloquer les contournements qui utilisent la barre oblique inverse (\) :

request.path.matches(r'^/\\*admin')

Combinez cela avec urlDecode pour gérer à la fois l'encodage d'URL et les échappements de barre oblique inverse (\) :

request.path.urlDecode().matches(r'^/\\*admin')

Étapes suivantes