Menyimpan kunci akun layanan di Hashicorp Vault

Menyimpan rahasia akun layanan di Hashicorp Vault

Fitur ini memungkinkan Anda menyimpan sertifikat akun layanan Google untuk Apigee Hybrid di Hashicorp Vault, rahasia eksternal Google. {i>External secret manager<i} memungkinkan Anda mengelola bagaimana data disimpan di Kubernetes, termasuk mengelola residensi data dan kontrol akses yang sangat detail.

Jika Anda tidak menggunakan Workload Identity on GKE clusters atau Workload Identity Federation di EKS dan AKS, komponen hybrid Apigee 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 sertifikat akun layanan (file .json) yang disimpan di hard drive. Lihat hal ini dalam penggantian 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 hal ini dalam penggantian dengan properti konfigurasi serviceAccountPath. Lihat Tentang akun layanan.
  • Sertifikat akun layanan yang disimpan dalam secret Kubernetes. Lihat hal ini dalam penggantian dengan properti konfigurasi serviceAccountRef. Lihat Menyimpan data dalam secret Kubernetes.
  • Sertifikat akun layanan yang disimpan di Hashicorp Vault, yang dijelaskan dalam panduan ini. Lihat hal ini dalam penggantian dengan properti konfigurasi serviceAccountSecretProviderClass.

Menyiapkan untuk menyimpan rahasia akun layanan di Vault

Instal driver CSI dan penyedia Vault

Jika Anda belum menginstal driver CSI pada cluster menggunakan Helm, ikuti petunjuk di Driver Secrets Store CSI: Penginstalan. Untuk 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 rahasia, kebijakan, dan peran Vault

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

  1. Buat rahasia 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.",
        "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.",
        "universe_domain": "googleapis.com"
      }",
      "cassandraRestore":...
    ...
    }
        
  2. Berikan akses ke rahasia 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 rahasia 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 rahasia 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 guna mengikat kebijakan ke:
    ./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. Memisahkannya 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 ini, buat peran Vault yang mengikat akun layanan Apigee spesifik per 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 mengenai penyedia yang harus 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 secret yang diharapkan
Pencadangan Cassandra cassandraBackup
Pemulihan Cassandra cassandraRestore
Hubungkan agen connectAgent
Logger logger
MART mart
Metrik metrics
Monetisasi mint
Runtime runtime
Penyelaras synchronizer
UDCA udca
Pengamat 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 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 guna 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 dan namespace yang sama dengan Apigee, formatnya umumnya 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 guna mengaktifkan penggunaan secret eksternal untuk akun layanan Google. Anda dapat menghapus atau menjadikan properti konfigurasi serviceAccountPath dan serviceAccountPaths sebagai komentar:
    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 sertifikat akun layanan

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

  1. Perbarui file penggantian:
    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_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.