Format dan sintaks kondisi penetapan peran Azure
Kondisi adalah pemeriksaan tambahan yang dapat Anda tambahkan secara opsional ke penetapan peran untuk memberikan kontrol akses yang lebih terperinci. Misalnya, Anda dapat menambahkan kondisi yang mengharuskan objek memiliki tag tertentu untuk membaca objek. Artikel ini menjelaskan format dan sintaks kondisi penetapan peran.
Format kondisi
Untuk lebih memahami kondisi penetapan peran, ada baiknya melihat formatnya.
Kondisi sederhana
Kondisi paling dasar terdiri dari tindakan dan ekspresi yang ditargetkan. Tindakan adalah operasi yang dapat dilakukan pengguna pada jenis sumber daya. Ekspresi adalah pernyataan yang mengevaluasi benar atau salah, yang menentukan apakah tindakan diizinkan untuk dilakukan.
Berikut ini adalah format dari kondisi sederhana.
(
(
!(ActionMatches{'<action>'})
)
OR
(
<attribute> <operator> <value>
)
)
Kondisi berikut memiliki tindakan "Baca blob". Ekspresi memeriksa apakah nama kontainer adalah blob-contoh-kontainer.
(
(
!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'})
)
OR
(
@Resource[Microsoft.Storage/storageAccounts/blobServices/containers:name]
StringEquals 'blobs-example-container'
)
)
Bagaimana suatu kondisi dievaluasi
Jika pengguna mencoba melakukan tindakan dalam penetapan peran yang bukan <action>
, !(ActionMatches)
dievaluasi sebagai benar dan kondisi keseluruhan dievaluasi sebagai benar untuk memungkinkan tindakan dilakukan.
Jika pengguna mencoba melakukan <action>
dalam penetapan peran, !(ActionMatches)
dievaluasi sebagai salah, sehingga ekspresi dievaluasi. Jika ekspresi bernilai benar, kondisi keseluruhan bernilai benar untuk memungkinkan <action>
dilakukan. Jika tidak, <action>
tidak diizinkan untuk dilakukan.
Kode semu berikut menunjukkan cara lain Anda dapat membaca kondisi ini.
if a user tries to perform an action in the role assignment that does not match <action>
{
Allow action to be performed
}
else
{
if <attribute> <operator> <value> is true
{
Allow <action> to be performed
}
else
{
Do not allow <action> to be performed
}
}
Suboperasi
Beberapa tindakan memiliki suboperasi. Misalnya, Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read
tindakan data memiliki suboperasi "Cantumkan blob". Kondisi dengan suboperasi memiliki format berikut.
(
(
!(ActionMatches{'<action>'}
AND
SubOperationMatches{'<subOperation>'})
)
OR
(
<attribute> <operator> <value>
)
)
Beberapa tindakan
Kondisi dapat menyertakan beberapa tindakan yang ingin Anda izinkan jika kondisi adalah benar. Jika Anda memilih beberapa tindakan untuk satu kondisi, mungkin ada lebih sedikit atribut untuk dipilih untuk kondisi Anda karena atribut harus tersedia di seluruh tindakan yang dipilih.
(
(
!(ActionMatches{'<action>'})
AND
!(ActionMatches{'<action>'})
)
OR
(
<attribute> <operator> <value>
)
)
Beberapa ekspresi
Kondisi dapat mencakup beberapa ekspresi. Bergantung pada operator, atribut dapat diperiksa terhadap beberapa nilai.
(
(
!(ActionMatches{'<action>'})
)
OR
(
<attribute> <operator> <value>
AND | OR
<attribute> <operator> {<value>, <value>, <value>}
AND | OR
<attribute> <operator> <value>
)
)
Beberapa kondisi
Anda juga dapat menggabungkan kondisi untuk menargetkan beberapa tindakan.
(
(
!(ActionMatches{'<action>'})
)
OR
(
<attribute> <operator> <value>
AND | OR
<attribute> <operator> {<value>, <value>, <value>}
AND | OR
<attribute> <operator> <value>
)
)
AND
(
(
!(ActionMatches{'<action>'})
)
OR
(
<attribute> <operator> <value>
AND | OR
<attribute> <operator> <value>
)
)
Sintaks kondisi
Berikut ini menunjukkan sintaks untuk kondisi penetapan peran.
(
(
!(ActionMatches{'<action>'} AND SubOperationMatches{'<subOperation>'})
AND
!(ActionMatches{'<action>'} AND SubOperationMatches{'<subOperation>'})
AND
...
)
OR
(
<attribute> <operator> {<value, <value>, ...}
AND | OR
<attribute> <operator> {<value>, <value>, ...}
AND | OR
...
)
)
AND
(
(
!(ActionMatches{'<action>'} AND SubOperationMatches{'<subOperation>'})
AND
!(ActionMatches{'<action>'} AND SubOperationMatches{'<subOperation>'})
AND
...
)
OR
(
<attribute> <operator> {<value, <value>, ...}
AND | OR
<attribute> <operator> {<value>, <value>, ...}
AND | OR
...
)
)
AND
...
Tindakan
Saat ini, kondisi dapat ditambahkan ke penetapan peran bawaan atau kustom yang memiliki penyimpanan blob atau tindakan data penyimpanan antrean. Ini termasuk peran bawaan berikut:
- Kontributor Data Blob Penyimpanan
- Pemilik Data Blob Penyimpanan
- Pembaca Data Blob Penyimpanan.
- Kontributor Data Antrean Penyimpanan
- Pemroses Pesan Data Antrean Penyimpanan
- Storage Queue Data Message Sender
- Kontributor Data Antrean Penyimpanan
Untuk daftar tindakan penyimpanan yang dapat Anda gunakan dalam kondisi, lihat:
- Tindakan dan atribut untuk kondisi penetapan peran Azure untuk Azure Blob Storage
- Tindakan dan atribut untuk kondisi penetapan peran Azure untuk Azure Queue Storage.
Atribut
Bergantung pada tindakan yang dipilih, atribut dapat ditemukan di tempat yang berbeda. Jika Anda memilih beberapa tindakan untuk satu kondisi, mungkin ada lebih sedikit atribut yang dapat dipilih untuk kondisi Anda karena atribut harus tersedia di semua tindakan yang dipilih. Untuk menentukan atribut, Anda harus menyertakan sumber sebagai awalan.
Sumber atribut | Deskripsi | Kode |
---|---|---|
Lingkungan | Atribut dikaitkan dengan lingkungan permintaan, seperti asal jaringan permintaan atau tanggal dan waktu saat ini. |
@Environment |
Kepala sekolah | Atribut adalah atribut keamanan kustom yang ditetapkan ke prinsipal, seperti aplikasi pengguna atau perusahaan (perwakilan layanan). | @Principal |
Permintaan | Atribut adalah bagian dari permintaan tindakan, seperti mengatur tag indeks blob. | @Request |
Sumber daya | Atribut adalah properti sumber daya, seperti nama kontainer. | @Resource |
Untuk daftar lengkap atribut penyimpanan yang dapat Anda gunakan dalam kondisi, lihat:
Atribut lingkungan
Atribut lingkungan dikaitkan dengan keadaan di mana permintaan akses dibuat, seperti tanggal dan waktu hari atau lingkungan jaringan. Lingkungan jaringan mungkin apakah akses melalui titik akhir privat tertentu atau subnet jaringan virtual, atau mungkin melalui tautan privat apa pun.
Tabel berikut mencantumkan atribut lingkungan yang didukung untuk kondisi.
Nama tampilan | Deskripsi | Atribut | Jenis |
---|---|---|---|
Apakah tautanprivat 1 | Gunakan atribut ini dalam kondisi untuk memerlukan akses melalui tautan privat apa pun. | isPrivateLink |
Boolean |
Titikakhir privat 1,2 | Gunakan atribut ini dalam kondisi untuk membatasi akses melalui titik akhir privat tertentu. | Microsoft.Network/privateEndpoints |
String |
Subnet1,3 | Gunakan atribut ini dalam kondisi untuk membatasi akses dari subnet tertentu. | Microsoft.Network/virtualNetworks/subnets |
String |
UTC sekarang | Gunakan atribut ini dalam kondisi untuk membatasi akses ke objek selama periode waktu tertentu. | UtcNow |
DateTime |
1 Untuk operasi salin, Is private link
atribut , , Private endpoint
dan Subnet
hanya berlaku untuk tujuan, akun penyimpanan seperti itu, bukan sumbernya. Untuk informasi selengkapnya tentang operasi salin yang berlaku untuk ini, pilih setiap atribut dalam tabel untuk melihat detail selengkapnya.
2 Anda hanya dapat menggunakan Private endpoint
atribut jika saat ini Anda memiliki setidaknya satu titik akhir privat yang dikonfigurasi dalam langganan Anda.
3 Anda hanya dapat menggunakan Subnet
atribut jika saat ini Anda memiliki setidaknya satu subnet jaringan virtual menggunakan titik akhir layanan yang dikonfigurasi dalam langganan Anda.
Atribut utama
Atribut utama adalah atribut keamanan kustom yang ditetapkan ke prinsip keamanan yang meminta akses ke sumber daya. Perwakilan keamanan dapat menjadi pengguna atau aplikasi perusahaan (perwakilan layanan).
Untuk menggunakan atribut utama, Anda harus memiliki yang berikut:
- Izin Microsoft Entra untuk pengguna yang masuk, seperti peran Administrator Penetapan Atribut
- Atribut keamanan kustom yang ditentukan dalam ID Microsoft Entra
Untuk informasi selengkapnya tentang atribut keamanan kustom, lihat:
- Menambahkan atau menonaktifkan atribut keamanan kustom di ID Microsoft Entra
- Mengizinkan akses baca ke blob berdasarkan tag dan atribut keamanan kustom
- Prinsipal tidak muncul di Sumber atribut
Atribut permintaan
Atribut permintaan dikaitkan dengan kriteria yang ditentukan dalam permintaan akses, seperti awalan blob yang ditentukan untuk dicantumkan.
Atribut sumber daya
Atribut sumber daya dikaitkan dengan objek tempat akses diminta, seperti nama akun penyimpanan, nama kontainer, atau apakah namespace hierarki diaktifkan untuk akun penyimpanan.
Operator fungsi
Bagian ini mencantumkan operator fungsi yang tersedia untuk membangun kondisi.
ActionMatches
Properti | Nilai |
---|---|
Operator | ActionMatches |
Keterangan | Memeriksa apakah tindakan saat ini cocok dengan pola tindakan yang ditentukan. |
Contoh | ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} Jika tindakan yang diperiksa sama dengan "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read", maka true ActionMatches{'Microsoft.Authorization/roleAssignments/*'} Jika tindakan yang diperiksa sama dengan "Microsoft.Authorization/roleAssignments/write", maka true ActionMatches{'Microsoft.Authorization/roleDefinitions/*'} Jika tindakan yang diperiksa sama dengan "Microsoft.Authorization/roleAssignments/write", maka false |
SubOperationMatches
Properti | Nilai |
---|---|
Operator | SubOperationMatches |
Keterangan | Memeriksa apakah suboperasi saat ini cocok dengan pola suboperasi yang ditentukan. |
Contoh | SubOperationMatches{'Blob.List'} |
Ada
Properti | Nilai |
---|---|
Operator | Exists |
Keterangan | Memeriksa apakah atribut yang ditentukan ada. |
Contoh | Exists @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:snapshot] |
Dukungan atribut 1 | Nama cakupan enkripsi Snapshot ID Versi |
1 Operator Exists
hanya didukung untuk atribut ini dalam penyusun kondisi ABAC visual di portal Azure. Anda dapat menambahkan Exists
operator ke atribut apa pun menggunakan alat lain, seperti PowerShell, Azure CLI, REST API, dan editor kode kondisi di portal Azure.
Operator logis
Bagian ini mencantumkan operator logis yang tersedia untuk membangun kondisi.
Dan
Properti | Nilai |
---|---|
Operator | AND && |
Keterangan | Dan operator. |
Contoh | !(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'}) |
Atau
Properti | Nilai |
---|---|
Operator | OR || |
Keterangan | Atau operator. |
Contoh | @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:versionId] DateTimeEquals '2022-06-01T00:00:00.0Z' OR NOT Exists @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:versionId |
Not
Properti | Nilai |
---|---|
Operator | NOT ! |
Keterangan | Bukan atau operator negasi. |
Contoh | NOT Exists @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:versionId] |
Operator perbandingan Boolean
Bagian ini mencantumkan operator perbandingan Boolean yang tersedia untuk membangun kondisi.
Properti | Nilai |
---|---|
Operator | BoolEquals BoolNotEquals |
Keterangan | Perbandingan Boolean. |
Contoh | @Resource[Microsoft.Storage/storageAccounts:isHnsEnabled] BoolEquals true |
Operator perbandingan string
Bagian ini mencantumkan operator perbandingan string yang tersedia untuk membangun kondisi.
StringEquals
Properti | Nilai |
---|---|
Operator | StringEquals StringEqualsIgnoreCase |
Keterangan | Pencocokan peka huruf besar/kecil (atau tidak peka huruf besar/kecil). Nilai harus sama persis dengan string. |
Contoh | @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade' |
StringNotEquals
Properti | Nilai |
---|---|
Operator | StringNotEquals StringNotEqualsIgnoreCase |
Keterangan | Negasi StringEquals operator (atau StringEqualsIgnoreCase ) . |
StringStartsWith
Properti | Nilai |
---|---|
Operator | StringStartsWith StringStartsWithIgnoreCase |
Keterangan | Pencocokan peka huruf besar/kecil (atau tidak peka huruf besar/kecil). Nilai dimulai dengan string. |
StringNotStartsWith
Properti | Nilai |
---|---|
Operator | StringNotStartsWith StringNotStartsWithIgnoreCase |
Keterangan | Negasi StringStartsWith operator (atau StringStartsWithIgnoreCase ) . |
StringLike
Properti | Nilai |
---|---|
Operator | StringLike StringLikeIgnoreCase |
Keterangan | Pencocokan peka huruf besar/kecil (atau tidak peka huruf besar/kecil). Nilai dapat menyertakan kartubebas yang cocok dengan multi karakter (* ) atau kartubebas yang cocok dengan satu karakter (? ) di mana saja dalam string. Jika diperlukan, karakter ini dapat diloloskan dengan menambahkan garis miring terbalik \* dan \? . |
Contoh | @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:path] StringLike 'readonly/*' Resource[name1] StringLike 'a*c?' Jika Resource[name1] sama dengan "abcd", maka benar Resource[name1] StringLike 'A*C?' Jika Resource[name1] sama dengan "abcd", maka salah Resource[name1] StringLike 'a*c' Jika Resource[name1] sama dengan "abcd", maka salah |
StringNotLike
Properti | Nilai |
---|---|
Operator | StringNotLike StringNotLikeIgnoreCase |
Keterangan | Negasi StringLike operator (atau StringLikeIgnoreCase ) . |
Operator perbandingan numerik
Bagian ini mencantumkan operator perbandingan numerik yang tersedia untuk membangun kondisi.
Properti | Nilai |
---|---|
Operator | NumericEquals NumericNotEquals NumericGreaterThan NumericGreaterThanEquals NumericLessThan NumericLessThanEquals |
Keterangan | Pencocokan angka. Hanya bilangan bulat yang didukung. |
Operator perbandingan DateTime
Bagian ini mencantumkan operator perbandingan tanggal/waktu yang tersedia untuk membangun kondisi.
Properti | Nilai |
---|---|
Operator | DateTimeEquals DateTimeNotEquals DateTimeGreaterThan DateTimeGreaterThanEquals DateTimeLessThan DateTimeLessThanEquals |
Keterangan | Pemeriksaan presisi penuh dengan format: yyyy-mm-ddThh:mm:ss.mmmmmmmZ . Digunakan untuk ID versi blob, rekam jepret blob, dan UTC sekarang. |
Contoh | @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs:versionId] DateTimeEquals '2022-06-01T00:00:00.0Z' |
Operator perbandingan GUID
Bagian ini mencantumkan operator perbandingan pengidentifikasi unik global (GUID) yang tersedia untuk membangun kondisi.
Properti | Nilai |
---|---|
Operator | GuidEquals GuidNotEquals |
Keterangan | Pencocokan tidak peka huruf besar/kecil dengan format: 00000000-0000-0000-0000-000000000000 . Digunakan untuk mengidentifikasi sumber daya, seperti ID utama atau ID definisi peran. |
Contoh |
Operator perbandingan lintas produk
Bagian ini mencantumkan operator perbandingan lintas produk yang tersedia untuk membangun kondisi.
ForAnyOfAnyValues
Properti | Nilai |
---|---|
Operator | ForAnyOfAnyValues:StringEquals ForAnyOfAnyValues:StringEqualsIgnoreCase ForAnyOfAnyValues:StringNotEquals ForAnyOfAnyValues:StringNotEqualsIgnoreCase ForAnyOfAnyValues:StringLike ForAnyOfAnyValues:StringLikeIgnoreCase ForAnyOfAnyValues:StringNotLike ForAnyOfAnyValues:StringNotLikeIgnoreCase ForAnyOfAnyValues:NumericEquals ForAnyOfAnyValues:NumericNotEquals ForAnyOfAnyValues:NumericGreaterThan ForAnyOfAnyValues:NumericGreaterThanEquals ForAnyOfAnyValues:NumericLessThan ForAnyOfAnyValues:NumericLessThanEquals ForAnyOfAnyValues:GuidEquals ForAnyOfAnyValues:GuidNotEquals |
Keterangan | Jika setidaknya satu nilai di sisi kiri memenuhi perbandingan dengan setidaknya satu nilai di sisi kanan, maka ekspresi dievaluasi sebagai benar. Memiliki format: ForAnyOfAnyValues:<BooleanFunction> . Mendukung banyak string dan angka. |
Contoh | @Resource[Microsoft.Storage/storageAccounts/encryptionScopes:name] ForAnyOfAnyValues:StringEquals {'validScope1', 'validScope2'} Jika nama cakupan enkripsi sama dengan validScope1 atau validScope2 , maka true.{'red', 'blue'} ForAnyOfAnyValues:StringEquals {'blue', 'green'} benar {'red', 'blue'} ForAnyOfAnyValues:StringEquals {'orange', 'green'} salah |
ForAllOfAnyValues
Properti | Nilai |
---|---|
Operator | ForAllOfAnyValues:StringEquals ForAllOfAnyValues:StringEqualsIgnoreCase ForAllOfAnyValues:StringNotEquals ForAllOfAnyValues:StringNotEqualsIgnoreCase ForAllOfAnyValues:StringLike ForAllOfAnyValues:StringLikeIgnoreCase ForAllOfAnyValues:StringNotLike ForAllOfAnyValues:StringNotLikeIgnoreCase ForAllOfAnyValues:NumericEquals ForAllOfAnyValues:NumericNotEquals ForAllOfAnyValues:NumericGreaterThan ForAllOfAnyValues:NumericGreaterThanEquals ForAllOfAnyValues:NumericLessThan ForAllOfAnyValues:NumericLessThanEquals ForAllOfAnyValues:GuidEquals ForAllOfAnyValues:GuidNotEquals |
Keterangan | Jika setiap nilai di sisi kiri memenuhi perbandingan dengan setidaknya satu nilai di sisi kanan, maka ekspresi dievaluasi sebagai benar. Memiliki format: ForAllOfAnyValues:<BooleanFunction> . Mendukung banyak string dan angka. |
Contoh | @Request[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] ForAllOfAnyValues:StringEquals {'Cascade', 'Baker', 'Skagit'} {'red', 'blue'} ForAllOfAnyValues:StringEquals {'orange', 'red', 'blue'} benar {'red', 'blue'} ForAllOfAnyValues:StringEquals {'red', 'green'} salah |
ForAnyOfAllValues
Properti | Nilai |
---|---|
Operator | ForAnyOfAllValues:StringEquals ForAnyOfAllValues:StringEqualsIgnoreCase ForAnyOfAllValues:StringNotEquals ForAnyOfAllValues:StringNotEqualsIgnoreCase ForAnyOfAllValues:StringLike ForAnyOfAllValues:StringLikeIgnoreCase ForAnyOfAllValues:StringNotLike ForAnyOfAllValues:StringNotLikeIgnoreCase ForAnyOfAllValues:NumericEquals ForAnyOfAllValues:NumericNotEquals ForAnyOfAllValues:NumericGreaterThan ForAnyOfAllValues:NumericGreaterThanEquals ForAnyOfAllValues:NumericLessThan ForAnyOfAllValues:NumericLessThanEquals ForAnyOfAllValues:GuidEquals ForAnyOfAllValues:GuidNotEquals |
Keterangan | Jika setidaknya satu nilai di sisi kiri memenuhi perbandingan dengan setiap nilai di sisi kanan, maka ekspresi dievaluasi sebagai benar. Memiliki format: ForAnyOfAllValues:<BooleanFunction> . Mendukung banyak string dan angka. |
Contoh | {10, 20} ForAnyOfAllValues:NumericLessThan {15, 18} benar |
ForAllOfAllValues
Properti | Nilai |
---|---|
Operator | ForAllOfAllValues:StringEquals ForAllOfAllValues:StringEqualsIgnoreCase ForAllOfAllValues:StringNotEquals ForAllOfAllValues:StringNotEqualsIgnoreCase ForAllOfAllValues:StringLike ForAllOfAllValues:StringLikeIgnoreCase ForAllOfAllValues:StringNotLike ForAllOfAllValues:StringNotLikeIgnoreCase ForAllOfAllValues:NumericEquals ForAllOfAllValues:NumericNotEquals ForAllOfAllValues:NumericGreaterThan ForAllOfAllValues:NumericGreaterThanEquals ForAllOfAllValues:NumericLessThan ForAllOfAllValues:NumericLessThanEquals ForAllOfAllValues:GuidEquals ForAllOfAllValues:GuidNotEquals |
Keterangan | Jika setiap nilai di sisi kiri memenuhi perbandingan dengan setiap nilai di sisi kanan, maka ekspresi dievaluasi sebagai benar. Memiliki format: ForAllOfAllValues:<BooleanFunction> . Mendukung banyak string dan angka. |
Contoh | {10, 20} ForAllOfAllValues:NumericLessThan {5, 15, 18} salah {10, 20} ForAllOfAllValues:NumericLessThan {25, 30} benar {10, 20} ForAllOfAllValues:NumericLessThan {15, 25, 30} salah |
Karakter khusus
karakter | Deskripsi |
---|---|
* |
Tanda bintang (*) menunjukkan kecocokan kartubebas multi karakter yang dapat digunakan dengan operator Like . Jika perlu, Anda dapat menghindari tanda bintang dengan menambahkan garis miring terbalik \* . |
? |
Tanda tanya (?) mewakili kecocokan kartubebas karakter tunggal yang dapat digunakan dengan operator Like . Jika perlu, Anda dapat menghindari tanda tanya dengan menambahkan garis miring terbalik \? . |
$ |
Tanda dolar ($) digunakan untuk membantu menggambarkan kunci tag. Di Azure PowerShell, jika string yang diapit tanda kutip ganda (") menyertakan tanda dolar, Anda harus mengawalinya dengan backtick ('). Misalnya: tags:Project<`$key_case_sensitive`$> . |
Pengelompokan dan prioritas
Jika Anda memiliki tiga ekspresi atau lebih untuk tindakan yang ditargetkan dengan operator yang berbeda di antara ekspresi, urutan evaluasi bersifat ambigu. Anda menggunakan tanda kurung ()
untuk mengelompokkan ekspresi dan menentukan urutan ekspresi dievaluasi. Ekspresi yang diapit tanda kurung memiliki prioritas yang lebih tinggi. Misalnya, jika Anda memiliki ekspresi berikut:
a AND b OR c
Anda harus menambahkan tanda kurung dengan salah satu cara berikut:
(a AND b) OR c
a AND (b OR c)