Autenticación de soluciones de servicio de Batch con Active Directory

Azure Batch admite la autenticación con Azure Active Directory (Azure AD). Azure AD es el directorio basado en la nube multiinquilino y el servicio de administración de identidades de Microsoft. El propio Azure usa Azure AD para la autenticación de sus clientes, administradores de servicios y usuarios de la organización.

Al utilizar la autenticación de Azure AD con Azure Batch, puede autenticar de una de estas dos maneras:

  • Uso de autenticación integrada para autenticar un usuario que está interactuando con la aplicación. Una aplicación que use la autenticación integrada recopila las credenciales de un usuario y las usa para autenticar el acceso a los recursos de Batch.
  • Uso de una entidad de servicio para autenticar una aplicación desatendida. Una entidad de servicio define la directiva y los permisos de una aplicación para representar la aplicación cuando se accede a los recursos en tiempo de ejecución.

Para más información acerca de Azure AD, consulte la Documentación de Azure Active Directory.

Puntos de conexión para autenticación

Para autenticar aplicaciones de Batch con Azure AD, debe incluir algunos puntos de conexión conocidos en el código.

Punto de conexión de Azure AD

El punto de conexión de la autoridad de Azure AD básico es:

https://login.microsoftonline.com/

Para autenticar con Azure AD, use este punto de conexión junto con el identificador de inquilino (identificador del directorio). El identificador de inquilino identifica el inquilino de Azure AD que se usará para la autenticación. Para recuperar el identificador de inquilino, siga los pasos descritos en Obtención del identificador de inquilino de Azure Active Directory:

https://login.microsoftonline.com/<tenant-id>

Nota

El punto de conexión específico del inquilino es necesario al autenticar con una entidad de servicio.

El punto de conexión específico del inquilino es opcional, aunque recomendable, al autenticar mediante autenticación integrada. Sin embargo, también puede utilizar el punto de conexión común de Azure AD. El punto de conexión común proporciona una interfaz genérica de recopilación de credenciales cuando no se proporciona un inquilino específico. El punto de conexión común es https://login.microsoftonline.com/common.

Para más información sobre los puntos de conexión de Azure AD, consulte Autenticación frente a autorización.

Punto de conexión de recursos de Batch

Use el punto de conexión de recursos de Azure Batch para adquirir un token para autenticar las solicitudes al servicio de Batch:

https://batch.core.windows.net/

Registro de la aplicación con un inquilino

El primer paso para usar Azure AD para autenticar es registrar la aplicación en un inquilino de Azure AD. El registro de la aplicación le permite llamar a la Biblioteca de autenticación de Active Directory (ADAL) de Azure desde el código. La ADAL proporciona una API para autenticar con Azure AD desde la aplicación. La aplicación debe registrarse tanto si tiene previsto usar la autenticación integrada como una entidad de servicio.

Al registrar la aplicación, facilita información acerca de la aplicación a Azure AD. Azure AD proporciona un identificador de aplicación (también denominado Id. de cliente) que se utiliza para asociar la aplicación con Azure AD en tiempo de ejecución. Para conocer más detalles acerca del identificador de la aplicación, consulte Objetos de aplicación y de entidad de servicio de Azure Active Directory.

Para registrar la aplicación de Batch, siga los pasos descritos en la sección Registro de una aplicación del Inicio rápido: Registro de una aplicación en la plataforma de identidad de Microsoft. Si registra la aplicación como una aplicación nativa, puede especificar cualquier URI válido para el URI de redirección. No es necesario que sea un punto de conexión real.

Una vez registrada la aplicación, verá el identificador de la aplicación:

Screenshot of the Application ID shown in the Azure portal.

Obtención del identificador de inquilino para Active Directory

El identificador de inquilino identifica al inquilino de Azure AD que proporciona servicios de autenticación a la aplicación. Para obtener el identificador de inquilino, siga estos pasos:

  1. En Azure Portal, seleccione Active Directory.
  2. Seleccione Propiedades.
  3. Copie el valor GUID proporcionado para el identificador de directorio. Este valor también se denomina identificador de inquilino.

Screenshot of the Directory ID in the Azure portal.

Uso de autenticación integrada

Para autenticar mediante autenticación integrada, deberá conceder a la aplicación permisos para conectarse a la API del servicio de Batch. Este paso permite a la aplicación autenticar llamadas en la API del servicio de Batch con Azure AD.

