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, pengelola secret eksternal. Dengan pengelola secret eksternal, Anda dapat mengelola cara data disimpan di Kubernetes, termasuk mengelola residensi data dan kontrol akses yang mendetail.

Jika tidak menggunakan Workload Identity on GKE clusters atau Workload Identity Federation di EKS dan AKS, komponen Apigee hybrid 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 sertifikat akun layanan (.json file) disimpan di hard drive. Lihat hal ini di penggantian dengan properti konfigurasi serviceAccountPath. Contoh:
    logger:
      serviceAccountPath: service-accounts/myhybridorg-apigee-logger.json
    
  • File sertifikat akun layanan (.json file) disimpan di hard drive. Lihat hal ini di penggantian dengan properti konfigurasi serviceAccountPath. Lihat Tentang akun layanan.
  • Sertifikat akun layanan yang disimpan dalam secret Kubernetes. Lihat hal ini di penggantian dengan properti konfigurasi serviceAccountRef. Lihat Menyimpan data dalam secret Kubernetes.
  • Sertifikat akun layanan yang disimpan di Hashicorp Vault, dijelaskan dalam panduan ini. Lihat hal ini di 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 di cluster menggunakan Helm, ikuti petunjuk di Secrets Store CSI Driver: Installation. Untuk informasi selengkapnya, lihat Menginstal penyedia CSI Vault dalam dokumentasi Vault.

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

Membuat rahasia, kebijakan, dan peran Vault

Gunakan UI atau API Vault untuk membuat secret dan memberikan izin untuk 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 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 guna membuat daftar nama akun layanan untuk 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 dan pisahkan ke dalam daftar, satu daftar untuk nama akun layanan org, dan daftar terpisah untuk nama akun layanan env bagi 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. Memisahkan mereka ke dalam daftar yang 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 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 pengemudi CSI penyedia mana yang harus berkomunikasi dengan saat meminta secret. Kunci akun layanan harus dikonfigurasi melalui objek ini. Tabel berikut menampilkan nama file (objectNames) yang diharapkan oleh Apigee Hybrid:

Akun layananNama file rahasia yang diharapkan
Cadangan Cassandra cassandraBackup
Pemulihan Cassandra cassandraRestore
Hubungkan agen connectAgent
Logger logger
MART mart
Metrik metrics
Monetisasi mint
Runtime runtime
Penyinkron synchronizer
UDCA udca
Pengamat watcher
  1. Gunakan template SecretProviderClass berikut guna 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 menjadi http://vault.APIGEE_NAMESPACE.svc.cluster.local:VAULT_SERVICE_PORT.

    Simpan template ke file bernama spc-org.yaml.

  2. Terapkan SecretProviderClass khusus org ke namespace apigee Anda:
    kubectl -n apigee 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 yang sama dengan Apigee, formatnya umumnya akan menjadi 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 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 \
        --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 roll back untuk menggunakan file sertifikat akun layanan

Jika Anda perlu melakukan roll back untuk menggunakan file sertifikat akun layanan Google yang tersimpan, gunakan 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 \
        --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.