Struktur definisi kebijakan Azure Policy

Aturan kebijakan terdiri dari blok if dan then. Di dalam blok if, Anda mendefinisikan satu atau beberapa kondisi yang menentukan kapan kebijakan diberlakukan. Anda dapat menerapkan operator logis ke kondisi ini untuk menentukan skenario kebijakan secara tepat.

Untuk detail lengkap tentang setiap efek, urutan evaluasi, properti, dan contoh, lihat dasar-dasar efek definisi Azure Policy.

Di blok then, Anda menentukan efek yang terjadi ketika kondisi if terpenuhi.

{
  "if": {
      <condition> | <logical operator>
  },
  "then": {
    "effect": "deny | audit | modify | denyAction | append | auditIfNotExists | deployIfNotExists | disabled"
  }
}

Untuk informasi selengkapnya tentang policyRule, buka skema definisi kebijakan.

Operator logis

Operator logis yang didukung adalah:

  • "not": {condition or operator}
  • "allOf": [{condition or operator},{condition or operator}]
  • "anyOf": [{condition or operator},{condition or operator}]

Sintaks not membalikkan hasil dari kondisi. allOf Sintaks (mirip dengan operasi logisand) mengharuskan semua kondisi benar. anyOf Sintaks (mirip dengan operasi logisor) memerlukan satu atau beberapa kondisi agar benar.

Anda dapat menggabungkan operator logis. Contoh berikut menunjukkan operasi not yang tertanam di dalam operasi allOf.

"if": {
  "allOf": [
    {
      "not": {
        "field": "tags",
        "containsKey": "application"
      }
    },
    {
      "field": "type",
      "equals": "Microsoft.Storage/storageAccounts"
    }
  ]
},

Kondisi

Sebuah kondisi mengevaluasi apakah suatu nilai memenuhi kriteria tertentu. Kondisi yang didukung adalah:

  • "equals": "stringValue"
  • "notEquals": "stringValue"
  • "like": "stringValue"
  • "notLike": "stringValue"
  • "match": "stringValue"
  • "matchInsensitively": "stringValue"
  • "notMatch": "stringValue"
  • "notMatchInsensitively": "stringValue"
  • "contains": "stringValue"
  • "notContains": "stringValue"
  • "in": ["stringValue1","stringValue2"]
  • "notIn": ["stringValue1","stringValue2"]
  • "containsKey": "keyName"
  • "notContainsKey": "keyName"
  • "less": "dateValue" | "less": "stringValue" | "less": intValue
  • "lessOrEquals": "dateValue" | "lessOrEquals": "stringValue" | "lessOrEquals": intValue
  • "greater": "dateValue" | "greater": "stringValue" | "greater": intValue
  • "greaterOrEquals": "dateValue" | "greaterOrEquals": "stringValue" | "greaterOrEquals": intValue
  • "exists": "bool"

Untuk less, , lessOrEqualsgreater, dan greaterOrEquals, jika jenis properti tidak cocok dengan jenis kondisi, kesalahan akan muncul. Perbandingan string dibuat menggunakan InvariantCultureIgnoreCase.

Saat menggunakan kondisi contains dan notContains, karakter pengganti (*) tidak boleh digunakan dalam nilai.

Saat menggunakan kondisi like dan notLike, Anda menyediakan karakter kartu bebas (*) dalam nilai. Nilai tidak boleh memiliki lebih dari satu karakter kartu bebas.

