Seguridad básica en el acceso a una Azure Function con un Service Principal

Sitio dedicado a Microsoft Azure y otras tecnologías Cloud

The Bender

En el artículo anterior he construido una Function para la gestión básica de operaciones sobre mi máquina virtual en Azure de desarrollo y formación.

Para ejecutar las operaciones he dado de alta un service principal llamado robotijo, le he dado permisos en la suscripción adecuada, y he utilizado sus datos de identificación para lanzar las acciones sobre la VM.

Todo ello en C#, con un SDK de programación «Fluent» y xUnit como framework de testing.

Ahora me quiero centrar en el detalle de la construcción del Service Principal y en los datos que necesito para su configuración más básica y sencilla de la seguridad.

Creando a «Robotijo»

Empiezo yéndome al Directorio Activo en donde quiero dar de alta mi nueva cuenta Service Principal, y aquí doy de alta un nuevo registro de aplicación (app registrations); le doy un nombre y un ámbito de actuación (un tier, multiples tiers y/o usuarios externos) y ya tengo tres parámetros que voy a utilizar cada vez que lo invoque:

  • Application Id (ClientID): el identificador de seguridad con el que se realiza la relación de confianza con el directorio activo.
  • ObjectID: el identificado del propio objeto.
  • Directory (tenant)ID: El directorio a donde pertenece el Objeto. Ojo con no confundirlo con el tenantId donde queremos realizar las operaciones con el Service Principal, que eso se localiza en el propio Azure AD elegido.

Para un mínimo de seguridad debo de crear un secreto de cliente desde el menú de certificados y secretos del Service Principal. Aquí lo genero y se me muestra y, AL LORO, tengo que copiarlo a buen recaudo porque no se vuelve a mostrar; si lo pierdo tengo que generar otro.

Lo ideal, y de lo que escribiré más adelante, sería que este secreto lo almacenara en un Key Vault o, aún mejor, que en vez de esta clave alfanumérica utilizará un Certificado (también almacenado en un Key Vault).

Invocando a «Robotijo»

Ahora me voy al código y configuración de la función, introduciendo en el fichero de conexión los datos necesarios para indicar cual es el Service Principal que quiero utilizar para realizar las operaciones sobre la VM. Sin olvidarme de darle los permisos necesarios en la suscripción.

using Microsoft.Azure.Management.Fluent;
using Microsoft.Azure.Management.ResourceManager.Fluent;
using Microsoft.Azure.Management.ResourceManager.Fluent.Core;

namespace trainerfunctions
{
    public class Credenciales
    {
        public IAzure Get()
        {
            var applicationId = $"c8579238-1405-4ef4-af2b-76ae65cc2699";
            var applicationSecret = $"k@8Fq/2?v.AHIoB64cAiUiEzxARIdBh+";
            var tenantId = $"da51a5d1-9b62-4a99-bcca-a0617f290b10";
            var subscriptionId = $"xxxxxxx-xxxxxx-xxx-xxxx-xxxxxxxxxxx";

            var credentials = SdkContext.AzureCredentialsFactory
                .FromServicePrincipal(applicationId, applicationSecret, tenantId, AzureEnvironment.AzureGlobalCloud);

            var azure = Azure
                .Configure()
                .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
                .Authenticate(credentials)
                .WithSubscription(subscriptionId);

            return azure;
        }
    }

El applicationId y el tenatId los saco de la pantalla principal de Robotijo.

Service Principal Created

El applicationSecret lo he copiado al hacerlo en la sección de Certificados y secretos.

Service Principal Secret

Y el SubscriptionId lo he sacado de la sección de suscripciones del portal.

Service Principal Subscription

A partir de aquí ya tengo el objeto del Service Principal en un IAzure, que puedo utilizar para ejecutar las acciones en la Function, como en el siguiente ejemplo en donde solicito el estatus de la Vm:

        public string Status()
        {
            var Azure = new Credenciales().Get();
            var vm = Azure.VirtualMachines.GetById($"/subscriptions/xxxx-xxx-xx-xxxx-xxxxxxx/resourceGroups/grupoDeRecursos/providers/Microsoft.Compute/virtualMachines/MaquinaVirtual");

            return vm.PowerState.Value;
        }

Por cierto, encontrar el Id de la máquina virtual ha sido un poquito lioso. El que me está pidiendo está dentro de la propia vm, en el menú de Propiedades, siendo el ResourceId.

Virtual Machien Resource Id

Espero que sea de ayuda.

 

Una respuesta

  1. […] esté y esté artículo he compartido cómo he construido a robotijo, una function que me permite realizar operaciones muy […]

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.