Checkpoints
Create a simple GKE cluster
/ 20
Deploy a pod that mounts the host filesystem
/ 20
Deploy a second node pool
/ 20
Deploy PodSecurityPolicy objects
/ 20
Deploy a blocked pod that mounts the host filesystem
/ 20
Como aumentar a segurança das configurações padrão do cluster do GKE
- GSP496
- Visão geral
- Configuração e requisitos
- Tarefa 1: crie um cluster simples do GKE
- Tarefa 2: execute um pod do SDK do Google Cloud
- Tarefa 3: implante um pod que monte o sistema de arquivos do host
- Tarefa 4: analise e comprometa o host subjacente
- Tarefa 5: implante um segundo pool de nós
- Tarefa 6: execute um pod do SDK do Google Cloud
- Tarefa 7: implante objetos PodSecurityPolicy
- Tarefa 8: implante um pod bloqueado que ative o sistema de arquivos do host
- Parabéns!
GSP496
Visão geral
Este laboratório mostra alguns riscos de segurança de uma configuração padrão do cluster do GKE e as medidas de proteção necessárias para evitar escapes do pod e escalonamento de privilégios do cluster. Os caminhos de ataque são relevantes nos seguintes cenários:
- Uma falha do aplicativo em um pod externo que permite ataques de falsificação de solicitação do lado do servidor (SSRF)
- Um contêiner totalmente comprometido em um pod que permite a execução de comando remoto (RCE)
- Um usuário interno mal-intencionado ou um invasor com credenciais comprometidas que permitem criar/atualizar um pod em um determinado namespace
Este laboratório, criado por engenheiros do GKE Helmsman, explica como aumentar a segurança das configurações padrão do cluster do GKE.
*O código de exemplo deste laboratório é fornecido no estado em que se encontra, sem provisões ou garantias*
Objetivos
Após concluir o laboratório, você entenderá a necessidade de proteger os metadados da instância do GKE e definir políticas PodSecurityPolicy adequadas ao seu ambiente.
Você realizará as seguintes ações:
- Criar um pequeno cluster do GKE usando as configurações padrão
- Validar os caminhos mais comuns de escape do pod e o escalonamento de privilégios do cluster da perspectiva de um usuário interno mal-intencionado
- Aumentar a proteção do cluster do GKE para resolver esses problemas
- Validar o cluster para que essas ações não sejam mais permitidas
Configuração e requisitos
Antes de clicar no botão Start Lab
Leia estas instruções. Os laboratórios são cronometrados e não podem ser pausados. O timer é iniciado quando você clica em Começar o laboratório e mostra por quanto tempo os recursos do Google Cloud vão ficar disponíveis.
Este laboratório prático permite que você realize as atividades em um ambiente real de nuvem, não em uma simulação ou demonstração. Você vai receber novas credenciais temporárias para fazer login e acessar o Google Cloud durante o laboratório.
Confira os requisitos para concluir o laboratório:
- Acesso a um navegador de Internet padrão (recomendamos o Chrome).
- Tempo para concluir o laboratório---não se esqueça: depois de começar, não será possível pausar o laboratório.
Como iniciar seu laboratório e fazer login no console do Google Cloud
-
Clique no botão Começar o laboratório. Se for preciso pagar, você verá um pop-up para selecionar a forma de pagamento. No painel Detalhes do laboratório à esquerda, você vai encontrar o seguinte:
- O botão Abrir console do Google Cloud
- O tempo restante
- As credenciais temporárias que você vai usar neste laboratório
- Outras informações, se forem necessárias
-
Se você estiver usando o navegador Chrome, clique em Abrir console do Google Cloud ou clique com o botão direito do mouse e selecione Abrir link em uma janela anônima.
O laboratório ativa os recursos e depois abre a página Fazer login em outra guia.
Dica: coloque as guias em janelas separadas lado a lado.
Observação: se aparecer a caixa de diálogo Escolher uma conta, clique em Usar outra conta. -
Se necessário, copie o Nome de usuário abaixo e cole na caixa de diálogo Fazer login.
{{{user_0.username | "Nome de usuário"}}} Você também encontra o Nome de usuário no painel Detalhes do laboratório.
-
Clique em Seguinte.
-
Copie a Senha abaixo e cole na caixa de diálogo de boas-vindas.
{{{user_0.password | "Senha"}}} Você também encontra a Senha no painel Detalhes do laboratório.
-
Clique em Seguinte.
Importante: você precisa usar as credenciais fornecidas no laboratório, e não as da sua conta do Google Cloud. Observação: se você usar sua própria conta do Google Cloud neste laboratório, é possível que receba cobranças adicionais. -
Acesse as próximas páginas:
- Aceite os Termos e Condições.
- Não adicione opções de recuperação nem autenticação de dois fatores (porque essa é uma conta temporária).
- Não se inscreva em testes gratuitos.
Depois de alguns instantes, o console do Google Cloud será aberto nesta guia.
Ativar o Cloud Shell
O Cloud Shell é uma máquina virtual com várias ferramentas de desenvolvimento. Ele tem um diretório principal permanente de 5 GB e é executado no Google Cloud. O Cloud Shell oferece acesso de linha de comando aos recursos do Google Cloud.
- Clique em Ativar o Cloud Shell na parte de cima do console do Google Cloud.
Depois de se conectar, vai notar que sua conta já está autenticada, e que o projeto está configurado com seu PROJECT_ID. A saída contém uma linha que declara o projeto PROJECT_ID para esta sessão:
gcloud
é a ferramenta de linha de comando do Google Cloud. Ela vem pré-instalada no Cloud Shell e aceita preenchimento com tabulação.
- (Opcional) É possível listar o nome da conta ativa usando este comando:
-
Clique em Autorizar.
-
A saída será parecida com esta:
Saída:
- (Opcional) É possível listar o ID do projeto usando este comando:
Saída:
Exemplo de saída:
gcloud
, acesse o guia com informações gerais sobre a gcloud CLI no Google Cloud.
Tarefa 1: crie um cluster simples do GKE
- Defina uma zona em uma variável de ambiente chamada MY_ZONE. Este laboratório usa "
". Você pode selecionar uma zona se preferir:
- Execute este comando para iniciar o cluster do Kubernetes
simplecluster
que é gerenciado pelo Kubernetes Engine. Depois configure-o para processar dois nós:
A criação de um cluster leva alguns minutos porque o Kubernetes Engine provisiona as máquinas virtuais. Neste laboratório, os avisos sobre os recursos disponíveis nas novas versões podem ser ignorados.
- Após a criação do cluster, verifique a versão instalada do Kubernetes com o comando
kubectl version
:
O comando gcloud container clusters create
autentica automaticamente a kubectl
.
- Confira os nós em execução no console do GCP. No Menu de navegação, clique em Compute Engine > Instâncias de VM.
O cluster do Kubernetes está pronto para ser usado.
Clique em Verificar meu progresso para conferir o objetivo.
Tarefa 2: execute um pod do SDK do Google Cloud
- No prompt do Cloud Shell, inicie uma única instância do contêiner do SDK do Google Cloud:
Esse processo leva alguns minutos.
- No contêiner do pod, agora há um shell bash:
Pode levar alguns segundos para o contêiner iniciar e o prompt de comando aparecer. Caso o prompt de comando não seja exibido, pressione Enter.
Confira o endpoint do Compute Metadata
- Execute o comando a seguir para acessar o endpoint
v1
do Compute Metadata:
A resposta será semelhante a esta:
/computeMetadata/v1/instance/name
from this server. Missing Metadata-Flavor:Google header.
...snip...
Perceba que um erro aparece e informa que um cabeçalho HTTP personalizado está faltando.
- Adicione o cabeçalho personalizado na próxima execução e recupere o nome da instância do Compute Engine que executa o pod:
A resposta será semelhante a esta:
Mantenha o shell no pod disponível para a próxima etapa.
- Caso você saia acidentalmente do pod, execute novamente o seguinte comando:
Analise as credenciais de bootstrapping do nó do GKE
- No mesmo shell do pod, execute o comando a seguir para listar os atributos associados às instâncias subjacentes do GCE. Lembre-se de incluir a barra final:
Talvez o dado mais confidencial da listagem seja kube-env
. Ele contém diversas variáveis usadas pelo kubelet
como credenciais iniciais ao anexar o nó ao cluster do GKE. As variáveis CA_CERT
, KUBELET_CERT
e KUBELET_KEY
contêm essas informações e são consideradas confidenciais a administradores fora do cluster.
- Para conferir as variáveis e os dados possivelmente confidenciais, execute o seguinte comando:
Considere as situações abaixo:
- Uma falha que permita SSRF em um aplicativo de pod
- Uma falha do aplicativo ou biblioteca que permita RCE em um pod
- Um usuário interno com permissão para criar ou executar no pod
Nesses casos, há uma grande probabilidade de comprometimento e exfiltração das credenciais confidenciais de bootstrapping do kubelet
pelo endpoint do Compute Metadata. É possível usar as credenciais do kubelet
em algumas situações e escalonar os privilégios para cluster-admin
. Isso permite controle total do cluster do GKE, inclusive dos dados, aplicativos e acessos aos nós subjacentes.
Use as permissões atribuídas à conta de serviço do pool do nó
Por padrão, os projetos do Google Cloud com a API Compute ativada têm uma conta de serviço no formato NNNNNNNNNN-compute@developer.gserviceaccount.com
no projeto e o papel Editor
anexado a ela. Os clusters do GKE criados sem a especificação de uma conta de serviço usam a conta de serviço padrão do Compute e a anexam a todos os nós de trabalho.
- Execute o seguinte comando
curl
para listar os escopos do OAuth associados à conta de serviço anexada à instância subjacente do Compute Engine:
(Resposta)
A combinação dos escopos de autenticação e as permissões da conta de serviço determinam quais aplicativos podem ser acessados nesse nó. A lista acima mostra os escopos mínimos necessários para a maioria dos clusters do GKE, mas alguns casos de uso exigem escopos maiores.
Aviso: se, durante a criação do cluster, você configurou o escopo da autenticação para incluir "https://www.googleapis.com/auth/cloud-platform", qualquer API Google Cloud estaria no escopo, e apenas as permissões do IAM atribuídas à conta de serviço determinariam o acesso.
Além disso, se a conta de serviço padrão com o papelEditor
do IAM estiver em uso, qualquer pod nesse pool de nós teria permissões de Editor
no projeto do Google Cloud em que o cluster do GKE estiver implantado. O papel Editor
do IAM tem várias permissões de leitura/gravação para interagir com os recursos do projeto, como instâncias do Compute, buckets do Cloud Storage, registros do GCR, entre outros, o que provavelmente não é o desejado
- Para sair do pod, digite:
Tarefa 3: implante um pod que monte o sistema de arquivos do host
Um dos caminhos mais simples de aplicar o escape ao host subjacente é montando o sistema de arquivos do host no do pod com volumes
e volumeMounts
padrão do Kubernetes em uma especificação Pod
.
- Isso pode ser demonstrado executando o seguinte comando para criar um pod que monte o sistema de arquivos
/
subjacente do host em uma pasta chamada/rootfs
no contêiner:
- Execute
kubectl get pod
e faça isso novamente até que ele atinja o estado "Running":
(Saída)
Clique em Verificar meu progresso para conferir o objetivo.
Tarefa 4: analise e comprometa o host subjacente
- Execute o seguinte comando para incluir um shell no pod recém-criado:
- Mude o ponto do sistema de arquivos raiz do shell do pod para o do host subjacente:
Com esses comandos simples, o pod agora é um shell root
no nó. Faça o seguinte:
Execute o comando padrão do Docker com permissão total |
|
Liste as imagens do Docker |
|
Use |
|
Analise os secrets ativos do Kubernetes |
|
Use |
|
Quase todas as operações que podem ser feitas pelo usuário root
estão disponíveis nesse shell do pod. Isso inclui mecanismos de persistência, como adição de usuários/chaves SSH, execução de contêineres privilegiados do Docker no host fora da visualização do Kubernetes, entre outras funções.
- Execute
exit
duas vezes: uma para deixar ochroot
e outra para sair do shell do pod:
- Agora exclua o pod
hostpath
:
Entenda os controles disponíveis
As próximas etapas vão demonstrar os seguintes tópicos:
-
Como desativar o endpoint legado da API de metadados do Compute Engine: ao especificar uma chave e um valor de metadados personalizados, o endpoint
v1beta1
não ficará mais disponível na instância. - Ativar a ocultação de metadados: ao passar uma configuração adicional durante a criação do cluster e/ou do pool de nós, um proxy leve será instalado em cada nó para todas as solicitações da API de metadados e impedirá o acesso a endpoints confidenciais.
- Ativar e configurar o PodSecurityPolicy: configurar essa opção em um cluster do GKE adicionará o controle de admissão PodSecurityPolicy, que ajuda a restringir o uso de definições não protegidas na criação do pod. No caso da demonstração, você impedirá que contêineres operem como usuário raiz ou tenham a capacidade de ativar o sistema de arquivos de host subjacente.
Tarefa 5: implante um segundo pool de nós
Para que você tenha experiências com e sem a proteção do endpoint de metadados, será criado um segundo pool de nós que incluirá duas configurações adicionais. Os pods programados para o pool de nós genérico não terão proteção. Já os programados para o segundo pool de nós contarão com essa segurança.
- Crie o segundo pool de nós:
Clique em Verificar meu progresso para conferir o objetivo.
Tarefa 6: execute um pod do SDK do Google Cloud
- No Cloud Shell, inicie uma única instância do contêiner do SDK do Google Cloud. Ela será executada apenas no segundo pool de nós com as proteções ativadas, sem operar como o usuário raiz:
- Haverá um shell bash em execução no contêiner do pod no pool de nós
second-pool
. Isto vai aparecer:
Pode levar alguns segundos para o contêiner iniciar e o prompt de comando abrir.
Se um prompt de comando não for exibido, pressione Enter.
Analise vários endpoints bloqueados
- Com a configuração do segundo pool de nós definida como
--workload-metadata-from-node=SECURE
, o comando abaixo para recuperar o arquivo confidencial,kube-env
, apresentará falha:
(Saída)
- No entanto, outros comandos a endpoints não confidenciais ainda terão sucesso se o cabeçalho HTTP adequado tiver passado:
Exemplo de saída
- Saia do pod:
Você voltará ao Cloud Shell.
Tarefa 7: implante objetos PodSecurityPolicy
- Para avançar, conceda permissões explícitas para transformar sua conta de usuário em
cluster-admin:
(Saída)
- Em seguida, implante um
PodSecurityPolicy
mais restrito em todos os usuários autenticados no namespace padrão:
(Saída)
- Depois adicione o
ClusterRole
que oferece a capacidade necessária para "usar" o PodSecurityPolicy:
(Saída)
- Por fim, crie um RoleBinding no namespace padrão para que qualquer permissão de usuário autenticado use o PodSecurityPolicy:
(Saída)
system:authenticated
no RoleBinding pelo usuário específico ou pela conta de serviço que precisa da capacidade de criar pods no namespace padrão.
Clique em Verificar meu progresso para conferir o objetivo.
Ative a política do PodSecurity
- Ativar o controlador de permissão PodSecurityPolicy:
Esse processo leva alguns minutos para ser concluído.
Tarefa 8: implante um pod bloqueado que ative o sistema de arquivos do host
Como a conta usada para implantar o cluster do GKE recebeu permissões cluster-admin em uma etapa anterior, é necessário criar uma conta de "usuário" separada para interagir com o cluster e validar a aplicação do PodSecurityPolicy.
- Para fazer isso, execute:
(Saída)
- Agora execute os comandos abaixo para conceder à conta de serviço permissão para interagir com o cluster e tentar criar pods:
- Para ter acesso ao arquivo das credenciais da conta de serviço, execute este código:
- Configure
kubectl
para autenticar como esta conta de serviço:
- Execute o código abaixo para configurar
kubectl
a usar as credenciais ao se comunicar com o cluster:
- Agora tente criar outro pod que ative o sistema de arquivos
/
do host subjacente em uma pasta chamada/rootfs
no contêiner:
- Esta resposta valida o bloqueio por PSP:
- Implante outro pod que atenda aos critérios do
restrictive-psp
:
(Saída)
- Execute o código abaixo para conferir a anotação adicionada ao pod indicando qual PodSecurityPolicy autorizou a criação:
Resposta anexada à linha de comando do Cloud Shell:
Clique em Verificar meu progresso para conferir o objetivo.
Parabéns!
Neste laboratório, você configurou um cluster padrão do Kubernetes no Google Kubernetes Engine. Em seguida, você sondou e analisou o acesso disponível ao pod, aumentou a proteção do cluster e confirmou que ações nocivas não são mais possíveis.
Termine a Quest
Este laboratório autoguiado faz parte da Quest Google Kubernetes Engine Best Practices: Security do Qwiklabs. Uma Quest é uma série de laboratórios relacionados que formam um programa de aprendizado. Ao concluir uma Quest, você ganha um selo como reconhecimento da sua conquista. Você pode publicar os selos com um link para eles no seu currículo on-line ou nas redes sociais. Inscreva-se nesta Quest ou em outra que tenha este laboratório para receber os créditos de conclusão imediatamente. Consulte o catálogo do Google Cloud Ensina para ver todas as Quests disponíveis.
Comece o próximo laboratório
Continue a quest com Google Kubernetes Engine Security: Binary Authorization ou confira estes laboratórios do Google Cloud Ensina:
- Segurança de aplicativos no Kubernetes Engine – Três exemplos
- Como usar o controle de acesso baseado em papel no Kubernetes Engine
Próximas etapas / Saiba mais
IMPORTANTE: embora este laboratório aborde várias questões de segurança de forma detalhada, há outras áreas que precisam ser consideradas no seu ambiente. Consulte o Guia para aumentar a segurança do cluster para mais informações.
PodSecurityPolicy: Guia sobre como usar PodSecurityPolicies e Guia para aumentar a segurança do cluster
Contas de serviço do nó: Guia de permissões
Como proteger os metadados do nó: Guia sobre como proteger os metadados do nó
Treinamento e certificação do Google Cloud
Esses treinamentos ajudam você a aproveitar as tecnologias do Google Cloud ao máximo. Nossas aulas incluem habilidades técnicas e práticas recomendadas para ajudar você a alcançar rapidamente o nível esperado e continuar sua jornada de aprendizado. Oferecemos treinamentos que vão do nível básico ao avançado, com opções de aulas virtuais, sob demanda e por meio de transmissões ao vivo para que você possa encaixá-las na correria do seu dia a dia. As certificações validam sua experiência e comprovam suas habilidades com as tecnologias do Google Cloud.
Manual atualizado em 3 de outubro de 2023
Laboratório testado em 9 de outubro de 2023
Copyright 2024 Google LLC. Todos os direitos reservados. Google e o logotipo do Google são marcas registradas da Google LLC. Todos os outros nomes de produtos e empresas podem ser marcas registradas das respectivas empresas a que estão associados.