Azure Resource Manager şablonlarını kullanarak Azure rolleri atama

Azure rol tabanlı erişim denetimi (Azure RBAC), Azure kaynaklarına erişimi yönetmek için kullandığınız yetkilendirme sistemidir. Erişim vermek için kullanıcılara, gruplara, hizmet sorumlularına veya yönetilen kimliklere belirli kapsamda roller atamanız gerekir. Azure PowerShell veya Azure CLI'yı kullanmaya ek olarak, Azure Resource Manager şablonlarını kullanarak roller atayabilirsiniz. Kaynakları tutarlı ve tekrar tekrar dağıtmanız gerekiyorsa şablonlar yararlı olabilir. Bu makalede, şablonları kullanarak rollerin nasıl atandığı açıklanır.

Uyarı

Bicep, Azure kaynaklarınızı tanımlamaya yönelik yeni bir dildir. Kod olarak altyapınızın kalitesini artırmaya yardımcı olan diğer özelliklerin yanı sıra JSON'dan daha basit bir yazma deneyimine sahiptir. Azure'da kod olarak altyapıya yeni eklenen herkesin JSON yerine Bicep kullanmasını öneririz.

Bicep kullanarak rol atamalarını tanımlama hakkında bilgi edinmek için bkz. Bicep kullanarak Azure RBAC kaynakları oluşturma. Hızlı başlangıç örneği için bkz . Hızlı Başlangıç: Bicep kullanarak Azure rolü atama.

Önkoşullar

Azure rollerini atamak için şunlar gereklidir:

Aşağıdaki sürümleri kullanmanız gerekir:

  • 2018-09-01-preview veya daha üzeri kullanılarak yeni bir hizmet sorumlusuna Azure rolü atamak için
  • 2020-04-01-preview veya daha sonra kaynak kapsamında bir Azure rolü atamak için
  • 2022-04-01 ilk kararlı sürümdür

Daha fazla bilgi için bk . Azure RBAC REST API'lerinin API sürümleri.

Nesne kimliklerini alma

Rol atamak için rolü atamak istediğiniz kullanıcı, grup veya uygulamanın kimliğini belirtmeniz gerekir. Kimlik şu biçimdedir: 11111111-1111-1111-1111-111111111111. Kimliği Azure portalı, Azure PowerShell veya Azure CLI kullanarak alabilirsiniz.

Kullanıcı

Bir kullanıcının kimliğini almak için Get-AzADUser veya az ad user show komutlarını kullanabilirsiniz.

$objectid = (Get-AzADUser -DisplayName "{name}").id
objectid=$(az ad user show --id "{email}" --query id --output tsv)

Grup

Bir grubun kimliğini almak için Get-AzADGroup veya az ad group show komutlarını kullanabilirsiniz.

$objectid = (Get-AzADGroup -DisplayName "{name}").id
objectid=$(az ad group show --group "{name}" --query id --output tsv)

Yönetilen kimlikler

Yönetilen kimliğin ID'sini almak için Get-AzAdServiceprincipal veya az ad sp komutlarını kullanabilirsiniz.

$objectid = (Get-AzADServicePrincipal -DisplayName <Azure resource name>).id
objectid=$(az ad sp list --display-name <Azure resource name> --query [].id --output tsv)

Uygulama

Hizmet sorumlusunun kimliğini (uygulama tarafından kullanılan kimlik) almak için Get-AzADServicePrincipal veya az ad sp list komutlarını kullanabilirsiniz. Hizmet sorumlusu için nesne kimliğini kullanın ve uygulama kimliğini değil.

$objectid = (Get-AzADServicePrincipal -DisplayName "{name}").id
objectid=$(az ad sp list --display-name "{name}" --query [].id --output tsv)

Azure rolü atama

Azure RBAC'de erişim vermek için bir rol atarsınız.

Kaynak grubu kapsamı (parametreler olmadan)

Aşağıdaki şablonda rol atamanın temel bir yolu gösterilmektedir. Bazı değerler şablon içinde belirtilir. Aşağıdaki şablonda gösterilmiştir:

  • Okuyucu rolünü kaynak grubu kapsamındaki bir kullanıcıya, gruba veya uygulamaya atama

Şablonu kullanmak için aşağıdakileri yapmanız gerekir:

  • Yeni bir JSON dosyası oluşturma ve şablonu kopyalama
  • Rolü atamak için <your-principal-id> ile kullanıcı, grup, yönetilen kimlik veya uygulamanın kimliğini değiştirin.
{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources": [
        {
            "type": "Microsoft.Authorization/roleAssignments",
            "apiVersion": "2022-04-01",
            "name": "[guid(resourceGroup().id)]",
            "properties": {
                "roleDefinitionId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]",
                "principalId": "<your-principal-id>"
            }
        }
    ]
}

Aşağıda, örnek New-AzResourceGroupDeployment ve az deployment group create komutları, ExampleGroup adlı bir kaynak grubunda bir dağıtımı başlatmanın nasıl yapılacağını gösterir.

