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 secret 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 campuran Apigee Anda harus mengautentikasi akun layanan Google agar dapat melakukan tugasnya. Ada tiga metode untuk menyimpan dan mereferensikan kunci akun layanan Google di Apigee hybrid:

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

Menyiapkan untuk menyimpan secret akun layanan di Vault

Menginstal driver CSI dan penyedia Vault

Jika Anda belum menginstal driver CSI di cluster menggunakan Helm, ikuti petunjuk di Driver CSI Secrets Store: Penginstalan. 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": "myhybridorg",
        "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. Dalam 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 ke:
    ./generate-encoded-sas.sh

    Output Anda akan berupa daftar nama akun layanan Kubernetes yang dipisahkan 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 menjadi 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, 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 yang akan diajak berkomunikasi saat meminta secret. 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
Connect Agent connectAgent
Logger logger
MART mart
Metrik metrics
Monetisasi mint
Runtime runtime
Synchronizer synchronizer
UDCA udca
Watcher watcher
  1. Gunakan template SecretProviderClass berikut untuk mengonfigurasi resource ini untuk secret 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 akan berupa 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 apply -f spc-org.yaml
  3. Untuk setiap lingkungan, gunakan template SecretProviderClass berikut untuk mengonfigurasi resource ini untuk 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 yang sama dengan Apigee, formatnya umumnya akan berupa 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 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 \
        --atomic \
        -f overrides.yaml
    
    helm upgrade telemetry apigee-telemetry/ \
        --install \
        --namespace apigee \
        --atomic \
        -f overrides.yaml
    
    helm upgrade redis apigee-redis/ \
        --install \
        --namespace apigee \
        --atomic \
        -f overrides.yaml
    
    helm upgrade ORG_NAME apigee-org/ \
        --install \
        --namespace apigee \
        --atomic \
        -f overrides.yaml
    
  3. Untuk setiap lingkungan, terapkan diagram apigee-env:
    helm upgrade ENV_NAME apigee-env/ \
        --install \
        --namespace apigee \
        --set env=ENV_NAME \
        --atomic \
        -f overrides.yaml
    

Melakukan rollback untuk menggunakan file sertifikat akun layanan

Jika Anda perlu melakukan rollback untuk menggunakan file sertifikat 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
    
    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 \
        --atomic \
        -f overrides.yaml
    
    helm upgrade telemetry apigee-telemetry/ \
        --install \
        --namespace apigee \
        --atomic \
        -f overrides.yaml
    
    helm upgrade redis apigee-redis/ \
        --install \
        --namespace apigee \
        --atomic \
        -f overrides.yaml
    
    helm upgrade ORG_NAME apigee-org/ \
        --install \
        --namespace apigee \
        --atomic \
        -f overrides.yaml
    
  3. Untuk setiap lingkungan, terapkan diagram apigee-env:
    helm upgrade ENV_NAME apigee-env/ \
        --install \
        --namespace apigee \
        --set env=ENV_NAME \
        --atomic \
        -f overrides.yaml
    

    Ulangi langkah ini untuk setiap lingkungan.