Menyimpan rahasia Cassandra di Hashicorp Vault

Menyimpan rahasia Cassandra di Hashicorp Vault

Fitur ini memungkinkan Anda menyimpan kredensial Cassandra DB untuk Apigee Hybrid di Hashicorp Vault, pengelola secret eksternal. Dengan pengelola secret eksternal, Anda dapat mengelola bagaimana secret disimpan di Kubernetes, termasuk mengelola residensi data dan kontrol akses yang mendetail.

Sebelum Apigee Hybrid versi 1.10, satu-satunya cara untuk menyediakan sandi bagi pengguna Cassandra adalah dengan menentukan sandi dalam fallback.yaml. Sandi ini disimpan di secret Kubernetes. Contoh:

cassandra:
  auth:
    default:
      password: "********"
    admin:
      password: "********"
    ddl:
      password: "********"
    dml:
      password: "********"
    jmx:
      username: "jmxuser"
      password: "********"
    jolokia:
      username: "apigee"
      password: "********"

Dengan Hashicorp Vault, Anda dapat menyediakan sandi ini melalui Kubernetes Secrets Store CSI Driver API (SecretProviderClass). Hal ini memungkinkan Kubernetes memasang beberapa secret, kunci, dan sertifikat yang disimpan di Vault eksternal.

Pengguna dan sandi Cassandra

Anda perlu membuat rahasia untuk pengguna Cassandra berikut. Ubah nilai default agar sesuai dengan kebijakan keamanan organisasi Anda.

Pengguna Cassandra Nama pengguna default Sandi default
Admin admin_user "********"
DDL ddl_user "********"
Default cassandra Catatan: Nama pengguna default harus selalu "cassandra" "********"
DML dml_user "********"
JMX "jmxuser" "********"
Jolokia "apigee" "********"

Lihat properti konfigurasi cassandra untuk mengetahui informasi selengkapnya.

Mengonfigurasi integrasi secret eksternal

Penyiapan integrasi Vault untuk Apigee Hybrid terdiri dari prosedur berikut.

  • Di dua prosedur pertama, Anda berinteraksi langsung dengan Vault.
  • Pada prosedur ketiga dan keempat, Anda akan menerapkan konfigurasi ke cluster Kubernetes.

Gunakan prosedur berikut untuk membuat secret di Vault dan memungkinkan penginstalan hybrid Anda agar memiliki akses ke secret tersebut.

