Este guia descreve como verificar a integridade da imagem de máquina virtual (VM) do Compute Engine que o Google Kubernetes Engine (GKE) usa para VMs de plano de controle. Este guia é destinado a uma equipe de segurança que monitora os registros do plano de controle e quer verificar o seguinte:
- A VM do plano de controle foi inicializada com firmware autêntico e outro software de inicialização que foi verificado criptograficamente pela inicialização segura e pelo monitoramento de integridade.
- A VM do plano de controle foi inicializada a partir de uma imagem autêntica do GKE OS.
Também é possível realizar essa verificação nas imagens do SO e na integridade de inicialização dos nós de trabalho.
Esta página descreve uma parte de um conjunto de recursos opcionais do plano de controle no GKE que permite realizar tarefas como verificar a postura de segurança do plano de controle ou configurar a criptografia e a assinatura de credenciais no plano de controle usando chaves gerenciadas. Para mais detalhes, consulte Sobre a autoridade do plano de controle do GKE.
Por padrão,o Google Cloud aplica várias medidas de segurança ao plano de controle gerenciado. Esta página descreve os recursos opcionais que oferecem mais visibilidade ou controle sobre o plano de controle do GKE.
Sobre a verificação de integridade da VM
Por padrão, todas as instâncias do plano de controle do GKE são VMs protegidas, que são VMs reforçadas que usam recursos de segurança, como inicialização segura e medida, um módulo de plataforma confiável virtual (vTPM, na sigla em inglês) e firmware UEFI. Todos os nós do GKE também ativam o monitoramento de integridade, que valida a sequência de inicialização de cada VM protegida em relação a uma determinada sequência de inicialização "boa". Essa validação retorna resultados de aprovação ou reprovação para cada fase da sequência de inicialização e adiciona esses resultados ao Cloud Logging. O monitoramento de integridade está ativado por padrão em todos os clusters do GKE e valida as seguintes fases:
- Sequência de inicialização antecipada: desde o início do firmware UEFI até o momento em que o
carregador de inicialização assume o controle. Adicionado aos registros da VM como
earlyBootReportEvent
. - Sequência de inicialização tardia: desde quando o carregador de inicialização assume o controle até o
kernel do sistema operacional assumir o controle. Adicionado aos registros da VM como
lateBootReportEvent
.
O GKE também adiciona registros de criação de VM do plano de controle ao Logging. Esses registros contêm metadados que identificam a máquina e incluem detalhes sobre a imagem da VM e a sequência de inicialização. OGoogle Cloud publica um atestado de resumo de verificação (VSA) para cada imagem de VM do plano de controle do GKE no repositório gke-vsa no GitHub. O VSA usa o framework in-toto para atestados. É possível validar os registros de VM do plano de controle dos clusters com os VSAs correspondentes para verificar se os nós do plano de controle foram inicializados conforme o esperado.
A realização dessas validações pode ajudar você a alcançar os seguintes objetivos:
- Verifique se o software no plano de controle está protegido por inicialização segura e monitoramento de integridade, corresponde ao código-fonte pretendido e é exatamente o mesmo que a imagem usada por outros clientes do Google Cloud .
- Melhore sua confiança em como o GKE protege o plano de controle.
Preços
Esse recurso é oferecido sem custo financeiro extra no GKE.
Antes de começar
Antes de começar, veja se você realizou as seguintes tarefas:
- Ative a API Google Kubernetes Engine. Ativar a API Google Kubernetes Engine
- Se você quiser usar a CLI do Google Cloud para essa tarefa,
instale e, em seguida,
inicialize a
CLI gcloud. Se você instalou a gcloud CLI anteriormente, instale a versão
mais recente executando
gcloud components update
.
-
Enable the Cloud Logging API.
- Verifique se você já tem um cluster do modo Autopilot ou padrão do GKE com a versão 1.29 ou mais recente.
Funções exigidas
Para receber as permissões necessárias para verificar a integridade da VM da camada de controle, peça ao administrador para conceder a você os seguintes papéis do IAM no projeto:
-
Criar e interagir com clusters:
Administrador de cluster do Kubernetes Engine (
roles/container.clusterAdmin
) -
Acessar e processar registros:
Visualizador de registros (
roles/logging.viewer
)
Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.
Também é possível conseguir as permissões necessárias por meio de papéis personalizados ou de outros papéis predefinidos.
Verificar se há fases da sequência de inicialização com falha
O monitoramento de integridade adiciona um registro ao Logging se uma VM do plano de controle falha ou conclui com êxito uma fase da sequência de inicialização. Para conferir os eventos de inicialização com falha, execute estes comandos:
No console do Google Cloud , acesse a página Análise de registros:
No campo Consulta, insira a seguinte consulta:
jsonPayload.@type="type.googleapis.com/cloud_integrity.IntegrityEvent" jsonPayload.earlyBootReportEvent.policyEvaluationPassed="false" OR jsonPayload.lateBootReportEvent.policyEvaluationPassed="false" jsonPayload.metadata.isKubernetesControlPlaneVM="true"
Também é possível verificar se os eventos de inicialização foram bem-sucedidos substituindo
false
portrue
nesta consulta.Clique em Executar consulta. Se não houver resultados, as VMs do plano de controle passaram por todas as verificações de monitoramento de integridade. Se uma saída aparecer, siga para a próxima etapa para identificar o cluster correspondente.
No registro de integridade de inicialização com falha, copie o valor no campo
resource.labels.instance_id
.No campo Consulta, insira a seguinte consulta:
protoPayload.@type="type.googleapis.com/google.cloud.audit.AuditLog" protoPayload.metadata.isKubernetesControlPlaneVM="true" resource.labels.instance_id="INSTANCE_ID" protoPayload.methodName="v1.compute.instances.insert"
Substitua
INSTANCE_ID
pelo valor do campoinstance_id
da etapa anterior.Clique em Executar consulta. O valor no campo
protoPayload.metadata.parentResource.parentResourceId
é o ID do cluster do GKE.Encontre o nome do cluster do GKE:
gcloud asset query \ --organization=ORGANIZATION_ID \ --statement="SELECT name FROM container_googleapis_com_Cluster WHERE resource.data.id='CLUSTER_ID';"
Substitua:
ORGANIZATION_ID
: o ID numérico da sua organização do Google Cloud .CLUSTER_ID
: o valor do campoprotoPayload.metadata.parentResource.parentResourceId
da etapa anterior.
O resultado será assim:
# lines omitted for clarity //container.googleapis.com/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME
Essa saída tem os seguintes campos:
PROJECT_ID
: o ID do projeto do Google Cloud .LOCATION
: O local do cluster.CLUSTER_NAME
: o nome do cluster.
Encontrar e inspecionar os registros da VM do plano de controle
Os registros de criação de VM do Compute Engine que correspondem a
clusters do GKE são armazenados no
bucket de registro _Default
.
Para encontrar os registros de criação das VMs do plano de controle do cluster e extrair esses
metadados, faça o seguinte:
No console do Google Cloud , acesse a página Análise de registros:
No campo Consulta, insira a seguinte consulta:
resource.type="gce_instance" protoPayload.methodName="v1.compute.instances.insert" protoPayload.metadata.isKubernetesControlPlaneVM="true"
Clique em Executar consulta. Se não houver resultados, verifique se você atende a todos os requisitos na seção Antes de começar.
Nos resultados da consulta, verifique o campo
metadata
. O resultado será assim:# fields omitted for clarity "metadata": { "usedResources": { "attachedDisks": [ { "sourceImageId": "9046093115864736653", "sourceImage": "https://www.googleapis.com/compute/v1/projects/1234567890/global/images/gke-1302-gke1627000-cos-113-18244-85-49-c-pre", "isBootDisk": true } # fields omitted for clarity
O campo
metadata
inclui as seguintes informações:usedResources
: a lista de recursos usados para criar a VM.attachedDisks
: o disco de inicialização da VM.sourceImageId
: o ID exclusivo do imagem da VM.sourceImage
: o URL da imagem da VM de origem. A sintaxe do valor neste campo éhttps://www.googleapis.com/compute/v1/projects/PROJECT_NUMBER/global/images/IMAGE_NAME
, em quePROJECT_NUMBER
é o número do projeto Google Cloudque hospeda as VMs do plano de controle eIMAGE_NAME
é o nome da imagem usada para inicializar a VM.isBootDisk
: um identificador booleano para saber se esse disco foi usado como disco de inicialização da VM.
Encontrar e verificar o VSA para imagens de VM do plano de controle
Nesta seção, você encontra o VSA que corresponde à imagem da VM do plano de controle no repositório gke-vsa no GitHub. Em seguida, use uma ferramenta chamada
slsa-verifier
fornecida pelo
framework de Níveis de cadeia de suprimentos para artefatos de software (SLSA)
para verificar o VSA. Você precisa dos seguintes dados do registro de criação da VM do plano de
controle:
- O ID da imagem da VM
- O número do projeto do Google Cloudque hospeda as VMs
- O nome da imagem do SO usada para inicializar a VM
O arquivo que corresponde à VM do plano de controle tem o seguinte formato de nome:
IMAGE_NAME:IMAGE_ID.intoto.jsonl
Substitua:
IMAGE_NAME
: o nome da imagem da VM, que é a string após/images/
no campoattachedDisks.sourceImage
no registro de auditoria da VM da seção anterior. Por exemplo,gke-1302-gke1627000-cos-113-18244-85-49-c-pre
.IMAGE_ID
: o ID da imagem da VM, que é o valor do campoattachedDisks.sourceImageId
no registro de auditoria da VM da seção anterior. Por exemplo,9046093115864736653
.
Para encontrar e verificar o VSA quando você sabe o nome do arquivo do VSA, siga estas etapas:
- Abra o
repositório do GitHub
gke-vsa
. - No diretório "gke-master-images", encontre o arquivo correspondente à sua
imagem de VM. Por exemplo:
https://github.com/GoogleCloudPlatform/gke-vsa/blob/main/gke-master-images:78064567238/IMAGE_NAME:IMAGE_ID.intoto.jsonl
- Faça o download do arquivo VSA.
- Instale a ferramenta
slsa-verifier
. Salve a chave pública para verificar o VSA em um arquivo chamado
vsa_signing_public_key
:Verifique o VSA:
slsa-verifier verify-vsa \ --attestation-path=PATH_TO_VSA_FILE \ --resource-uri=gce_image://gke-master-images:IMAGE_NAME \ --subject-digest=gce_image_id:IMAGE_ID\ --verifier-id=https://bcid.corp.google.com/verifier/bcid_package_enforcer/v0.1 \ --verified-level=BCID_L1 \ --verified-level=SLSA_BUILD_LEVEL_2 \ --public-key-path=PATH_TO_PUBLIC_KEY_FILE \ --public-key-id=keystore://76574:prod:vsa_signing_public_key
Substitua:
PATH_TO_VSA_FILE
: o caminho para o arquivo VSA que você fez o download.IMAGE_NAME
: o nome do imagem da VM, comogke-1302-gke1627000-cos-113-18244-85-49-c-pre
.IMAGE_ID
: o ID da imagem da VM, como9046093115864736653
.
Se a VSA passar nas verificações, a saída será esta:
Verifying VSA: PASSED PASSED: SLSA verification passed