Saat menggunakan kondisi match dan notMatch, gunakan hashtag (#) untuk mencocokkan digit, tanda tanya (?) untuk huruf, dan titik (.) untuk mencocokkan karakter apa pun, serta karakter lainnya cocokkan dengan karakter tersebut. Meskipun match dan notMatch peka huruf besar/kecil, semua kondisi lain yang mengevaluasi tidak stringValue peka huruf besar/kecil. Alternatif yang tidak sensitif huruf tersedia di matchInsensitively dan notMatchInsensitively.

Bidang

Kondisi yang mengevaluasi apakah nilai properti dalam payload permintaan sumber daya memenuhi kriteria tertentu dapat dibentuk menggunakan field ekspresi. Bidang berikut ini didukung:

  • name

  • fullName

    • Mengembalikan nama lengkap sumber daya. Nama lengkap sumber daya adalah nama sumber daya yang didahului oleh nama sumber daya induk apa pun (misalnya myServer/myDatabase).
  • kind

  • type

  • location

    • Bidang lokasi dinormalisasi untuk mendukung berbagai format. Misalnya, East US 2 dianggap sama dengan eastus2.
    • Gunakan global untuk sumber daya yang bersifat agnostik terhadap lokasi.
  • id

    • Mengembalikan ID sumber daya dari sumber daya yang sedang dievaluasi.
    • Contoh: /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myRG/providers/Microsoft.KeyVault/vaults/myVault
  • identity.type

    • Mengembalikan jenis identitas terkelola yang diaktifkan pada sumber daya.
    • Nilai yang valid dari identitas terkelola: None, , SystemAssignedSystemAssigned, UserAssigned, dan UserAssigned.
    • identity.type dapat digunakan dengan kondisi aturan kebijakan yang didukung. Misalnya, kebijakan dengan efek tolak dapat memblokir permintaan berdasarkan keberadaan identitas atau berdasarkan nilai tertentu dari jenis identitas. Contoh aturan kebijakan yang memeriksa keberadaan identity.type adalah definisi kebijakan bawaan Akun Automation harus memiliki Identitas Terkelola dengan ID dea83a72-443c-4292-83d5-54a2f98749c0.
  • tags

    • tags['<tagName>']
      • Sintaks braket ini mendukung nama tag yang memiliki tanda baca seperti tanda hubung, titik, atau spasi.
      • Di mana tagName adalah nama tag untuk memvalidasi kondisi.
      • Contoh: tags['Acct.CostCenter'] di mana Acct.CostCenter adalah nama tag.
    • tags['''<tagName>''']
      • Sintaks braket ini mendukung nama tag yang memiliki apostrof di dalamnya dengan melakukan escape dengan apostrof ganda.
      • Di mana tagName adalah nama tag untuk memvalidasi kondisi.
      • Contoh: tags['''My.Apostrophe.Tag'''] di mana 'My.Apostrophe.Tag' adalah nama tag.
    • tags.<tagName>, tags[tagName], dan tags[tag.with.dots] merupakan cara yang dapat diterima untuk mendeklarasikan tags bidang tetapi ekspresi yang disukai adalah contoh sebelumnya.
  • alias properti

    • Untuk daftar, lihat Alias.
    • Dalam ekspresi yang mengacu pada alias array field, setiap elemen dalam array dievaluasi satu per satu dengan operator logis [*] antar elemen. Untuk informasi selengkapnya, lihat Acuan properti sumber daya dari array.

Ekspresi Lapangan

Kondisi yang menggunakan ekspresi field dapat menggantikan sintaks definisi kebijakan yang warisan "source": "action", yang sebelumnya berfungsi pada operasi tulis. Misalnya, kode berikut tidak lagi didukung:

{
  "source": "action",
  "like": "Microsoft.Network/publicIPAddresses/*"
}

Tetapi perilaku yang diinginkan dapat dicapai menggunakan field logika:

{
  "field": "type",
  "equals": "Microsoft.Network/publicIPAddresses"
}

Menggunakan tag dengan parameter

Nilai parameter dapat diteruskan ke bidang tag. Meneruskan parameter ke bidang tag meningkatkan fleksibilitas definisi kebijakan selama penetapan kebijakan.

Dalam contoh berikut, concat digunakan untuk membuat pencarian bidang tag untuk tag bernama nilai tagName parameter. Jika tag tersebut tidak ada, modify efek digunakan untuk menambahkan tag menggunakan nilai tag bernama yang sama yang diatur pada grup sumber daya induk sumber daya yang diaudit dengan menggunakan resourcegroup() fungsi pencarian.

{
  "if": {
    "field": "[concat('tags[', parameters('tagName'), ']')]",
    "exists": "false"
  },
  "then": {
    "effect": "modify",
    "details": {
      "operations": [
        {
          "operation": "add",
          "field": "[concat('tags[', parameters('tagName'), ']')]",
          "value": "[resourcegroup().tags[parameters('tagName')]]"
        }
      ],
      "roleDefinitionIds": [
        "/providers/microsoft.authorization/roleDefinitions/4a9ae827-6dc8-4573-8ac7-8239d42aa03f"
      ]
    }
  }
}

Nilai

Kondisi yang mengevaluasi apakah nilai memenuhi kriteria tertentu dapat dibentuk menggunakan value ekspresi. Nilai dapat bersifat harfiah, nilai parameter, atau nilai yang dikembalikan dari fungsi templat yang didukung.

Peringatan

Jika hasil fungsi templat adalah kesalahan, evaluasi kebijakan akan gagal. Evaluasi yang gagal adalah implisit deny. Untuk mengetahui informasi selengkapnya, lihat menghindari kegagalan templat. Gunakan enforcementMode dari doNotEnforce untuk mencegah efek dari evaluasi yang gagal pada sumber daya baru atau yang diperbarui saat menguji dan memvalidasi sebuah definisi kebijakan baru.

Contoh nilai

Contoh aturan kebijakan ini menggunakan value untuk membandingkan hasil fungsi resourceGroup() dan properti name yang dikembalikan dengan kondisi like dari *netrg. Aturan ini menolak sumber daya apa pun yang bukan dari Microsoft.Network/*type dalam grup sumber daya apa pun yang namanya berakhiran *netrg.

{
  "if": {
    "allOf": [
      {
        "value": "[resourceGroup().name]",
        "like": "*netrg"
      },
      {
        "field": "type",
        "notLike": "Microsoft.Network/*"
      }
    ]
  },
  "then": {
    "effect": "deny"
  }
}

Contoh aturan kebijakan ini menggunakan value untuk memeriksa apakah hasil dari beberapa fungsi bertingkatequalstrue. Aturan ini menolak sumber daya apa pun yang tidak memiliki setidaknya tiga tag.

{
  "mode": "indexed",
  "policyRule": {
    "if": {
      "value": "[less(length(field('tags')), 3)]",
      "equals": "true"
    },
    "then": {
      "effect": "deny"
    }
  }
}

Menghindari kegagalan templat

Penggunaan fungsi templat di value memungkinkan banyak fungsi berlapis yang kompleks. Jika hasil fungsi templat adalah kesalahan, evaluasi kebijakan akan gagal. Evaluasi yang gagal adalah implisit deny. Contoh value yang gagal dalam skenario tertentu:

{
  "policyRule": {
    "if": {
      "value": "[substring(field('name'), 0, 3)]",
      "equals": "abc"
    },
    "then": {
      "effect": "audit"
    }
  }
}

Contoh aturan kebijakan sebelumnya menggunakan substring() untuk membandingkan tiga karakter pertama dengan nameabc. Jika name lebih pendek dari tiga karakter, substring() fungsi menghasilkan kesalahan. Kesalahan ini mengubah kebijakan menjadi deny efek.

Sebagai gantinya , gunakan fungsi if() untuk memeriksa apakah tiga karakter name pertama sama abc tanpa mengizinkan name lebih pendek dari tiga karakter untuk menyebabkan kesalahan:

{
  "policyRule": {
    "if": {
      "value": "[if(greaterOrEquals(length(field('name')), 3), substring(field('name'), 0, 3), 'not starting with abc')]",
      "equals": "abc"
    },
    "then": {
      "effect": "audit"
    }
  }
}

Dengan aturan kebijakan yang direvisi, if() memeriksa panjang name sebelum mencoba mendapatkan substring() untuk nilai yang memiliki kurang dari tiga karakter. Jika name terlalu pendek, nilai "tidak dimulai dengan abc" dikembalikan sebagai gantinya dan dibandingkan dengan abc. Sumber daya dengan nama pendek yang tidak dimulai dengan abc masih melanggar aturan kebijakan, namun sekarang tidak lagi menyebabkan kesalahan selama evaluasi.

Hitung

Kondisi yang menghitung berapa banyak anggota array yang memenuhi kriteria tertentu dapat dibentuk menggunakan count ekspresi. Skenario umum adalah memeriksa apakah setidaknya salah satu dari, tepat salah satu dari, semua, atau tidak ada anggota array yang memenuhi kondisi. Mengevaluasi count setiap anggota array untuk ekspresi kondisi dan menjumlahkan hasil yang sebenarnya , yang kemudian dibandingkan dengan operator ekspresi.

Jumlah bidang

Menghitung berapa banyak anggota array dalam payload permintaan yang memenuhi ekspresi kondisi. Struktur field count ekspresi adalah:

{
  "count": {
    "field": "<[*] alias>",
    "where": {
      /* condition expression */
    }
  },
  "<condition>": "<compare the count of true condition expression array members to this value>"
}