Membuat rahasia, kebijakan, dan peran Vault

  1. Pastikan konteks Kubernetes saat ini disetel ke cluster Anda:
    kubectl config current-context
  2. Gunakan Vault API, CLI, atau UI untuk membuat secret cassandra. Nilai rahasia yang Anda buat harus cocok dengan nama pengguna dan sandi Cassandra yang saat ini digunakan di cluster Anda.
    • Kunci rahasia: Kunci rahasia apa pun (atau kombinasi beberapa kunci) dapat digunakan, misalnya:
      secret/data/apigee/cassandra
    • Data rahasia: Apigee Hybrid mengharapkan pasangan nama pengguna dan sandi untuk pengguna Cassandra berikut:
      Pengguna Cassandra
      Admin
      DDL
      Default
      DML
      JMX
      Jolokia
      Nilai nama pengguna dan sandi ini dapat tersebar di sejumlah kunci rahasia.
    • Vault CLI: Perintah berikut menunjukkan cara membuat satu secret yang berisi semua nama pengguna dan sandi yang diperlukan:
      vault kv put secret/apigee/cassandra \
          adminUsername="ADMIN_USERNAME" \
          adminPassword="ADMIN_PASSWORD" \
          ddlUsername="DDL_USERNAME" \
          ddlPassword="DDL_PASSWORD" \
          defaultUsername="cassandra" \
          defaultPassword="DEFAULT_PASSWORD" \
          dmlUsername="DML_USERNAME" \
          dmlPassword="DML_PASSWORD" \
          jmxUsername="JMX_USERNAME" \
          jmxPassword="JMX_PASSWORD" \
          jolokiaUsername="JOLOKIA_USERNAME" \
          jolokiaPassword="JOLOKIA_PASSWORD"
      Nama pengguna default untuk setiap pengguna adalah sebagai berikut:
      Pengguna Cassandra Nilai default
      Admin admin_user
      DDL ddl_user
      Default cassandra
      DML dml_user
      JMX jmxuser
      Jolokia apigee
  3. Dalam Vault, buat kebijakan untuk memberikan akses ke rahasia yang baru saja dibuat.
    1. Buat file kebijakan (nama yang disarankan: apigee-cassandra-auth.txt) dengan konten berikut:
      path "secret/data/apigee/cassandra" {
        capabilities = ["read"]
      }
      Jika Anda membuat beberapa secret, setiap secret harus ditambahkan ke file kebijakan:
      path "secret/data/apigee/cassandra/admin" {
        capabilities = ["read"]
      }
      
      path "secret/data/apigee/cassandra/ddl" {
        capabilities = ["read"]
      }
    2. Terapkan kebijakan ke Vault:
      vault policy write apigee-cassandra-auth apigee-cassandra-auth.txt

      Anda dapat membuat kebijakan menggunakan input standar, bukan membaca dari file:

      echo 'path "secret/data/apigee/cassandra" { capabilities = ["read"] }' | vault policy write apigee-cassandra-auth -
  4. Ikat kebijakan dengan akun layanan Kubernetes Apigee Cassandra.
    1. Tentukan variabel lingkungan berikut:
      export ORG_NAME=APIGEE_ORG_NAME
      export ENVS_LIST=LIST_OF_APIGEE-ENVS
      export APIGEE_NAMESPACE=YOUR_APIGEE_NAMESPACE
      export NAMESPACES=apigee-system,${APIGEE_NAMESPACE}

      Dengan keterangan:

      • ORG_NAME adalah nama organisasi Apigee Anda.
      • ENVS_LIST Adalah daftar yang dipisahkan koma dari lingkungan Apigee, misalnya dev,prod.
      • APIGEE_NAMESPACE adalah namespace Apigee Anda. Defaultnya adalah apigee.
      • NAMESPACES adalah daftar namespace yang dipisahkan koma untuk Apigee, apigee-system, dan namespace Apigee Anda.
    2. Buat skrip dengan konten berikut. Skrip dapat memiliki nama apa pun. Dalam contoh berikut, nama skrip adalah create-vault-cassandra-role.sh:
      # create-vault-cassandra-role.sh
      
      ORG=ORG_NAME  # ORG name
      ENVS=ENVS_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}
      
      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
      
    3. Jalankan skrip dan tetapkan output ke variabel SERVICE_ACCOUNT_NAMES. Tindakan ini akan membuat daftar nama akun layanan Kubernetes yang dipisahkan koma.
      export SERVICE_ACCOUNT_NAMES=$(./create-vault-cassandra-role)

      Pastikan variabel telah diisi dengan daftar:

      echo $SERVICE_ACCOUNT_NAMES
    4. Gunakan Vault CLI untuk membuat peran yang mengikat kebijakan ke akun layanan Kubernetes:
      vault write auth/kubernetes/role/cassandra \
          bound_service_account_names=${SERVICE_ACCOUNT_NAMES} \
          bound_service_account_namespaces=${NAMESPACES} \
          policies=apigee-cassandra-auth \
          ttl=1m

Instal driver CSI dan penyedia Vault

Apigee Hybrid v1.11.1 mendukung versi chart Helm berikut:

Software Version
Driver CSI Secrets Store v1.3.4
Vault v0.25.0
  1. Ikuti Petunjuk penginstalan Driver CSI Secrets Store untuk Menginstal driver CSI di cluster. Driver CSI memiliki chart Helm untuk penginstalan.
  2. Ikuti petunjuk dalam Menginstal penyedia CSI Vault untuk menginstal penyedia CSI Vault jika Anda belum menginstalnya.

Membuat objek SecretProviderClass

Resource SecretProviderClass memberi tahu pengemudi CSI penyedia mana yang harus berkomunikasi saat meminta secret. Kredensial pengguna Cassandra harus dikonfigurasi melalui objek ini. Tabel berikut menampilkan nama file (objectName) yang diharapkan oleh Apigee Cassandra:

