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-namesolicita 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--namedurante la creación. Si no ha configurado--namedurante la creación de la entidad de servicio, el prefijo del nombre esazure-cli-.--spnfiltra por los nombres de entidad de servicio que coincidan exactamente. El nombre de la entidad de servicio siempre empieza conhttps://. Si el valor utilizado para--nameno era un URI, este valorhttps://, seguido por el nombre para mostrar.--show-minesolicita solo las entidades de servicio creadas por el usuario que ha iniciado sesión.--filtertoma 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--queryde 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.
Inicie sesión como la entidad de servicio.
az login --service-principal --username APP_ID --password PASSWORD --tenant TENANT_IDCree 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_GROUPCree 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 --yesObtenga 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