Properti berikut digunakan dengan field count:

  • count.field (wajib): Berisi jalur ke array dan harus berupa alias array.
  • count.where (opsional): Ekspresi kondisi untuk mengevaluasi dengan satu per satu setiap anggota array alias dari count.field. Jika properti ini tidak disediakan, semua anggota array dengan jalur 'kolom' dievaluasi menjadi true. Kondisi apa pun dapat digunakan di dalam properti ini. Operator logis dapat digunakan di dalam properti ini untuk membuat persyaratan evaluasi yang kompleks.
  • condition (wajib): Nilai dibandingkan dengan jumlah item yang memenuhi ekspresi kondisi count.where. Kondisi numerik harus digunakan.

Untuk informasi lebih lengkap tentang cara bekerja dengan properti array di Azure Policy, termasuk penjelasan terperinci tentang bagaimana ekspresi field count dievaluasi, lihat Merujuk pada properti sumber daya array.

Jumlah nilai

Menghitung jumlah anggota array yang memenuhi kondisi. Array dapat berupa array harfiah atau referensi ke parameter array. Struktur value count ekspresi adalah:

{
  "count": {
    "value": "<literal array | array parameter reference>",
    "name": "<index name>",
    "where": {
      /* condition expression */
    }
  },
  "<condition>": "<compare the count of true condition expression array members to this value>"
}

