Utiliser l’authentification Microsoft Entra pour la passerelle auto-hébergée

S’APPLIQUE À : Développeur | Premium

La passerelle auto-hébergée Azure Gestion des API a besoin d’une connectivité avec son instance Gestion des API cloud associée pour la création de rapports de statuts, pour la vérification et l’application de mises à jour de configuration, et l’envoi de métriques et d’événements.

En plus d’utiliser un jeton d’accès de passerelle (clé d’authentification) pour vous connecter à son instance Gestion des API cloud, vous pouvez autoriser la passerelle auto-hébergée à s’authentifier sur son instance cloud associée avec une application Microsoft Entra. Avec l’authentification Microsoft Entra, vous pouvez configurer des délais d’expiration plus longs pour les secrets, et utiliser des étapes standard pour gérer et permuter les secrets dans Active Directory.

Présentation du scénario

L’API de configuration de passerelle auto-hébergée peut examiner RBAC Azure pour déterminer qui dispose des autorisations nécessaires pour lire la configuration de la passerelle. Une fois que vous avez créé une application Microsoft Entra avec ces autorisations, la passerelle auto-hébergée peut s’authentifier sur l’instance Gestion des API avec l’application.

Pour activer l’authentification Microsoft Entra, effectuez les étapes suivantes :

  1. Créez deux rôles personnalisés pour :
    • Permettre à l’API de configuration d’accéder aux informations RBAC du client
    • Accorder des autorisations de lecture de la configuration de la passerelle auto-hébergée
  2. Accorder l’accès RBAC à l’identité managée de l’instance Gestion des API
  3. Créer une application Microsoft Entra et lui accorder l’accès en lecture sur la configuration de la passerelle
  4. Déployer la passerelle avec de nouvelles options de configuration

Prérequis

Remarques sur les limitations

  • Seule l’identité managée affectée par le système est prise en charge.

Créer des rôles personnalisées

Créez les deux rôles personnalisés suivants qui sont attribués dans les étapes ultérieures. Vous pouvez utiliser les autorisations répertoriées dans les modèles JSON suivants pour créer les rôles personnalisés à l’aide du portail Azure, d’Azure CLI, d’Azure PowerShell ou d’autres outils Azure.

Lors de la configuration des rôles personnalisés, mettez à jour la propriété AssignableScopes avec les valeurs d’étendue appropriées pour votre répertoire, comme un abonnement dans lequel votre instance Gestion des API est déployée.

Rôle de service validateur d’accès à l’API de configuration Gestion des API

{
  "Description": "Can access RBAC permissions on the API Management resource to authorize requests in Configuration API.",
  "IsCustom": true,
  "Name": "API Management Configuration API Access Validator Service Role",
  "Permissions": [
    {
      "Actions": [
        "Microsoft.Authorization/*/read"
      ],
      "NotActions": [],
      "DataActions": [],
      "NotDataActions": []
    }
  ],
  "NotDataActions": [],
  "AssignableScopes": [
    "/subscriptions/{subscriptionID}"
  ]
}

Rôle lecteur de configuration de la passerelle Gestion des API

{
  "Description": "Can read self-hosted gateway configuration from Configuration API",
  "IsCustom": true,
  "Name": "API Management Gateway Configuration Reader Role",
  "Permissions": [
    {
      "Actions": [],
      "NotActions": [],
      "DataActions": [
        "Microsoft.ApiManagement/service/gateways/getConfiguration/action"
      ],
      "NotDataActions": []
    }
  ],
  "NotDataActions": [],
  "AssignableScopes": [
    "/subscriptions/{subscriptionID}"
  ]
}

Ajouter des attributions de rôle

Assigner un rôle de service validateur d’accès à l’API de configuration Gestion des API

Attribuez le rôle de service validateur d’accès à l’API de configuration Gestion des API à l’identité managée de l’instance Gestion des API. Pour les étapes détaillées d’attribution d’un rôle, consultez Attribuer des rôles Azure à l’aide du portail.

  • Étendue : groupe de ressources ou abonnement dans lequel l’instance Gestion des API est déployée
  • Rôle : rôle de service validateur d’accès à l’API de configuration Gestion des API
  • Attribuer l’accès à : identité managée de l’instance Gestion des API

Attribuer le rôle lecteur de configuration de la passerelle Gestion des API

Étape 1 : Inscrire une application Microsoft Entra

Créez une application Microsoft Entra. Pour connaître les étapes, consultez Créer une application et un principal de service Microsoft Entra pouvant accéder aux ressources. Cette application sera utilisée par la passerelle auto-hébergée pour s’authentifier auprès de l’instance Gestion des API.

  • Générer une clé secrète client
  • Prenez note des valeurs d’application suivantes à utiliser dans la section d’après lors du déploiement de la passerelle auto-hébergée : ID d’application (client), ID de répertoire (locataire) et clé secrète client

Étape 2 : Attribuer le rôle de service lecteur de configuration de la passerelle Gestion des API

Attribuez le rôle de service lecteur de configuration de la passerelle Gestion des API à l’application.

  • Étendue : l’instance Gestion des API (ou groupe de ressources ou abonnement dans lequel elle est déployée)
  • Rôle : rôle lecteur de configuration de la passerelle Gestion des API
  • Attribuer l’accès à : application Microsoft Entra

