arrow_back

Como proteger o Google Kubernetes Engine com o IAM e a admissão de segurança do pod

Acesse mais de 700 laboratórios e cursos

Como proteger o Google Kubernetes Engine com o IAM e a admissão de segurança do pod

Laboratório 1 hora 30 minutos universal_currency_alt 5 créditos show_chart Introdutório
info Este laboratório pode incorporar ferramentas de IA para ajudar no seu aprendizado.
Acesse mais de 700 laboratórios e cursos

Visão geral

Você vai controlar o acesso aos clusters do GKE com o IAM, definirá uma política de segurança para restringir a criação de pods com privilégio e testará essa política. Você também vai fazer a rotação das credenciais e do endereço IP.

Observação: neste laboratório, o modo GKE Standard será usado. O laboratório abrange as políticas de segurança de pods, e não é possível criar políticas que modifiquem as configurações de segurança integradas no GKE Autopilot.

Objetivos

Neste laboratório, você aprenderá a fazer o seguinte:

  • Usar o IAM para controlar o acesso ao GKE
  • Criar e usar políticas de segurança de pods para controlar a criação de pods
  • Realizar a rotação de credenciais e o endereço IP
Observação: para este laboratório, o Google Cloud Ensina provisionou para você dois nomes de usuário disponíveis na caixa de diálogo Detalhes da conexão.

Essas contas serão indicadas como Nome de usuário 1 e Nome de usuário 2.

Tarefa 1: usar os papéis do IAM para conceder acesso administrativo a todos os clusters do GKE no projeto

Faça login no console do Google Cloud como o primeiro usuário

  1. Como de costume, faça login no console do Google Cloud em uma janela anônima com o Nome de usuário 1 provido. A senha é a mesma para os dois nomes de usuário.
  2. Na barra de título do console do Google Cloud, clique em Ativar o Cloud Shell (Ícone do Cloud Shell).
  3. Clique em Continuar.

Depois do provisionamento, o comando do Cloud Shell será exibido.

Observação: se você sair da conta do Nome de usuário 1, a conta do Nome de usuário 2 poderá ser excluída pelo Google Cloud Ensina. Por isso, não saia da conta do Nome de usuário 1 até concluir este laboratório.

Faça login e navegue pelo console do Google Cloud como o segundo usuário

  1. Abra outra guia na janela anônima.
  2. Acesse console.cloud.google.com.
  3. Clique no ícone do usuário no canto superior direito da tela e, em seguida, clique em Adicionar conta.
  4. Faça login no console do Google Cloud com o Nome de usuário 2 fornecido. Lembre-se de que a senha é a mesma para os dois nomes de usuário.
Observação: verifique se você está na guia Nome de usuário 2 do console do Google Cloud.
  1. Depois de fazer login como Nome de usuário 2, no Menu de navegação (Ícone do menu de navegação), clique em Kubernetes Engine > Clusters.

  2. O ID do projeto do laboratório precisa estar selecionado na parte de cima da página.

Observe que a opção para criar um cluster está desativada.

Caixa de diálogo de clusters do Kubernetes exibindo a mensagem de que o usuário precisa da permissão container.cluster.create para a ação

Observação: o Nome de usuário 2 tem acesso ao projeto, mas apenas com o papel de Leitor, o que torna todos os recursos do projeto acessíveis, mas no modo somente leitura.

Conceda ao Nome de usuário 2 o papel de administrador do GKE do IAM

Agora você vai permitir que o Nome de usuário 2 crie um cluster do GKE e implante cargas de trabalho usando papéis primários para conceder ao usuário permissões para administrar todos os clusters do GKE e gerenciar recursos dentro desses clusters no projeto. A conta do Nome de usuário 1 tem direitos de proprietário do projeto, e você usará essa conta para conceder ao Nome de usuário 2 mais direitos.

  1. Volte à guia Nome de usuário 1 do console do Google Cloud.
