Nesta página, mostramos como executar cargas de trabalho privilegiadas de parceiros do Autopilot do Google Kubernetes Engine (GKE). Você vai aprender a configurar uma carga de trabalho de sincronização que instala uma lista de permissões no cluster e a mantém atualizada.
Esta página é destinada aos seguintes tipos de funções:
- Engenheiros de segurança que querem garantir que as cargas de trabalho de terceiros precisem de uma lista de permissões para serem executadas nos clusters e venham de fontes aprovadas pelo GKE.
- Engenheiros de plataforma que querem ativar cargas de trabalho de terceiros em clusters para desbloquear equipes de aplicativos.
Para saber mais sobre os papéis comuns e as tarefas de exemplo que mencionamos na documentação, consulte Tarefas e funções de usuário comuns do GKE Enterprise.
Antes de ler esta página, confira se você conhece os seguintes conceitos:
- Recursos personalizados do Kubernetes
- Restrições de segurança do Autopilot do GKE
- Parceiros do Autopilot do GKE
Sobre cargas de trabalho de parceiros privilegiadas no Autopilot
O GKE permite que um subconjunto de parceiros aprovados execute cargas de trabalho com privilégios em clusters do Autopilot. Essas cargas de trabalho privilegiadas podem ignorar algumas das restrições de segurança impostas pelo Autopilot. Por exemplo, um parceiro pode precisar executar uma carga de trabalho que usa recursos específicos do Linux ou exige um contêiner privilegiado.
Os parceiros criam e mantêm listas de permissões para as cargas de trabalho privilegiadas. Cada lista de permissões é um arquivo que corresponde a uma carga de trabalho de parceiro privilegiado específica. Os parceiros enviam esses arquivos de lista de permissões para o GKE para aprovação. Após a aprovação, o GKE hospeda o arquivo de lista de permissões em um repositório gerenciado pelo Google.
Para executar uma carga de trabalho de parceiro, instale o arquivo de lista de permissões correspondente no seu
cluster. O GKE fornece um recurso personalizado do Kubernetes chamado
AllowlistSynchronizer
, que instala listas de permissões e as mantém atualizadas.
Depois que uma lista de permissões é instalada, você pode implantar a carga de trabalho privilegiada do parceiro correspondente.
Bugs e solicitações de recursos para cargas de trabalho privilegiadas e listas de permissões
Os parceiros são responsáveis por criar, desenvolver e manter as cargas de trabalho privilegiadas e as listas de permissões. Se você encontrar um bug ou tiver um pedido de recurso para uma carga de trabalho privilegiada ou uma lista de permissões, entre em contato com o parceiro correspondente.
Sobre o controlador AllowlistSynchronizer
O AllowlistSynchronizer
é um controlador executado no plano de controle do
GKE. Você implanta um novo AllowlistSynchronizer
como um manifesto YAML,
semelhante a como você implanta qualquer outra carga de trabalho do Kubernetes. No manifesto, você
especifica o caminho para o arquivo de lista de permissões que quer instalar, que você recebe
do parceiro terceirizado. O sincronizador encontra o arquivo de lista de permissões do parceiro
em um repositório gerenciado pelo Google e instala a lista de permissões no cluster.
A cada 10 minutos, o sincronizador verifica se há atualizações no arquivo da lista de permissões. Se uma atualização existir, o sincronizador vai instalar a lista de permissões atualizada no cluster.
Para parar de permitir cargas de trabalho específicas, atualize os AllowlistSynchronizers atuais para
remover os caminhos de arquivo da lista de permissões correspondentes e exclua o objeto WorkloadAllowlist
do cluster. Se você excluir um objeto WorkloadAllowlist
instalado
sem remover o caminho do sincronizador da lista de permissões, o sincronizador
reinstala a lista de permissões. Os parceiros não podem excluir arquivos da lista de permissões do repositório gerenciado pelo Google.
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
.
Requisitos
- O recurso personalizado
AllowlistSynchronizer
exige a versão 1.32.2-gke.1652000 ou mais recente do GKE. - Você precisa saber qual carga de trabalho do parceiro quer executar no cluster. Consulte a documentação do parceiro para instruções de instalação da carga de trabalho privilegiada.
Crie um novo AllowlistSynchronizer
.
Para executar uma carga de trabalho privilegiada de um parceiro, adicione o caminho ao arquivo de lista de permissões correspondente a um recurso personalizado AllowlistSynchronizer
. Em seguida, implante o AllowlistSynchronizer no cluster.
- Em um editor de texto, crie um arquivo YAML.
Adicione o seguinte conteúdo ao arquivo YAML:
apiVersion: auto.gke.io/v1 kind: AllowlistSynchronizer metadata: name: ALLOWLIST_SYNCHRONIZER_NAME spec: allowlistPaths: - ALLOWLIST1_PATH - ALLOWLIST2_PATH
Substitua:
ALLOWLIST_SYNCHRONIZER_NAME
: o nome do novo sincronizador. Escolha um nome descritivo que identifique a carga de trabalho ou a equipe que a lista de permissões oferece suporte.ALLOWLIST1_PATH, ALLOWLIST2_PATH, ...
: um ou mais caminhos para arquivos de lista de permissões de parceiros a serem instalados. Confira a documentação da carga de trabalho do parceiro escolhido para esse caminho. É possível especificar diretórios inteiros ou arquivos individuais.
Implante o arquivo YAML no cluster:
kubectl apply -f PATH_TO_YAML_FILE
Substitua
PATH_TO_YAML_FILE
pelo caminho para o arquivo YAML criado na etapa anterior.O controlador
AllowlistSynchronizer
instala arquivos de lista de permissões dos caminhos especificados no cluster.Aguarde até que o sincronizador informe um status
Ready
:kubectl wait --for=condition=Ready allowlistsynchronizer/ALLOWLIST_SYNCHRONIZER_NAME \ --timeout=60s
Também é possível integrar a implantação de carga de trabalho do parceiro ao pipeline de integração e implantação contínuas (CI/CD). Configure seu fluxo de trabalho para aguardar até que a lista de permissões seja instalada antes de implantar a carga de trabalho correspondente.
Atualizar um AllowlistSynchronizer
É possível atualizar um AllowlistSynchronizer para adicionar ou remover arquivos de lista de permissões. É possível atualizar os sincronizadores atuais em situações como as seguintes:
- O parceiro adiciona um novo arquivo de lista de permissões com um nome diferente.
- Você quer adicionar uma nova lista de permissões de carga de trabalho a um sincronizador que agrupa listas de permissões relacionadas.
- Você quer remover uma lista de permissões de um sincronizador porque não quer mais usar a carga de trabalho correspondente.
Para atualizar um objeto AllowlistSynchronizer
, faça o seguinte:
Liste os sincronizadores atuais no cluster:
kubectl get allowlistsynchronizer
Abra a especificação do sincronizador que você quer atualizar em um editor de texto.
Atualize o campo
spec.allowlistPaths
para adicionar, modificar ou remover caminhos de arquivo da lista de permissões.Salve e feche o editor de texto.
Aplique a configuração atualizada ao cluster:
kubectl apply -f PATH_TO_YAML_FILE
Substitua
PATH_TO_YAML_FILE
pelo caminho para o arquivo YAML que você atualizou na etapa anterior.
Quando você implanta uma configuração de sincronizador atualizada, o campo
managedAllowlistStatus.generation
no status do objeto
AllowlistSynchronizer
aumenta em um. O controlador AllowlistSynchronizer
aplica as mudanças.
Monitorar o status da sincronização da lista de permissão
Depois de instalar um AllowlistSynchronizer
ou atualizar um sincronizador, é possível monitorar o status da sincronização. O status ajuda você a acompanhar a instalação, remoção ou modificações dos arquivos da lista de permissões, bem como os erros que podem ocorrer.
Para monitorar o status geral da sincronização, execute o seguinte comando:
kubectl get allowlistsynchronizer ALLOWLIST_SYNCHRONIZER_NAME -o yaml
O resultado será assim:
...
status:
conditions:
- type: Ready
status: "False"
reason: "SyncError"
message: "some allowlists failed to sync: example-allowlist-1.yaml"
lastTransitionTime: "2024-10-12T10:00:00Z"
observedGeneration: 2
managedAllowlistStatus:
- filePath: "gs://path/to/allowlist1.yaml"
generation: 1
phase: Installed
lastSuccessfulSync: "2024-10-10T10:00:00Z"
- filePath: "gs://path/to/allowlist2.yaml"
phase: Failed
lastError: "Initial install failed: invalid contents"
lastSuccessfulSync: "2024-10-08T10:00:00Z"
Para uma descrição desses campos, consulte
Status do AllowlistSynchronizer
.
Verifique se há uma lista de permissões no cluster
Para verificar se uma lista de permissões existe no cluster, execute o seguinte comando:
kubectl get workloadallowlist
A saída é uma lista das listas de permissão instaladas no cluster. Verifique se a saída inclui a lista de permissões que você quer usar.
Implantar a carga de trabalho privilegiada
Depois que uma lista de permissões é instalada, você pode implantar a carga de trabalho correspondente no cluster. O parceiro que fornece a carga de trabalho também precisa dar instruções de instalação. Para conferir uma lista de parceiros do Autopilot e links para a documentação deles, consulte Parceiros do Autopilot.
Usar repositórios de espelhamento de imagens particulares
É possível espelhar as imagens de contêiner das cargas de trabalho de parceiros em repositórios particulares que você possui. Para executar essas imagens espelhadas em uma carga de trabalho, você precisa atender a todos os requisitos a seguir:
- O resumo SHA-256 da imagem espelhada precisa corresponder ao resumo da imagem da carga de trabalho do parceiro disponível publicamente.
- O resumo SHA-256 da imagem especificado precisa existir no objeto
WorkloadAllowlist
fornecido pelo parceiro e sincronizado com seu cluster.
Se a carga de trabalho do parceiro oferecer suporte a imagens espelhadas, a especificação da lista de permissões para essa carga de trabalho vai conter uma lista de resumos de imagens no campo containers.imageDigests
da especificação da lista de permissões para essa carga de trabalho. Normalmente, esse campo tem um resumo separado para cada versão disponível da imagem do contêiner. Para ver essa lista de resumos de imagens, faça o
seguinte:
- Verifique se a lista de permissões existe no cluster.
Confira a especificação da lista de permissões instalada:
kubectl get workloadallowlist ALLOWLIST_NAME -o yaml
Substitua
ALLOWLIST_NAME
pelo nome da lista de permissões instalada. Por exemplo,company-name-solution-v1.0.0
.Para cargas de trabalho que oferecem suporte a esse recurso, a saída é semelhante a esta. O campo
imageDigests
tem uma lista de resumos permitidos.# lines omitted for clarity - containerName: pause-container1 imageDigests: - cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229 - 932ea160d395f3d7f76c0c17a52a63c4cfe1836a900f1058b6bc20b16fd10d23
Se a saída não incluir um campo
imageDigests
ou se o resumo do lançamento que você quer usar não estiver na lista, entre em contato diretamente com o parceiro e peça para ele atualizar a lista de permissões. Depois que o parceiro adicionar resumos de imagens à lista de permissões e enviar as mudanças ao GKE, o sincronizador de lista de permissões no cluster vai instalar automaticamente a lista atualizada.Adicione um dos resumos de imagem compatíveis ao manifesto da carga de trabalho.
Por exemplo, considere a seguinte imagem em uma especificação de pod disponível publicamente de um parceiro:
...
containers:
- name: pause-container1
image: partner-repo/pause1@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
securityContext:
privileged: true
É possível usar uma imagem espelhada se o resumo corresponder ao resumo disponível publicamente, como no exemplo a seguir:
...
containers:
- name: pause-container1
image: my-private-repo/pause1@sha256:cb5c1bddd1b5665e1867a7fa1b5fa843a47ee433bbb75d4293888b71def53229
securityContext:
privileged: true
É necessário incluir o resumo SHA-256 no campo da imagem, semelhante ao exemplo anterior. Se os resumos não forem iguais, a imagem espelhada não será executada. Para preservar os resumos de imagens ao espelhar imagens de parceiros, use uma ferramenta como crane, ORAS ou skopeo.
Excluir uma carga de trabalho privilegiada
Para impedir que uma carga de trabalho privilegiada seja executada nos seus clusters, remova o caminho para a lista de permissões correspondente do AllowlistSynchronizer. O sincronizador desinstala a lista de permissões.
Se você excluir um objeto WorkloadAllowlist
do cluster em vez de
atualizar o sincronizador, ele vai reinstalar a lista de permissões. Remova o caminho de AllowlistSynchronizer
.
Para desinstalar uma lista de permissões, faça o seguinte:
- No manifesto YAML do
AllowlistSynchronizer
que gerencia a lista de permissões, remova o caminho para a lista que você quer desinstalar. Para instruções, consulte a seção Atualizar uma seção AllowlistSynchronizer atual. Para verificar se a lista de permissões foi desinstalada, confira uma lista de objetos
WorkloadAllowlist
no cluster:kubectl get workloadallowlist
Na saída, verifique se a lista de permissões que você queria remover não aparece.
Exclua a carga de trabalho do cluster. Para instruções, consulte a documentação do provedor de carga de trabalho.
Impedir a instalação da lista de permissões nos clusters
Para evitar a instalação de listas de permissões de cargas de trabalho privilegiadas em clusters específicos, use uma ValidatingAdmissionPolicy. A validação de políticas de admissão garante que os recursos do Kubernetes atendam a critérios específicos antes de serem executados no cluster. Por exemplo, você pode validar se um rótulo tem um valor específico.
Para evitar a instalação de listas de permissões em um cluster, faça o seguinte:
Salve o seguinte manifesto ValidatingAdmissionPolicy como
disallow-allowlists.yaml
:apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingAdmissionPolicy metadata: name: "disallow-allowlists" spec: failurePolicy: Fail matchConstraints: resourceRules: - apiGroups: ["auto.gke.io"] apiVersions: ["*"] operations: ["*"] resources: ["allowlistsynchronizers"] validations: - expression: "false" message: 'AllowlistSynchronizer creation is not allowed'
Salve o seguinte manifesto ValidatingAdmissionPolicyBinding como
disallow-allowlists-binding.yaml
:apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingAdmissionPolicyBinding metadata: name: "disallow-allowlists-binding" spec: policyName: "disallow-allowlists" validationActions: [Deny]
Implante o ValidatingAdmissionPolicy no cluster:
kubectl apply -f disallow-allowlists.yaml kubectl apply -f disallow-allowlists-binding.yaml
Essa política impede a criação de novos AllowlistSynchronizers no cluster.
Resolver problemas
Se a sincronização ou a implantação da carga de trabalho falhar, consulte Resolver problemas na implantação de cargas de trabalho privilegiadas do Autopilot.
A seguir
- Parceiros do Autopilot do GKE
- Executar cargas de trabalho privilegiadas de código aberto no Autopilot do GKE
- Recursos de segurança do Autopilot do GKE
- Definição de recurso personalizado AllowlistSynchronizer