Esta página explica como fazer a autenticação segura no servidor da API Kubernetes a partir de clusters do GKE. Pode proteger o seu cluster garantindo que apenas os utilizadores e as aplicações autorizados acedem aos seus recursos do Kubernetes. Vai saber mais sobre os métodos de autenticação disponíveis, o método de autenticação recomendado e como autenticar utilizadores, aplicações e sistemas antigos.
Para informações sobre a autenticação de cargas de trabalho do Kubernetes em Google Cloud APIs, consulte o artigo Federação de identidades da carga de trabalho para o GKE.
Esta página destina-se a especialistas e operadores de segurança que têm de se autenticar de forma segura no servidor da API Kubernetes a partir de clusters do GKE. Esta página fornece informações essenciais sobre os métodos de autenticação disponíveis e como os implementar. Para saber mais sobre as funções comuns e as tarefas de exemplo que referimos no conteúdo, consulte o artigo Funções e tarefas comuns do utilizador do GKE. Google Cloud
Antes de ler esta página, certifique-se de que conhece os seguintes conceitos:
- Vista geral da autenticação no Google Cloud
- Vista geral do IAM e do controlo de acesso baseado em funções (CABF) no GKE
- Vista geral dos métodos do Kubernetes para autenticação
Antes de começar
Antes de começar, certifique-se de que realizou as seguintes tarefas:
- Ative a API Google Kubernetes Engine. Ative a API Google Kubernetes Engine
- Se quiser usar a CLI gcloud para esta tarefa,
instale-a e, em seguida,
inicialize-a. Se instalou anteriormente a CLI gcloud, execute
gcloud components update
para obter a versão mais recente.
Autentique utilizadores
O GKE gere a autenticação do utilizador final por si através da CLI do Google Cloud. A CLI gcloud autentica os utilizadores no Google Cloud, configura a configuração do Kubernetes, obtém um token de acesso OAuth para o cluster e mantém o token de acesso atualizado.
Todos os clusters do GKE estão configurados para aceitar Google Cloud
identidades de utilizadores e contas de serviço, validando as credenciais apresentadas por
kubectl
e obtendo o endereço de email associado à identidade do utilizador ou da conta de serviço. Como resultado, as credenciais dessas contas têm de incluir o âmbito do userinfo.email
OAuth para a autenticação ser bem-sucedida.
Quando usa gcloud
para configurar o kubeconfig
do seu ambiente para um cluster novo ou existente, gcloud
dá a kubectl
as mesmas credenciais usadas pelo próprio gcloud
. Por exemplo, se usar o gcloud auth login
, as suas credenciais pessoais são fornecidas ao kubectl
, incluindo o âmbito userinfo.email
. Isto permite que o cluster do GKE autentique o cliente kubectl
.
Em alternativa, pode optar por configurar o kubectl
para usar as credenciais de umaGoogle Cloud conta de serviço, enquanto é executado numa instância do Compute Engine. No entanto, por predefinição, o âmbito userinfo.email
não está incluído nas credenciais criadas pelas instâncias do Compute Engine. Por conseguinte, tem de adicionar este âmbito explicitamente, por exemplo, usando a flag --scopes
quando a instância do Compute Engine é criada.
Pode autorizar ações no seu cluster através da gestão de identidade e de acesso (IAM) ou do controlo de acesso baseado em funções (CABF) do Kubernetes.
Autentique com OAuth
Para se autenticar no cluster através do método OAuth, faça o seguinte:
Inicie sessão na CLI gcloud com as suas credenciais. Esta ação abre um navegador de Internet para concluir o processo de autenticação para Google Cloud:
gcloud auth login
Recupere as credenciais do Kubernetes para um cluster específico:
gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION
Substitua o seguinte:
CLUSTER_NAME
: o nome do cluster.CONTROL_PLANE_LOCATION
: a localização do Compute Engine do plano de controlo do seu cluster. Indique uma região para clusters regionais ou uma zona para clusters zonais.
Verifique se tem autenticação:
kubectl cluster-info
Depois de os utilizadores ou as Google Cloud contas de serviço serem autenticados, também têm de ser autorizados a realizar qualquer ação num cluster do GKE. Para mais informações sobre como configurar a autorização, consulte o controlo de acesso baseado em funções.
Autentique aplicações
Também pode autenticar-se no servidor da API a partir de uma aplicação num pod sem interação do utilizador, como a partir de um script no seu pipeline de CI/CD. A forma como o consegue depende do ambiente em que a sua aplicação está a ser executada.
Aplicação no mesmo cluster
Se a sua aplicação estiver a ser executada no mesmo cluster do GKE, use uma conta de serviço do Kubernetes para autenticar.
Crie uma conta de serviço do Kubernetes e anexe-a ao seu pod. Se o seu Pod já tiver uma conta de serviço do Kubernetes ou se quiser usar a conta de serviço predefinida do espaço de nomes, ignore este passo.
Use o RBAC do Kubernetes para conceder à conta de serviço do Kubernetes as autorizações de que a sua aplicação precisa.
O exemplo seguinte concede
view
autorizações a recursos no espaço de nomesprod
a uma conta de serviço denominadacicd
no espaço de nomescicd-ns
:kubectl create rolebinding cicd-secret-viewer \ --namespace=prod \ --clusterrole=view \ --serviceaccount=cicd-ns:cicd
Em tempo de execução, quando a sua aplicação envia um pedido da API Kubernetes, o servidor da API autentica as credenciais da conta de serviço.
Candidaturas em Google Cloud
Se a sua aplicação for executada no interior Google Cloud mas fora do cluster de destino (por exemplo, uma VM do Compute Engine ou outro cluster do GKE), deve autenticar-se no servidor da API através das credenciais da conta de serviço do IAM disponíveis no ambiente.
Atribua uma conta de serviço do IAM ao seu ambiente. Se a sua aplicação estiver a ser executada numa VM do Compute Engine, atribua uma conta de serviço do IAM à instância. Se a sua aplicação estiver a ser executada num cluster do GKE diferente, use a Federação de identidades de cargas de trabalho para o GKE para configurar o seu pod de modo a ser executado como uma conta de serviço do IAM.
Os exemplos que se seguem usam
ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com
como conta de serviço de IAM.Conceda à conta de serviço do IAM acesso ao cluster.
O exemplo seguinte concede a função do IAM, que fornece acesso a objetos da API Kubernetes em clusters:
roles/container.developer
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/container.developer
Em alternativa, pode usar o CABF para conceder ao serviço IAM acesso à conta ao cluster. Execute o comando
kubectl create rolebinding
a partir de aplicações no mesmo cluster e use--user=ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com
em vez da flag--service-account
.Obtenha as credenciais do cluster:
gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION
A sua aplicação é autenticada automaticamente através da conta de serviço do IAM definida no ambiente.
Aplicações noutros ambientes
Se a sua aplicação estiver a autenticar a partir de um ambiente externo Google Cloud, não pode aceder às credenciais da conta de serviço do IAM geridas. Para obter as credenciais do cluster, pode criar uma conta de serviço do IAM, transferir a respetiva chave e usar a chave em tempo de execução a partir do seu serviço para obter as credenciais do cluster com a CLI gcloud.
Crie uma conta de serviço do IAM para a sua aplicação. Se já tiver uma conta de serviço do IAM, ignore este passo.
O comando seguinte cria uma conta de serviço da IAM com o nome
ci-cd-pipeline
:gcloud iam service-accounts create ci-cd-pipeline
Conceda à conta de serviço do IAM acesso ao seu cluster.
O comando seguinte concede a função de IAM à conta de serviço de IAM:
roles/container.developer
ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/container.developer
Também pode usar o RBAC para conceder acesso da conta de serviço do IAM ao cluster. Execute o comando
kubectl create rolebinding
a partir de aplicações no mesmo cluster e use--user=ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com
em vez da flag--service-account
.Crie e transfira uma chave para a sua conta de serviço de IAM. Disponibilize-o à sua aplicação no momento da execução:
gcloud iam service-accounts keys create gsa-key.json \ --iam-account=ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com
Em tempo de execução, no ambiente que executa a sua aplicação, faça a autenticação na CLI gcloud através da chave da conta de serviço do IAM:
gcloud auth activate-service-account ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com \ --key-file=gsa-key.json
Use a CLI gcloud para obter as credenciais do cluster:
gcloud config set project PROJECT_ID gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION
Ambientes sem o gcloud
Recomendamos a utilização da CLI gcloud para obter as credenciais do cluster, porque este método é resiliente a eventos do cluster, como uma rotação de IP do plano de controlo ou uma rotação de credenciais. No entanto, se não conseguir instalar a CLI gcloud no seu ambiente, pode criar um ficheiro kubeconfig estático para autenticar no cluster:
Crie uma conta de serviço do IAM para a sua aplicação. Se já tiver uma conta de serviço do IAM, ignore este passo.
O comando seguinte cria uma conta de serviço da IAM com o nome
ci-cd-pipeline
:gcloud iam service-accounts create ci-cd-pipeline
Conceda à conta de serviço do IAM acesso ao seu cluster.
O comando seguinte concede a função de IAM à conta de serviço de IAM:
roles/container.developer
ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/container.developer
Também pode criar uma função de IAM personalizada para ter um controlo detalhado sobre as autorizações que concede.
Crie e transfira uma chave para a sua conta de serviço de IAM.
No exemplo seguinte, o nome do ficheiro de chave é
gsa-key.json
:gcloud iam service-accounts keys create gsa-key.json \ --iam-account=ci-cd-pipeline@PROJECT_ID.iam.gserviceaccount.com
Se estiver a usar o ponto final baseado em DNS para acesso ao plano de controlo, obtenha o valor
endpoint
para o seu cluster:gcloud container clusters describe CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --format="value(endpoint)"
Se estiver a usar o ponto final baseado em IP para acesso ao plano de controlo, obtenha o valor
endpoint
do comando anterior e obtenha o valorclusterCaCertificate
para o seu cluster:gcloud container clusters describe CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --format="value(masterAuth.clusterCaCertificate)"
Crie um ficheiro
kubeconfig.yaml
. Use o seguinte formato se estiver a usar o ponto final baseado em DNS para acesso ao plano de controlo:apiVersion: v1 kind: Config clusters: - name: CLUSTER_NAME cluster: server: https://endpoint users: - name: ci-cd-pipeline-gsa user: exec: apiVersion: client.authentication.k8s.io/v1beta1 args: - --use_application_default_credentials command: gke-gcloud-auth-plugin installHint: Install gke-gcloud-auth-plugin for kubectl by following https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl#install_plugin provideClusterInfo: true contexts: - context: cluster: CLUSTER_NAME user: ci-cd-pipeline-gsa name: CLUSTER_NAME-ci-cd current-context: CLUSTER_NAME-ci-cd
Substitua o seguinte:
CLUSTER_NAME
: o nome do cluster.endpoint
: o valor que obteve paraendpoint
no passo anterior.
Se estiver a usar pontos finais baseados em IP para acesso ao plano de controlo, adicione o valor que obteve para
clusterCaCertificate
no passo anterior no parâmetrocluster
do ficheirokubeconfig.yaml
:apiVersion: v1 kind: Config clusters: - name: CLUSTER_NAME cluster: server: https://endpoint certificate-authority-data: masterAuth.clusterCaCertificate users: ...
Não precisa de descodificar o certificado codificado em base64.
Implemente
kubeconfig.yaml
egsa-key.json
juntamente com a sua aplicação no seu ambiente. Em tempo de execução, no ambiente que executa a sua aplicação, defina estas variáveis de ambiente:export KUBECONFIG=path/to/kubeconfig.yaml export GOOGLE_APPLICATION_CREDENTIALS=path/to/gsa-key.json
A sua aplicação já pode enviar pedidos para a API Kubernetes e vai ser autenticada como a conta de serviço de IAM.
Atualize os métodos de autenticação antigos
Antes da integração do OAuth com o GKE, o certificado X.509 pré-aprovisionado ou uma palavra-passe estática eram os únicos métodos de autenticação disponíveis, mas já não são recomendados e devem ser desativados. Estes métodos apresentam uma superfície de ataque mais ampla para comprometer o cluster e estão desativados por predefinição em clusters com a versão 1.12 e posteriores do GKE. Se usar métodos de autenticação antigos, recomendamos que os desative.
Se estiver ativada, um utilizador com a autorizaçãocontainer.clusters.getCredentials
pode
obter o certificado de cliente e a palavra-passe estática. As funções roles/container.admin
, roles/owner
e roles/editor
têm todas esta autorização, por isso, use essas funções com moderação. Leia mais acerca das funções de IAM no GKE.
Desative a autenticação com uma palavra-passe estática
Uma palavra-passe estática é uma combinação de nome de utilizador e palavra-passe que o servidor da API valida. No GKE, este método de autenticação é denominado autenticação básica.
Para atualizar um cluster existente e remover a palavra-passe estática:
gcloud container clusters update CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION \
--no-enable-basic-auth
Desative a autenticação com um certificado de cliente
Com a autenticação por certificado, um cliente apresenta um certificado que o servidor da API valida com a autoridade de certificação especificada. No GKE, a autoridade de certificação (AC) de raiz do cluster assina os certificados de cliente.
A autenticação de certificado de cliente tem implicações na autorização para o servidor da API Kubernetes. Se a autorização Attribute Based Access Control (ABAC) antiga estiver ativada no cluster, por predefinição, os certificados de cliente podem autenticar e executar qualquer ação no servidor da API. Por outro lado, com o controlo de acesso baseado em funções (RBAC) ativado, os certificados de cliente têm de receber uma autorização específica para os recursos do Kubernetes.
Para criar um cluster sem gerar um certificado de cliente, use a flag --no-issue-client-certificate
:
gcloud container clusters create CLUSTER_NAME \
--location=CONTROL_PLANE_LOCATION
--no-issue-client-certificate
Atualmente, não existe forma de remover um certificado de cliente de um cluster existente. Para deixar de usar a autenticação de certificados de cliente num cluster existente, certifique-se de que tem o RBAC ativado no cluster e que o certificado de cliente não tem autorização no cluster.
O que se segue?
- Saiba mais acerca da Google Cloud autenticação.
- Saiba mais sobre o controlo de acesso no GKE.
- Saiba mais sobre as contas de serviço Google.
- Saiba mais sobre a Federação de identidades de cargas de trabalho para o GKE.
- Saiba como reforçar a segurança do cluster