Observação: verifique se você está na guia Nome de usuário 1 do console do Google Cloud.
  1. No Menu de navegação (Ícone do menu de navegação), clique em IAM e Admin > IAM.

  2. No console do IAM, localize a linha que corresponde ao Nome de usuário 2 e, em seguida, clique no ícone em forma de lápis no lado direito da linha para editar as permissões desse usuário.

  3. Observe que o Nome de usuário 2 tem atualmente o papel Leitor, que concede acesso de leitura a todos os recursos dentro do projeto.

  4. Clique em ADICIONAR OUTRO PAPEL para selecionar um papel na lista suspensa.

  5. Na caixa suspensa Selecionar um papel, escolha Kubernetes Engine > Administrador de clusters do Kubernetes Engine.

  6. Clique em SALVAR.

Observação: o Nome de usuário 2 agora tem acesso para administrar todos os clusters do GKE no projeto e gerenciar recursos neles.

Se esse nível de acesso for muito amplo para sua organização, é possível restringir a autoridade do usuário em um cluster do GKE usando o controle de acesso baseado em função do Kubernetes.

Clique em Verificar meu progresso para conferir o objetivo. Conceder ao Nome de usuário 2 o papel de administrador do GKE do IAM

Teste o acesso do Nome de usuário 2

Você agora verificará seu trabalho usando o Nome de usuário 2 para criar um cluster do GKE.

  1. Volte para a guia com o Nome de usuário 2 do console do Google Cloud.
Observação: verifique se você está na guia Nome de usuário 2 do console do Google Cloud.
  1. Depois de fazer login como Nome de usuário 2, no Menu de navegação (Ícone do menu de navegação), clique em Kubernetes Engine > Clusters.

Agora, você verá a opção para criar um cluster habilitada. Talvez seja necessário atualizar a guia do navegador da Web do Nome de usuário 2 para ver as alterações.

  1. Clique em Criar para começar a gerar um cluster do GKE.

  2. Clique em Mudar para o cluster padrão e confirme o mesmo no próximo pop-up.

Lembrete: neste laboratório, é preciso usar o modo padrão do GKE.
  1. Defina o nome do cluster como standard-cluster-1 se ele não for o padrão.

  2. Confirme que um cluster zonal, e não um cluster regional, está selecionado.

  3. Escolha a zona para o cluster, se esse não for o padrão.

  4. Deixe todos os demais valores como padrão e clique em Criar.

O cluster começa o provisionamento, mas falha logo em seguida.

Observação: a falha nesta etapa do laboratório é proposital.
  1. Clique no ícone de notificação na barra de ferramentas na parte de cima da tela para ler a mensagem de erro.

O Nome de usuário 2 ainda não tem alguns direitos necessários para implantar um cluster. Isso acontece porque o GKE usa as instâncias do Compute Engine do Google Cloud para os nós.

Para implantar um cluster do GKE, o usuário precisa ter atribuído a si o papel iam.serviceAccountUser na conta de serviço padrão do Compute Engine.

Conceda o papel do IAM ServiceAccountUser ao Nome de usuário 2

Agora você vai usar o IAM para conceder ao Nome de usuário 2 o papel iam.serviceAccountUser, para que o Nome de usuário 2 consiga implantar um cluster do GKE.

  1. Volte à guia Nome de usuário 1 do console do Google Cloud.
Observação: verifique se você está na guia Nome de usuário 1 do console do Google Cloud.
  1. No Menu de navegação (Ícone do menu de navegação), clique em IAM e Admin > Contas de serviço.

  2. No console do IAM, clique na linha que corresponde à conta de serviço padrão do Compute Engine para selecioná-la.

  3. Clique em Permissão para abrir o painel com as informações de permissão.

  4. Na página de Permissão, clique em Conceder acesso.

O painel de informações de permissões será aberto no lado direito da janela.

  1. Digite o nome do Nome de usuário 2 na caixa Novos principais. É possível copiar esse nome da página "Detalhes do laboratório".
  2. Na caixa Selecionar um papel, verifique se Contas de serviço > Usuário da conta de serviço está selecionado.
  3. Clique em Salvar.

Clique em Verificar meu progresso para conferir o objetivo. Conceda o papel de usuário de conta de serviço do IAM ao Nome de usuário 2

Verifique se o Nome de usuário 2 pode criar um cluster do GKE

