Adicionar condições de atribuição de função para segredos do Key Vault ao usar a CLI do Azure (versão prévia)

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

  1. Use az login e siga as instruções para entrar como Administrador de Acesso do Usuário ou Proprietário.

    az login
    
  2. Use az account show para obter sua ID de assinatura.

    az account show
    
  3. Inicialize uma variável com sua ID de assinatura.

    subscriptionId="<subscriptionId>"
    

Etapa 2: Criar um usuário

  1. Use az ad user create para criar um usuário ou localizar um usuário existente. Este artigo usa User1 como exemplo.

  2. 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.

  1. 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 true
    
  2. Atribua 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 set falha com um erro (Forbidden) Caller is not authorized to perform action on resource para a ação Microsoft.KeyVault/vaults/secrets/setSecret/action para 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 $vaultScope
    

    Note

    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 Forbidden erro imediatamente após a atribuição geralmente significa que a função ainda não foi propagada.

  3. 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.

  4. Criar um segundo segredo chamado test-db-password.

    az keyvault secret set --vault-name "<keyVaultName>" --name "test-db-password" --value "<secretValue>"
    
  5. 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

  1. Inicialize as variáveis da função Key Vault Secrets User.

    roleDefinitionName="Key Vault Secrets User"
    roleDefinitionId="4633458b-17de-408a-b874-0445c86b69e6"
    
  2. Inicialize o escopo do grupo de recursos.

    scope="/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
    
  3. 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 com test-app. Todas as outras ações (que não sejam getSecret) 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 found devido ao ponto de exclamação (!) na condição. Desabilite a expansão do histórico com set +H, em seguida, habilite-a novamente mais tarde com set -H.

  4. 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"
    
  5. 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 $conditionVersion
    

    Exemplo 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

  1. Abra uma nova janela de comando.

  2. Use az login para entrar como User1.

    az login
    
  3. Inicialize as variáveis usadas anteriormente.

    keyVaultName="<keyVaultName>"
    secretNameAllowed="test-app-secret1"
    secretNameDenied="test-db-password"
    
  4. Use o comando az keyvault secret show para tentar ler o segredo cujo acesso foi negado.

    az keyvault secret show --vault-name $keyVaultName --name $secretNameDenied
    

    Saí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: ForbiddenByRbac
    
  5. Leia o segredo cujo nome começa com test-app.

    az keyvault secret show --vault-name $keyVaultName --name $secretNameAllowed
    

    Saí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

  1. 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 $resourceGroup
    
  2. Crie um arquivo JSON com o seguinte formato e atualize as condition propriedades e description também para permitir segredos cujos nomes começam com api-.

    {
      "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"
    }
    
  3. Use az role assignment update para atualizar a condição.

    az role assignment update --role-assignment "./path/roleassignment.json"
    

Etapa 7: Limpar os recursos

  1. 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 $resourceGroup
    
  2. Exclua o cofre de chaves que você criou.

  3. Exclua o usuário que você criou.