Como armazenar chaves de conta de serviço em secrets do Kubernetes

Como armazenar secrets de conta de serviço em secrets do Kubernetes

Nesta página, descrevemos como armazenar chaves de conta de serviço da Apigee híbrida em secrets do Kubernetes. Armazenar chaves de conta de serviço em secrets do Kubernetes aumenta a segurança e simplifica o gerenciamento no ambiente do Kubernetes. Com as chaves armazenadas em secrets, não é necessário armazená-las no sistema de arquivos.

Contas de serviço

O modelo híbrido usa as seguintes contas de serviço:

Produção

Sem produção

  • apigee-non-prod

Antes de começar

Este procedimento usa duas variáveis de ambiente opcionais: $APIGEE_HELM_CHARTS_HOME e $PROJECT_ID. Se você não definir essas variáveis, substitua o valor apropriado para cada uma nos exemplos de código.

  1. Crie um diretório para as chaves da conta de serviço no diretório $APIGEE_HELM_CHARTS_HOME:
    mkdir -p $APIGEE_HELM_CHARTS_HOME/service-accounts
  2. Verifique se é possível executar a ferramenta create-service-account. Se você baixou os gráficos recentemente, o arquivo create-service-account pode não estar em um modo executável. No diretório $APIGEE_HELM_CHARTS_HOME, execute o seguinte comando:
    $APIGEE_HELM_CHARTS_HOME/apigee-operator/etc/tools/create-service-account \
    --help

    Se a saída indicar um erro de permissão negada, torne o arquivo executável. Por exemplo, use chmod no Linux, macOS ou UNIX:

    chmod +x $APIGEE_HELM_CHARTS_HOME/apigee-operator/etc/tools/create-service-account

Crie chaves de conta de serviço.

Crie ou atualize as contas de serviço e faça o download dos arquivos de chave usando a ferramenta create-service-account. Essa ação faz o download de um arquivo JSON para cada conta de serviço.

Os nomes dos arquivos de chave da conta de serviço terão o seguinte formato: $PROJECT_ID-apigee-SERVICE_ACCOUNT_NAME.json

Produção

$APIGEE_HELM_CHARTS_HOME/apigee-operator/etc/tools/create-service-account \
  --env prod \
  --dir $APIGEE_HELM_CHARTS_HOME/service-accounts

Sem produção

$APIGEE_HELM_CHARTS_HOME/apigee-operator/etc/tools/create-service-account \
  --env non-prod \
  --dir $APIGEE_HELM_CHARTS_HOME/service-accounts

Criar secrets do Kubernetes

Crie os secrets do Kubernetes para armazenar as chaves da conta de serviço.

O comando kubectl create secret nas amostras de código a seguir tem a estrutura:

kubectl create secret generic SECRET_NAME \
  --from-file="client_secret.json=PATH_TO_SERVICE_ACCOUNT_KEY" \
  -n APIGEE_NAMESPACE

Produção

Crie os secrets com os seguintes comandos:

  • apigee-cassandra (se programar backups no Cloud Storage)
    kubectl create secret generic apigee-cassandra-svc-account \
      --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-cassandra.json" \
      -n APIGEE_NAMESPACE
  • apigee-logger
    kubectl create secret generic apigee-logger-svc-account \
      --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-logger.json" \
      -n APIGEE_NAMESPACE
  • apigee-mart
    kubectl create secret generic apigee-mart-svc-account \
      --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-mart.json" \
      -n APIGEE_NAMESPACE
  • apigee-metrics
    kubectl create secret generic apigee-metrics-svc-account \
      --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-metrics.json" \
      -n APIGEE_NAMESPACE
  • apigee-mint-task-scheduler (se você estiver usando a Monetização para Apigee híbrida)
    kubectl create secret generic apigee-mint-task-scheduler-svc-account \
      --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-mint-task-scheduler.json" \
      -n APIGEE_NAMESPACE
  • apigee-runtime
    kubectl create secret generic apigee-runtime-svc-account \
      --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-runtime.json" \
      -n APIGEE_NAMESPACE
  • apigee-synchronizer
    kubectl create secret generic apigee-synchronizer-svc-account \
      --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-synchronizer.json" \
      -n APIGEE_NAMESPACE
  • apigee-udca
    kubectl create secret generic apigee-udca-svc-account \
      --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-udca.json" \
      -n APIGEE_NAMESPACE
  • apigee-watcher
    kubectl create secret generic apigee-watcher-svc-account \
      --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-watcher.json" \
      -n APIGEE_NAMESPACE

