Executar cargas de trabalho privilegiadas de parceiros do Autopilot do GKE


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:

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.

  1. Em um editor de texto, crie um arquivo YAML.
  2. 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.
  3. 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.

  4. 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:

  1. Liste os sincronizadores atuais no cluster:

    kubectl get allowlistsynchronizer
    
  2. Abra a especificação do sincronizador que você quer atualizar em um editor de texto.

  3. Atualize o campo spec.allowlistPaths para adicionar, modificar ou remover caminhos de arquivo da lista de permissões.

  4. Salve e feche o editor de texto.

  5. 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:

  1. Verifique se a lista de permissões existe no cluster.
  2. 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.

  3. 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:

  1. 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.
  2. 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.

  3. 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:

  1. 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'
    
  2. 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]
    
  3. 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