Post

False Policy compliance

Nagy kedvencemnek, az Azure Policy-nak is meg van a saját gyengesége. Egyrészt, hogy nem valós időben mutatja az adatokat, hiszen alapvetően 24 óránként fut le a már meglévő erőforrásokra, másrészt, hogy minden Policy csak annyira pontos, mint amilyenre megírták. Ez utóbbi azért lehet probléma, mert ha egy Policy nem pontos, akkor az erőforrások nem megfelelően jelennek majd meg a Compliance-ben. Ebben a cikkben egy egyszerű Private DNS Zone regisztrációt fogok bemutatni, ahol a gyári megoldás alapvetően megfelelően működik, de ha a portált használva a connection-t letöröljük, úgy már is nem fogja észrevenni a Policy. Ezt a hibát fogom bemutatni és megoldani.

Policy

A gyári KeyVault Policy-t fogom használni, ami alapvetően megfelelően működik, de logikailag nem megy biztosra, így a számomra nem lesz megfelelő.

False Policy compliance

Ez tehát megnézi, hogy milyen “groupids”-ről van szó, ha “vault”?, akkor pedig lefuttatja a deployment-et. Ez alapvetően jó így, de ha a portált használva töröljük a connection-t, akkor a Policy nem fogja észrevenni, hogy nem megfelelő az erőforrás. Tehát hiába szuperzöld minden, igazából hiányos a beállításunk.

Ezt amúgy könnyen tudjuk orvosolni, esetemben például csak kiegészítettem egyetlen további feltétellel.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
"existenceCondition": {
            "anyOf": [
              {
                "count": {
                  "field": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups/privateDnsZoneConfigs[*]",
                  "where": {
                    "field": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups/privateDnsZoneConfigs[*].privateDnsZoneId",
                    "equals": "[parameters('privateDnsZoneId')]"
                  }
                },
                "greaterOrEquals": 1
              }
            ]
          }

Ez a feltétel azt nézi meg, hogy van-e egyáltalán beállítva a Private DNS Zone, és az a zóna van beállítva, amit kértem a paraméterben legalább egyszer. Ha igen, akkor megfelelő, ha nem, akkor indul a deployment és létrehozza a kapcsolatot.

“existenceCondition” ellentétes logikával műküdik, mint a poliyRule. Az első felében akkor indul a policy, ha IGAZ a feltétel, DE az existenceCondition akkor indul, ha HAMIS a feltétel.

Egészében így néz ki a policy:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
{
  "mode": "Indexed",
  "policyRule": {
    "if": {
      "allOf": [
        {
          "field": "type",
          "equals": "Microsoft.Network/privateEndpoints"
        },
        {
          "count": {
            "field": "Microsoft.Network/privateEndpoints/privateLinkServiceConnections[*].groupIds[*]",
            "where": {
              "field": "Microsoft.Network/privateEndpoints/privateLinkServiceConnections[*].groupIds[*]",
              "equals": "vault"
            }
          },
          "greaterOrEquals": 1
        }
      ]
    },
    "then": {
      "effect": "[parameters('effect')]",
      "details": {
        "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups",
        "roleDefinitionIds": [
          "/providers/Microsoft.Authorization/roleDefinitions/4d97b98b-1d4f-4787-a291-c67834d212e7"
        ],
        "existenceCondition": {
          "anyOf": [
            {
              "count": {
                "field": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups/privateDnsZoneConfigs[*]",
                "where": {
                  "field": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups/privateDnsZoneConfigs[*].privateDnsZoneId",
                  "equals": "[parameters('privateDnsZoneId')]"
                }
              },
              "greaterOrEquals": 1
            }
          ]
        },
        "deployment": {
          "properties": {
            "mode": "incremental",
            "template": {
              "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
              "contentVersion": "1.0.0.0",
              "parameters": {
                "privateDnsZoneId": {
                  "type": "string"
                },
                "privateEndpointName": {
                  "type": "string"
                },
                "location": {
                  "type": "string"
                }
              },
              "resources": [
                {
                  "name": "[concat(parameters('privateEndpointName'), '/deployedByPolicy')]",
                  "type": "Microsoft.Network/privateEndpoints/privateDnsZoneGroups",
                  "apiVersion": "2020-03-01",
                  "location": "[parameters('location')]",
                  "properties": {
                    "privateDnsZoneConfigs": [
                      {
                        "name": "keyvault-privateDnsZone",
                        "properties": {
                          "privateDnsZoneId": "[parameters('privateDnsZoneId')]"
                        }
                      }
                    ]
                  }
                }
              ]
            },
            "parameters": {
              "privateDnsZoneId": {
                "value": "[parameters('privateDnsZoneId')]"
              },
              "privateEndpointName": {
                "value": "[field('name')]"
              },
              "location": {
                "value": "[field('location')]"
              }
            }
          }
        }
      }
    }
  },
  "parameters": {
    "privateDnsZoneId": {
      "type": "String",
      "metadata": {
        "displayName": "Private DNS Zone ID",
        "description": "A private DNS zone ID to connect to the private endpoint.",
        "strongType": "Microsoft.Network/privateDnsZones",
        "assignPermissions": true
      }
    },
    "effect": {
      "type": "String",
      "metadata": {
        "displayName": "Effect",
        "description": "Enable or disable the execution of the policy"
      },
      "allowedValues": [
        "DeployIfNotExists",
        "Disabled"
      ],
      "defaultValue": "DeployIfNotExists"
    }
  }
}

Konklúzió

A Policy egy nagyon jó eszköz, de nem szabad megfeledkezni arról, hogy csak annyira pontos, mint amilyenre megírták. Ha nem vagyunk biztosak benne, hogy minden esetben megfelelően fog működni, akkor érdemes lehet egy kicsit tovább finomítani rajta. A fenti példában is látszik, hogy a gyári megoldás nem volt megfelelő, de egy kis kiegészítéssel már tökéletesen működött.

This post is licensed under CC BY 4.0 by the author.