Mengaktifkan Workload Identity Federation di AKS dan EKS

Topik ini menjelaskan cara mengaktifkan Workload Identity Federation untuk penginstalan hybrid Apigee di platform AKS dan EKS.

Untuk penginstalan di GKE, ikuti petunjuk di Mengaktifkan Workload Identity di GKE.

Ringkasan

Workload identity federation memungkinkan aplikasi yang berjalan di luar Google Cloud meniru akun layanan Google Cloud Platform menggunakan kredensial dari penyedia identitas eksternal.

Menggunakan workload identity federation dapat membantu Anda meningkatkan keamanan dengan memungkinkan aplikasi menggunakan mekanisme autentikasi yang disediakan oleh lingkungan eksternal dan dapat membantu mengganti kunci akun layanan.

Untuk mengetahui ringkasannya, lihat Praktik terbaik untuk menggunakan Workload Identity Federation.

Menyiapkan Workload Identity Federation

Untuk menggunakan Workload Identity Federation dengan Apigee Hybrid, konfigurasi cluster Anda terlebih dahulu, lalu terapkan fitur tersebut ke penginstalan Apigee Hybrid Anda.

Sebelum memulai

Petunjuk ini mengasumsikan bahwa Anda telah menyiapkan penginstalan Apigee hybrid. Akun layanan IAM dan akun layanan Kubernetes dibuat selama penginstalan awal. Lihat Gambaran Besar untuk mengetahui ringkasan penginstalan Apigee Hybrid.

Untuk penginstalan di AKS, pastikan Anda telah mengaktifkan penerbit OpenID Connect (OIDC). Anda harus mengaktifkan fitur ini agar Workload Identity Federation dapat mengakses metadata OpenID Connect dan JSON Web Key Set (JWKS) untuk cluster.

Konfigurasi cluster Anda untuk menggunakan Workload Identity Federation.

  1. Periksa apakah konfigurasi gcloud saat ini disetel ke project ID Google Cloud Anda dengan perintah berikut:
    gcloud config get project
  2. Jika perlu, tetapkan konfigurasi gcloud saat ini:

    gcloud config set project PROJECT_ID
  3. Aktifkan Security Token Service API:

    Periksa apakah Security Token Service API diaktifkan dengan perintah berikut:

    gcloud services list --enabled --project PROJECT_ID | grep sts.googleapis.com

    Jika API tidak diaktifkan:

    Konsol

    Enable the Security Token Service API.

    Enable the API

    Command line

    Aktifkan API dengan perintah berikut:

    gcloud services enable sts.googleapis.com --project PROJECT_ID
  4. Buat workload identity pool dan penyedia workload.

    Peran yang diperlukan

    Untuk mendapatkan izin yang diperlukan guna mengonfigurasi Workload Identity Federation, minta administrator Anda untuk memberi Anda peran IAM berikut pada project:

    Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.

    Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

    Atau, peran dasar Pemilik IAM (roles/owner) juga mencakup izin untuk mengonfigurasi penggabungan identitas. Anda tidak boleh memberikan peran dasar dalam lingkungan produksi, tetapi Anda dapat memberikannya dalam lingkungan pengembangan atau pengujian.

    Untuk membuat workload identity pool dan penyedia workload, lakukan hal berikut:

    1. Tentukan URL penerbit cluster AKS Anda:

      AKS

      az aks show -n NAME -g RESOURCE_GROUP --query "oidcIssuerProfile.issuerUrl" -otsv

      Ganti kode berikut:

      • NAME: Nama cluster.
      • RESOURCE_GROUP: Grup resource cluster.

      Perintah ini menampilkan URL penerbit. Anda akan memerlukan URL penerbit di salah satu langkah berikut.

      Jika perintah tersebut tidak menampilkan URL penerbit, pastikan Anda telah mengaktifkan fitur penerbit OIDC.

      EKS

      aws eks describe-cluster --name NAME --query "cluster.identity.oidc.issuer" --output text
      

      Ganti NAME dengan nama cluster.

      Perintah ini menampilkan URL penerbit. Anda memerlukan URL penerbit di salah satu langkah berikut.

      Kubernetes lainnya

      1. Hubungkan ke cluster Kubernetes Anda dan gunakan `kubectl` untuk menentukan URL penerbit cluster Anda:
        kubectl get --raw /.well-known/openid-configuration | jq -r .issuer
        

        Anda memerlukan URL penerbit di salah satu langkah berikut.

    2. Opsional: Jika penerbit OIDC Anda tidak dapat diakses secara publik, download JSON Web Key Set (JWKS) cluster:
      kubectl get --raw /openid/v1/jwks > cluster-jwks.json
      

      Untuk memeriksa apakah penyedia OIDC Anda tersedia untuk publik, Anda harus dapat mengakses URL penyedia dengan perintah CURL dan menerima respons 200.

    3. Buat workload identity pool baru:
      gcloud iam workload-identity-pools create POOL_ID \
        --location="global" \
        --description="DESCRIPTION" \
        --display-name="DISPLAY_NAME"
                  

      Ganti kode berikut:

      • POOL_ID: ID unik untuk pool
      • DISPLAY_NAME: (Opsional) Nama pool.
      • DESCRIPTION: (Opsional) Deskripsi pool yang Anda pilih. Deskripsi ini muncul saat Anda memberikan akses ke identitas pool.

      Contoh:

      gcloud iam workload-identity-pools create my-wi-pool --display-name="My workload pool" --description="My workload pool description"
    4. Tambahkan cluster sebagai penyedia workload identity pool. Pilih perintah untuk membuat penyedia, bergantung pada apakah penerbit OIDC Anda dapat diakses secara publik atau tidak dapat diakses secara publik:

      Dapat diakses secara publik

      Jika penerbit OIDC Anda dapat diakses secara publik, buat penyedia dengan perintah berikut:

      gcloud iam workload-identity-pools providers create-oidc WORKLOAD_PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="ISSUER" \
        --attribute-mapping="google.subject=assertion.sub"

      Tidak dapat diakses secara publik

      Jika penerbit OIDC Anda tidak dapat diakses secara publik, buat penyedia dengan perintah berikut:

        gcloud iam workload-identity-pools providers create-oidc WORKLOAD_PROVIDER_ID \
        --location="global" \
        --workload-identity-pool="POOL_ID" \
        --issuer-uri="ISSUER" \
        --jwks-file="cluster-jwks.json" \
        --attribute-mapping="google.subject=assertion.sub"

      Ganti kode berikut:

      • WORKLOAD_PROVIDER_ID: ID penyedia unik untuk workload identity pool yang Anda pilih.
      • POOL_ID: ID workload identity pool yang telah Anda buat sebelumnya.
      • ISSUER: Gunakan URL penerbit yang Anda tentukan sebelumnya untuk URI penerbit .

      attribute-mapping="google.subject=assertion.sub" memetakan subjek Kubernetes ke subjek IAM.

