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.

Not

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 sonra 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 bkz . 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.

User

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)

Gruplandırma

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 kimliğini 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 uygulama kimliğini değil nesne kimliğini kullanın.

$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:

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

  • Yeni bir JSON dosyası oluşturma ve şablonu kopyalama
  • yerine rolün atanacak kullanıcı, grup, yönetilen kimlik veya uygulamanın kimliğiyle değiştirin <your-principal-id>
{
    "$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ı verilmiştir.

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.

Role assignment at resource group scope

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')]"
            }
        }
    ]
}

Not

Şablonun her dağıtımı için parametre olarak aynı roleNameGuid değer sağlanmadığı sürece bu şablon bir kez etkili olmaz. 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, dağıtımı bir kaynak grubu 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 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ı

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

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, şablonu dağıtıldıktan sonra depolama hesabı için kullanıcıya Katkıda Bulunan rolü ataması örneği gösterilmektedir.

Role assignment at resource scope

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ı principalType oluştururken özelliğini olarak ServicePrincipal ayarlamanız gerekir. Rol atamasının apiVersion özelliğini de 2018-09-01-preview veya üzeri olarak 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').principalId]",
                "principalType": "ServicePrincipal"
            }
        }
    ]
}

Aşağıda, dağıtımı bir kaynak grubu kapsamında başlatmaya yönelik New-AzResourceGroupDeployment ve az deployment group create komutları 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.

Role assignment for a new managed identity service principal

Sonraki adımlar