Pengguna Cassandra Nama file rahasia yang diharapkan
Admin adminUsername, adminPassword
DDL ddlUsername, ddlPassword
Default cassandra, defaultPassword
DML dmlUsername, dmlPassword
JMX jmxUsername, jmxPassword
Jolokia jolokiaUsername, jolokiaPassword
  1. Buat file YAML untuk SecretProviderClass Anda. Nama file dapat berupa apa saja, misalnya: spc.yaml. Gunakan template SecretProviderClass berikut untuk mengonfigurasi referensi ini:
    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: apigee-cassandra-auth-spc
    spec:
      provider: vault
      parameters:
        roleName: apigee-cassandra-auth  # the roleName should match the vault role you created earlier in this procedure
    
        # vaultAddress is the endpoint your Vault server is running at.
        # If Vault is running in the same cluster as Apigee, the format will generally be:
        # http://vault.<namespace>.svc.cluster.local:<vaultServicePort>
        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 Cassandra 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.
        # For example, if the Vault secret is located at `secret/data/apigee/cassandra`
        # and you want to specify the admin password, you would use the following:
        # - objectName: "adminPassword"
        #   secretPath: "secret/data/apigee/cassandra"
        #   secretKey: "key within Vault secret specifying the admin password"
        objects: |
          - objectName: "adminUsername"
            secretPath: ""
            secretKey: ""
          - objectName: "adminPassword"
            secretPath: ""
            secretKey: ""
          - objectName: "defaultUsername"
            secretPath: ""
            secretKey: ""
          - objectName: "defaultPassword"
            secretPath: ""
            secretKey: ""
          - objectName: "ddlUsername"
            secretPath: ""
            secretKey: ""
          - objectName: "ddlPassword"
            secretPath: ""
            secretKey: ""
          - objectName: "dmlUsername"
            secretPath: ""
            secretKey: ""
          - objectName: "dmlPassword"
            secretPath: ""
            secretKey: ""
          - objectName: "jolokiaUsername"
            secretPath: ""
            secretKey: ""
          - objectName: "jolokiaPassword"
            secretPath: ""
            secretKey: ""
          - objectName: "jmxUsername"
            secretPath: ""
            secretKey: ""
          - objectName: "jmxPassword"
            secretPath: ""
            secretKey: ""
  2. Terapkan SecretProviderClass ke namespace apigee dan apigee-system Anda. Dalam perintah berikut, namespace adalah apigee dan apigee-system. Ganti nilai tersebut jika Anda menggunakan namespace lain:
    kubectl -n apigee apply -f spc.yaml
    kubectl -n apigee-system apply -f spc.yaml

Aktifkan rahasia eksternal untuk Cassandra

  1. Dalam overrides.yaml, tambahkan konfigurasi berikut guna mengaktifkan penggunaan secret eksternal untuk Cassandra:
    cassandra:
      auth:
        secretProviderClass: apigee-cassandra-auth-spc  # The name of the SecretProviderClass created in spc.yaml.

    Lihat cassandra.auth.secretProviderClass.

  2. Gunakan helm upgrade untuk menerapkan perubahan pada komponen apigee-operator dan apigee-datastore:
    • Pengontrol datastore di apigee-operator mengambil bagian dalam penonaktifan Cassandra dan replikasi data selama perluasan region. Tugas ini memerlukan kredensial JMX dan Jolokia.
      helm upgrade operator apigee-operator/ \
        --namespace apigee-system \
        --atomic \
        -f overrides.yaml
    • apigee-datastore memberikan kredensial yang digunakan oleh komponen downstream, seperti apigee-runtime, Synchronizer & MART, saat terhubung ke Cassandra.
      helm upgrade datastore apigee-datastore/ \
        --namespace apigee \
        --atomic \
        -f overrides.yaml
  3. Memverifikasi bahwa secret eksternal sedang digunakan. Jika secret eksternal diaktifkan, Volume, Volume Mount, dan Environment Variable baru akan ditambahkan dan merujuk ke secret tersebut.
    • Verifikasi deployment apigee-controller-manager.

      Pastikan bahwa Volume yang bernama apigee-external-secrets ada dan merujuk ke SecretProviderClass yang dibuat di atas:

      kubectl -n apigee-system get deployment apigee-controller-manager -o jsonpath='{.spec.template.spec.volumes[?(@.name=="apigee-external-secrets")]}'
      {
        "csi": {
          "driver": "secrets-store.csi.k8s.io",
          "readOnly": true,
          "volumeAttributes": {
            "secretProviderClass": "apigee-cassandra-auth-spc"
          }
        },
        "name": "apigee-external-secrets"
      }

      Pastikan VolumeMount yang bernama apigee-external-secrets ada:

      kubectl -n apigee-system get deployment apigee-controller-manager -o jsonpath='{.spec.template.spec.containers[?(@.name=="manager")].volumeMounts[?(@.name=="apigee-external-secrets")]}'
      {
        "mountPath": "/opt/apigee/externalsecrets",
        "name": "apigee-external-secrets",
        "readOnly": true
      }

      Pastikan bahwa Environment Variable ada yang merujuk ke secret eksternal:

      kubectl -n apigee-system get deployment apigee-controller-manager -o jsonpath='{.spec.template.spec.containers[?(@.name=="manager")].env}'
      [
        ...
        {
          "name": "CASSANDRA_JOLOKIA_USERNAME_PATH",
          "value": "/opt/apigee/externalsecrets/jolokiaUsername"
        },
        {
          "name": "CASSANDRA_JOLOKIA_PASSWORD_PATH",
          "value": "/opt/apigee/externalsecrets/jolokiaPassword"
        }
      ]