New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateFile rbac-test.json
az deployment group create --resource-group ExampleGroup --template-file rbac-test.json

Aşağıda, şablon dağıtıldıktan sonra bir kaynak grubu için kullanıcıya Okuyucu rolü ataması örneği gösterilmektedir.

Kaynak grubu kapsamında rol atamasının ekran görüntüsü.

Kaynak grubu veya abonelik kapsamı

Önceki şablon çok esnek değildir. Aşağıdaki şablon parametreleri kullanır ve farklı kapsamlarda kullanılabilir. Aşağıdaki şablonda gösterilmiştir:

  • Kaynak grubu veya abonelik kapsamında bir kullanıcıya, gruba veya uygulamaya rol atama
  • Sahip, Katkıda Bulunan ve Okuyucu rollerini parametre olarak belirtme

Şablonu kullanmak için aşağıdaki girişleri belirtmeniz gerekir:

  • Rolün atanacak kullanıcı, grup, yönetilen kimlik veya uygulamanın kimliği
  • Rol ataması için kullanılacak benzersiz bir kimlik veya varsayılan kimliği kullanabilirsiniz
{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "principalId": {
            "type": "string",
            "metadata": {
                "description": "The principal to assign the role to"
            }
        },
        "builtInRoleType": {
            "type": "string",
            "allowedValues": [
                "Owner",
                "Contributor",
                "Reader"
            ],
            "metadata": {
                "description": "Built-in role to assign"
            }
        },
        "roleNameGuid": {
            "type": "string",
            "defaultValue": "[newGuid()]",
            "metadata": {
                "description": "A new GUID used to identify the role assignment"
            }
        }
    },
    "variables": {
        "Owner": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', '8e3af657-a8ff-443c-a75c-2fe8c4bcb635')]",
        "Contributor": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
        "Reader": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]"
    },
    "resources": [
        {
            "type": "Microsoft.Authorization/roleAssignments",
            "apiVersion": "2022-04-01",
            "name": "[parameters('roleNameGuid')]",
            "properties": {
                "roleDefinitionId": "[variables(parameters('builtInRoleType'))]",
                "principalId": "[parameters('principalId')]"
            }
        }
    ]
}

Uyarı

Şablon, roleNameGuid değerinin aynı olarak her dağıtımda parametre olarak sağlanmadığı sürece idempotent değildir. Sağlanmadıysa roleNameGuid , varsayılan olarak her dağıtımda yeni bir GUID oluşturulur ve sonraki dağıtımlar bir Conflict: RoleAssignmentExists hatayla başarısız olur.

Rol atamasının kapsamı dağıtım düzeyinden belirlenir. Aşağıda, bir kaynak grubu kapsamındaki dağıtıma nasıl başlanacağını gösteren New-AzResourceGroupDeployment ve az deployment group create komutları örnek verilmiştir.

New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateFile rbac-test.json -principalId $objectid -builtInRoleType Reader
az deployment group create --resource-group ExampleGroup --template-file rbac-test.json --parameters principalId=$objectid builtInRoleType=Reader

Aşağıda, dağıtımı bir abonelik kapsamında başlatmaya ve konumu belirtmeye yönelik New-AzDeployment ve az deployment sub create komutları verilmiş.

New-AzDeployment -Location centralus -TemplateFile rbac-test.json -principalId $objectid -builtInRoleType Reader
az deployment sub create --location centralus --template-file rbac-test.json --parameters principalId=$objectid builtInRoleType=Reader

Kaynak kapsamı

Kaynak düzeyinde bir rol atamanız gerekiyorsa, rol ataması üzerindeki scope özelliğini kaynağın adına ayarlayın.

Aşağıdaki şablonda gösterilmiştir:

  • Yeni depolama hesabı oluşturma
  • Depolama hesabı kapsamında bir kullanıcıya, gruba veya uygulamaya rol atama
  • Sahip, Katkıda Bulunan ve Okuyucu rollerini parametre olarak belirtme