Properti berikut digunakan dengan value count:

  • count.value (wajib): Array yang akan dievaluasi.
  • count.name (wajib): Nama indeks, terdiri dari huruf dan digit bahasa Inggris. Menentukan nama untuk nilai anggota array yang dievaluasi dalam perulangan saat ini. Nama digunakan untuk mereferensikan nilai saat ini di dalam kondisi count.where. Opsional ketika ekspresi count tidak berada sebagai cabang dari ekspresi lain count. Ketika tidak disediakan, nama indeks secara implisit diatur ke "default".
  • count.where(opsional): Ekspresi kondisi untuk mengevaluasi secara individual untuk setiap anggota array .count.value Jika properti ini tidak disediakan, semua anggota array dievaluasi ke true. Kondisi apa pun dapat digunakan di dalam properti ini. Operator logis dapat digunakan di dalam properti ini untuk membuat persyaratan evaluasi yang kompleks. Nilai anggota array yang saat ini dijumlahkan dapat diakses dengan memanggil fungsi saat ini.
  • condition (wajib): Nilai dibandingkan dengan jumlah item yang memenuhi ekspresi kondisi count.where. Kondisi numerik harus digunakan.

Fungsi saat ini

Fungsi current() hanya tersedia di dalam kondisi count.where. Ini mengembalikan nilai anggota array yang saat ini dihitung oleh evaluasi ekspresi count.