Una vez que haya registrado la aplicación, siga estos pasos en Azure Portal para concederle acceso al servicio Batch:

  1. En Azure Portal, elija Todos los servicios y, después, seleccione Registros de aplicaciones.
  2. Busque el nombre de la aplicación en la lista de registros de aplicaciones.
  3. Seleccione la aplicación y, después, Permisos de API.
  4. En la sección Permisos de API, seleccione Agregar un permiso.
  5. En Seleccionar una API, busque "Microsoft Azure Batch" para encontrar Batch API. (ddbf3205-c6bd-46ae-8127-60eb93363864 es el identificador de aplicación de Batch API).
  6. Seleccione Batch API y, después, elija Seleccionar.
  7. En Seleccionar permisos, active la casilla situada junto a Access Azure Batch Service (Acceder al servicio Azure Batch) y haga clic en Add permissions (Agregar permisos).

El panel Permisos de API muestra ahora que la aplicación de Azure AD tiene acceso tanto a Microsoft Graph como a la API del servicio Batch. La primera vez que registra la aplicación con Azure AD, se conceden permisos a Microsoft Graph automáticamente.

Uso de una entidad de servicio

Para autenticar una aplicación que se ejecute desatendida, utilice una entidad de servicio. Una vez que haya registrado la aplicación, siga estos pasos en Azure Portal para configurar una entidad de servicio:

  1. Solicite un secreto para la aplicación.
  2. Asignación del control de acceso basado en rol de Azure (RBAC de Azure) a la aplicación.

Solicitud de un secreto para la aplicación

Cuando la aplicación se autentica con una entidad de servicio, envía el identificador de la aplicación y un secreto a Azure AD. Debe crear y copiar la clave secreta que usará desde el código.

Siga estos pasos en Azure Portal:

  1. En Azure Portal, elija Todos los servicios. Seleccione Registros de aplicaciones.
  2. Seleccione la aplicación en la página en la lista de registros de aplicaciones.
  3. Seleccione la aplicación y, después, Certificates & secrets (Certificados y secretos). En la sección Secretos de cliente, seleccione Nuevo secreto de cliente.
  4. Para crear un secreto, escriba una descripción del secreto. A continuación, seleccione una expiración para el secreto de un año, dos años o ninguna expiración.
  5. Seleccione Agregar para crear y mostrar el secreto. Copie el valor del secreto en un lugar seguro, puesto que no podrá acceder a él nuevamente después de abandonar la página.

Asignación del control de acceso basado en rol de Azure a la aplicación

Para autenticarse con una entidad de servicio, debe asignar el control de acceso basado en rol de Azure a la aplicación. Siga estos pasos:

  1. En Azure Portal, vaya a la cuenta de Batch utilizada por la aplicación.
  2. En la sección Configuración de la cuenta de Batch, seleccione Control de acceso (IAM) .
  3. Asigne el rol Colaborador o Lector a la aplicación. Para asignar roles, consulte Asignación de roles de Azure mediante Azure Portal.

La aplicación debe aparecer ahora en la configuración de control de acceso con un rol de Azure asignado.

Asignación de un rol personalizado

Un rol personalizado concede permisos específicos a un usuario para enviar trabajos, tareas, etc. De esta forma, se evita la posibilidad de que los usuarios realicen operaciones que afecten al costo, como crear grupos o modificar nodos.

Puede usar un rol personalizado para conceder permisos a un usuario, grupo o entidad de servicio de Azure AD para las siguientes operaciones de control de acceso basado en rol de Azure:

  • Microsoft.Batch/batchAccounts/pools/write
  • Microsoft.Batch/batchAccounts/pools/delete
  • Microsoft.Batch/batchAccounts/pools/read
  • Microsoft.Batch/batchAccounts/jobSchedules/write
  • Microsoft.Batch/batchAccounts/jobSchedules/delete
  • Microsoft.Batch/batchAccounts/jobSchedules/read
  • Microsoft.Batch/batchAccounts/jobs/write
  • Microsoft.Batch/batchAccounts/jobs/delete
  • Microsoft.Batch/batchAccounts/jobs/read
  • Microsoft.Batch/batchAccounts/certificates/write
  • Microsoft.Batch/batchAccounts/certificates/delete
  • Microsoft.Batch/batchAccounts/certificates/read
  • Microsoft.Batch/batchAccounts/read (para cualquier operación de lectura)
  • Microsoft.Batch/batchAccounts/listKeys/action (para cualquier operación)

Los roles personalizados son para usuarios autenticados mediante Azure AD, no con las credenciales de la cuenta de Batch (clave compartida). Tenga en cuenta que las credenciales de la cuenta de Batch proporcionan el permiso completo para la cuenta de Batch. Tenga en cuenta también que los trabajos que usan autogrupo requieren permisos de nivel de grupo.

Nota

Ciertas asignaciones de roles deben especificarse en el campo Acción, mientras que otras deben especificarse en el campo DataAction. Para más información, consulte Operaciones del proveedor de recursos de Azure.

