Menyimpan rahasia Cassandra di Hashicorp Vault
Fitur ini memungkinkan Anda menyimpan kredensial Cassandra DB untuk Apigee Hybrid di Hashicorp Vault, rahasia eksternal Google. Pengelola secret eksternal memungkinkan Anda mengelola cara secret disimpan di Kubernetes, termasuk mengelola residensi data dan kontrol akses terperinci.
Sebelum Apigee Hybrid versi 1.10, satu-satunya cara untuk menyediakan {i>password<i} bagi pengguna Cassandra adalah untuk menentukan sandi di override.yaml. Sandi ini disimpan dalam secret Kubernetes. Contoh:
cassandra: auth: default: password: "********" admin: password: "********" ddl: password: "********" dml: password: "********" jmx: username: "jmxuser" password: "********" jolokia: username: "apigee" password: "********"
Dengan menggunakan Hashicorp Vault, Anda dapat memberikan 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 harus membuat secret untuk pengguna Cassandra berikut. Ubah nilai default menjadi memenuhi 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.
- Dalam 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 rahasia di Vault dan mengaktifkan hybrid Anda instalasi agar memiliki akses ke sana.
Membuat rahasia, kebijakan, dan peran Vault
-
Pastikan konteks Kubernetes saat ini ditetapkan ke cluster Anda:
kubectl config current-context
-
Gunakan Vault API, CLI, atau UI untuk membuat secret cassandra. Nilai secret yang Anda buat
harus cocok dengan nama pengguna dan sandi Cassandra yang saat ini digunakan di cluster Anda.
-
Kunci rahasia: Semua kunci rahasia (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 -
Vault CLI: Perintah berikut menunjukkan cara membuat satu rahasia yang berisi semua nama pengguna dan sandi yang diperlukan:
Nama pengguna default untuk setiap pengguna adalah sebagai berikut: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"
Pengguna Cassandra Nilai default Admin admin_user
DDL ddl_user
Default cassandra
DML dml_user
JMX jmxuser
Jolokia apigee
-
Kunci rahasia: Semua kunci rahasia (atau kombinasi beberapa kunci) dapat digunakan, misalnya:
-
Di dalam Vault, buat kebijakan untuk memberikan akses ke rahasia yang baru saja Anda buat.
-
Buat file kebijakan (nama yang disarankan:
apigee-cassandra-auth.txt
) dengan konten berikut: Jika Anda membuat beberapa secret, setiap secret harus ditambahkan ke file kebijakan:path "secret/data/apigee/cassandra" { capabilities = ["read"] }
path "secret/data/apigee/cassandra/admin" { capabilities = ["read"] } path "secret/data/apigee/cassandra/ddl" { capabilities = ["read"] }
-
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 -
-
Buat file kebijakan (nama yang disarankan:
-
Ikat kebijakan ke akun layanan Apigee Cassandra Kubernetes.
- 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 Anda, untuk
contoh
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.
- Buat skrip dengan konten berikut. Skrip dapat memiliki nama apa pun. Di kolom
contoh berikut, nama skripnya 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
- 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
-
Menggunakan Vault CLI untuk membuat peran yang mengikat kebijakan ke layanan Kubernetes
akun:
vault write auth/kubernetes/role/cassandra \ bound_service_account_names=${SERVICE_ACCOUNT_NAMES} \ bound_service_account_namespaces=${NAMESPACES} \ policies=apigee-cassandra-auth \ ttl=1m
- Tentukan variabel lingkungan berikut:
Instal driver CSI dan penyedia Vault
Apigee hybrid v1.12.1 mendukung versi diagram Helm berikut:
Software | Version |
---|---|
Driver CSI Secrets Store | v1.3.4 |
Vault | v0.25.0 |
- Ikuti petunjuk penginstalan Driver Secrets Store CSI untuk Menginstal driver CSI pada cluster. Driver CSI memiliki chart Helm untuk penginstalan.
- Ikuti petunjuk di Menginstal penyedia Vault CSI untuk menginstal penyedia Vault CSI jika Anda belum menginstalnya.
Membuat objek SecretProviderClass
Resource SecretProviderClass
memberi tahu driver CSI penyedia yang akan
diajak 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 secret yang diharapkan |
---|---|
Admin | adminUsername , adminPassword |
DDL | ddlUsername , ddlPassword |
Default | cassandra , defaultPassword |
DML | dmlUsername , dmlPassword |
JMX | jmxUsername , jmxPassword |
Jolokia | jolokiaUsername , jolokiaPassword |
- Buat file YAML untuk
SecretProviderClass
. Nama file dapat apa saja, misalnya:spc.yaml
. Gunakan templateSecretProviderClass
berikut untuk mengonfigurasi resource 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: ""
- Terapkan
SecretProviderClass
ke namespaceapigee
danapigee-system
Anda. Dalam perintah berikut ini, namespace akanapigee
danapigee-system
. Ganti nilai tersebut jika Anda menggunakan namespace yang berbeda:kubectl -n apigee apply -f spc.yaml
kubectl -n apigee-system apply -f spc.yaml
Aktifkan secret eksternal untuk Cassandra
- 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.
- Gunakan
helm upgrade
untuk menerapkan perubahan keapigee-operator
dan Komponenapigee-datastore
:- Pengontrol datastore di
apigee-operator
berpartisipasi dalam Penghentian Cassandra dan replikasi data selama perluasan region. Tugas-tugas ini memerlukan kredensial JMX dan Jolokia.helm upgrade operator apigee-operator/ \ --namespace apigee-system \ --atomic \ -f overrides.yaml
apigee-datastore
memberikan kredensial yang komponen downstream sepertiapigee-runtime
, Penyelaras & Penggunaan MART saat terhubung ke Cassandra.helm upgrade datastore apigee-datastore/ \ --namespace apigee \ --atomic \ -f overrides.yaml
- Pengontrol datastore di
-
Memverifikasi bahwa secret eksternal digunakan. Ketika secret eksternal diaktifkan,
Volume
,Volume Mount
, danEnvironment Variable
, ditambahkan yang merujuk ke secret.- Verifikasi deployment
apigee-controller-manager
.Pastikan bahwa
Volume
bernamaapigee-external-secrets
ada dan merujuk keSecretProviderClass
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
bernamaapigee-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 ada
Environment Variable
yang mereferensikan rahasia 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" } ]
- Verifikasi deployment
Melakukan rollback ke Secret K8s
- Untuk mengembalikan ke secret non-eksternal, hapus konfigurasi
secretProviderClass
dioverrides.yaml
dan gunakan konfigurasi sebelumnya:cassandra: auth: secretProviderClass: apigee-cassandra-auth-spc # remove this line
- Gunakan
helm upgrade
untuk menerapkan perubahan keapigee-operator
dan Komponenapigee-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 akan menggantikan petunjuk di bagian pemecahan masalah, Buat penampung klien untuk proses debug.
Bagian ini menjelaskan cara membuat penampung klien yang dapat Anda akses
Utilitas proses debug Cassandra
seperti cqlsh
. Utilitas ini memungkinkan Anda untuk melakukan kueri{i> <i}tabel Cassandra dan
dapat berguna untuk tujuan proses debug.
Membuat penampung klien
Untuk membuat penampung klien, ikuti langkah-langkah berikut:
- 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
. - Buka file baru dan tempelkan 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.12.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
- Simpan file dengan ekstensi
.yaml
. Contoh:my-spec.yaml
. - Terapkan spesifikasi ke cluster Anda:
kubectl apply -f my-spec.yaml -n apigee
- Login ke penampung:
kubectl exec -n CASSANDRA_CLIENT_NAME -it -- bash
- 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 ini untuk menghapus pod klien Cassandra:
kubectl delete pods -n apigee cassandra-client