Você agora verificará seu trabalho usando o Nome de usuário 2 para criar um cluster do GKE.

  1. Volte para a guia com o Nome de usuário 2 do console do Google Cloud.
Observação: verifique se você está na guia Nome de usuário 2 do console do Google Cloud.
  1. Depois de fazer login como Nome de usuário 2, em Menu de navegação (Ícone do menu de navegação), clique em Kubernetes Engine > Clusters. Talvez seja necessário atualizar a página da Web.

  2. Clique em Criar para começar a gerar um cluster do GKE.

  3. Clique em Mudar para o cluster padrão e confirme no próximo pop-up.

  4. Defina o nome do cluster como standard-cluster-1 se ele não for o padrão.

  5. Confirme que um cluster zonal, e não um cluster regional, está selecionado.

  6. Escolha a zona para o cluster, se esse não for o padrão.

  7. Deixe todos os demais valores como padrão e clique em Criar.

Observação: espere alguns minutos até que a implantação do cluster seja concluída.

A implantação do cluster vai funcionar agora.

Clique em Verificar meu progresso para conferir o objetivo. Crie um cluster do GKE

Tarefa 2: defina e use a admissão de segurança do pod

PodSecurity é um controlador de admissão do Kubernetes que permite aplicar os padrões de segurança de pods aos pods em execução nos clusters do GKE. Os padrões de segurança de pods são políticas de segurança predefinidas que abrangem as necessidades de alto nível de segurança do pod no Kubernetes. Essas políticas variam de altamente permissivas a altamente restritivas.

Nessa tarefa, você vai criar uma política de segurança de pods que permite a criação de pods sem privilégios no namespace padrão do cluster. Pods sem privilégios não permitem que os usuários executem código como raiz e têm acesso limitado aos dispositivos no host.

Você cria um ClusterRole que pode ser usado em uma vinculação de papel que associe a política a contas que exijam a capacidade de implantar pods com acesso sem privilégio.

Os usuários que exigem capacidade de implantar pods com privilégios podem receber acesso ao PSP integrado fornecido para permitir que os usuários administradores implantem pods depois que as políticas de segurança dos pods forem habilitadas.

Quando tiver os componentes configurados, você habilitará o controlador PodSecurityPolicy, que aplica essas políticas e testa como elas afetam os usuários com diferentes privilégios.

Conecte-se ao cluster do GKE

  1. Volte à guia Nome de usuário 1 do console do Google Cloud.
Observação: verifique se você está na guia Nome de usuário 1 do console do Google Cloud.
  1. No Cloud Shell, digite o comando abaixo para criar variáveis de ambiente para a zona do Google Cloud e o nome do cluster que foram usados para criar o cluster neste laboratório:
export my_zone={{{project_0.default_zone | ZONE }}} export my_cluster=standard-cluster-1
  1. Configure o preenchimento automático da ferramenta de linha de comando kubectl:
source <(kubectl completion bash)
  1. Configure o acesso ao cluster para o kubectl:
gcloud container clusters get-credentials $my_cluster --zone $my_zone

Aplicar os padrões de segurança de pods usando o PodSecurity

Para usar o controlador de admissão do PodSecurity, aplique padrões de segurança de pods específicos em modos específicos a namespaces específicos.

Criar namespaces

Crie namespaces no cluster:

kubectl create ns baseline-ns kubectl create ns restricted-ns

Esse comando cria os seguintes namespaces:

  • baseline-ns: para cargas de trabalho permissivas
  • restricted-ns: para cargas de trabalho altamente restritas

Usar rótulos para aplicar políticas de segurança

Aplique os seguintes padrões de segurança de pods:

  • valor de referência: aplicar a baseline-ns no modo "avisar"
  • restrito: aplicar a restricted-ns no modo "aplicar"
kubectl label --overwrite ns baseline-ns pod-security.kubernetes.io/warn=baseline kubectl label --overwrite ns restricted-ns pod-security.kubernetes.io/enforce=restricted

