Menggunakan autentikasi Microsoft Entra untuk gateway yang dihost sendiri

BERLAKU UNTUK: Pengembang | Premium

Gateway yang dihost sendiri Azure API Management memerlukan konektivitas dengan instans API Management berbasis cloud terkait untuk status pelaporan, memeriksa dan menerapkan pembaruan konfigurasi, dan mengirim metrik dan peristiwa.

Selain menggunakan token akses gateway (kunci autentikasi) untuk terhubung dengan instans API Management berbasis cloud-nya, Anda dapat mengaktifkan gateway yang dihost sendiri untuk mengautentikasi ke instans cloud terkait dengan menggunakan aplikasi Microsoft Entra. Dengan autentikasi Microsoft Entra, Anda dapat mengonfigurasi waktu kedaluwarsa yang lebih lama untuk rahasia dan menggunakan langkah-langkah standar untuk mengelola dan memutar rahasia di Direktori Aktif.

Gambaran umum skenario

API konfigurasi gateway yang dihost sendiri dapat memeriksa Azure RBAC untuk menentukan siapa yang memiliki izin untuk membaca konfigurasi gateway. Setelah Anda membuat aplikasi Microsoft Entra dengan izin tersebut, gateway yang dihost sendiri dapat mengautentikasi ke instans API Management menggunakan aplikasi.

Untuk mengaktifkan autentikasi Microsoft Entra, selesaikan langkah-langkah berikut:

  1. Buat dua peran kustom untuk:
    • Biarkan API konfigurasi mendapatkan akses ke informasi RBAC pelanggan
    • Memberikan izin untuk membaca konfigurasi gateway yang dihost sendiri
  2. Memberikan akses RBAC ke identitas terkelola instans API Management
  3. Membuat aplikasi Microsoft Entra dan memberinya akses untuk membaca konfigurasi gateway
  4. Menyebarkan gateway dengan opsi konfigurasi baru

Prasyarat

  • Instans API Management di tingkat layanan Pengembang atau Premium. Jika diperlukan, selesaikan mulai cepat berikut: Buat instans Azure API Management.
  • Provisikan sumber daya gateway pada instans.
  • Aktifkan identitas terkelola yang ditetapkan sistem pada instans.
  • Gambar kontainer gateway yang dihost sendiri versi 2.2 atau yang lebih baru

Catatan batasan

  • Hanya identitas terkelola yang ditetapkan sistem yang didukung.

Membuat peran kustom

Buat dua peran kustom berikut yang ditetapkan di langkah selanjutnya. Anda dapat menggunakan izin yang tercantum dalam templat JSON berikut untuk membuat peran kustom menggunakan portal Azure, Azure CLI, Azure PowerShell, atau alat Azure lainnya.

Saat mengonfigurasi peran kustom, perbarui AssignableScopes properti dengan nilai cakupan yang sesuai untuk direktori Anda, seperti langganan tempat instans API Management Anda disebarkan.

Peran Layanan Validator Akses API Management Configuration 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}"
  ]
}

Peran Pembaca Konfigurasi GATEWAY API Management

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

Tambahkan penetapan peran

Menetapkan Peran Layanan Validator Akses API Management Configuration API

Tetapkan Peran Layanan Validator Akses API Management Configuration API ke identitas terkelola instans API Management. Untuk langkah-langkah terperinci untuk menetapkan peran, lihat Menetapkan peran Azure menggunakan portal.

  • Cakupan: Grup sumber daya atau langganan tempat instans API Management disebarkan
  • Peran: Peran Layanan Validator Akses API Management Configuration API
  • Menetapkan akses ke: Identitas terkelola instans API Management

Menetapkan Peran Pembaca Konfigurasi GATEWAY API Management

Langkah 1: Daftarkan aplikasi Microsoft Entra

Buat aplikasi Microsoft Entra baru. Untuk langkah-langkahnya, lihat Membuat aplikasi Microsoft Entra dan perwakilan layanan yang dapat mengakses sumber daya. Aplikasi ini akan digunakan oleh gateway yang dihost sendiri untuk mengautentikasi ke instans API Management.

  • Membuat rahasia klien
  • Perhatikan nilai aplikasi berikut untuk digunakan di bagian berikutnya saat menyebarkan gateway yang dihost sendiri: ID aplikasi (klien), ID direktori (penyewa), dan rahasia klien

Langkah 2: Tetapkan Peran Layanan Pembaca Konfigurasi GATEWAY API Management

Tetapkan Peran Layanan Pembaca Konfigurasi GATEWAY API Management ke aplikasi.

  • Cakupan: Instans API Management (atau grup sumber daya atau langganan tempatnya disebarkan)
  • Peran: Peran Pembaca Konfigurasi Gateway API Management
  • Menetapkan akses ke: Aplikasi Microsoft Entra

Menyebarkan gateway yang dihost sendiri

Sebarkan gateway yang dihost sendiri ke Kubernetes, menambahkan pengaturan pendaftaran aplikasi Microsoft Entra ke data elemen gateway ConfigMap. Dalam contoh file konfigurasi YAML berikut, gateway diberi nama mygw dan file diberi nama mygw.yaml.

Penting

Jika Anda mengikuti panduan penyebaran Kubernetes yang ada:

  • Pastikan untuk menghilangkan langkah untuk menyimpan kunci autentikasi default menggunakan kubectl create secret generic perintah .
  • Ganti file konfigurasi dasar berikut untuk file YAML default yang dihasilkan untuk Anda di portal Azure. File berikut menambahkan konfigurasi Microsoft Entra sebagai pengganti konfigurasi untuk menggunakan kunci autentikasi.
---
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

Sebarkan gateway ke Kubernetes dengan perintah berikut:

kubectl apply -f mygw.yaml

Konfirmasikan bahwa gateway sedang berjalan

  1. Jalankan perintah berikut untuk memeriksa apakah penyebaran telah berhasil. Mungkin perlu sedikit waktu agar semua objek dibuat dan agar pod dapat diinisialisasi.

    kubectl get deployments
    

    Ini harus kembali

    NAME             READY   UP-TO-DATE   AVAILABLE   AGE
    <gateway-name>   1/1     1            1           18s
    
  2. Jalankan perintah berikut untuk memeriksa apakah layanan berhasil dibuat. IP dan port layanan Anda akan berbeda.

    kubectl get services
    

    Ini harus kembali

    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. Kembali ke portal Microsoft Azure dan pilih Gambaran Umum.

  4. Konfirmasikan bahwa Status menunjukkan tanda centang hijau, diikuti dengan jumlah node yang sesuai dengan jumlah replika yang ditentukan dalam file YAML. Status ini berarti pod gateway yang dihost sendiri yang disebarkan berhasil berkomunikasi dengan layanan API Management dan memiliki "heartbeat" reguler. Cuplikan layar memperlihatkan status gateway yang dihost sendiri di portal.

Tip

  • Jalankan perintah kubectl logs deployment/<gateway-name> untuk melihat log dari pod yang dipilih secara acak jika ada lebih dari satu pod.
  • Jalankan kubectl logs -h untuk serangkaian opsi perintah lengkap, seperti cara melihat log untuk pod atau kontainer tertentu.

Langkah berikutnya