Политика Azure «Доступ по SSH из Интернета должен быть заблокирован» с эффектом запретить

#azure #azure-policy

Вопрос:

Моя цель: Предотвратить доступ к виртуальным машинам через SSH, отказав в правилах NSG, которые разрешают входящий трафик через порт 22.

Сначала я попытался самостоятельно написать пользовательскую политику, а затем переписать эту политику: доступ по SSH из Интернета должен быть заблокирован. Но в обоих случаях, когда я создаю виртуальную машину, связанная NSG все равно будет создана с открытым портом SSH.

Мои политики действуют так, как будто они имеют аудит эффекта, поскольку они не останавливают запрос ресурса немедленно (виртуальная машина, NSG), но несоответствие в Соответствии отображается позже на Портале. Но тогда, конечно, уже слишком поздно, а ресурсы уже есть и работают.

Спасибо за вашу помощь!

Обновить:

Перефразируя вопрос: Почему Azure в первую очередь не обеспечивает эффект отрицания?

Вся политика (такая же, как политика, связанная выше, за исключением запрета на действие) по запросу @KenWMSFT:

 "if": {
        "allOf": [
          {
            "equals": "Microsoft.Network/networkSecurityGroups/securityRules",
            "field": "type"
          },
          {
            "allOf": [
              {
                "equals": "Allow",
                "field": "Microsoft.Network/networkSecurityGroups/securityRules/access"
              },
              {
                "equals": "Inbound",
                "field": "Microsoft.Network/networkSecurityGroups/securityRules/direction"
              },
              {
                "anyOf": [
                  {
                    "equals": "*",
                    "field": "Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRange"
                  },
                  {
                    "equals": "22",
                    "field": "Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRange"
                  },
                  {
                    "equals": "true",
                    "value": "[if(and(not(empty(field('Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRange'))), contains(field('Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRange'),'-')), and(lessOrEquals(int(first(split(field('Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRange'), '-'))),22),greaterOrEquals(int(last(split(field('Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRange'), '-'))),22)), 'false')]"
                  },
                  {
                    "count": {
                      "field": "Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRanges[*]",
                      "where": {
                        "equals": "true",
                        "value": "[if(and(not(empty(first(field('Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRanges[*]')))), contains(first(field('Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRanges[*]')),'-')), and(lessOrEquals(int(first(split(first(field('Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRanges[*]')), '-'))),22),greaterOrEquals(int(last(split(first(field('Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRanges[*]')), '-'))),22)) , 'false')]"
                      }
                    },
                    "greater": 0
                  },
                  {
                    "not": {
                      "field": "Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRanges[*]",
                      "notEquals": "*"
                    }
                  },
                  {
                    "not": {
                      "field": "Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRanges[*]",
                      "notEquals": "22"
                    }
                  }
                ]
              },
              {
                "anyOf": [
                  {
                    "equals": "*",
                    "field": "Microsoft.Network/networkSecurityGroups/securityRules/sourceAddressPrefix"
                  },
                  {
                    "equals": "Internet",
                    "field": "Microsoft.Network/networkSecurityGroups/securityRules/sourceAddressPrefix"
                  },
                  {
                    "not": {
                      "field": "Microsoft.Network/networkSecurityGroups/securityRules/sourceAddressPrefixes[*]",
                      "notEquals": "*"
                    }
                  },
                  {
                    "not": {
                      "field": "Microsoft.Network/networkSecurityGroups/securityRules/sourceAddressPrefixes[*]",
                      "notEquals": "Internet"
                    }
                  }
                ]
              }
            ]
          }
        ]
      },
      "then": {
        "effect": "deny"
      }
    }
  },
 

Комментарии:

1. Пожалуйста, опубликуйте содержание политики, которую вы используете, чтобы мы могли увидеть ваши настройки

2. вы пробовали эффект отключения?

3. Спасибо за ваши комментарии. @KenWMSFT Я предоставил ссылку на политику. Единственное изменение заключается в том, что я использую эффект отрицания . Но, конечно, я могу опубликовать всю политику, если это общий подход здесь.

4. @user6932954 Вы действительно думаете, что отключенный эффект имеет желаемый эффект? Согласно документам, это способ «отключить одно назначение» и, насколько я понял, не отключать запрос ресурсов.

5. На первый взгляд я бы ожидал, что эта политика будет запрещать развертывание правил безопасности, но разрешит развертывание виртуальной машины. Azure рассматривает правила безопасности NSG как отдельные ресурсы, отличные от виртуальной машины. Для такого типа политики я не уверен, возможен ли эффект запрета. Однако вы можете развернуть несуществующие правила безопасности NSG для блокировки порта 22, если они не существуют. Это позволит продолжить развертывание и переопределить параметры развертывания, которые открывают порт 22 для SSH-трафика.