Esses comandos resultam em:

  • As cargas de trabalho no namespace baseline-ns que violam a política de referência são permitidas, e o cliente exibe uma mensagem de aviso.
  • As cargas de trabalho no namespace restricted-ns que violam a política restrita são rejeitadas, e o GKE adiciona uma entrada aos registros de auditoria.

Verifique se os rótulos foram adicionados:

kubectl get ns --show-labels

O resultado será assim:

baseline-ns Active 74s kubernetes.io/metadata.name=baseline-ns,pod-security.kubernetes.io/warn=baseline restricted-ns Active 18s kubernetes.io/metadata.name=restricted-ns,pod-security.kubernetes.io/enforce=restricted default Active 57m kubernetes.io/metadata.name=default kube-public Active 57m kubernetes.io/metadata.name=kube-public kube-system Active 57m kubernetes.io/metadata.name=kube-system

Clique em Verificar meu progresso para conferir o objetivo. Criar os namespaces e os rótulos

Testar as políticas configuradas

Para verificar se o controlador de admissão do PodSecurity funciona conforme o esperado, implante uma carga de trabalho que viole o valor de referência e a política restrita nos dois namespaces. O manifesto de exemplo a seguir implanta um contêiner que permite o escalonamento de privilégios.

  1. Crie e abra um arquivo chamado psa-workload.yaml com nano usando o seguinte comando:
nano psa-workload.yaml
  1. Quando o nano estiver aberto, cole o seguinte no arquivo psa-workload.yaml:
apiVersion: v1 kind: Pod metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx securityContext: privileged: true
  1. Pressione Ctrl+O e, em seguida, pressione Enter para salvar o arquivo editado.

  2. Pressione Ctrl+X para sair do editor de texto nano.

  3. Aplique o manifesto ao namespace baseline-ns:

kubectl apply -f psa-workload.yaml --namespace=baseline-ns

O resultado será assim:

Warning: would violate PodSecurity "baseline:latest": privileged (container "nginx" must not set securityContext.privileged=true) pod/nginx created

A política de referência permite que o pod seja implantado no namespace.

  1. Verifique se o pod foi implantado:
kubectl get pods --namespace=baseline-ns -l=app=nginx
  1. Aplique o manifesto ao namespace restricted-ns:
kubectl apply -f psa-workload.yaml --namespace=restricted-ns

O resultado será assim:

