Menyimpan kunci akun layanan di Hashicorp Vault

Menyimpan secret akun layanan di HashiCorp Vault

Fitur ini memungkinkan Anda menyimpan sertifikat akun layanan Google untuk Apigee Hybrid di Hashicorp Vault, pengelola secret eksternal. Pengelola rahasia eksternal memungkinkan Anda mengelola cara data disimpan di Kubernetes, termasuk mengelola residensi data dan kontrol akses terperinci.

Jika Anda tidak menggunakan Workload Identity di cluster GKE atau Workload Identity Federation di EKS dan AKS, komponen hybrid Apigee Anda perlu mengautentikasi akun layanan Google agar dapat menjalankan tugasnya. Ada tiga metode untuk menyimpan dan merujuk ke kunci akun layanan Google di Apigee hybrid:

  • File kunci JSON akun layanan (file .json) yang disimpan di hard drive. Referensi ini dalam penggantian Anda dengan properti konfigurasi serviceAccountPath. Contoh:
    logger:
      serviceAccountPath: service-accounts/myhybridorg-apigee-logger.json
    
  • File kunci JSON akun layanan (file .json) yang disimpan di hard drive. Referensi ini dalam penggantian Anda dengan properti konfigurasi serviceAccountPath. Lihat Tentang akun layanan.
  • Sertifikat akun layanan yang disimpan dalam secret Kubernetes. Referensi ini dalam penggantian Anda dengan properti konfigurasi serviceAccountRef. Lihat Menyimpan kunci akun layanan di secret Kubernetes.
  • Sertifikat akun layanan yang disimpan di Hashicorp Vault, dijelaskan dalam panduan ini. Referensi ini dalam penggantian Anda dengan properti konfigurasi serviceAccountSecretProviderClass.

Menyiapkan penyimpanan secret akun layanan di Vault

Menginstal driver CSI dan penyedia Vault

Jika Anda belum menginstal driver CSI di cluster menggunakan Helm, ikuti petunjuk di Secrets Store CSI Driver: Installation. Untuk mengetahui informasi selengkapnya, lihat Menginstal penyedia CSI Vault dalam dokumentasi Vault.

Lihat Platform dan versi yang didukung Apigee Hybrid untuk mengetahui versi Driver CSI minimum yang didukung oleh Apigee Hybrid.

Membuat secret, kebijakan, dan peran Vault

