Partilhar via


Usar a autenticação do Microsoft Entra para o gateway auto-hospedado

APLICA-SE A: Developer | Prémio

O gateway auto-hospedado do Gerenciamento de API do Azure precisa de conectividade com sua instância de Gerenciamento de API baseada em nuvem associada para relatar o status, verificar e aplicar atualizações de configuração e enviar métricas e eventos.

Além de usar um token de acesso de gateway (chave de autenticação) para se conectar com sua instância de Gerenciamento de API baseada em nuvem, você pode habilitar o gateway auto-hospedado para autenticar em sua instância de nuvem associada usando um aplicativo Microsoft Entra. Com a autenticação do Microsoft Entra, você pode configurar tempos de expiração mais longos para segredos e usar etapas padrão para gerenciar e girar segredos no Ative Directory.

Descrição geral do cenário

A API de configuração de gateway auto-hospedado pode verificar o RBAC do Azure para determinar quem tem permissões para ler a configuração do gateway. Depois de criar um aplicativo Microsoft Entra com essas permissões, o gateway auto-hospedado pode se autenticar na instância de Gerenciamento de API usando o aplicativo.

Para habilitar a autenticação do Microsoft Entra, conclua as seguintes etapas:

  1. Crie duas funções personalizadas para:
    • Permita que a API de configuração tenha acesso às informações RBAC do cliente
    • Conceder permissões para ler a configuração do gateway auto-hospedado
  2. Conceder acesso RBAC à identidade gerenciada da instância de Gerenciamento de API
  3. Criar um aplicativo Microsoft Entra e conceder-lhe acesso para ler a configuração do gateway
  4. Implantar o gateway com novas opções de configuração

Pré-requisitos

  • Uma instância de Gerenciamento de API na camada de serviço Developer ou Premium. Se necessário, conclua o seguinte guia de início rápido: Criar uma instância de Gerenciamento de API do Azure.
  • Provisione um recurso de gateway na instância.
  • Habilite uma identidade gerenciada atribuída ao sistema na instância.
  • Imagem de contêiner de gateway auto-hospedado versão 2.2 ou posterior

Notas de limitações

  • Somente a identidade gerenciada atribuída ao sistema é suportada.

Criar funções personalizadas

Crie as duas funções personalizadas a seguir que são atribuídas em etapas posteriores. Você pode usar as permissões listadas nos seguintes modelos JSON para criar as funções personalizadas usando o portal do Azure, a CLI do Azure, o Azure PowerShell ou outras ferramentas do Azure.

Ao configurar as funções personalizadas, atualize a AssignableScopes propriedade com valores de escopo apropriados para seu diretório, como uma assinatura na qual sua instância de Gerenciamento de API é implantada.

Configuração de Gerenciamento de API Função de serviço Validador de acesso à 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}"
  ]
}

Função de leitor de configuração do API Management Gateway

{
  "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}"
  ]
}

Adicionar atribuições de função

Atribuir Função de Serviço Validador de Acesso à API de Configuração de Gerenciamento de API

Atribua a função de serviço Validador de acesso da API de configuração de API à identidade gerenciada da instância de gerenciamento de API. Para obter etapas detalhadas para atribuir uma função, consulte Atribuir funções do Azure usando o portal.

  • Escopo: o grupo de recursos ou a assinatura na qual a instância de Gerenciamento de API é implantada
  • Função: Função de serviço do Validador de Acesso à API de Configuração de Gerenciamento de API
  • Atribuir acesso a: Identidade gerenciada da instância de Gerenciamento de API

Atribuir função de leitor de configuração do API Management Gateway

Etapa 1: Registrar o aplicativo Microsoft Entra

Crie um novo aplicativo Microsoft Entra. Para conhecer as etapas, consulte Criar um aplicativo e uma entidade de serviço do Microsoft Entra que possam acessar recursos. Este aplicativo será usado pelo gateway auto-hospedado para autenticar na instância de Gerenciamento de API.

  • Gerar um segredo do cliente
  • Anote os seguintes valores de aplicativo para uso na próxima seção ao implantar o gateway auto-hospedado: ID do aplicativo (cliente), ID do diretório (locatário) e segredo do cliente

Etapa 2: Atribuir função de serviço do Leitor de Configuração do Gateway de Gerenciamento de API

Atribua a função de serviço Leitor de Configuração do API Management Gateway ao aplicativo.

  • Escopo: A instância de Gerenciamento de API (ou grupo de recursos ou assinatura na qual ela é implantada)
  • Função: Função de leitor de configuração do API Management Gateway
  • Atribuir acesso a: Aplicação Microsoft Entra

Implantar o gateway auto-hospedado

Implante o gateway auto-hospedado no Kubernetes, adicionando configurações de registro do aplicativo Microsoft Entra ao data elemento dos gateways ConfigMap. No exemplo a seguir arquivo de configuração YAML, o gateway é chamado mygw e o arquivo é chamado mygw.yaml.

Importante

Se você estiver seguindo as diretrizes de implantação do Kubernetes existentes:

  • Certifique-se de omitir a etapa para armazenar a chave de autenticação padrão usando o kubectl create secret generic comando.
  • Substitua o seguinte arquivo de configuração básica pelo arquivo YAML padrão gerado para você no portal do Azure. O arquivo a seguir adiciona a configuração do Microsoft Entra no lugar da configuração para usar uma chave de autenticação.
---
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

Implante o gateway no Kubernetes com o seguinte comando:

kubectl apply -f mygw.yaml

Confirme se o gateway está em execução

  1. Execute o seguinte comando para verificar se a implantação foi bem-sucedida. Pode levar um pouco de tempo para que todos os objetos sejam criados e para que os pods sejam inicializados.

    kubectl get deployments
    

    Deve voltar

    NAME             READY   UP-TO-DATE   AVAILABLE   AGE
    <gateway-name>   1/1     1            1           18s
    
  2. Execute o seguinte comando para verificar se os serviços foram criados com êxito. Os IPs e as portas do seu serviço serão diferentes.

    kubectl get services
    

    Deve voltar

    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. Volte para o portal do Azure e selecione Visão geral.

  4. Confirme se Status mostra uma marca de seleção verde, seguida por uma contagem de nós que corresponde ao número de réplicas especificadas no arquivo YAML. Esse status significa que os pods de gateway auto-hospedados implantados estão se comunicando com êxito com o serviço de Gerenciamento de API e têm uma "pulsação" regular. Captura de tela mostrando o status do gateway auto-hospedado no portal.

Gorjeta

  • Execute o kubectl logs deployment/<gateway-name> comando para visualizar logs de um pod selecionado aleatoriamente se houver mais de um.
  • Execute kubectl logs -h para obter um conjunto completo de opções de comando, como exibir logs para um pod ou contêiner específico.

Próximos passos