Error from server (Forbidden): error when creating "workload.yaml": pods "nginx" is forbidden: violates PodSecurity "restricted:latest": allowPrivilegeEscalation != false (container "nginx" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "nginx" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "nginx" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "nginx" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")

O pod não será implantado no namespace. Uma entrada de auditoria é adicionada ao registro.

Clique em Verificar meu progresso para conferir o objetivo. Aplique o manifesto ao namespace restricted-ns

Exibir violações da política nos registros de auditoria

As violações de política nos modos de auditoria e aplicação são registradas nos registros de auditoria do cluster. É possível ver esses registros usando a Análise de registros, no console do Google Cloud.

  1. Na barra de título do console do Google Cloud, digite Análise de registros no campo Pesquisar e clique em Análise de registros nos resultados da pesquisa.

  2. No campo Consulta, especifique:

resource.type="k8s_cluster" protoPayload.response.reason="Forbidden" protoPayload.resourceName="core/v1/namespaces/restricted-ns/pods/nginx"
  1. Clique em Executar consulta.

  2. Na seção Resultados da consulta, expanda a entrada de registro. Os detalhes são semelhantes aos seguintes:

{ ... protoPayload: { @type: "type.googleapis.com/google.cloud.audit.AuditLog" authenticationInfo: {1} authorizationInfo: [1] methodName: "io.k8s.core.v1.pods.create" request: {6} requestMetadata: {2} resourceName: "core/v1/namespaces/restricted-ns/pods/nginx" response: { @type: "core.k8s.io/v1.Status" apiVersion: "v1" code: 403 details: {2} kind: "Status" message: "pods "nginx" is forbidden: violates PodSecurity "restricted:latest": privileged (container "nginx" must not set securityContext.privileged=true), allowPrivilegeEscalation != false (container "nginx" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "nginx" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "nginx" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "nginx" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")" metadata: {0} reason: "Forbidden" status: "Failure" } serviceName: "k8s.io" status: {2} } receiveTimestamp: "2022-12-01T19:19:25.353235326Z" resource: {2} timestamp: "2022-12-01T19:19:21.469360Z" }

(Opcional) Tarefa 3: alterne as credenciais e o endereço IP

Você vai fazer a rotação de credenciais e do endereço IP do cluster. É uma prática de segurança fazer isso regularmente para reduzir a vida útil das credenciais. Embora existam comandos separados para alternar o IP e as credenciais de serviço, alternar as credenciais também alterna o IP.

  1. No Cloud Shell, execute o seguinte comando:
gcloud container clusters update $my_cluster --zone $my_zone --start-credential-rotation
  1. Digite Y para continuar.
  2. Deixe o Cloud Shell aberto até que a operação seja concluída.

Depois que o comando for concluído no Cloud Shell, o cluster iniciará o processo para atualizar todos os nós. Esse processo pode levar até 15 minutos para o cluster. O processo também atualiza automaticamente a entrada kubeconfig para o usuário atual.

  1. O mestre do cluster agora informa temporariamente o novo endereço IP além do endereço original.

Observação: para evitar perda de acesso, é necessário atualizar o arquivo kubeconfig em qualquer outro sistema que use o kubectl ou uma API para acessar o mestre antes de concluir o processo de alternância.

  1. Para concluir as tarefas de alternância de credenciais e endereço IP, execute o seguinte comando:
gcloud container clusters update $my_cluster --zone $my_zone --complete-credential-rotation

Esse comando finaliza os processos de alternância e remove o endereço IP original do cluster.

Observação: se a rotação de credenciais não for concluída e retornar uma mensagem de erro, execute o comando abaixo. gcloud container clusters upgrade $my_cluster --node-pool=default-pool --zone $my_zone
  1. Digite Y para continuar.

  2. Após a conclusão do upgrade do cluster, execute novamente o seguinte comando:

gcloud container clusters update $my_cluster --zone $my_zone --complete-credential-rotation

Finalize o laboratório

Clique em Terminar o laboratório após a conclusão. O Google Cloud Ensina remove os recursos usados e limpa a conta por você.

Você vai poder avaliar sua experiência no laboratório. Basta selecionar o número de estrelas, digitar um comentário e clicar em Enviar.

O número de estrelas indica o seguinte:

  • 1 estrela = muito insatisfeito
  • 2 estrelas = insatisfeito
  • 3 estrelas = neutro
  • 4 estrelas = satisfeito
  • 5 estrelas = muito satisfeito

Feche a caixa de diálogo se não quiser enviar feedback.

Para enviar seu feedback, fazer sugestões ou correções, use a guia Suporte.

Antes de começar

  1. Os laboratórios criam um projeto e recursos do Google Cloud por um período fixo
  2. Os laboratórios têm um limite de tempo e não têm o recurso de pausa. Se você encerrar o laboratório, vai precisar recomeçar do início.
  3. No canto superior esquerdo da tela, clique em Começar o laboratório

Usar a navegação anônima

  1. Copie o nome de usuário e a senha fornecidos para o laboratório
  2. Clique em Abrir console no modo anônimo

Fazer login no console

  1. Faça login usando suas credenciais do laboratório. Usar outras credenciais pode causar erros ou gerar cobranças.
  2. Aceite os termos e pule a página de recursos de recuperação
  3. Não clique em Terminar o laboratório a menos que você tenha concluído ou queira recomeçar, porque isso vai apagar seu trabalho e remover o projeto

Este conteúdo não está disponível no momento

Você vai receber uma notificação por e-mail quando ele estiver disponível

Ótimo!

Vamos entrar em contato por e-mail se ele ficar disponível

Um laboratório por vez

Confirme para encerrar todos os laboratórios atuais e iniciar este

Use a navegação anônima para executar o laboratório

Para executar este laboratório, use o modo de navegação anônima ou uma janela anônima do navegador. Isso evita conflitos entre sua conta pessoal e a conta de estudante, o que poderia causar cobranças extras na sua conta pessoal.