Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Note
Azure ABAC para Key Vault está em versão prévia. Alguns aspectos podem mudar antes da disponibilidade geral. Para consultar os termos de versão prévia, consulte os termos de uso complementares.
Na maioria dos casos, uma atribuição de função do Azure concede as permissões de que você precisa para os recursos do Azure. Em alguns casos, talvez você queira um controle de acesso mais granular adicionando uma condição de atribuição de função.
Este artigo mostra como usar a CLI do Azure para adicionar uma condição de controle de acesso baseado em atributos do Azure (Azure ABAC) a uma atribuição de função do Key Vault, de modo que uma entidade de segurança só possa ler segredos cujos nomes comecem com um prefixo específico.
Para obter o conjunto completo de ações e atributos com suporte, consulte Ações e atributos das condições ABAC do Azure Key Vault (versão prévia).
Importante
As condições ABAC só funcionam quando o modelo de permissão do cofre de chaves está definido como Controle de acesso baseado em função do Azure. As políticas de acesso ao cofre legadas não suportam condições.
Pré-requisitos
- Para obter informações sobre os pré-requisitos para adicionar ou editar condições de atribuição de função, consulte os pré-requisitos de condições.
- O Key Vault de destino deve ter seu modelo de permissão definido como Controle de acesso baseado em função do Azure.
- CLI do Azure instalado localmente ou use Azure Cloud Shell.
Condition
Neste artigo, você restringe o acesso a segredos cujos nomes começam com test-app. Se o usuário tentar ler um segredo sem o prefixo de test-app nome, o acesso não será permitido.
Essa é a aparência da condição:
(
(
!(ActionMatches{'Microsoft.KeyVault/vaults/secrets/getSecret/action'})
)
OR
(
@Resource[Microsoft.KeyVault/vaults/secrets:name] StringStartsWith 'test-app'
)
)
Etapa 1: Entrar no Azure
Use az login e siga as instruções para entrar como Administrador de Acesso do Usuário ou Proprietário.
az loginUse az account show para obter sua ID de assinatura.
az account showInicialize uma variável com sua ID de assinatura.
subscriptionId="<subscriptionId>"
Etapa 2: Criar um usuário
Use az ad user create para criar um usuário ou localizar um usuário existente. Este artigo usa User1 como exemplo.
Inicialize uma variável com a ID do objeto do usuário.
userObjectId="<userObjectId>"
Etapa 3: Configurar o cofre de chaves
Note
Os comandos neste artigo usam a sintaxe Bash (variable="value" e $variable). Se você executá-los de Windows PowerShell ou PowerShell 7, use a sintaxe variável do PowerShell em vez disso ($variable = "value") e ignore a nota de expansão de histórico do Bash na Etapa 4. Os az comandos em si são idênticos em ambos os shells.
Use az keyvault create para criar um cofre de chaves que usa Azure RBAC como seu modelo de permissão.
az keyvault create --name "<keyVaultName>" --resource-group "<resourceGroup>" --location "<location>" --enable-rbac-authorization trueAtribua a si mesmo uma função de plano de dados do Key Vault para poder criar segredos. Quando um cofre usa Azure RBAC, funções de plano de controle, como Proprietário ou Colaborador, não concedem acesso a valores secretos. Sem uma função de plano de dados,
az keyvault secret setfalha com um erro(Forbidden) Caller is not authorized to perform action on resourcepara a açãoMicrosoft.KeyVault/vaults/secrets/setSecret/actionpara a ação.myObjectId=$(az ad signed-in-user show --query id -o tsv) vaultScope="/subscriptions/$subscriptionId/resourceGroups/<resourceGroup>/providers/Microsoft.KeyVault/vaults/<keyVaultName>" az role assignment create --assignee-object-id $myObjectId --assignee-principal-type User --role "Key Vault Secrets Officer" --scope $vaultScopeNote
Use Oficial de Segredos do Key Vault para criar e gerenciar valores secretos ou Administrador do Key Vault para acesso completo ao plano de dados. Key Vault Secrets User tem acesso somente leitura. Depois de atribuir uma função, aguarde de 1 a 5 minutos para propagação antes de executar o próximo comando. Um
Forbiddenerro imediatamente após a atribuição geralmente significa que a função ainda não foi propagada.Use az keyvault secret set para criar um segredo chamado
test-app-secret1.az keyvault secret set --vault-name "<keyVaultName>" --name "test-app-secret1" --value "<secretValue>"Note
O nome do segredo é o atributo de recurso avaliado pela condição. Escolha nomes que reflitam o prefixo ao qual você planeja restringir o acesso.
Criar um segundo segredo chamado
test-db-password.az keyvault secret set --vault-name "<keyVaultName>" --name "test-db-password" --value "<secretValue>"Inicialize variáveis com os nomes usados.
resourceGroup="<resourceGroup>" keyVaultName="<keyVaultName>" secretNameAllowed="test-app-secret1" secretNameDenied="test-db-password"
Etapa 4: Atribuir uma função com uma condição
Inicialize as variáveis da função Key Vault Secrets User.
roleDefinitionName="Key Vault Secrets User" roleDefinitionId="4633458b-17de-408a-b874-0445c86b69e6"Inicialize o escopo do grupo de recursos.
scope="/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"Inicialize a condição.
condition="((!(ActionMatches{'Microsoft.KeyVault/vaults/secrets/getSecret/action'})) OR (@Resource[Microsoft.KeyVault/vaults/secrets:name] StringStartsWith 'test-app'))"Para a ação
Get secret, essa condição permite ler um segredo somente se seu nome começar comtest-app. Todas as outras ações (que não sejamgetSecret) não são afetadas.Note
A condição deve ser uma string de linha única. Condições com várias linhas são rejeitadas. Se você criar a condição em várias linhas, achate-a primeiro. Por exemplo:
condition=$(echo "$condition" | tr -s ' \n' ' ')No Bash, se a expansão do histórico estiver habilitada, você poderá ver
bash: !: event not founddevido ao ponto de exclamação (!) na condição. Desabilite a expansão do histórico comset +H, em seguida, habilite-a novamente mais tarde comset -H.Inicialize a versão da condição e a descrição.
conditionVersion="2.0" description="Read access to secrets whose names start with test-app"Use az role assignment create para atribuir a função Key Vault Secrets User com uma condição ao usuário no escopo do grupo de recursos.
az role assignment create --assignee-object-id $userObjectId --scope $scope --role $roleDefinitionId --description "$description" --condition "$condition" --condition-version $conditionVersionExemplo de saída:
{ "canDelegate": null, "condition": "((!(ActionMatches{'Microsoft.KeyVault/vaults/secrets/getSecret/action'})) OR (@Resource[Microsoft.KeyVault/vaults/secrets:name] StringStartsWith 'test-app'))", "conditionVersion": "2.0", "description": "Read access to secrets whose names start with test-app", "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}", "name": "{roleAssignmentId}", "principalId": "{userObjectId}", "principalType": "User", "resourceGroup": "{resourceGroup}", "roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/4633458b-17de-408a-b874-0445c86b69e6", "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}", "type": "Microsoft.Authorization/roleAssignments" }
Etapa 5: Testar a condição
Abra uma nova janela de comando.
Use az login para entrar como User1.
az loginInicialize as variáveis usadas anteriormente.
keyVaultName="<keyVaultName>" secretNameAllowed="test-app-secret1" secretNameDenied="test-db-password"Use o comando az keyvault secret show para tentar ler o segredo cujo acesso foi negado.
az keyvault secret show --vault-name $keyVaultName --name $secretNameDeniedSaída de exemplo. Observe que a leitura falha devido à condição:
(Forbidden) Caller is not authorized to perform action on resource. If role assignments, deny assignments or role definitions changed recently, please observe propagation time. ... Code: ForbiddenByRbacLeia o segredo cujo nome começa com
test-app.az keyvault secret show --vault-name $keyVaultName --name $secretNameAllowedSaída de exemplo. Observe que você pode ler o segredo porque seu nome começa com
test-app:{ "attributes": { }, "contentType": null, "id": "https://<keyVaultName>.vault.azure.net/secrets/test-app-secret1/<version>", "name": "test-app-secret1", "tags": {}, "value": "<secretValue>" }
Etapa 6: (Opcional) Editar a condição
Na janela de comando original, use az role assignment list para obter a atribuição de função que você adicionou.
az role assignment list --assignee $userObjectId --resource-group $resourceGroupCrie um arquivo JSON com o seguinte formato e atualize as
conditionpropriedades edescriptiontambém para permitir segredos cujos nomes começam comapi-.{ "canDelegate": null, "condition": "((!(ActionMatches{'Microsoft.KeyVault/vaults/secrets/getSecret/action'})) OR (@Resource[Microsoft.KeyVault/vaults/secrets:name] StringStartsWith 'test-app' OR @Resource[Microsoft.KeyVault/vaults/secrets:name] StringStartsWith 'api-'))", "conditionVersion": "2.0", "description": "Read access to secrets whose names start with test-app or api-", "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}", "name": "{roleAssignmentId}", "principalId": "{userObjectId}", "principalName": "user1@contoso.com", "principalType": "User", "resourceGroup": "{resourceGroup}", "roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/4633458b-17de-408a-b874-0445c86b69e6", "roleDefinitionName": "Key Vault Secrets User", "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}", "type": "Microsoft.Authorization/roleAssignments" }Use az role assignment update para atualizar a condição.
az role assignment update --role-assignment "./path/roleassignment.json"
Etapa 7: Limpar os recursos
Use az role assignment delete para remover a atribuição de função e a condição.
az role assignment delete --assignee $userObjectId --role "$roleDefinitionName" --resource-group $resourceGroupExclua o cofre de chaves que você criou.
Exclua o usuário que você criou.
Conteúdo relacionado
- Ações e atributos para condições ABAC do Azure Key Vault (versão prévia)
- Adicionar condições de atribuição de função para segredos do Key Vault ao usar o Azure PowerShell (versão prévia)
- Solucionar problemas de condições de atribuição de função do Azure
- Solucionar problemas de acesso para Azure Key Vault