Penggunaan perhitungan nilai

  • current(<index name defined in count.name>). Misalnya: current('arrayMember').
  • current(). Diperbolehkan hanya ketika value count ekspresi bukan anak dari ekspresi lain count . Mengembalikan nilai yang sama seperti contoh sebelumnya.

Jika nilai yang dikembalikan oleh panggilan adalah objek, pengakses properti didukung. Misalnya: current('objectArrayMember').property.

Pemakaian hitungan kolom

  • current(<the array alias defined in count.field>). Misalnya, current('Microsoft.Test/resource/enumeratedArray[*]').
  • current(). Diperbolehkan hanya ketika field count ekspresi bukan anak dari ekspresi lain count . Mengembalikan nilai yang sama dengan contoh sebelumnya.
  • current(<alias of a property of the array member>). Misalnya, current('Microsoft.Test/resource/enumeratedArray[*].property').

Contoh jumlah bidang

Contoh 1: Memeriksa apakah array kosong

{
  "count": {
    "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]"
  },
  "equals": 0
}

Contoh 2: Memeriksa bahwa hanya satu elemen dalam array yang memenuhi persyaratan kondisi

{
  "count": {
    "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
    "where": {
      "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].description",
      "equals": "My unique description"
    }
  },
  "equals": 1
}

Contoh 3: Memastikan setidaknya satu anggota array agar sesuai dengan ekspresi kondisi

{
  "count": {
    "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
    "where": {
      "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].description",
      "equals": "My common description"
    }
  },
  "greaterOrEquals": 1
}

Contoh 4: Memeriksa apakah semua anggota array objek memenuhi ekspresi kondisi

{
  "count": {
    "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
    "where": {
      "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].description",
      "equals": "description"
    }
  },
  "equals": "[length(field('Microsoft.Network/networkSecurityGroups/securityRules[*]'))]"
}

Contoh 5: Memeriksa apakah setidaknya satu anggota array cocok dengan beberapa properti dalam ekspresi kondisi

{
  "count": {
    "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
    "where": {
      "allOf": [
        {
          "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].direction",
          "equals": "Inbound"
        },
        {
          "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].access",
          "equals": "Allow"
        },
        {
          "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].destinationPortRange",
          "equals": "3389"
        }
      ]
    }
  },
  "greater": 0
}

Contoh 6: Menggunakan fungsi current() di dalam kondisi where untuk mengakses nilai anggota array yang saat ini dijumlahkan dalam fungsi templat. Kondisi ini memeriksa apakah jaringan virtual berisi awalan alamat yang tidak berada di bawah rentang CIDR 10.0.0.0/24.

{
  "count": {
    "field": "Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]",
    "where": {
      "value": "[ipRangeContains('10.0.0.0/24', current('Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]'))]",
      "equals": false
    }
  },
  "greater": 0
}

Contoh 7: Menggunakan fungsi field() di dalam kondisi where untuk mengakses nilai anggota array yang saat ini dijumlahkan. Kondisi ini memeriksa apakah jaringan virtual berisi awalan alamat yang tidak berada di bawah rentang CIDR 10.0.0.0/24.

{
  "count": {
    "field": "Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]",
    "where": {
      "value": "[ipRangeContains('10.0.0.0/24', first(field(('Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]')))]",
      "equals": false
    }
  },
  "greater": 0
}

Contoh hitung nilai

Contoh 1: Memeriksa apakah nama sumber daya cocok dengan salah satu pola nama yang diberikan.

{
  "count": {
    "value": [
      "prefix1_*",
      "prefix2_*"
    ],
    "name": "pattern",
    "where": {
      "field": "name",
      "like": "[current('pattern')]"
    }
  },
  "greater": 0
}

Contoh 2: Memeriksa apakah nama sumber daya cocok dengan salah satu pola nama yang diberikan. Fungsi current() tidak menentukan nama indeks. Hasilnya sama dengan contoh sebelumnya.

