Criar um diretor de serviço Azure com o Azure CLI

As ferramentas automatizadas que utilizam serviços do Azure devem ter sempre permissões restritas. Em vez de obrigar as aplicações a iniciarem sessão como um utilizador com privilégios máximos, o Azure disponibiliza principais de serviço.

O que é um diretor de serviço Azure?

Um principal de serviço do Azure é uma identidade criada para ser utilizada com aplicações, serviços alojados e ferramentas automatizadas para aceder aos recursos do Azure. Este acesso é restringido pelas funções atribuídas ao principal de serviço, o que lhe permite assumir o controlo dos recursos que podem ser acedidos e em que nível. Por motivos de segurança, é sempre recomendado utilizar os principais de serviço com ferramentas automatizadas, em vez de permitir que iniciem sessão com uma identidade de utilizador.

Este artigo mostra-lhe os passos para criar, obter informações e repor um diretor de serviço Azure com o Azure CLI.

1. Criar um chefe de serviço

Crie um diretor de serviço Azure com o comando ad sp create-for-rbac .

As appId teclas e tenant as teclas aparecem na saída de e são utilizadas na autenticação principal de az ad sp create-for-rbac serviço. Registem os seus valores, mas podem ser recuperados a qualquer momento com a lista de anúncios da AZ Sp.

Quando cria um principal de serviço, escolhe o tipo de autenticação de início de sessão que o mesmo utiliza. Existem dois tipos de autenticação disponíveis para os principados do serviço Azure: autenticação baseada em palavra-passe e autenticação baseada em certificados.

Aviso

Quando cria um principal de serviço Azure usando o az ad sp create-for-rbac comando, a saída inclui credenciais que deve proteger. Certifique-se de que não inclui estas credenciais no seu código nem regista as credenciais no seu controlo de código fonte. Como alternativa, considere usar identidades geridas se disponível para evitar a necessidade de usar credenciais.

Para reduzir o risco de um principal de serviço comprometido, atribua uma função mais específica e reduza os âmbitos a um grupo de recursos ou recursos. Veja os Passos para adicionar uma atribuição de função para obter mais informações.

Autenticação baseada em palavra-passe

Com a autenticação baseada em palavras-passe, é criada uma senha aleatória para si. Se não especificar um --name valor de parâmetro, será criado um nome que contenha uma marca de tempo para si. Tem de especificar uma como --scopes este valor não tem um padrão. Se preferir, pode definir a tarefa de função mais tarde, utilizando a az role assignment create.

# Create a service principal with required parameter
az ad sp create-for-rbac --scopes /subscriptions/mySubscriptionID

# Create a service principal for a resource group using a preferred name and role
az ad sp create-for-rbac --name myServicePrincipalName \
                         --role reader \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName

Também pode criar um principal de serviço usando variáveis.

let "randomIdentifier=$RANDOM*$RANDOM"  
servicePrincipalName="msdocs-sp-$randomIdentifier"
roleName="azureRoleName"
subscriptionID=$(az account show --query id -o tsv)
# Verify the ID of the active subscription
echo "Using subscription ID $subscriptionID"
resourceGroup="myResourceGroupName"

echo "Creating SP for RBAC with name $servicePrincipalName, with role $roleName and in scopes /subscriptions/$subscriptionID/resourceGroups/$resourceGroup"
az ad sp create-for-rbac --name $servicePrincipalName --role $roleName --scopes /subscriptions/$subscriptionID/resourceGroups/$resourceGroup

A saída para um principal de serviço com autenticação de senha inclui a password chave. Certifique-se de copiar este valor - não pode ser recuperado. Se perder a palavra-passe, reponha as credenciais do principal de serviço.

Autenticação baseada em certificado

Para autenticação baseada em certificado, utilize o --cert parâmetro. Este parâmetro requer que possua um certificado existente. Certifique-se de que qualquer ferramenta que utilize este principal serviço tenha acesso à chave privada do certificado. Os certificados devem estar num formato ASCII, como PEM, CER ou DER. Passe o certificado como uma corda, ou use o @path formato para carregar o certificado a partir de um ficheiro.

Nota

Ao utilizar um ficheiro PEM, o CERTIFICADO deve ser anexado à CHAVE PRIVADA dentro do ficheiro.

az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --cert "-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----"
az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --cert @/path/to/cert.pem

O --keyvault parâmetro pode ser adicionado para usar um certificado em Azure Key Vault. Neste caso, o --cert valor é o nome do certificado.

az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --cert certificateName \
                         --keyvault vaultName

