Creación de una entidad de servicio de Azure con la CLI de Azure

Las herramientas automatizadas que usan los servicios de Azure deberán tener siempre permisos restringidos. En lugar de que las aplicaciones inicien sesión como un usuario con privilegios totales, Azure ofrece las entidades de servicio.

Qué es una entidad de servicio de Azure

Una entidad de servicio de Azure es una identidad creada para su uso con aplicaciones, servicios hospedados y herramientas automatizadas que acceden a los recursos de Azure. Este acceso está restringido por los roles asignados a la entidad de servicio, lo que permite controlar a qué recursos pueden tener acceso y en qué nivel. Por motivos de seguridad, se recomienda usar siempre entidades de servicio con las herramientas automatizadas, en lugar de permitirles iniciar sesión con una identidad de usuario.

En este artículo, se muestran los pasos para crear una entidad de servicio de Azure, obtener información sobre ella y restablecerla con la CLI de Azure.

Creación de una entidad de servicio

Cree una entidad de servicio de Azure con el comando az ad sp create-for-rbac.

Las claves appId y tenant se muestran en la salida de az ad sp create-for-rbac y se usan en la autenticación de la entidad de servicio. Anote sus valores, aunque se pueden recuperar en cualquier momento con az ad sp list.

Al crear una entidad de servicio, elija el tipo de autenticación de inicio de sesión que usa. Hay dos tipos de autenticación disponibles para las entidades de servicio de Azure: autenticación basada en contraseña y autenticación basada en certificados.

Nota

Si su cuenta no tiene permisos suficientes para crear una entidad de servicio, az ad sp create-for-rbac devolverá un mensaje de error que contiene el texto "Privilegios insuficientes para completar la operación". Póngase en contacto con el administrador de Azure Active Directory para crear a una entidad de servicio.

Advertencia

Cuando se crea una entidad de servicio de Azure mediante el comando az ad sp create-for-rbac, la salida incluye las credenciales que se deben proteger. Asegúrese de no incluir estas credenciales en el código ni en el control de código fuente. Considere también la posibilidad de usar identidades administradas para evitar tener que usar credenciales.

Como mínimo, se recomienda usar Contributor como para el parámetro --role. Para reducir el riesgo de poner en peligro una entidad de servicio, asígnele un rol más específico y restrinja el ámbito a un recurso o a un grupo de recursos. Para obtener más información, consulte Pasos para agregar una asignación de roles.

Autenticación basada en contraseña

La autenticación basada en contraseña no tiene ningún parámetro de autenticación y se usa con una contraseña aleatoria que se crea automáticamente.

az ad sp create-for-rbac --name ServicePrincipalName --role Contributor

Importante

A partir de la CLI de Azure 2.0.68, ya no se admite el parámetro --password para crear una entidad de servicio con una contraseña definida por el usuario, para impedir el uso accidental de contraseñas no seguras.

La salida para una entidad de servicio con autenticación por contraseña incluye la clave password. No olvide copiar este valor porque no se puede recuperar. Si olvida la contraseña, restablezca las credenciales de la entidad de servicio.

Autenticación basada en certificados

Para la autenticación basada en certificado, use el argumento --cert. Este argumento requiere que tenga un certificado. Asegúrese de que todas las herramientas que usan esta entidad de servicio tienen acceso a la clave privada del certificado. Los certificados deben estar en formato ASCII, como PEM, CER o DER. Pase el certificado como una cadena o use el formato @path para cargar el certificado desde un archivo.

Nota

Cuando se usa un archivo PEM, se debe anexar un valor de CERTIFICATE a PRIVATE KEY en el archivo.

az ad sp create-for-rbac --name ServicePrincipalName --role Contributor --cert "-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----"
az ad sp create-for-rbac --name ServicePrincipalName --role Contributor --cert @/path/to/cert.pem

Se puede agregar el argumento --keyvault para usar un certificado de Azure Key Vault. En este caso, el valor --cert es el nombre del certificado.

az ad sp create-for-rbac --name ServicePrincipalName --role Contributor --cert CertName --keyvault VaultName

Para crear un certificado autofirmado para la autenticación, use el argumento --create-cert:

az ad sp create-for-rbac --name ServicePrincipalName --role Contributor --create-cert

Salida de la consola:

Creating a role assignment under the scope 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 argument
{
  "appId": "myAppId",
  "displayName": "myDisplayName",
  "fileWithCertAndPrivateKey": "C:\\myPath\\myNewFile.pem",
  "name": "http://myName",
  "password": null,
  "tenant": "myTenantId"
}

Contenido del nuevo archivo PEM:

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

Nota

El comando az ad sp create-for-rbac --create-cert crea la entidad de servicio y un archivo PEM. El archivo PEM contiene los valores de PRIVATE KEY y CERTIFICATE con el formato correcto.

Se puede agregar el argumento --keyvault para almacenar el certificado en Azure Key Vault. Cuando se usa --keyvault, el argumento --cert también es necesario.

az ad sp create-for-rbac --name ServicePrincipalName --role Contributor --create-cert --cert CertName --keyvault VaultName

A menos que almacene el certificado en Key Vault, la salida incluirá la clave fileWithCertAndPrivateKey. Este valor de clave indica donde está almacenado el certificado generado. No olvide copiar el certificado en una ubicación segura o no podrá iniciar sesión con esta entidad de servicio.

Si pierde el acceso a la clave privada de un certificado, restablezca las credenciales de la entidad de servicio.

Recuperación de certificado desde Key Vault

En el caso del certificado almacenado en Key Vault, recupere el certificado con su clave privada del certificado con az keyvault secret show y conviértalo en un archivo PEM. En Key Vault, el nombre del secreto del certificado es el mismo que el nombre del 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