{
  "count": {
    "value": [
      "prefix1_*",
      "prefix2_*"
    ],
    "where": {
      "field": "name",
      "like": "[current()]"
    }
  },
  "greater": 0
}

Contoh 3: Memeriksa apakah nama sumber daya cocok dengan salah satu pola nama yang diberikan yang disediakan oleh parameter array.

{
  "count": {
    "value": "[parameters('namePatterns')]",
    "name": "pattern",
    "where": {
      "field": "name",
      "like": "[current('pattern')]"
    }
  },
  "greater": 0
}

Contoh 4: Memeriksa apakah salah satu awalan alamat jaringan virtual tidak berada di bawah daftar awalan yang disetujui.

{
  "count": {
    "field": "Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]",
    "where": {
      "count": {
        "value": "[parameters('approvedPrefixes')]",
        "name": "approvedPrefix",
        "where": {
          "value": "[ipRangeContains(current('approvedPrefix'), current('Microsoft.Network/virtualNetworks/addressSpace.addressPrefixes[*]'))]",
          "equals": true
        },
      },
      "equals": 0
    }
  },
  "greater": 0
}

Contoh 5: Memeriksa apakah semua aturan NSG yang dipesan ditentukan dalam NSG. Properti aturan NSG yang dipesan didefinisikan dalam parameter array yang berisi objek.

Nilai parameter:

[
  {
    "priority": 101,
    "access": "deny",
    "direction": "inbound",
    "destinationPortRange": 22
  },
  {
    "priority": 102,
    "access": "deny",
    "direction": "inbound",
    "destinationPortRange": 3389
  }
]

Kebijakan:

{
  "count": {
    "value": "[parameters('reservedNsgRules')]",
    "name": "reservedNsgRule",
    "where": {
      "count": {
        "field": "Microsoft.Network/networkSecurityGroups/securityRules[*]",
        "where": {
          "allOf": [
            {
              "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].priority",
              "equals": "[current('reservedNsgRule').priority]"
            },
            {
              "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].access",
              "equals": "[current('reservedNsgRule').access]"
            },
            {
              "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].direction",
              "equals": "[current('reservedNsgRule').direction]"
            },
            {
              "field": "Microsoft.Network/networkSecurityGroups/securityRules[*].destinationPortRange",
              "equals": "[current('reservedNsgRule').destinationPortRange]"
            }
          ]
        }
      },
      "equals": 1
    }
  },
  "equals": "[length(parameters('reservedNsgRules'))]"
}

Fungsi kebijakan

Fungsi dapat digunakan untuk memperkenalkan lebih banyak logika ke dalam aturan kebijakan. Fungsi diselesaikan dalam aturan kebijakan definisi kebijakan dan dalam nilai parameter yang ditetapkan ke definisi kebijakan dalam inisiatif.

Semua fungsi templat Resource Manager tersedia untuk digunakan dalam aturan kebijakan, kecuali fungsi dan fungsi yang ditentukan pengguna berikut:

  • copyIndex()
  • dateTimeAdd()
  • dateTimeFromEpoch
  • dateTimeToEpoch
  • deployment()
  • environment()
  • extensionResourceId()
  • lambda() Untuk informasi selengkapnya, buka lambda
  • listAccountSas()
  • listKeys()
  • listSecrets()
  • list*
  • managementGroup()
  • newGuid()
  • pickZones()
  • providers()
  • reference()
  • resourceId()
  • subscriptionResourceId()
  • tenantResourceId()
  • tenant()
  • variables()

Catatan

Fungsi-fungsi ini masih tersedia dalam details.deployment.properties.template bagian penyebaran templat dalam deployIfNotExists definisi kebijakan.

