Armazenar chaves de contas de serviço no Hashicorp Vault

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ção serviceAccountPath. 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ção serviceAccountPath. 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.

  1. Crie os segredos específicos da organização e do ambiente no seguinte formato:
    Chave secretaDados 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. O apigee-cassandra-backup e o apigee-cassandra-restore usam a conta de serviço apigee-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":...
    ...
    }
        
  2. 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"]
    }
  3. No Vault, crie uma política que conceda acesso ao segredo da organização:
    vault policy write apigee-orgsakeys-auth orgsakeys-auth-policy.txt
  4. 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.

  5. 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.

  6. 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
    
  7. 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
  8. 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 e apigee-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
  9. 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
    
  10. 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çoNomes 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
  1. 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.

  2. Aplique o SecretProviderClass específico da organização ao seu espaço de nomes do Apigee:
    kubectl -n apigee apply -f spc-org.yaml
  3. 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.

  4. 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

  1. No ficheiro de substituições, adicione as propriedades de configuração serviceAccountSecretProviderClass e envs[].serviceAccountSecretProviderClass para ativar a utilização de segredos externos para contas de serviço Google. Pode remover ou comentar as propriedades de configuração serviceAccountPath e serviceAccountPaths:
    serviceAccountSecretProviderClass: apigee-orgsakeys-spc
    
    envs:
      - name: ENV_NAME
        serviceAccountSecretProviderClass: apigee-envsakeys-ENV_NAME-spc
  2. 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
    
  3. 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:

  1. Atualize o ficheiro de substituições:
    1. Remova ou comente as linhas serviceAccountSecretProviderClass e envs:serviceAccountSecretProviderClass.
    2. Adicione as propriedades de configuração serviceAccountPath e serviceAccountPaths 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
    
  2. 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
    
  3. 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.