Armazenar segredos da conta de serviço no Hashicorp Vault
Esta funcionalidade permite-lhe armazenar certificados de contas de serviço Google para o Apigee Hybrid no Hashicorp Vault, um gestor de segredos externo. Os gestores de segredos externos permitem-lhe gerir a forma como os dados são armazenados no Kubernetes, incluindo a gestão da residência de dados e os controlos de acesso detalhados.
Se não estiver a usar o Workload Identity em clusters do GKE ou a Workload Identity Federation no EKS e no AKS, os seus componentes híbridos do Apigee têm de autenticar contas de serviço Google para poderem realizar as respetivas tarefas. Existem três métodos para armazenar e consultar chaves de contas de serviço Google no Apigee Hybrid:
-
Ficheiros de cert da conta de serviço (ficheiros
.json
) armazenados num disco rígido. Consulte-as nas substituições com a propriedade de configuraçãoserviceAccountPath
. Por exemplo:logger: serviceAccountPath: service-accounts/myhybridorg-apigee-logger.json
-
Ficheiros de cert da conta de serviço (ficheiros
.json
) armazenados num disco rígido. Consulte-as nas substituições com a propriedade de configuraçãoserviceAccountPath
. Consulte o artigo Acerca das contas de serviço. -
Certificados de contas de serviço armazenados num secret do Kubernetes. Consulte-as nas substituições com a propriedade de configuração
serviceAccountRef
. Consulte o artigo Armazenar dados num secret do Kubernetes. -
Certificados de contas de serviço armazenados no Hashicorp Vault, explicados neste guia. Consulte-as nas substituições com a propriedade de configuração
serviceAccountSecretProviderClass
.
Configure o armazenamento de segredos da conta de serviço no Vault
Instale o controlador CSI e o fornecedor do Vault
Se ainda não instalou o controlador CSI no cluster através do Helm, siga as instruções em Controlador CSI da Secrets Store: instalação. Para mais informações, consulte o artigo Instalar o fornecedor de CSI do Vault na documentação do Vault.
Consulte as plataformas e versões suportadas do Apigee Hybrid para ver as versões mínimas do controlador CSI suportadas pelo Apigee Hybrid.
Crie segredos, políticas e funções do Vault
Use a IU ou as APIs do Vault para criar segredos e conceder autorizações para que as contas de serviço do Kubernetes usadas pelo Apigee hybrid leiam esses segredos.
-
Crie os segredos específicos da organização e do ambiente no seguinte formato:
Chave secreta Dados secretos secret/data/apigee/orgsakeys
{ "cassandraBackup": "***", "cassandraRestore": "***", "connectAgent": "***", "logger": "***", "mart": "***", "metrics": "***", "mint": "***", "udca": "***", "watcher": "***" }
secret/data/apigee/envsakeys-ENV_NAME
{ "runtime": "***", "synchronizer": "***", "udca": "***". }
Substitua o
"***"
em cada par pelo conteúdo do ficheiro .json da conta de serviço Google correspondente ao componente Apigee. Oapigee-cassandra-backup
e oapigee-cassandra-restore
usam a conta de serviçoapigee-cassandra
. Por exemplo:{ "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":... ... }
- Conceda acesso ao segredo da organização. Crie um ficheiro de texto denominado orgsakeys-auth-policy.txt com o seguinte conteúdo:
path "secret/data/apigee/orgsakeys" { capabilities = ["read"] }
-
No Vault, crie uma política que conceda acesso ao segredo da organização:
vault policy write apigee-orgsakeys-auth orgsakeys-auth-policy.txt
-
Para cada ambiente, crie um ficheiro de texto denominado
envsakeys-ENV_NAME-auth-policy.txt
com o seguinte conteúdo:path "secret/data/apigee/envsakeys-ENV_NAME" { capabilities = ["read"] }
Repita este passo para cada ambiente.
-
No Vault, crie uma política que conceda acesso ao segredo do ambiente:
vault policy write apigee-envsakeys-ENV_NAME-auth envsakeys-ENV_NAME-auth-policy.txt
Repita este passo para cada ambiente.
-
Crie um script denominado
generate-encoded-sas.sh
com o seguinte conteúdo:# 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
-
Execute o script para gerar a lista de nomes de contas de serviço à qual associar a política:
./generate-encoded-sas.sh
O resultado deve ser uma lista de nomes de contas de serviço do Kubernetes separados por vírgulas, semelhante ao seguinte exemplo:
./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 -
Copie o texto de saída e separe-o em listas, uma lista para os nomes das contas de serviço org e uma lista separada para o nome da conta de serviço env para cada ambiente. As contas de serviço da organização estão primeiro na lista de resultados até
apigee-logger-apigee-telemetry
.A lista de nomes de serviços org do exemplo anterior:
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
Os nomes das contas de serviço env têm o padrão
apigee-synchronizer-ORG_NAME-ENV_NAME-HASH_TEXT
eapigee-runtime-ORG_NAME-ENV_NAME-HASH_TEXT
. Separe-os em listas separadas para cada ambiente. Por exemplo, o resultado do exemplo anterior pode ser separado nas duas listas seguintes:dev
ambiente:apigee-synchronizer-myhybridorg-dev-ee52aca,apigee-runtime-myhybrid org-dev-ee52aca
prod
ambiente:apigee-synchronizer-myhybridorg-prod-2d0221c,apigee-runtime-myhybri dorg-prod-2d0221c
-
Usando a política, crie uma função do Vault que associe as contas de serviço do Apigee específicas da organização:
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
-
Para cada ambiente, crie uma função do Vault para as respetivas chaves de conta de serviço:
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
Repita este passo para cada ambiente.
Crie SecretProviderClass
objetos
O recurso SecretProviderClass
indica ao controlador CSI com que fornecedor comunicar quando pede segredos. As chaves de conta de serviço têm de ser configuradas através deste objeto. A tabela seguinte mostra os nomes de ficheiros (objectNames
) esperados pelo Apigee Hybrid:
Conta de serviço | Nomes de ficheiros secretos esperados |
---|---|
Cópia de segurança do Cassandra | cassandraBackup |
Restauro do Cassandra | cassandraRestore |
Ligue a um agente | connectAgent |
Logger | logger |
MART | mart |
Métrica | metrics |
Rentabilização | mint |
Tempo de execução | runtime |
Sincronizador | synchronizer |
UDCA | udca |
Observador | watcher |
-
Use o seguinte modelo
SecretProviderClass
para configurar este recurso para os segredos específicos da organização: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 é o ponto final onde o servidor do Vault está em execução. Se o Vault estiver a ser executado no mesmo cluster que o Apigee, o formato é geralmente
http://vault.APIGEE_NAMESPACE.svc.cluster.local:VAULT_SERVICE_PORT
.Guarde o modelo num ficheiro com o nome
spc-org.yaml
. -
Aplique o
SecretProviderClass
específico da organização ao seu espaço de nomes do Apigee:kubectl -n apigee apply -f spc-org.yaml
-
Para cada ambiente, use o seguinte modelo
SecretProviderClass
para configurar este recurso para os segredos específicos do ambiente. Repita este passo para cada ambiente: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 é o ponto final onde o servidor do Vault está em execução. Se o Vault estiver a ser executado no mesmo cluster que o Apigee, o formato é geralmente
http://vault.APIGEE_NAMESPACE.svc.cluster.local:VAULT_SERVICE_PORT
.Guarde o modelo num ficheiro com o nome
spc-env-ENV_NAME.yaml
. -
Para cada ambiente, aplique o
SecretProviderClass
específico do ambiente ao seu espaço de nomes do Apigee:kubectl -n apigee apply -f spc-env-ENV_NAME.yaml
Repita este passo para cada ambiente.
Ative segredos externos para contas de serviço Google
-
No ficheiro de substituições, adicione as propriedades de configuração
serviceAccountSecretProviderClass
eenvs[].serviceAccountSecretProviderClass
para ativar a utilização de segredos externos para contas de serviço Google. Pode remover ou comentar as propriedades de configuraçãoserviceAccountPath
eserviceAccountPaths
:serviceAccountSecretProviderClass: apigee-orgsakeys-spc envs: - name: ENV_NAME serviceAccountSecretProviderClass: apigee-envsakeys-ENV_NAME-spc
-
Aplique cada gráfico 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
-
Para cada ambiente, aplique o gráfico
apigee-env
:helm upgrade ENV_NAME apigee-env/ \ --install \ --namespace apigee \ --set env=ENV_NAME \ --atomic \ -f overrides.yaml
Reverter para a utilização de ficheiros de cert da conta de serviço
Se precisar de reverter para a utilização de ficheiros de cert da conta de serviço Google armazenados, siga este procedimento:
-
Atualize o ficheiro de substituições:
-
Remova ou comente as linhas
serviceAccountSecretProviderClass
eenvs:serviceAccountSecretProviderClass
. -
Adicione as propriedades de configuração
serviceAccountPath
eserviceAccountPaths
com os caminhos para as contas de serviço adequadas.
Por exemplo:
# 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
-
Remova ou comente as linhas
-
Aplique cada gráfico 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
-
Para cada ambiente, aplique o gráfico
apigee-env
:helm upgrade ENV_NAME apigee-env/ \ --install \ --namespace apigee \ --set env=ENV_NAME \ --atomic \ -f overrides.yaml
Repita este passo para cada ambiente.