Fungsi berikut tersedia untuk digunakan dalam aturan kebijakan, tetapi berbeda dari penggunaan dalam templat Azure Resource Manager (templat ARM):

  • utcNow() - Tidak seperti templat ARM, properti ini dapat digunakan di luar defaultValue.
    • Mengembalikan string yang diatur ke tanggal dan waktu saat ini dalam format DateTime Universal ISO 8601 yyyy-MM-ddTHH:mm:ss.fffffffZ.

Fungsi berikut ini hanya tersedia dalam aturan kebijakan:

  • addDays(dateTime, numberOfDaysToAdd)

    • dateTime: String [Wajib] - String dalam format yyyy-MM-ddTHH:mm:ss.FFFFFFFZUniversal ISO 8601 DateTime .
    • numberOfDaysToAdd: Bilangan bulat [Wajib] - Jumlah hari untuk ditambahkan.
  • field(fieldName)

    • fieldName: String [Wajib] - Nama bidang yang akan diambil
    • Mengembalikan nilai bidang tersebut dari sumber daya yang dievaluasi oleh if kondisi.
    • field terutama digunakan dengan auditIfNotExists dan deployIfNotExists untuk mereferensikan bidang pada sumber daya yang sedang dievaluasi. Contoh penggunaan ini dapat dilihat dalam contoh DeployIfNotExists.
  • requestContext().apiVersion

    • Mengembalikan versi API dari permintaan yang memicu evaluasi kebijakan (misalnya: 2021-09-01). Nilai ini adalah versi API yang digunakan dalam permintaan PUT/PATCH untuk evaluasi pada pembuatan/pembaruan sumber daya. Versi API terbaru selalu digunakan selama evaluasi kepatuhan pada sumber daya yang ada.
  • requestContext().identity

    • idtyp: mengembalikan identitas pemanggil permintaan yang memicu evaluasi kebijakan (misalnya: user). Nilai yang diterima meliputi: app, , usernull.

      {
      "value": "[tryGet(requestContext().identity, 'idtyp')]",
      "equals": "user"
      }
      
    • appid: mengembalikan ID aplikasi klien tempat permintaan dijalankan dari (misalnya: ID aplikasi portal)

      {
        "value": "[tryGet(requestContext().identity, 'appid')]",
        "notIn": "[parameters('allowedClientAppIds')]"
      }
      
    • acrs: mengembalikan apakah permintaan diautentikasi dengan autentikasi multifaktor (MFA)

        {
         "value": "p1",
         "notIn": "[split(requestContext().identity.acrs, ',')]"
        }
      
    • http: //schemas.microsoft.com/identity/claims/objectidentifier: mengembalikan ID pengguna (atau objek) yang terkait dengan permintaan.

         "value": "[tryGet(requestContext().identity, 'http: //schemas.microsoft.com/identity/claims/objectidentifier')]",
         "in": ['userId']
      

Peringatan

Saat Anda menggunakan fungsi requestContext().identity, mesin kebijakan tersebut menandai kebijakan sebagai NotApplicable untuk evaluasi atau pemindaian kepatuhan. Akibatnya, hasil kepatuhan untuk kebijakan tersebut terlihat sebagai NotApplicable, tetapi penegakan efek seperti Deny, DeployIfNotExists dan Modify masih terjadi pada waktu permintaan.

  • policy()

    • Mengembalikan informasi berikut tentang kebijakan yang sedang dievaluasi. Properti dapat diakses dari objek yang dikembalikan (misalnya: [policy().assignmentId]).

      {
        "assignmentId": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/providers/Microsoft.Authorization/policyAssignments/myAssignment",
        "definitionId": "/providers/Microsoft.Authorization/policyDefinitions/34c877ad-507e-4c82-993e-3452a6e0ad3c",
        "setDefinitionId": "/providers/Microsoft.Authorization/policySetDefinitions/42a694ed-f65e-42b2-aa9e-8052e9740a92",
        "definitionReferenceId": "StorageAccountNetworkACLs"
      }
      
  • ipRangeContains(range, targetRange)

    • range: String [Wajib] - String yang menentukan rentang alamat IP untuk memeriksa apakah targetRange berada di dalamnya.
    • targetRange: String [Wajib] - String yang menentukan rentang alamat IP untuk divalidasi seperti yang disertakan dalam rentang.
    • Mengembalikan boolean untuk apakah range rentang alamat IP berisi rentang alamat IP targetRange. Rentang kosong, atau campuran antara keluarga IP tidak diperbolehkan dan mengakibatkan kegagalan evaluasi.

    Format yang didukung:

    • Alamat IP tunggal (contoh: 10.0.0.0, 2001:0DB8::3:FFFE)
    • Rentang CIDR (contoh: 10.0.0.0/24, 2001:0DB8::/110)
    • Rentang yang ditentukan oleh alamat IP awal dan akhir (contoh: 192.168.0.1-192.168.0.9, 2001:0DB8::-2001:0DB8::3:FFFF)
  • current(indexName)