Déployer la passerelle auto-hébergée

Déployez la passerelle auto-hébergée sur Kubernetes, en ajoutant les paramètres d’inscription d’application Microsoft Entra à l’élément data des passerelles ConfigMap. Dans l’exemple de fichier de configuration YAML suivant, la passerelle est nommée mygw et le fichier est nommé mygw.yaml.

Important

Si vous suivez les instructions de déploiement Kubernetes existantes :

  • Veillez à omettre l’étape de stockage de la clé d’authentification par défaut à l’aide de la commande kubectl create secret generic.
  • Remplacez le fichier de configuration de base suivant par le fichier YAML par défaut généré pour vous dans le portail Azure. Le fichier suivant ajoute la configuration Microsoft Entra à la place de la configuration qui permet d’utiliser une clé d’authentification.
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mygw-env
  labels:
    app: mygw
data:
  config.service.endpoint: "<service-name>.configuration.azure-api.net"
  config.service.auth: azureAdApp 
  config.service.auth.azureAd.authority: "https://login.microsoftonline.com"  
  config.service.auth.azureAd.tenantId: "<Azure AD tenant ID>" 
  config.service.auth.azureAd.clientId: "<Azure AD client ID>" 
  config.service.auth.azureAd.clientSecret: "<Azure AD client secret>"
  gateway.name: <gateway-id>
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mygw
  labels:
    app: mygw
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mygw
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 25%
  template:
    metadata:
      labels:
        app: mygw
    spec:
      terminationGracePeriodSeconds: 60
      containers:
      - name: mygw
        image: mcr.microsoft.com/azure-api-management/gateway:v2
        ports:
        - name: http
          containerPort: 8080
        - name: https
          containerPort: 8081
          # Container port used for rate limiting to discover instances
        - name: rate-limit-dc
          protocol: UDP
          containerPort: 4290
          # Container port used for instances to send heartbeats to each other
        - name: dc-heartbeat
          protocol: UDP
          containerPort: 4291
        readinessProbe:
          httpGet:
            path: /status-0123456789abcdef
            port: http
            scheme: HTTP
          initialDelaySeconds: 0
          periodSeconds: 5
          failureThreshold: 3
          successThreshold: 1
        envFrom:
        - configMapRef:
            name: mygw-env
---
apiVersion: v1
kind: Service
metadata:
  name: mygw-live-traffic
  labels:
    app: mygw
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local
  ports:
  - name: http
    port: 80
    targetPort: 8080
  - name: https
    port: 443
    targetPort: 8081
  selector:
    app: mygw
---
apiVersion: v1
kind: Service
metadata:
  name: mygw-instance-discovery
  labels:
    app: mygw
  annotations:
    azure.apim.kubernetes.io/notes: "Headless service being used for instance discovery of self-hosted gateway"
spec:
  clusterIP: None
  type: ClusterIP
  ports:
  - name: rate-limit-discovery
    port: 4290
    targetPort: rate-limit-dc
    protocol: UDP
  - name: discovery-heartbeat
    port: 4291
    targetPort: dc-heartbeat
    protocol: UDP
  selector:
    app: mygw

Déployez la passerelle sur Kubernetes avec la commande suivante :

kubectl apply -f mygw.yaml

Vérifier que la passerelle est en cours d’exécution

  1. Exécutez la commande suivante pour vérifier si le déploiement a réussi. Notez que le temps nécessaire à la création de tous les objets et à l’initialisation des pods peut être long.

    kubectl get deployments
    

    Il devrait y avoir un retour

    NAME             READY   UP-TO-DATE   AVAILABLE   AGE
    <gateway-name>   1/1     1            1           18s
    
  2. Exécutez la commande suivante pour vérifier si les services ont bien été créés. Les adresses IP et les ports de votre service seront différents.

    kubectl get services
    

    Il devrait y avoir un retour

    NAME                                TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
    <gateway-name>-live-traffic         ClusterIP      None            <none>        4290/UDP,4291/UDP   9m1s
    <gateway-name>-instance-discovery   LoadBalancer   10.99.236.168   <pending>     80:31620/TCP,443:30456/TCP   9m1s
    
  3. Revenez au portail Azure, puis sélectionnez Vue d’ensemble.

  4. Vérifiez qu’État affiche une coche verte, suivie d’un nombre de nœuds qui correspond au nombre de réplicas spécifiés dans le fichier YAML. Cet état signifie que les pods de passerelle auto-hébergés déployés communiquent avec le service API management et présentent une « pulsation » normale.Capture d’écran qui montre l’état de la passerelle auto-hébergée dans le portail.

Conseil

  • Exécutez la commande kubectl logs deployment/<gateway-name> pour afficher les journaux d’un pod sélectionné de manière aléatoire, s’il en existe plusieurs.
  • Exécutez kubectl logs -h pour obtenir un ensemble complet d’options de commande, par exemple, comment afficher les journaux d’un pod ou d’un conteneur spécifique.

Étapes suivantes