Recuperación de una entidad de servicio existente

Para obtener una lista de las entidades de servicio de un inquilino, use az ad sp list. De forma predeterminada, este comando devuelve las primeras 100 entidades de servicio del inquilino. Para obtener todas las entidades de servicio del inquilino, use el argumento --all. Generar esta lista puede tardar tiempo, por lo que se recomienda filtrarla con uno de los argumentos siguientes:

  • --display-name solicita las entidades de servicio que tengan un prefijo que coincida con el nombre proporcionado. El nombre para mostrar de una entidad de servicio es el valor que se establece con el parámetro --name durante la creación. Si no ha configurado --name durante la creación de la entidad de servicio, el prefijo del nombre es azure-cli-.
  • --spn filtra por los nombres de entidad de servicio que coincidan exactamente. El nombre de la entidad de servicio siempre empieza con https://. Si el valor utilizado para --name no era un URI, este valor https://, seguido por el nombre para mostrar.
  • --show-mine solicita solo las entidades de servicio creadas por el usuario que ha iniciado sesión.
  • --filter toma un filtro OData y filtra en el lado del servidor. Se recomienda este método frente al filtrado en el lado del cliente con el argumento --query de la CLI. Para más información acerca de los filtros OData, consulte la sintaxis de expresiones OData para filtros.

La información que se devuelve para los objetos de entidad de servicio es detallada. Para obtener solo la información necesaria para iniciar sesión, use la cadena de consulta [].{id:appId, tenant:appOwnerTenantId}. Por ejemplo, para obtener la información de inicio de sesión de todas las entidades de servicio creadas por el usuario que haya iniciado la sesión actual:

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

Importante

az ad sp list o az ad sp show obtienen el usuario y el inquilino, pero no los secretos de autenticación ni el método de autenticación. Los secretos de los certificados de Key Vault se pueden recuperar con az keyvault secret show, pero no otros secretos que se almacenen de forma predeterminada. Si olvida un método de autenticación o un secreto, restablezca las credenciales de la entidad de servicio.

Administración de roles de la entidad de servicio

La CLI de Azure tiene los siguientes comandos para administrar las asignaciones de roles.

Se recomienda usar el rol Colaborador como mínimo para una entidad de servicio. Este rol tiene permiso total para leer y escribir en una cuenta de Azure. El rol Lector es más restrictivo y proporciona acceso de solo lectura. Para más información sobre el control de acceso basado en rol (RBAC), consulte RBAC: roles integrados.

En este ejemplo se agrega el rol Lector y se elimina el rol Colaborador:

az role assignment create --assignee APP_ID --role Reader
az role assignment delete --assignee APP_ID --role Contributor

Nota

Si su cuenta no tiene permisos para asignar un rol, verá un mensaje de error indicando que su cuenta "no tiene autorización para realizar la acción Microsoft.Authorization/roleAssignments/write". Póngase en contacto con el administrador de Azure Active Directory para administrar los roles.

Agregar un rol no restringe los permisos asignados previamente. Al restringir los permisos de una entidad de servicio, el rol Colaborador se debe eliminar.

Para comprobar los cambios, puede obtener una lista de los roles asignados:

az role assignment list --assignee APP_ID

Inicio de sesión mediante una entidad de servicio

Para probar las credenciales y los permisos de la nueva entidad de servicio, inicie sesión. Para iniciar sesión con una entidad de servicio, necesita los valores de appId, tenant y las credenciales.

Para iniciar sesión con una entidad de servicio con una contraseña:

az login --service-principal --username APP_ID --password PASSWORD --tenant TENANT_ID

Para iniciar sesión con un certificado, debe estar disponible localmente en un archivo PEM o DER, en formato ASCII. Cuando se usa un archivo PEM, se deben anexar los valores de CERTIFICATE y PRIVATE KEY en el archivo.

az login --service-principal --username APP_ID --tenant TENANT_ID --password /path/to/cert

Para más información acerca de inicio de sesión con una entidad de servicio, consulte Inicio de sesión con la CLI de Azure.

Creación de un recurso mediante una entidad de servicio

En la sección siguiente se proporciona un ejemplo de cómo crear un recurso para Azure Storage con una entidad de servicio, mediante los siguientes comandos:

Para iniciar sesión con una entidad de servicio, necesita los valores de appId, tenant y password devueltos como respuesta al crear la entidad de servicio.

  1. Inicie sesión como la entidad de servicio.

    az login --service-principal --username APP_ID --password PASSWORD --tenant TENANT_ID
    
  2. Cree un grupo de recursos que contenga todos los recursos utilizados para el mismo inicio rápido, tutorial o proyecto de desarrollo.

    az group create --location WESTUS --name MY_RESOURCE_GROUP
    
  3. Cree un recurso para un servicio de Azure. Reemplace <SERVICENAME> por el nombre del servicio de Azure.

    Para Azure Storage, los valores válidos para el parámetro <KIND> son:

    • BlobStorage
    • BlockBlobStorage
    • FileStorage
    • Storage
    • StorageV2
    az storage account create --name MY_RESOURCE_<SERVICENAME> --resource-group MY_RESOURCE_GROUP --kind <KIND> --sku F0 --location WESTUS --yes
    
  4. Obtenga las claves de recurso del nuevo recurso, que se usa en el código para autenticarse en el servicio de Azure.

    az storage account keys list --name MY_RESOURCE_<SERVICENAME> --resource-group MY_RESOURCE_GROUP
    

Restablecimiento de las credenciales

Si olvida las credenciales de una entidad de servicio, utilice az ad sp credential reset. El comando reset toma los mismos argumentos que az ad sp create-for-rbac.

az ad sp credential reset --name APP_ID

Vea también