Contoh fungsi kebijakan

Contoh aturan kebijakan ini menggunakan resourceGroup fungsi sumber daya untuk mendapatkan name properti , dikombinasikan dengan concat fungsi array dan objek untuk membangun like kondisi yang memberlakukan nama sumber daya untuk memulai dengan nama grup sumber daya.

{
  "if": {
    "not": {
      "field": "name",
      "like": "[concat(resourceGroup().name,'*')]"
    }
  },
  "then": {
    "effect": "deny"
  }
}

Batas aturan kebijakan

Batas yang diberlakukan selama penulisan

Batasan pada struktur aturan kebijakan diberlakukan selama penulisan atau penugasan kebijakan. Upaya untuk membuat atau menetapkan definisi kebijakan yang melebihi batas ini gagal.

Batas Nilai Detil-detil
Ekspresi kondisi dalam if kondisi 4096
Ekspresi kondisional dalam blok then 128 Berlaku untuk existenceCondition kebijakan auditIfNotExists dan deployIfNotExists
Fungsi kebijakan per aturan kebijakan 2048
Jumlah parameter dari fungsi kebijakan 128 Contoh: [function('parameter1', 'parameter2', ...)]
Kedalaman fungsi kebijakan bersarang 64 Contoh: [function(nested1(nested2(...)))]
Panjang string ekspresi fungsi kebijakan 81920 Contoh: panjang "[function(....)]"
Field count ekspresi per larik 5
Value count ekspresi per aturan kebijakan 10
Value count jumlah perulangan ekspresi 100 Ekspresi berlapis Value count juga menyertakan jumlah perulangan ekspresi induk.

Batas yang diberlakukan selama evaluasi

Batas ukuran objek yang diproses oleh fungsi kebijakan selama evaluasi kebijakan. Batasan ini tidak selalu dapat diberlakukan selama penulisan karena bergantung pada konten yang dievaluasi. Contohnya:

{
  "field": "name",
  "equals": "[concat(field('stringPropertyA'), field('stringPropertyB'))]"
}

Panjang string yang dibuat oleh concat() fungsi tergantung pada nilai properti dalam sumber daya yang dievaluasi.

Batas Nilai Contoh
Panjang untai (karakter) yang dikembalikan oleh fungsi 131072 [concat(field('longString1'), field('longString2'))]
Kedalaman objek kompleks yang disediakan sebagai parameter ke, atau dikembalikan oleh fungsi 128 [union(field('largeObject1'), field('largeObject2'))]
Jumlah node objek kompleks yang disediakan sebagai parameter ke, atau dikembalikan oleh fungsi 32768 [concat(field('largeArray1'), field('largeArray2'))]

Peringatan

Kebijakan yang melebihi batas selama evaluasi akan menjadi kebijakan deny dengan efektif dan dapat memblokir permintaan masuk. Saat menulis kebijakan dengan fungsi yang kompleks, perhatikan batasan ini dan uji kebijakan Anda terhadap sumber daya yang berpotensi melebihinya.

Langkah berikutnya