Rollback ke K8s Secret

  1. Untuk kembali ke secret non-eksternal, hapus konfigurasi secretProviderClass di overrides.yaml dan gunakan konfigurasi sebelumnya:
    cassandra:
          auth:
            secretProviderClass: apigee-cassandra-auth-spc # remove this line
  2. Gunakan helm upgrade untuk menerapkan perubahan pada komponen apigee-operator dan apigee-datastore:
    helm upgrade operator apigee-operator/ \
      --namespace apigee-system \
      --atomic \
      -f overrides.yaml
    helm upgrade datastore apigee-datastore/ \
      --namespace apigee \
      --atomic \
      -f overrides.yaml

Pemecahan masalah: Membuat penampung klien untuk proses debug

Jika Anda menggunakan Vault, bagian ini menggantikan petunjuk di bagian pemecahan masalah, Membuat penampung klien untuk proses debug.

Bagian ini menjelaskan cara membuat penampung klien tempat Anda dapat mengakses utilitas proses debug Cassandra seperti cqlsh. Utilitas ini memungkinkan Anda membuat kueri tabel Cassandra dan dapat berguna untuk tujuan proses debug.

Membuat penampung klien

Untuk membuat penampung klien, ikuti langkah-langkah berikut:

  1. Penampung menggunakan sertifikat TLS dari pod apigee-cassandra-user-setup. Langkah pertama adalah mengambil nama sertifikat ini:
    kubectl get secrets -n apigee --field-selector type=kubernetes.io/tls | grep apigee-cassandra-user-setup | awk '{print $1}'

    Perintah ini akan menampilkan nama sertifikat. Misalnya: apigee-cassandra-user-setup-rg-hybrid-b7d3b9c-tls.

  2. Buka file baru dan tempel spesifikasi pod berikut ke dalamnya:
    apiVersion: v1
      kind: Pod
      metadata:
        labels:
        name: CASSANDRA_CLIENT_NAME   # For example: my-cassandra-client
        namespace: apigee
      spec:
        containers:
        - name: CASSANDRA_CLIENT_NAME
          image: "gcr.io/apigee-release/hybrid/apigee-hybrid-cassandra-client:1.11.1"
          imagePullPolicy: Always
          command:
          - sleep
          - "3600"
          env:
          - name: CASSANDRA_SEEDS
            value: apigee-cassandra-default.apigee.svc.cluster.local
          - name: APIGEE_DML_USERNAME_PATH
            value: /opt/apigee/externalsecrets/dmlUsername
          - name: APIGEE_DML_PASSWORD_PATH
            value: /opt/apigee/externalsecrets/dmlPassword
          volumeMounts:
          - mountPath: /opt/apigee/ssl
            name: tls-volume
            readOnly: true
          - name: apigee-external-secrets
            mountPath: /opt/apigee/externalsecrets
            readOnly: true
        volumes:
        - name: tls-volume
          secret:
            defaultMode: 420
            secretName: apigee-cassandra-user-setup-vaibhavhybridor-8b3e61d-tls
        - name: apigee-external-secrets
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: apigee-cass-password
        serviceAccount: apigee-cassandra-default
        serviceAccountName: apigee-cassandra-default
        restartPolicy: Never
  3. Simpan file dengan ekstensi .yaml. Contoh: my-spec.yaml.
  4. Terapkan spesifikasi ke cluster Anda:
    kubectl apply -f my-spec.yaml -n apigee
  5. Login ke penampung:
    kubectl exec -n CASSANDRA_CLIENT_NAME -it -- bash
  6. Hubungkan ke antarmuka cqlsh Cassandra dengan perintah berikut. Masukkan perintah persis seperti yang ditunjukkan:
    APIGEE_DML_USER=$(cat "$APIGEE_DML_USERNAME_PATH")
    export APIGEE_DML_USER
    APIGEE_DML_PASSWORD=$(cat "$APIGEE_DML_PASSNAME_PATH")
    export APIGEE_DML_PASSWORD
    cqlsh ${CASSANDRA_SEEDS} -u ${APIGEE_DML_USER} -p ${APIGEE_DML_PASSWORD} --ssl

Menghapus pod klien

Gunakan perintah berikut untuk menghapus pod klien Cassandra:

kubectl delete pods -n apigee cassandra-client