Sem produção

kubectl create secret generic apigee-non-prod-svc-account \
  --from-file="client_secret.json=$APIGEE_HELM_CHARTS_HOME/service-accounts/$PROJECT_ID-apigee-non-prod.json" \
  -n APIGEE_NAMESPACE

Referenciar chaves de conta de serviço na configuração

Depois de armazenar as chaves de conta de serviço como secrets do Kubernetes, atualize o arquivo overrides.yaml do Hybrid para referenciar esses secrets em vez de caminhos de arquivo diretos. Modifique as propriedades serviceAccountPath relevantes para usar serviceAccountSecretRef.

Use as seguintes configurações de serviceAccountSecretRefs e serviceAccountRef nas seções apropriadas do seu overrides.yaml:

Produção

envs:
- name: test
  serviceAccountSecretRefs:
    synchronizer: apigee-synchronizer-svc-account
    runtime: apigee-runtime-svc-account
    udca: apigee-udca-svc-account

mart:
  serviceAccountRef: apigee-mart-svc-account
  # Use the same service account for mart.serviceAccountRef and connectAgent.serviceAccountRef

connectAgent:
  serviceAccountRef: apigee-mart-svc-account
  # Use the same service account for mart.serviceAccountRef and connectAgent.serviceAccountRef

logger:
  serviceAccountRef: apigee-logger-svc-account

metrics:
  serviceAccountRef: apigee-metrics-svc-account

udca:
  serviceAccountRef: apigee-udca-svc-account

watcher:
  serviceAccountRef: apigee-watcher-svc-account

# If Scheduling backups in Cloud Storage
cassandra:
  backup:
    serviceAccountRef: apigee-cassandra-svc-account

# If using Monetization for Apigee hybrid
mintTaskScheduler:
  serviceAccountRef: apigee-mint-task-scheduler-svc-account

Sem produção

envs:
- name: test-env
  serviceAccountSecretRefs:
    synchronizer: apigee-non-prod-svc-account
    runtime: apigee-non-prod-svc-account
    udca: apigee-non-prod-svc-account

mart:
  serviceAccountRef: apigee-non-prod-svc-account

connectAgent:
  serviceAccountRef: apigee-non-prod-svc-account

logger:
  serviceAccountRef: apigee-non-prod-svc-account

metrics:
  serviceAccountRef: apigee-non-prod-svc-account

udca:
  serviceAccountRef: apigee-non-prod-svc-account

watcher:
  serviceAccountRef: apigee-non-prod-svc-account

# If Scheduling backups in Cloud Storage
cassandra:
  backup:
    serviceAccountRef: apigee-non-prod-svc-account

# If using Monetization for Apigee hybrid
mintTaskScheduler:
  serviceAccountRef: apigee-non-prod-svc-account

Aplicar mudanças de configuração

Aplique as mudanças aos gráficos apigee-telemetry, apigee-org e apigee-env com os seguintes comandos:

  1. Faça upgrade da telemetria da Apigee:
    helm upgrade telemetry apigee-telemetry/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      -f OVERRIDES_FILE
    
  2. Faça upgrade da organização da Apigee:
    helm upgrade ORG_NAME apigee-org/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      -f OVERRIDES_FILE
    
  3. Faça upgrade do ambiente.

    Especifique o ambiente com --set env=ENV_NAME. Repita esse comando para cada ambiente.

    helm upgrade ENV_RELEASE_NAME apigee-env/ \
      --install \
      --namespace APIGEE_NAMESPACE \
      --set env=ENV_NAME \
      -f OVERRIDES_FILE
    

A seguir