Buat file konfigurasi kredensial

Untuk men-deploy workload Kubernetes yang dapat mengakses Google Cloud resource, lakukan langkah-langkah berikut. Anda harus membuat file konfigurasi kredensial terlebih dahulu untuk setiap akun layanan IAM:

  1. Buat daftar akun layanan IAM (juga disebut "akun layanan Google") dengan perintah berikut:
    gcloud iam service-accounts list --project PROJECT_ID

    Anda harus membuat file konfigurasi kredensial untuk akun layanan IAM berikut:

    Prod

    Untuk lingkungan produksi:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-cassandra     apigee-cassandra@my_project_id.iam.gserviceaccount.com     False
    apigee-mart          apigee-mart@my_project_id.iam.gserviceaccount.com          False
    apigee-metrics       apigee-metrics@my_project_id.iam.gserviceaccount.com       False
    apigee-runtime       apigee-runtime@my_project_id.iam.gserviceaccount.com       False
    apigee-synchronizer  apigee-synchronizer@my_project_id.iam.gserviceaccount.com  False
    apigee-udca          apigee-udca@my_project_id.iam.gserviceaccount.com          False
    apigee-watcher       apigee-watcher@my_project_id.iam.gserviceaccount.com       False
    

    Non-prod

    Untuk lingkungan non-produksi:

    DISPLAY NAME         EMAIL                                                      DISABLED
    apigee-non-prod      apigee-non-prod@my_project_id.iam.gserviceaccount.com      False
    
  2. Buat file konfigurasi kredensial untuk setiap akun layanan IAM dalam daftar sebelumnya. Anda akan memerlukan file konfigurasi kredensial ini untuk mengonfigurasi Apigee hybrid agar menggunakan Workload Identity Federation:

    Kode

    gcloud iam workload-identity-pools create-cred-config \
      projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \
      --service-account=SERVICE_ACCOUNT_EMAIL \
      --credential-source-file=/var/
      --credential-source-type=text \
      --output-file=SERVICE_ACCOUNT_NAME-credential-configuration.json
      

    Contoh

    gcloud iam workload-identity-pools create-cred-config \
      projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider \
      --service-account=apigee-cassandra@myhybridporg.iam.gserviceaccount.com \
      --credential-source-file=/var/
      --credential-source-type=text \
      --output-file=apigee-cassandra-credential-configuration.json
      

    Dengan:

    • PROJECT_NUMBER: Nomor project dari project yang berisi workload identity pool. Ini harus berupa nomor project, bukan project ID.
    • POOL_ID: ID workload identity pool
    • WORKLOAD_PROVIDER_ID: ID penyedia workload identity pool
    • SERVICE_ACCOUNT_EMAIL: Alamat email akun layanan, jika Anda mengonfigurasi ServiceAccount Kubernetes untuk menggunakan peniruan identitas akun layanan IAM.

    File konfigurasi kredensial memungkinkan [Library Klien Cloud](/apis/docs/cloud-client-libraries), gcloud CLI, dan Terraform menentukan hal berikut:

    • Tempat Anda bisa memperoleh kredensial eksternal
    • Workload identity pool dan penyedia workload identity yang akan digunakan
    • Akun layanan yang akan ditiru

    Mengonfigurasi Apigee hybrid untuk menggunakan Workload Identity Federation

    1. Salin atau pindahkan setiap file output (SERVICE_ACCOUNT_NAME-credential-configuration.json) ke direktori bagan berikut (atau subdirektorinya). Ini adalah file yang Anda buat di langkah Buat file konfigurasi kredensial.

      Prod

      Akun layanan Direktori diagram Helm Apigee
      apigee-cassandra apigee-datastore/
      apigee-mart apigee-org/
      apigee-metrics apigee-telemetry/
      apigee-runtime apigee-env/
      apigee-synchronizer apigee-env/
      apigee-udca apigee-org/
      apigee-env/
      apigee-watcher apigee-org/

      Non-prod

      Akun layanan Diagram Helm Apigee
      apigee-non-prod apigee-datastore/
      apigee-telemetry/
      apigee-org/
      apigee-env/
    2. Lakukan perubahan global berikut pada file penggantian cluster Anda:

      Kode

      gcp:
        workloadIdentity:
          enabled: false # must be set to false to use Workload Identity Federation
        federatedWorkloadIdentity:
          enabled: true
          audience: "AUDIENCE"
          credentialSourceFile: "/var/run/service-account/token"
      

      Contoh

      gcp:
        workloadIdentity:
          enabled: false
        federatedWorkloadIdentity:
          enabled: true
          audience: "//iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider"
          credentialSourceFile: "/var/run/service-account/token"
      

      Dengan: AUDIENCE adalah audiens yang diizinkan dari Penyedia Workload Identity. Anda dapat menemukan nilai tersebut dengan menelusuri file konfigurasi kredensial untuk istilah audience: . Nilai audiens sama di setiap file konfigurasi kredensial.

      Misalnya, dalam contoh file apigee-udca-credential-configuration.json berikut:

      {
        "universe_domain": "googleapis.com",
        "type": "external_account:,"
        "audience": "//iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider",
        "subject_token_type": "urn:ietf:params:oauth: token-type:jwt",
        "token_url": "https://sts.googleapis.com/v1/token",
        "service
        "impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/apigee-udca@myhybridproject.iam.gserviceaccount.com:generateAccessToken",
        "credential_source": {
          "file": "/var/run/service-account/token",
          "format": {
            "type": "text"
          }
        }
      }

      Nilai audiens adalah //iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider.

    3. Konfigurasi penggantian untuk setiap komponen menggunakan Workload Identity Federation. Pilih petunjuk untuk file sertifikat, secret Kubernetes, atau Vault yang sesuai untuk penginstalan Anda.

      File sertifikat

      Ganti nilai serviceAccountPath dengan file sumber kredensial untuk akun layanan IAM yang sesuai. Ini harus berupa jalur relatif terhadap direktori diagram. Contoh:

      envs:
      - name: ENVIRONMENT_NAME
        serviceAccountPaths:
          synchronizer: apigee-synchronizer-credential-configuration.json
          runtime: apigee-runtime-credential-configuration.json
          udca: apigee-udca-credential-configuration.json
      
      mart:
        serviceAccountPath: apigee-mart-credential-configuration.json
      
      connectAgent:
        serviceAccountPath: apigee-mart-credential-configuration.json
      
      metrics:
        serviceAccountPath: apigee-metrics-credential-configuration.json
      
      udca:
        serviceAccountPath: apigee-udca-credential-configuration.json
      
      watcher:
        serviceAccountPath: apigee-watcher-credential-configuration.json
      

      Secret K8s

      1. Buat secret Kubernetes baru menggunakan file sumber kredensial untuk setiap file konfigurasi kredensial.
        kubectl create secret -n APIGEE_NAMESPACE generic SECRET_NAME --from-file="client_secret.json=CREDENTIAL_CONFIGURATION_FILE"

        Contoh:

        kubectl create secret -n apigee generic udca-workoad-identity-secret --from-file="client_secret.json=./apigee-udca-credential-configuration.json"
      2. Ganti nilai serviceAccountRef dengan secret baru. Contoh:
        udca:
          serviceAccountRef: udca-workoad-identity-secret
        

      Vault

      Perbarui kunci akun layanan, SAKEY untuk setiap akun layanan di Vault dengan file sumber kredensial yang sesuai. Prosedurnya serupa untuk semua komponen. Misalnya, untuk UDCA:

      SAKEY=$(cat .apigee-udca-credential-configuration.json); kubectl -n APIGEE_NAMESPACE exec vault-0 -- vault kv patch secret/apigee/orgsakeys udca="$SAKEY"

      Lihat Storing service account keys in Hashicorp Vault untuk mengetahui informasi selengkapnya.

    4. Terapkan perubahan pada setiap komponen yang terpengaruh dengan perintah helm upgrade:

      Jika Anda memperbarui kunci akun layanan Vault, perbarui diagram apigee-operator.

      helm upgrade operator apigee-operator/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f overrides.yaml
      

      Perbarui diagram lainnya yang terpengaruh dalam urutan berikut:

      helm upgrade datastore apigee-datastore/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f overrides.yaml
      
      helm upgrade telemetry apigee-telemetry/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f overrides.yaml
      
      helm upgrade $ORG_NAME apigee-org/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f overrides.yaml
      

      Perbarui diagram apigee-env untuk setiap lingkungan, mengganti $ENV_RELEASE_NAME danENV_NAME setiap kali:

      helm upgrade $ENV_RELEASE_NAME apigee-env/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        --set env=$ENV_NAME \
        -f overrides.yaml
      

      Lihat Referensi Helm Apigee Hybrid untuk mengetahui daftar komponen dan diagram yang sesuai.

    Memberikan akses ke akun layanan Kubernetes

    1. Buat daftar akun layanan Kubernetes dengan perintah berikut:
      kubectl get sa -n APIGEE_NAMESPACE
    2. Beri akun layanan Kubernetes akses untuk meniru identitas akun layanan IAM terkait seperti yang ditunjukkan pada tabel berikut. Tabel ini menampilkan nama akun layanan IAM Apigee default. Jika Anda menggunakan nama akun layanan kustom, gunakan akun layanan IAM yang sesuai:
      Akun layanan Kubernetes Akun layanan IAM
      Akun layanan Kubernetes tingkat organisasi
      apigee-connect-agent-ORG_NAME-ORG_HASH_ID apigee-mart
      apigee-mart-ORG_NAME-ORG_HASH_ID apigee-mart
      apigee-metrics-apigee-telemetry apigee-metrics
      apigee-open-telemetry-collector-apigee-telemetry apigee-metrics
      apigee-udca-ORG_NAME-ORG_HASH_ID apigee-udca
      apigee-watcher-ORG_NAME-ORG_HASH_ID apigee-watcher
      Akun layanan Kubernetes tingkat lingkungan
      apigee-runtime-ORG_NAME-ENV_NAME-ENV_HASH_ID apigee-runtime
      apigee-synchronizer-ORG_NAME-ENV_NAME-ENV_HASH_ID apigee-synchronizer
      Pencadangan dan pemulihan Cassandra (jika diaktifkan)
      apigee-cassandra-backup-sa apigee-cassandra
      apigee-cassandra-restore-sa apigee-cassandra

      Dengan:

      • ORG_NAME: 15 karakter pertama dari nama organisasi Anda.
      • ORG_HASH_ID: ID hash unik dari nama lengkap organisasi Anda.
      • ENV_NAME: 15 karakter pertama dari nama lingkungan Anda.
      • ENV_HASH_ID: ID hash unik dari nama organisasi dan lingkungan Anda.

      Contoh:

      • apigee-connect-agent-myhybridorg-123abcd
      • apigee-runtime-myhybridorg-prodenv-234bcde

      Berikan akses ke setiap akun layanan Kubernetes untuk meniru identitas akun layanan IAM yang sesuai dengan perintah berikut:

      gcloud iam service-accounts add-iam-policy-binding \
        IAM_SA_NAME@PROJECT_ID.iam.gserviceaccount.com \
          --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/MAPPED_SUBJECT" \
          --role=roles/iam.workloadIdentityUser

      Dengan:

      • IAM_SA_NAME: nama akun layanan.
      • PROJECT_ID: ID project yang terkait dengan Org. Apigee.
      • PROJECT_NUMBER: nomor project dari project tempat Anda membuat workload identity pool.
      • POOL_ID: ID workload identity pool.
      • MAPPED_SUBJECT: ServiceAccount Kubernetes dari klaim di token ID yang Anda petakan ke google.subject. Misalnya, jika Anda memetakan google.subject=assertions.sub dan token ID Anda berisi "sub": "system:serviceaccount:default:my-kubernetes-serviceaccount", maka MAPPED_SUBJECT adalah system:serviceaccount:default:my-kubernetes-serviceaccount.

    Untuk mengetahui informasi selengkapnya tentang Workload Identity Federation dan praktik terbaik, lihat Praktik terbaik untuk menggunakan workload identity federation.