Gunakan UI atau API Vault untuk membuat secret dan memberikan izin bagi akun layanan Kubernetes yang digunakan oleh Apigee Hybrid untuk membaca secret tersebut.

  1. Buat secret khusus organisasi dan lingkungan dalam format berikut:
    Kunci RahasiaData Rahasia
    secret/data/apigee/orgsakeys
    {
      "cassandraBackup": "***",
      "cassandraRestore": "***",
      "connectAgent": "***",
      "logger": "***",
      "mart": "***",
      "metrics": "***",
      "mint": "***",
      "udca": "***",
      "watcher": "***"
    }
    secret/data/apigee/envsakeys-ENV_NAME
    {
      "runtime": "***",
      "synchronizer": "***",
      "udca": "***"
    }

    Ganti "***" di setiap pasangan dengan konten file .json untuk akun layanan Google yang sesuai dengan komponen Apigee. apigee-cassandra-backup dan apigee-cassandra-restore menggunakan akun layanan apigee-cassandra. Contoh:

    {
      "cassandraBackup": "{
        "type": "service_account",
        "project_id": "my-project",
        "private_key_id": "PRIVATE_KEY_ID",
        "private_key": "-----BEGIN PRIVATE KEY-----\nPRIVATE_KEY_TEXT\n-----END PRIVATE KEY-----\n",
        "client_email": "apigee-cassandra@myhybridorg.iam.gserviceaccount.com",
        "client_id": "123456789012345678901",
        "auth_uri": "https://accounts.google.com/o/oauth2/auth",
        "token_uri": "https://oauth2.googleapis.com/token",
        "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
        "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/apigee-cassandra%40myhybridorg.iam.gserviceaccount.com",
        "universe_domain": "googleapis.com"
      }",
      "cassandraRestore":...
    ...
    }
        
  2. Berikan akses ke secret organisasi. Buat file teks bernama orgsakeys-auth-policy.txt dengan konten berikut:
    path "secret/data/apigee/orgsakeys" {
      capabilities = ["read"]
    }
  3. Di Vault, buat kebijakan yang memberikan akses ke secret organisasi:
    vault policy write apigee-orgsakeys-auth orgsakeys-auth-policy.txt
  4. Untuk setiap lingkungan, buat file teks bernama envsakeys-ENV_NAME-auth-policy.txt dengan konten berikut:
    path "secret/data/apigee/envsakeys-ENV_NAME" {
      capabilities = ["read"]
    }

    Ulangi langkah ini untuk setiap lingkungan.

  5. Dalam Vault, buat kebijakan yang memberikan akses ke secret lingkungan:
    vault policy write apigee-envsakeys-ENV_NAME-auth envsakeys-ENV_NAME-auth-policy.txt

    Ulangi langkah ini untuk setiap lingkungan.

  6. Buat skrip bernama generate-encoded-sas.sh dengan konten berikut:
    # generate-encoded-sas.sh
    
    ORG=$APIGEE_ORG            # Apigee organization name
    ENVS=$APIGEE_ENV_LIST      # comma separated env names, for example: dev,prod
    
    ORG_SHORT_NAME=$(echo $ORG | head -c 15)
    ENCODE=$(echo -n $ORG | shasum -a 256 | head -c 7)
    ORG_ENCODE=$(echo "$ORG_SHORT_NAME-$ENCODE")
    NAMES=apigee-manager,apigee-cassandra-default,apigee-cassandra-backup-sa,apigee-cassandra-restore-sa,apigee-cassandra-schema-setup-${ORG_ENCODE},apigee-cassandra-schema-val-${ORG_ENCODE},apigee-cassandra-user-setup-${ORG_ENCODE},apigee-mart-${ORG_ENCODE},apigee-mint-task-scheduler-${ORG_ENCODE},apigee-connect-agent-${ORG_ENCODE},apigee-watcher-${ORG_ENCODE},apigee-udca-${ORG_ENCODE},apigee-metrics-apigee-telemetry,apigee-open-telemetry-collector-apigee-telemetry,apigee-logger-apigee-telemetry
    
    for ENV in ${ENVS//,/ }
    do
      ENV_SHORT_NAME=$(echo $ENV | head -c 15)
      ENCODE=$(echo -n $ORG:$ENV | shasum -a 256 | head -c 7)
      ENV_ENCODE=$(echo "$ORG_SHORT_NAME-$ENV_SHORT_NAME-$ENCODE")
      NAMES+=,apigee-synchronizer-${ENV_ENCODE},apigee-runtime-${ENV_ENCODE}
    done
    
    echo $NAMES
    
  7. Jalankan skrip untuk membuat daftar nama akun layanan yang akan mengikat kebijakan:
    ./generate-encoded-sas.sh

    Output Anda harus berupa daftar nama akun layanan Kubernetes yang dipisahkan dengan koma, mirip dengan contoh berikut:

    ./generate-encoded-sas.sh
    apigee-manager,apigee-cassandra-default,apigee-cassandra-backup-sa,
    apigee-cassandra-restore-sa,apigee-cassandra-schema-setup-myhybrido
    rg-5b044c1,apigee-cassandra-schema-val-myhybridorg-5b044c1,apigee-c
    assandra-user-setup-myhybridorg-5b044c1,apigee-mart-myhybridorg-5b0
    44c1,apigee-mint-task-scheduler-myhybridorg-5b044c1,apigee-connect-
    agent-myhybridorg-5b044c1,apigee-watcher-myhybridorg-5b044c1,apigee
    -udca-myhybridorg-5b044c1,apigee-metrics-apigee-telemetry,apigee-op
    en-telemetry-collector-apigee-telemetry,apigee-logger-apigee-teleme
    try,apigee-synchronizer-myhybridorg-dev-ee52aca,apigee-runtime-myhy
    bridorg-dev-ee52aca,apigee-synchronizer-myhybridorg-prod-2d0221c,ap
    igee-runtime-myhybridorg-prod-2d0221c
  8. Salin teks output ke dalam dan pisahkan ke dalam daftar, satu daftar untuk nama akun layanan org dan daftar terpisah untuk nama akun layanan env untuk setiap lingkungan. Akun layanan org berada di urutan pertama dalam daftar output hingga apigee-logger-apigee-telemetry.

    Daftar nama layanan org dari contoh sebelumnya:

    apigee-manager,apigee-cassandra-default,apigee-cassandra-backup-sa,
    apigee-cassandra-restore-sa,apigee-cassandra-schema-setup-myhybrido
    rg-5b044c1,apigee-cassandra-schema-val-myhybridorg-5b044c1,apigee-c
    assandra-user-setup-myhybridorg-5b044c1,apigee-mart-myhybridorg-5b0
    44c1,apigee-mint-task-scheduler-myhybridorg-5b044c1,apigee-connect-
    agent-myhybridorg-5b044c1,apigee-watcher-myhybridorg-5b044c1,apigee
    -udca-myhybridorg-5b044c1,apigee-metrics-apigee-telemetry,apigee-op
    en-telemetry-collector-apigee-telemetry,apigee-logger-apigee-teleme
    try

    Nama akun layanan env memiliki pola apigee-synchronizer-ORG_NAME-ENV_NAME-HASH_TEXT dan apigee-runtime-ORG_NAME-ENV_NAME-HASH_TEXT. Pisahkan ke dalam daftar terpisah untuk setiap lingkungan. Misalnya, output dari contoh sebelumnya dapat dipisahkan menjadi dua daftar berikut:

    Lingkungan dev:

    apigee-synchronizer-myhybridorg-dev-ee52aca,apigee-runtime-myhybrid
    org-dev-ee52aca

    Lingkungan prod:

    apigee-synchronizer-myhybridorg-prod-2d0221c,apigee-runtime-myhybri
    dorg-prod-2d0221c
  9. Dengan menggunakan kebijakan tersebut, buat peran Vault yang mengikat akun layanan Apigee khusus organisasi:
    vault write auth/kubernetes/role/apigee-orgsakeys \
        bound_service_account_names=LIST_OF_ORG_SA_NAMES \
        bound_service_account_namespaces=apigee \
        policies=apigee-orgsakeys-auth \
        ttl=1m
    
  10. Untuk setiap lingkungan, buat peran Vault untuk kunci akun layanannya:
    vault write auth/kubernetes/role/apigee-envsakeys-ENV_NAME \
        bound_service_account_names=LIST_OF_ENV_NAME_SA_NAMES \
        bound_service_account_namespaces=apigee \
        policies=apigee-envsakeys-ENV_NAME-auth \ 
        ttl=1m
    

    Ulangi langkah ini untuk setiap lingkungan.

Membuat objek SecretProviderClass

Resource SecretProviderClass memberi tahu driver CSI penyedia mana yang harus dihubungi saat meminta rahasia. Kunci akun layanan harus dikonfigurasi melalui objek ini. Tabel berikut menunjukkan nama file (objectNames) yang diharapkan oleh Apigee Hybrid:

Akun layananNama file rahasia yang diharapkan
Pencadangan Cassandra cassandraBackup
Pemulihan Cassandra cassandraRestore
Menghubungkan agen connectAgent
Logger logger
MART mart
Metrik metrics
Monetisasi
(jika menggunakan Monetisasi untuk Apigee Hybrid)
mint
Runtime runtime
Penyinkron synchronizer
UDCA udca
Pengamat watcher
  1. Gunakan template SecretProviderClass berikut untuk mengonfigurasi resource ini untuk rahasia khusus organisasi:
    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: apigee-orgsakeys-spc
    spec:
      provider: vault
      parameters:
        roleName: apigee-orgsakeys
        vaultAddress: VAULT_ADDRESS
        # "objectName" is an alias used within the SecretProviderClass to reference
        # that specific secret. This will also be the filename containing the secret.
        # Apigee Hybrid expects these exact values so they must not be changed.
        # "secretPath" is the path in Vault where the secret should be retrieved.
        # "secretKey" is the key within the Vault secret response to extract a value from.
        objects: |
          - objectName: "cassandraBackup"
            secretPath: ""
            secretKey: ""
          - objectName: "cassandraRestore"
            secretPath: ""
            secretKey: ""
          - objectName: "connectAgent"
            secretPath: ""
            secretKey: ""
          - objectName: "logger"
            secretPath: ""
            secretKey: ""
          - objectName: "mart"
            secretPath: ""
            secretKey: ""
          - objectName: "metrics"
            secretPath: ""
            secretKey: ""
          - objectName: "mint"
            secretPath: ""
            secretKey: ""
          - objectName: "udca"
            secretPath: ""
            secretKey: ""
          - objectName: "watcher"
            secretPath: ""
            secretKey: ""
    

    VAULT_ADDRESS adalah endpoint tempat server Vault Anda berjalan. Jika Vault berjalan di cluster yang sama dengan Apigee, formatnya umumnya adalah http://vault.APIGEE_NAMESPACE.svc.cluster.local:VAULT_SERVICE_PORT.

    Simpan template ke file bernama spc-org.yaml.

  2. Terapkan SecretProviderClass khusus organisasi ke namespace apigee Anda:
    kubectl -n APIGEE_NAMESPACE apply -f spc-org.yaml
  3. Untuk setiap lingkungan, gunakan template SecretProviderClass berikut untuk mengonfigurasi resource ini bagi secret khusus lingkungan. Ulangi langkah ini untuk setiap lingkungan:
    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: apigee-envsakeys-ENV_NAME-spc
    spec:
      provider: vault
      parameters:
        roleName: apigee-envsakeys-ENV_NAME
        vaultAddress: VAULT_ADDRESS
        # "objectName" is an alias used within the SecretProviderClass to reference
        # that specific secret. This will also be the filename containing the secret.
        # Apigee Hybrid expects these exact values so they must not be changed.
        # "secretPath" is the path in Vault where the secret should be retrieved.
        # "secretKey" is the key within the Vault secret response to extract a value from.
        objects: |
          - objectName: "runtime"
            secretPath: ""
            secretKey: ""
          - objectName: "synchronizer"
            secretPath: ""
            secretKey: ""
          - objectName: "udca"
            secretPath: ""
            secretKey: ""
    

    VAULT_ADDRESS adalah endpoint tempat server Vault Anda berjalan. Jika Vault berjalan di cluster dan namespace yang sama dengan Apigee, formatnya biasanya adalah http://vault.APIGEE_NAMESPACE.svc.cluster.local:VAULT_SERVICE_PORT.

    Simpan template ke file bernama spc-env-ENV_NAME.yaml.

  4. Untuk setiap lingkungan, terapkan SecretProviderClass khusus lingkungan ke namespace apigee Anda:
    kubectl -n APIGEE_NAMESPACE apply -f spc-env-ENV_NAME.yaml

    Ulangi langkah ini untuk setiap lingkungan.

Mengaktifkan secret eksternal untuk akun layanan Google

  1. Dalam file penggantian, tambahkan properti konfigurasi serviceAccountSecretProviderClass dan envs[].serviceAccountSecretProviderClass untuk mengaktifkan penggunaan secret eksternal untuk akun layanan Google. Anda dapat menghapus atau mengomentari properti konfigurasi serviceAccountPath dan serviceAccountPaths:
    serviceAccountSecretProviderClass: apigee-orgsakeys-spc
    
    envs:
      - name: ENV_NAME
        serviceAccountSecretProviderClass: apigee-envsakeys-ENV_NAME-spc
  2. Terapkan setiap diagram Helm:
    helm upgrade datastore apigee-datastore/ \
        --install \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f overrides.yaml
    
    helm upgrade telemetry apigee-telemetry/ \
        --install \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f overrides.yaml
    
    helm upgrade redis apigee-redis/ \
        --install \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f overrides.yaml
    
    helm upgrade ORG_NAME apigee-org/ \
        --install \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f overrides.yaml
    
  3. Untuk setiap lingkungan, terapkan diagram apigee-env:
    helm upgrade ENV_NAME apigee-env/ \
        --install \
        --namespace APIGEE_NAMESPACE \
        --set env=ENV_NAME \
        --atomic \
        -f overrides.yaml
    

Melakukan roll back untuk menggunakan file JSON akun layanan

Jika Anda perlu melakukan roll back untuk menggunakan file JSON akun layanan Google yang tersimpan, gunakan prosedur berikut:

  1. Perbarui file penggantian Anda:
    1. Hapus atau jadikan baris serviceAccountSecretProviderClass dan envs:serviceAccountSecretProviderClass sebagai komentar.
    2. Tambahkan properti konfigurasi serviceAccountPath dan serviceAccountPaths dengan jalur ke akun layanan yang sesuai.

    Contoh:

    # serviceAccountSecretProviderClass: apigee-orgsakeys-spc - (commented out)
    
    cassandra:
      backup:
        serviceAccountPath: service-accounts/myhybridorg-apigee-cassandra.json
      restore:
        serviceAccountPath: service-accounts/myhybridorg-apigee-cassandra.json
    
    connectAgent:
      serviceAccountPath: service-accounts/myhybridorg-apigee-mart.json
    
    envs:
      - name: test
      # serviceAccountSecretProviderClass: apigee-envsakeys-spc - (commented out)
        serviceAccountPaths:
          runtime: service-accounts/myhybridorg-apigee-runtime.json
          synchronizer: service-accounts/myhybridorg-apigee-synchronizer.json
    
    logger:
      serviceAccountPath: service-accounts/myhybridorg-apigee-logger.json
    
    mart:
      serviceAccountPath: service-accounts/myhybridorg-apigee-mart.json
    
    metrics:
      serviceAccountPath: service-accounts/myhybridorg-apigee-metrics.json
    
    mint: # Required if using Monetization for Apigee hybrid (v1.15.1 and later)
      serviceAccountPath: service-accounts/myhybridorg-apigee-mint-task-scheduler.json
    
    udca:
      serviceAccountPath: service-accounts/myhybridorg-apigee-udca.json
    
    watcher:
      serviceAccountPath: service-accounts/myhybridorg-apigee-watcher.json
    
  2. Terapkan setiap diagram Helm:
    helm upgrade datastore apigee-datastore/ \
        --install \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f overrides.yaml
    
    helm upgrade telemetry apigee-telemetry/ \
        --install \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f overrides.yaml
    
    helm upgrade redis apigee-redis/ \
        --install \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f overrides.yaml
    
    helm upgrade ORG_NAME apigee-org/ \
        --install \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f overrides.yaml
    
  3. Untuk setiap lingkungan, terapkan diagram apigee-env:
    helm upgrade ENV_NAME apigee-env/ \
        --install \
        --namespace APIGEE_NAMESPACE \
        --set env=ENV_NAME \
        --atomic \
        -f overrides.yaml
    

    Ulangi langkah ini untuk setiap lingkungan.