Este tópico explica como ativar a Workload Identity Federation para instalações híbridas do Apigee nas plataformas AKS e EKS.
Para instalações no GKE, siga as instruções em Ativar o Workload Identity no GKE.
Vista geral
A federação de identidades de cargas de trabalho permite que as aplicações executadas fora do Google Cloud se façam passar por uma conta de serviço da Google Cloud Platform através da utilização de credenciais de um fornecedor de identidade externo.
A utilização da federação de identidades de cargas de trabalho pode ajudar a melhorar a segurança, permitindo que as aplicações usem os mecanismos de autenticação fornecidos pelo ambiente externo, e pode ajudar a substituir as chaves de contas de serviço.
Para uma vista geral, consulte o artigo Práticas recomendadas para usar a Workload Identity Federation.
Configure a Workload Identity Federation
Para usar a Workload Identity Federation com o Apigee hybrid, primeiro configure o cluster e, em seguida, aplique a funcionalidade à instalação do Apigee hybrid.
Antes de começar
Estas instruções pressupõem que já configurou a instalação híbrida do Apigee. As contas de serviço da IAM e as contas de serviço do Kubernetes são criadas durante a instalação inicial. Consulte o artigo O panorama geral para ver uma vista geral da instalação do Apigee Hybrid.
Para instalações no AKS, certifique-se de que ativou o emissor do OpenID Connect (OIDC). Tem de ativar esta funcionalidade para que a Workload Identity Federation possa aceder aos metadados do OpenID Connect e ao conjunto de chaves Web JSON (JWKS) para o cluster.
Configure o cluster para usar a Workload Identity Federation.
-
Verifique se a configuração
gcloud
atual está definida para o ID do projeto do Google Cloud com o seguinte comando:gcloud config get project
-
Ative a API Security Token Service:
Verifique se a API Security Token Service está ativada com o seguinte comando:
gcloud services list --enabled --project PROJECT_ID | grep sts.googleapis.com
Se a API não estiver ativada:
Consola
Enable the Security Token Service API.
Linha de comandos
Ative a API com o seguinte comando:
gcloud services enable sts.googleapis.com --project PROJECT_ID
-
Crie o Workload Identity Pool e o fornecedor.
Funções necessárias
Para obter as autorizações de que precisa para configurar a Workload Identity Federation, peça ao seu administrador para lhe conceder as seguintes funções de IAM no projeto:
-
Administrador do Workload Identity Pool (
roles/iam.workloadIdentityPoolAdmin
) -
Administrador da conta de serviço (
roles/iam.serviceAccountAdmin
)
Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.
Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.
Em alternativa, a função básica de proprietário da IAM (roles/owner
) também inclui autorizações para configurar a federação de identidades. Não deve conceder funções básicas num ambiente de produção, mas pode concedê-las num ambiente de desenvolvimento ou teste.Para criar um Workload Identity Pool e um fornecedor, faça o seguinte:
-
Determine o URL do emissor do cluster do AKS:
AKS
az aks show -n NAME -g RESOURCE_GROUP --query "oidcIssuerProfile.issuerUrl" -otsv
Substitua o seguinte:
NAME
: o nome do cluster.RESOURCE_GROUP
: o grupo de recursos do cluster.
O comando produz o URL do emissor. Vai precisar do URL do emissor num dos seguintes passos.
Se o comando não devolver um URL do emissor, verifique se ativou a funcionalidade emissor OIDC.
EKS
aws eks describe-cluster --name NAME --query "cluster.identity.oidc.issuer" --output text
Substitua
NAME
pelo nome do cluster.O comando produz o URL do emissor. Precisa do URL do emissor num dos seguintes passos.
Outro Kubernetes
-
Ligue-se ao cluster do Kubernetes e use `kubectl` para determinar o URL do emissor do cluster:
kubectl get --raw /.well-known/openid-configuration | jq -r .issuer
Precisa do URL do emissor num dos seguintes passos.
-
Opcional: se o emissor de OIDC não estiver acessível publicamente, transfira o conjunto de chaves Web JSON (JWKS) do cluster:
kubectl get --raw /openid/v1/jwks > cluster-jwks.json
Para verificar se o seu fornecedor de OIDC está disponível publicamente, deve conseguir aceder ao URL do fornecedor com um comando CURL e receber uma resposta 200.
-
Crie um novo Workload Identity Pool:
gcloud iam workload-identity-pools create POOL_ID \ --location="global" \ --description="DESCRIPTION" \ --display-name="DISPLAY_NAME"
Substitua o seguinte:
POOL_ID
: o ID exclusivo do conjunto.DISPLAY_NAME
: (Opcional) O nome do conjunto.DESCRIPTION
: (opcional) Uma descrição do conjunto que escolhe. Esta descrição é apresentada quando concede acesso a identidades agrupadas.
Por exemplo:
gcloud iam workload-identity-pools create my-wi-pool --display-name="My workload pool" --description="My workload pool description"
-
Adicione o cluster como um fornecedor do Workload Identity Pool. Escolha o comando para criar o fornecedor consoante o emissor de OIDC seja acessível publicamente ou não acessível publicamente:
Acessível publicamente
Se o emissor de OIDC for acessível publicamente, crie o fornecedor com o seguinte comando:
gcloud iam workload-identity-pools providers create-oidc WORKLOAD_PROVIDER_ID \ --location="global" \ --workload-identity-pool="POOL_ID" \ --issuer-uri="ISSUER" \ --attribute-mapping="google.subject=assertion.sub"
Não acessível publicamente
Se o emissor OIDC não for acessível publicamente, crie o fornecedor com o seguinte comando:
gcloud iam workload-identity-pools providers create-oidc WORKLOAD_PROVIDER_ID \ --location="global" \ --workload-identity-pool="POOL_ID" \ --issuer-uri="ISSUER" \ --jwks-file="cluster-jwks.json" \ --attribute-mapping="google.subject=assertion.sub"
Substitua o seguinte:
WORKLOAD_PROVIDER_ID
: um ID do fornecedor do Workload Identity Pool exclusivo à sua escolha.POOL_ID
: o ID do Workload Identity Pool que criou anteriormente.-
ISSUER
: use o URL do emissor que determinou anteriormente para o URI do emissor .
attribute-mapping="google.subject=assertion.sub"
mapeia o assunto do Kubernetes para o assunto do IAM.
-
Administrador do Workload Identity Pool (
Se necessário, defina a configuração gcloud
atual:
gcloud config set project PROJECT_ID
Crie os ficheiros de configuração de credenciais
Para implementar uma carga de trabalho do Kubernetes que possa aceder a Google Cloud recursos, primeiro tem de criar um ficheiro de configuração de credenciais para cada conta de serviço do IAM:
-
Liste as contas de serviço do IAM (também denominadas "contas de serviço Google") com o seguinte comando:
gcloud iam service-accounts list --project PROJECT_ID
Tem de criar os ficheiros de configuração de credenciais para as seguintes contas de serviço do IAM:
Prod
Para ambientes de produção:
DISPLAY NAME EMAIL DISABLED apigee-cassandra apigee-cassandra@my_project_id.iam.gserviceaccount.com False apigee-mart apigee-mart@my_project_id.iam.gserviceaccount.com False apigee-metrics apigee-metrics@my_project_id.iam.gserviceaccount.com False apigee-runtime apigee-runtime@my_project_id.iam.gserviceaccount.com False apigee-synchronizer apigee-synchronizer@my_project_id.iam.gserviceaccount.com False apigee-udca apigee-udca@my_project_id.iam.gserviceaccount.com False apigee-watcher apigee-watcher@my_project_id.iam.gserviceaccount.com False
Não prod
Para ambientes de não produção:
DISPLAY NAME EMAIL DISABLED apigee-non-prod apigee-non-prod@my_project_id.iam.gserviceaccount.com False
-
Crie um ficheiro de configuração de credenciais para cada conta de serviço do IAM na lista anterior. Precisa destes ficheiros de configuração de credenciais para configurar o Apigee Hybrid de modo a usar a Workload Identity Federation:
Código
gcloud iam workload-identity-pools create-cred-config \ projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/providers/WORKLOAD_PROVIDER_ID \ --service-account=SERVICE_ACCOUNT_EMAIL \ --credential-source-file=/var/ --credential-source-type=text \ --output-file=SERVICE_ACCOUNT_NAME-credential-configuration.json
Exemplo
gcloud iam workload-identity-pools create-cred-config \ projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider \ --service-account=apigee-cassandra@myhybridporg.iam.gserviceaccount.com \ --credential-source-file=/var/ --credential-source-type=text \ --output-file=apigee-cassandra-credential-configuration.json
Onde:
-
PROJECT_NUMBER
: o número do projeto que contém o Workload Identity Pool. Tem de ser o número do projeto e não o ID do projeto. -
POOL_ID
: o ID do Workload Identity Pool -
WORKLOAD_PROVIDER_ID
: o ID do fornecedor do Workload Identity Pool -
SERVICE_ACCOUNT_EMAIL
: endereço de email da conta de serviço, se configurou a sua conta de serviço do Kubernetes para usar a representação da conta de serviço do IAM.
O ficheiro de configuração de credenciais permite que as [bibliotecas cliente da nuvem](/apis/docs/cloud-client-libraries), a CLI gcloud e o Terraform determinem o seguinte:
- Onde obter credenciais externas
- Que Workload Identity Pool e fornecedor usar
- Que conta de serviço usar como identidade
Configure o Apigee Hybrid para usar a Workload Identity Federation
-
Copie ou mova cada ficheiro de saída (
SERVICE_ACCOUNT_NAME-credential-configuration.json
) para os seguintes diretórios de gráficos (ou subdiretórios dos mesmos). Estes foram os ficheiros que criou no passo Crie os ficheiros de configuração de credenciais.Prod
Conta de serviço Diretório do gráfico Helm do Apigee apigee-cassandra
apigee-datastore/
apigee-mart
apigee-org/
apigee-metrics
apigee-telemetry/
apigee-runtime
apigee-env/
apigee-synchronizer
apigee-env/
apigee-udca
apigee-org/
apigee-env/
apigee-watcher
apigee-org/
Não prod
Conta de serviço Gráfico Helm do Apigee apigee-non-prod
apigee-datastore/
apigee-telemetry/
apigee-org/
apigee-env/
-
Faça as seguintes alterações globais ao ficheiro de substituições do cluster:
Código
gcp: workloadIdentity: enabled: false # must be set to false to use Workload Identity Federation federatedWorkloadIdentity: enabled: true audience: "AUDIENCE" credentialSourceFile: "/var/run/service-account/token"
Exemplo
gcp: workloadIdentity: enabled: false federatedWorkloadIdentity: enabled: true audience: "//iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider" credentialSourceFile: "/var/run/service-account/token"
Onde: AUDIENCE é o público-alvo permitido do fornecedor de Workload Identity. Pode encontrar o valor pesquisando qualquer um dos ficheiros de configuração de credenciais pelo termo
audience:
. O valor do público-alvo é o mesmo em cada ficheiro de configuração de credenciais.Por exemplo, no seguinte ficheiro
apigee-udca-credential-configuration.json
de amostra:{ "universe_domain": "googleapis.com", "type": "external_account:," "audience": "//iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider", "subject_token_type": "urn:ietf:params:oauth: token-type:jwt", "token_url": "https://sts.googleapis.com/v1/token", "service "impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/apigee-udca@myhybridproject.iam.gserviceaccount.com:generateAccessToken", "credential_source": { "file": "/var/run/service-account/token", "format": { "type": "text" } } }
O valor do público-alvo é
//iam.googleapis.com/projects/123123123123/locations/global/workloadIdentityPools/my-wi-pool/providers/my-wi-provider
. -
Configure as substituições para cada componente através da Workload Identity Federation. Selecione as instruções para ficheiros CERT, segredos do Kubernetes ou Vault, conforme adequado para a sua instalação.
Ficheiro de certificação
Substitua o valor de
serviceAccountPath
pelo ficheiro de origem das credenciais da conta de serviço do IAM correspondente. Este tem de ser o caminho relativo ao diretório do gráfico. Por exemplo:envs: - name: ENVIRONMENT_NAME serviceAccountPaths: synchronizer: apigee-synchronizer-credential-configuration.json runtime: apigee-runtime-credential-configuration.json udca: apigee-udca-credential-configuration.json mart: serviceAccountPath: apigee-mart-credential-configuration.json connectAgent: serviceAccountPath: apigee-mart-credential-configuration.json metrics: serviceAccountPath: apigee-metrics-credential-configuration.json udca: serviceAccountPath: apigee-udca-credential-configuration.json watcher: serviceAccountPath: apigee-watcher-credential-configuration.json
Segredo do K8s
-
Crie um novo segredo do Kubernetes com o ficheiro de origem das credenciais para cada ficheiro de configuração das credenciais.
kubectl create secret -n APIGEE_NAMESPACE generic SECRET_NAME --from-file="client_secret.json=CREDENTIAL_CONFIGURATION_FILE"
Por exemplo:
kubectl create secret -n apigee generic udca-workoad-identity-secret --from-file="client_secret.json=./apigee-udca-credential-configuration.json"
-
Substitua o valor de
serviceAccountRef
pelo novo segredo. Por exemplo:udca: serviceAccountRef: udca-workoad-identity-secret
Vault
Atualize a chave da conta de serviço
SAKEY
para cada conta de serviço no Vault com o ficheiro de origem das credenciais correspondente. O procedimento é semelhante para todos os componentes. Por exemplo, para UDCA:SAKEY=$(cat .apigee-udca-credential-configuration.json); kubectl -n APIGEE_NAMESPACE exec vault-0 -- vault kv patch secret/apigee/orgsakeys udca="$SAKEY"
Consulte
Storing service account keys in Hashicorp Vault
para mais informações. -
Crie um novo segredo do Kubernetes com o ficheiro de origem das credenciais para cada ficheiro de configuração das credenciais.
-
Aplique as alterações a cada componente afetado com o comando
helm upgrade
:Se atualizou as chaves da conta de serviço do Vault, atualize o gráfico
apigee-operator
.helm upgrade operator apigee-operator/ \ --namespace APIGEE_NAMESPACE \ --atomic \ -f overrides.yaml
Atualize os restantes tops afetados pela seguinte ordem:
helm upgrade datastore apigee-datastore/ \ --namespace APIGEE_NAMESPACE \ --atomic \ -f overrides.yaml
helm upgrade telemetry apigee-telemetry/ \ --namespace APIGEE_NAMESPACE \ --atomic \ -f overrides.yaml
helm upgrade $ORG_NAME apigee-org/ \ --namespace APIGEE_NAMESPACE \ --atomic \ -f overrides.yaml
Atualize o gráfico
apigee-env
para cada ambiente, substituindo $ENV_RELEASE_NAME e ENV_NAME de cada vez:helm upgrade $ENV_RELEASE_NAME apigee-env/ \ --namespace APIGEE_NAMESPACE \ --atomic \ --set env=$ENV_NAME \ -f overrides.yaml
Consulte a referência do Helm do Apigee hybrid para ver uma lista de componentes e os respetivos gráficos.
Conceda o acesso às contas de serviço do Kubernetes
-
Liste as contas de serviço do Kubernetes com o seguinte comando:
kubectl get sa -n APIGEE_NAMESPACE
-
Conceda às contas de serviço do Kubernetes acesso para usar a identidade das contas de serviço do IAM associadas, conforme mostrado na tabela seguinte. A tabela mostra os nomes das contas de serviço da IAM do Apigee predefinidas. Se estiver a usar nomes de contas de serviço personalizados, use as contas de serviço do IAM correspondentes:
Contas de serviço do Kubernetes Conta de serviço do IAM Contas de serviço do Kubernetes ao nível da organização apigee-connect-agent-ORG_NAME-ORG_HASH_ID
apigee-mart
apigee-mart-ORG_NAME-ORG_HASH_ID
apigee-mart
apigee-metrics-apigee-telemetry
apigee-metrics
apigee-open-telemetry-collector-apigee-telemetry
apigee-metrics
apigee-udca-ORG_NAME-ORG_HASH_ID
apigee-udca
apigee-watcher-ORG_NAME-ORG_HASH_ID
apigee-watcher
Contas de serviço do Kubernetes ao nível do ambiente apigee-runtime-ORG_NAME-ENV_NAME-ENV_HASH_ID
apigee-runtime
apigee-synchronizer-ORG_NAME-ENV_NAME-ENV_HASH_ID
apigee-synchronizer
Cópia de segurança e restauro do Cassandra (se ativado) apigee-cassandra-backup-sa
apigee-cassandra
apigee-cassandra-restore-sa
apigee-cassandra
Onde:
ORG_NAME
: os primeiros 15 carateres do nome da sua organização.ORG_HASH_ID
: um ID hash exclusivo do nome completo da sua organização.ENV_NAME
: os primeiros 15 carateres do nome do seu ambiente.ENV_HASH_ID
: um ID hash exclusivo dos nomes da sua organização e ambiente.
Por exemplo:
apigee-connect-agent-myhybridorg-123abcd
apigee-runtime-myhybridorg-prodenv-234bcde
Conceda a cada conta de serviço do Kubernetes acesso para usar a identidade da conta de serviço do IAM adequada com o seguinte comando:
gcloud iam service-accounts add-iam-policy-binding \ IAM_SA_NAME@PROJECT_ID.iam.gserviceaccount.com \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/MAPPED_SUBJECT" \ --role=roles/iam.workloadIdentityUser
Onde:
IAM_SA_NAME
: o nome da conta de serviço.PROJECT_ID
: o ID do projeto associado à organização do Apigee.PROJECT_NUMBER
: o número do projeto do projeto onde criou o Workload Identity Pool.POOL_ID
: o ID do Workload Identity Pool.MAPPED_SUBJECT
: a ServiceAccount do Kubernetes da reivindicação no seu token de ID que mapeou paragoogle.subject
. Por exemplo, se mapeougoogle.subject=assertions.sub
e o seu token de ID contiver"sub": "system:serviceaccount:default:my-kubernetes-serviceaccount"
, entãoMAPPED_SUBJECT
ésystem:serviceaccount:default:my-kubernetes-serviceaccount
.
Para mais informações sobre a Workload Identity Federation e as práticas recomendadas, consulte o artigo Práticas recomendadas para usar a Workload Identity Federation.
-