針對自我裝載網路閘道使用 Microsoft Entra 驗證

適用於:開發人員 |進階版

Azure APIM 自我裝載網路閘道需要與其相關聯的雲端式 APIM 執行個體連線,以取得報告狀態、檢查和套用設定更新,以及傳送計量和事件。

除了使用網路閘道存取權杖 (驗證金鑰) 與其雲端式 APIM 執行個體連線之外,您還可以使用 Microsoft Entra 應用程式,讓自我裝載網路閘道向相關聯的雲端執行個體進行驗證。 您可以透過 Microsoft Entra 驗證,為祕密設定較長的到期時間,並使用標準步驟來管理和輪替 Active Directory 中的祕密。

案例概觀

自我裝載網路閘道設定 API 可以檢查 Azure RBAC,以判斷誰有權讀取網路閘道設定。 建立具有這些權限的 Microsoft Entra 應用程式之後,自我裝載網路閘道可以使用該應用程式向 APIM 執行個體進行驗證。

若要啟用 Microsoft Entra 驗證,請完成下列步驟:

  1. 建立兩個自訂角色以:
    • 讓設定 API 存取客戶的 RBAC 資訊
    • 授與讀取自我裝載網路閘道設定的權限
  2. 將 RBAC 存取權授與 APIM 執行個體的受控識別
  3. 建立 Microsoft Entra 應用程式,並向其授與讀取網路閘道設定的存取權
  4. 使用新的設定選項部署網路閘道

必要條件

限制注意事項

  • 只支援系統指派的受控識別。

建立自訂角色

建立下列兩個在後續步驟中指派的自訂角色。 您可以使用下列 JSON 範本中所列的權限,使用 Azure 入口網站Azure CLIAzure PowerShell 或其他 Azure 工具來建立自訂角色。

設定自訂角色時,請使用目錄的適當範圍值更新 AssignableScopes 屬性,例如部署 APIM 執行個體所用的訂用帳戶。

APIM 設定 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}"
  ]
}

APIM 網路閘道設定讀者角色

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

新增角色指派

指派 APIM 設定 API 存取驗證程式服務角色

將 APIM 設定 API 存取驗證程式服務角色指派給 APIM 執行個體的受控識別。 如需指派角色的詳細步驟,請參閱使用入口網站指派 Azure 角色

  • 範圍:部署 APIM 執行個體所用的資源群組或訂用帳戶
  • 角色:APIM 設定 API 存取驗證程式服務角色
  • 將存取權指派給:在 APIM 執行個體中的受控識別

指派 APIM 網路閘道設定讀者角色

步驟 1:註冊 Microsoft Entra 應用程式

建立新的 Microsoft Entra 應用程式。 如需步驟,請參閱建立可存取資源的 Microsoft Entra 應用程式和服務主體。 自我裝載網路閘道會使用此應用程式,向 APIM 執行個體進行驗證。

  • 產生用戶端密碼
  • 請記下下列應用程式值,以在部署自我裝載網路閘道時在下一節使用:應用程式 (用戶端) 識別碼、目錄 (租用戶) 識別碼和用戶端密碼

步驟 2:指派 APIM 網路閘道設定讀者服務角色

將 APIM 網路閘道設定讀者服務角色指派給此應用程式。

  • 範圍:APIM 執行個體 (或部署所用的資源群組或訂用帳戶)
  • 角色:APIM 網路閘道設定讀者角色
  • 指派存取權給:Microsoft Entra 應用程式

部署自我裝載閘道

將自我載入網路閘道部署至 Kubernetes,將 Microsoft Entra 應用程式註冊設定新增至網路閘道 ConfigMapdata 元素。 在下列範例 YAML 設定檔中,網路閘道會命名為 mygw,而檔案名為 mygw.yaml

重要

如果您遵循現有的 Kubernetes 部署指導

  • 請務必省略使用 kubectl create secret generic 命令儲存預設驗證金鑰的步驟。
  • 將下列基本設定檔取代為 Azure 入口網站中為您產生的預設 YAML 檔案。 下列檔案會新增 Microsoft Entra 設定來取代設定,以使用驗證金鑰。
---
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

使用下列命令將網路閘道部署至 Kubernetes:

kubectl apply -f mygw.yaml

確認網路閘道正在執行中

  1. 執行下列命令來檢查部署是否成功。 建立所有物件以及將 Pod 初始化可能需要一些時間。

    kubectl get deployments
    

    其應傳回

    NAME             READY   UP-TO-DATE   AVAILABLE   AGE
    <gateway-name>   1/1     1            1           18s
    
  2. 執行下列命令來檢查是否成功建立服務。 服務 IP 和連接埠會是不同的。

    kubectl get services
    

    其應傳回

    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. 返回 Azure 入口網站並選取 [概觀]

  4. 確認 [狀態] 顯示綠色核取記號,後面接著與 YAML 檔案中指定的複本數目相符的節點計數。 此狀態表示部署的自我裝載網路閘道 Pod 已成功與 APIM 服務進行通訊,並且有一般「活動訊號」。顯示入口網站中自我裝載閘道狀態的螢幕快照。

提示

  • 如果有一個以上的 Pod,請 kubectl logs deployment/<gateway-name> 執行命令來檢視隨機選取的 Pod 中的記錄。
  • 對於一組完整的命令選項執行 kubectl logs -h,例如如何檢視特定 Pod 或容器的記錄。

下一步