Şablonu kullanmak için aşağıdaki girişleri belirtmeniz gerekir:

  • Rolün atanacak kullanıcı, grup, yönetilen kimlik veya uygulamanın kimliği
{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "principalId": {
            "type": "string",
            "metadata": {
                "description": "The principal to assign the role to"
            }
        },
        "builtInRoleType": {
            "type": "string",
            "allowedValues": [
                "Owner",
                "Contributor",
                "Reader"
            ],
            "metadata": {
                "description": "Built-in role to assign"
            }
        },
        "roleNameGuid": {
            "type": "string",
            "defaultValue": "[newGuid()]",
            "metadata": {
                "description": "A new GUID used to identify the role assignment"
            }
        },
        "location": {
            "type": "string",
            "defaultValue": "[resourceGroup().location]"
        }
    },
    "variables": {
        "Owner": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', '8e3af657-a8ff-443c-a75c-2fe8c4bcb635')]",
        "Contributor": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]",
        "Reader": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'acdd72a7-3385-48ef-bd42-f606fba81ae7')]",
        "storageName": "[concat('storage', uniqueString(resourceGroup().id))]"
    },
    "resources": [
        {
            "apiVersion": "2019-04-01",
            "type": "Microsoft.Storage/storageAccounts",
            "name": "[variables('storageName')]",
            "location": "[parameters('location')]",
            "sku": {
                "name": "Standard_LRS"
            },
            "kind": "Storage",
            "properties": {}
        },
        {
            "type": "Microsoft.Authorization/roleAssignments",
            "apiVersion": "2022-04-01",
            "name": "[parameters('roleNameGuid')]",
            "scope": "[concat('Microsoft.Storage/storageAccounts', '/', variables('storageName'))]",
            "dependsOn": [
                "[variables('storageName')]"
            ],
            "properties": {
                "roleDefinitionId": "[variables(parameters('builtInRoleType'))]",
                "principalId": "[parameters('principalId')]"
            }
        }
    ]
}

Önceki şablonu dağıtmak için kaynak grubu komutlarını kullanırsınız. Aşağıda, dağıtımı bir kaynak kapsamında başlatmaya yönelik New-AzResourceGroupDeployment ve az deployment group create komutları verilmiştir.

New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateFile rbac-test.json -principalId $objectid -builtInRoleType Contributor
az deployment group create --resource-group ExampleGroup --template-file rbac-test.json --parameters principalId=$objectid builtInRoleType=Contributor

Aşağıda, şablonun dağıtılmasının ardından bir kullanıcıya bir depolama hesabı için Katılımcı rolü atama örneği gösterilmektedir.

Kaynak kapsamında rol atamasının ekran görüntüsü.

Yeni hizmet sorumlusu

Yeni bir hizmet sorumlusu oluşturur ve bu hizmet sorumlusuna hemen bir rol atamayı denerseniz, bu rol ataması bazı durumlarda başarısız olabilir. Örneğin, yeni bir yönetilen kimlik oluşturur ve ardından aynı Azure Resource Manager şablonunda bu hizmet sorumlusuna rol atamayı denerseniz rol ataması başarısız olabilir. Bu hatanın nedeni büyük olasılıkla bir çoğaltma gecikmesidir. Hizmet sorumlusu tek bir bölgede oluşturulur; ancak rol ataması, hizmet sorumlusunu henüz çoğaltmamış farklı bir bölgede gerçekleşebilir.

Bu senaryoyu ele almak için, rol atamasını yaparken ServicePrincipal olarak principalType özelliğini ayarlamanız gerekir. Rol atamasının apiVersion değerini 2018-09-01-preview veya daha sonraya da ayarlamanız gerekir. 2022-04-01 ilk kararlı sürümdür.

Aşağıdaki şablonda gösterilmiştir:

  • Yeni yönetilen kimlik hizmet sorumlusu oluşturma
  • Nasıl belirtilir? principalType
  • Kaynak grubu kapsamında katkıda bulunan rolünü bu hizmet sorumlusuna atama

Şablonu kullanmak için aşağıdaki girişleri belirtmeniz gerekir:

  • Yönetilen kimliğin temel adı veya varsayılan dizeyi kullanabilirsiniz
{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "baseName": {
            "type": "string",
            "defaultValue": "msi-test"
        }
    },
    "variables": {
        "identityName": "[concat(parameters('baseName'), '-bootstrap')]",
        "bootstrapRoleAssignmentId": "[guid(concat(resourceGroup().id, 'contributor'))]",
        "contributorRoleDefinitionId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]"
    },
    "resources": [
        {
            "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
            "name": "[variables('identityName')]",
            "apiVersion": "2018-11-30",
            "location": "[resourceGroup().location]"
        },
        {
            "type": "Microsoft.Authorization/roleAssignments",
            "apiVersion": "2022-04-01",
            "name": "[variables('bootstrapRoleAssignmentId')]",
            "dependsOn": [
                "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName'))]"
            ],
            "properties": {
                "roleDefinitionId": "[variables('contributorRoleDefinitionId')]",
                "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', variables('identityName')), '2018-11-30').properties.principalId]",
                "principalType": "ServicePrincipal"
            }
        }
    ]
}

Aşağıda, bir kaynak grubu kapsamındaki dağıtıma nasıl başlanacağını gösteren New-AzResourceGroupDeployment ve az deployment group create komutları örnek verilmiştir.

New-AzResourceGroupDeployment -ResourceGroupName ExampleGroup2 -TemplateFile rbac-test.json
az deployment group create --resource-group ExampleGroup2 --template-file rbac-test.json

Aşağıda, şablon dağıtıldıktan sonra yeni bir yönetilen kimlik hizmet sorumlusuna Katkıda Bulunan rolü ataması örneği gösterilmektedir.

Yeni yönetilen kimlik hizmet sorumlusu için rol atamasının ekran görüntüsü.

Sonraki adımlar