Para criar um certificado auto-assinado para autenticação, utilize o --create-cert parâmetro:

az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --create-cert

Saída da consola:

Creating a role assignment under the scopes of "/subscriptions/myId"
Please copy C:\myPath\myNewFile.pem to a safe place.
When you run 'az login', provide the file path in the --password parameter
{
  "appId": "myAppId",
  "displayName": "myDisplayName",
  "fileWithCertAndPrivateKey": "C:\\myPath\\myNewFile.pem",
  "name": "http://myName",
  "password": null,
  "tenant": "myTenantId"
}

Conteúdo do novo ficheiro PEM:

-----BEGIN PRIVATE KEY-----
myPrivateKeyValue
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
myCertificateValue
-----END CERTIFICATE-----

Nota

O az ad sp create-for-rbac --create-cert comando cria o principal de serviço e um ficheiro PEM. O ficheiro PEM contém uma chave e certificadoPRIVADOs corretamente formatados.

O --keyvault parâmetro pode ser adicionado para armazenar o certificado em Azure Key Vault. Durante a utilização--keyvault, é necessário o --cert parâmetro.

az ad sp create-for-rbac --name myServicePrincipalName \
                         --role roleName \
                         --scopes /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName \
                         --create-cert \
                         --cert certificateName \
                         --keyvault vaultName

A menos que guarde o certificado em Key Vault, a saída inclui a fileWithCertAndPrivateKey chave. O valor desta chave indica onde o certificado gerado está armazenado. Certifique-se de que copia o certificado para um local seguro, ou não pode entrar com este diretor de serviço.

Se perder o acesso à chave privada de um certificado, reponha as credenciais principais do serviço.

Obter certificado de Key Vault

Para certificados armazenados em Key Vault, recupere o certificado com a sua chave privada com a az keyvault secret show e converta-o num ficheiro PEM. No Key Vault, o nome do segredo do certificado é o mesmo que o nome do certificado.

az keyvault secret download --file /path/to/cert.pfx --vault-name VaultName --name CertName --encoding base64
openssl pkcs12 -in cert.pfx -passin pass: -out cert.pem -nodes

2. Obter um diretor de serviço existente

Uma lista dos diretores de serviço de um inquilino pode ser recuperada com lista de anúncios da AZ Sp. Por defeito, este comando devolve os primeiros 100 principais de serviço para o seu inquilino. Para obter todos os diretores de serviço de um inquilino, use o --all parâmetro. Conseguir esta lista pode demorar muito tempo, por isso é recomendável filtrar a lista com um dos seguintes parâmetros:

  • --display-name solicita os principais de serviço que têm um prefixo que corresponde ao nome fornecido. O nome de exibição de um principal de serviço é o valor definido com o parâmetro durante a --name criação. Se não definiu --name durante a criação principal do serviço, o prefixo do nome é azure-cli-.
  • --spn filtros no nome principal de serviço exato que combinam. O nome principal do serviço começa sempre com https://. se o valor utilizado --name não foi um URI, este valor é https:// seguido pelo nome de exibição.
  • --show-mine solicita apenas os principais de serviço criados pelo utilizador inscrito.
  • --filter toma um filtro OData e executa a filtragem do lado do servidor . Este método é recomendado sobre a filtragem do lado do cliente com o parâmetro do --query CLI. Para saber mais sobre os filtros OData, consulte a sintaxe da expressão OData para obter filtros.

A informação devolvida para objetos principais de serviço é verbosa. Para obter apenas as informações necessárias para o iniciar sismo, utilize a cadeia [].{id:appId, tenant:appOwnerTenantId}de consulta . Por exemplo, para obter a informação de inscrição para todos os principais de serviço criados pelo utilizador atualmente iniciado:

az ad sp list --show-mine --query "[].{id:appId, tenant:appOwnerTenantId}"

Importante

az ad sp list ou az ad sp show obter o utilizador e inquilino, mas não quaisquer segredos de autenticação ou o método de autenticação. Segredos para certificados em Key Vault podem ser recuperados com um show secreto az keyvault, mas nenhum outro segredo é armazenado por padrão. Se esquecer um método de autenticação ou segredo, reponha as credenciais principais do serviço.

3. Gerir as funções principais do serviço

O Azure CLI tem os seguintes comandos para gerir atribuições de funções:

A função Colaboradora tem permissões completas para ler e escrever numa conta Azure. A função Leitor é mais restritiva, com acesso só de leitura. Para obter mais informações sobre o Controlo de Acesso Baseado em Funções (RBAC) e as funções, veja RBAC: Funções incorporadas.