A continuación se muestra un ejemplo de una definición de rol personalizada:

{
 "properties":{
    "roleName":"Azure Batch Custom Job Submitter",
    "type":"CustomRole",
    "description":"Allows a user to submit jobs to Azure Batch but not manage pools",
    "assignableScopes":[
      "/subscriptions/88888888-8888-8888-8888-888888888888"
    ],
    "permissions":[
      {
        "actions":[
          "Microsoft.Batch/*/read",
          "Microsoft.Authorization/*/read",
          "Microsoft.Resources/subscriptions/resourceGroups/read",
          "Microsoft.Support/*",
          "Microsoft.Insights/alertRules/*"
        ],
        "notActions":[

        ],
        "dataActions":[
          "Microsoft.Batch/batchAccounts/jobs/*",
          "Microsoft.Batch/batchAccounts/jobSchedules/*"
        ],
        "notDataActions":[

        ]
      }
    ]
  }
}

Para más información sobre la creación de un rol personalizado, consulte los roles personalizados de Azure.

Obtención del identificador de inquilino para Azure Active Directory

El identificador de inquilino identifica al inquilino de Azure AD que proporciona servicios de autenticación a la aplicación. Para obtener el identificador de inquilino, siga estos pasos:

  1. En Azure Portal, seleccione Active Directory.
  2. Seleccione Propiedades.
  3. Copie el valor GUID proporcionado para el identificador de directorio. Este valor también se denomina identificador de inquilino.

Copy the directory ID

Ejemplos de código

Los ejemplos de código de esta sección muestran cómo autenticar con Azure AD mediante la autenticación integrada y con una entidad de servicio. La mayoría de estos ejemplos de código usan .NET, pero los conceptos son similares para otros lenguajes.

Nota

Un token de autenticación de Azure AD expira después de una hora. Cuando se usa un objeto BatchClient de larga duración, se recomienda que recupere un token de ADAL en cada solicitud para asegurarse de que siempre tiene un token válido.

Para lograr esto en. NET, escriba un método que recupere el token de Azure AD y pase ese método a un objeto BatchTokenCredentials como un delegado. El método delegado se llama en cada solicitud al servicio Batch para asegurarse de que se proporciona un token válido. De forma predeterminada ADAL almacena en caché los tokens, por lo que solo se recuperará un nuevo token de Azure AD si es necesario. Para más información sobre los tokens en Azure AD, consulte Tokens de seguridad.

Ejemplo de código: uso de la autenticación integrada de Azure AD con .NET de Batch

Para autenticar mediante la autenticación integrada de .NET de Batch, consulte el paquete de .NET de Azure Batch y el paquete de ADAL.

Incluya las siguientes instrucciones using en el código:

using Microsoft.Azure.Batch;
using Microsoft.Azure.Batch.Auth;
using Microsoft.IdentityModel.Clients.ActiveDirectory;

Haga referencia al punto de conexión de Azure AD en el código, incluido el identificador de inquilino. Para recuperar el identificador de inquilino, siga los pasos descritos en Obtención del identificador de inquilino de Azure Active Directory:

private const string AuthorityUri = "https://login.microsoftonline.com/<tenant-id>";

Haga referencia al punto de conexión del recurso para el servicio de Batch:

private const string BatchResourceUri = "https://batch.core.windows.net/";

Haga referencia a la cuenta de Batch:

private const string BatchAccountUrl = "https://myaccount.mylocation.batch.azure.com";

Especifique el identificador (Id. de cliente) de su aplicación. El identificador de la aplicación está disponible en el registro de la aplicación en Azure Portal:

private const string ClientId = "<application-id>";

También puede copiar el URI de redirección especificado, en caso de que registrara la aplicación como aplicación nativa. El URI de redireccionamiento especificado en el código debe coincidir con el URI de redireccionamiento que proporcionó al registrar la aplicación:

private const string RedirectUri = "http://mybatchdatasample";

Escriba un método de devolución de llamada para adquirir el token de autenticación de Azure AD. El método de devolución de llamada GetAuthenticationTokenAsync que se menciona aquí llama a ADAL para autenticar a un usuario que está interactuando con la aplicación. El método AcquireTokenAsync proporcionado por ADAL solicita al usuario sus credenciales y la aplicación se inicia una vez que el usuario las proporciona (a menos que ya tenga credenciales en caché):

public static async Task<string> GetAuthenticationTokenAsync()
{
    var authContext = new AuthenticationContext(AuthorityUri);

    // Acquire the authentication token from Azure AD.
    var authResult = await authContext.AcquireTokenAsync(BatchResourceUri,
                                                        ClientId,
                                                        new Uri(RedirectUri),
                                                        new PlatformParameters(PromptBehavior.Auto));

    return authResult.AccessToken;
}

Construya un objeto BatchTokenCredentials que tome el delegado como parámetro. Use esas credenciales para abrir un objeto BatchClient. Puede usar ese objeto BatchClient para las operaciones posteriores del servicio de Batch:

public static void PerformBatchOperations()
{
    Func<Task<string>> tokenProvider = () => GetAuthenticationTokenAsync();

    using (var client = BatchClient.Open(new BatchTokenCredentials(BatchAccountUrl, tokenProvider)))
    {
        client.JobOperations.ListJobs();
    }
}

Ejemplo de código: uso de una entidad de servicio de Azure AD con .NET de Batch

Para autenticar mediante una entidad de servicio de .NET de Batch, consulte el paquete de .NET de Azure Batch y el paquete de ADAL.

Incluya las siguientes instrucciones using en el código:

using Microsoft.Azure.Batch;
using Microsoft.Azure.Batch.Auth;
using Microsoft.IdentityModel.Clients.ActiveDirectory;

Haga referencia al punto de conexión de Azure AD en el código, incluido el identificador de inquilino. Cuando se usa una entidad de servicio, debe proporcionar un punto de conexión específico del inquilino. Para recuperar el identificador de inquilino, siga los pasos descritos en Obtención del identificador de inquilino de Azure Active Directory:

private const string AuthorityUri = "https://login.microsoftonline.com/<tenant-id>";

Haga referencia al punto de conexión del recurso para el servicio de Batch:

private const string BatchResourceUri = "https://batch.core.windows.net/";

Haga referencia a la cuenta de Batch:

private const string BatchAccountUrl = "https://myaccount.mylocation.batch.azure.com";

Especifique el identificador (Id. de cliente) de su aplicación. El identificador de la aplicación está disponible en el registro de la aplicación en Azure Portal:

private const string ClientId = "<application-id>";

Especifique la clave secreta que copió de Azure Portal:

private const string ClientKey = "<secret-key>";

Escriba un método de devolución de llamada para adquirir el token de autenticación de Azure AD. El método de devolución de llamada GetAuthenticationTokenAsync que se menciona aquí llama a ADAL para una autenticación desatendida:

public static async Task<string> GetAuthenticationTokenAsync()
{
    AuthenticationContext authContext = new AuthenticationContext(AuthorityUri);
    AuthenticationResult authResult = await authContext.AcquireTokenAsync(BatchResourceUri, new ClientCredential(ClientId, ClientKey));

    return authResult.AccessToken;
}

Construya un objeto BatchTokenCredentials que tome el delegado como parámetro. Use esas credenciales para abrir un objeto BatchClient. Después, puede usar ese objeto BatchClient para las operaciones posteriores del servicio Batch:

public static void PerformBatchOperations()
{
    Func<Task<string>> tokenProvider = () => GetAuthenticationTokenAsync();

    using (var client = BatchClient.Open(new BatchTokenCredentials(BatchAccountUrl, tokenProvider)))
    {
        client.JobOperations.ListJobs();
    }
}

Ejemplo de código: uso de una entidad de servicio de Azure AD con Python de Batch

Para la autenticación mediante una entidad de servicio de Python de Batch, instale los módulos azure-batch y azure-common y cree una referencia a ellos.

from azure.batch import BatchServiceClient
from azure.common.credentials import ServicePrincipalCredentials

Al usar una entidad de servicio, debe proporcionar el identificador de inquilino. Para recuperar el identificador de inquilino, siga los pasos descritos en Obtención del identificador de inquilino de Azure Active Directory:

TENANT_ID = "<tenant-id>"

Haga referencia al punto de conexión del recurso para el servicio de Batch:

RESOURCE = "https://batch.core.windows.net/"

Haga referencia a la cuenta de Batch:

BATCH_ACCOUNT_URL = "https://myaccount.mylocation.batch.azure.com"

Especifique el identificador (Id. de cliente) de su aplicación. El identificador de la aplicación está disponible en el registro de la aplicación en Azure Portal:

CLIENT_ID = "<application-id>"

Especifique la clave secreta que copió de Azure Portal:

SECRET = "<secret-key>"

Cree un objeto ServicePrincipalCredentials:

credentials = ServicePrincipalCredentials(
    client_id=CLIENT_ID,
    secret=SECRET,
    tenant=TENANT_ID,
    resource=RESOURCE
)

Utilice las credenciales del servicio principal para abrir un objeto BatchServiceClient. A continuación, use ese objeto BatchServiceClient para las operaciones posteriores del servicio Batch.

    batch_client = BatchServiceClient(
    credentials,
    batch_url=BATCH_ACCOUNT_URL
)

Pasos siguientes