Este exemplo adiciona a função Reader e remove a função de Contribuinte :

az role assignment create --assignee appID \
                          --role Reader \
                          --scope /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName

az role assignment delete --assignee appID \
                          --role Contributor \
                          --scope /subscriptions/mySubscriptionID/resourceGroups/myResourceGroupName

Adicionar uma função não restringe as permissões atribuídas anteriormente. Ao restringir as permissões do principiante de serviço, a função do Contribuinte deve ser removida se for previamente atribuída.

As alterações podem ser verificadas ao listar as funções atribuídas:

az role assignment list --assignee appID

4. Inscreva-se na utilização de um chefe de serviço

Teste as credenciais e permissões do novo principal de serviço iniciando sessão. Para entrar com um diretor de serviço, precisa do appId, tenante credenciais.

Para iniciar sessão com um principal de serviço através de uma palavra-passe:

az login --service-principal --username appID --password PASSWORD --tenant tenantID

Para iniciar sação com um certificado, deve estar disponível localmente como ficheiro PEM ou DER, em formato ASCII. Ao utilizar um ficheiro PEM, a CHAVE PRIVADA e o Certificado devem ser anexados dentro do ficheiro.

az login --service-principal --username appID --tenant tenantID --password /path/to/cert

Para saber mais sobre a inscrição com um diretor de serviço, consulte Iniciar sessão com o CLI Azure.

5. Criar um recurso utilizando o principal do serviço

A secção seguinte fornece um exemplo de como criar um recurso para o Azure Storage com um principal serviço, utilizando os seguintes comandos:

Para iniciar sômssin com um diretor de serviço, precisa do appID, tenantIDe password devolvido como resposta quando criou o seu principal serviço.

  1. Faça o login como diretor de serviço.

    az login --service-principal --username appID --password PASSWORD --tenant tenantID
    
  2. Crie um grupo de recursos para manter todos os recursos utilizados para o mesmo quickstart, tutorial ou projeto de desenvolvimento.

    az group create --location westus --name myResourceGroupName
    
  3. Criar uma conta de armazenamento.

    Para o armazenamento Azure, os valores válidos para o <KIND> parâmetro são:

    • BlobStorage
    • BlockBlobStorage
    • Arquiteia
    • Armazenamento
    • StorageV2
    az storage account create --name myStorageAccountName --resource-group myResourceGroupName --kind <KIND> --sku F0 --location westus --yes
    
  4. Obtenha chaves de recursos, que utiliza no seu código para autenticar na conta de armazenamento Azure.

    az storage account keys list --name myStorageAccountName --resource-group myResourceGroupName
    

6. Redefinir credenciais

Se perder as credenciais para um diretor de serviço, use o reset credencial ad sp. O comando reset tem os mesmos parâmetros que az ad sp create-for-rbac.

az ad sp credential reset --name myServicePrincipal_appID_or_name

7. Resolução de problemas

Privilégios insuficientes

Se a sua conta não tiver permissão para criar um principal de serviço, az ad sp create-for-rbac devolverá uma mensagem de erro contendo "Privilégios insuficientes para completar a operação". Contacte o seu administrador Azure Ative Directory para criar um diretor de serviço.

Inquilino inválido

Se especificou um ID de subscrição inválido, vê a mensagem de erro "O pedido não tinha uma subscrição ou um fornecedor de recursos de nível de inquilino válido." Se utilizar variáveis, utilize o comando Bash echo para ver o valor a ser passado para o comando de referência. Utilize a conta az definida para alterar a sua subscrição ou aprenda como gerir as subscrições do Azure com o Azure CLI.

Grupo de recursos não encontrado

Se tiver especificado um nome de grupo de recursos inválido, vê a mensagem de erro "O nome do grupo de recursos" não foi encontrada." Se utilizar variáveis, utilize o comando Bash echo para ver o valor a ser passado tanto para os comandos de subscrição como para os comandos de referência. Use a lista de grupos az para ver os grupos de recursos para a subscrição atual, ou aprenda como gerir grupos de recursos Azure com o Azure CLI.

Autorização para realizar ações

Se a sua conta não tiver permissão para atribuir uma função, ser-lhe-á apresentada uma mensagem de erro com a indicação de que a sua conta "não tem autorização para realizar a ação 'Microsoft.Authorization/roleAssignments/write'". Contacte o administrador do Azure Active Directory para gerir funções.

Ver também