Use a biblioteca de modelos de restrições

Esta página mostra como definir restrições do Policy Controller através dos modelos de restrições pré-existentes fornecidos pela Google.

Esta página destina-se a administradores de TI e operadores que querem garantir que todos os recursos executados na plataforma de nuvem cumprem os requisitos de conformidade da organização, fornecendo e mantendo a automatização para auditar ou aplicar, e usar modelos de configuração declarativa. Para saber mais sobre as funções comuns e as tarefas de exemplo que referimos no conteúdo, consulte o artigo Funções e tarefas comuns do utilizador do GKE. Google Cloud

O Policy Controller permite-lhe aplicar políticas a um cluster do Kubernetes definindo um ou mais objetos de restrição. Depois de instalar uma restrição, os pedidos ao servidor da API são verificados em relação à restrição e são rejeitados se não estiverem em conformidade. Os recursos não conformes preexistentes são comunicados no momento da auditoria.

Cada restrição é suportada por um modelo de restrição que define o esquema e a lógica da restrição. Os modelos de restrições podem ser provenientes da Google e de terceiros, ou pode escrever os seus próprios. Para mais informações sobre a criação de novos modelos, consulte o artigo Escreva um modelo de restrição.

Antes de começar

Examine a biblioteca de modelos de restrições

Quando define uma restrição, especifica o modelo de restrição que esta expande. Por predefinição, é instalada uma biblioteca de modelos de restrições comuns desenvolvida pela Google, e muitas organizações não precisam de criar modelos de restrições personalizados diretamente no Rego. Os modelos de restrições fornecidos pela Google têm a etiqueta configmanagement.gke.io/configmanagement.

Para apresentar uma lista de restrições, use o seguinte comando:

kubectl get constrainttemplates \
    -l="configmanagement.gke.io/configmanagement=config-management"

Para descrever um modelo de restrição e verificar os respetivos parâmetros obrigatórios, use o comando seguinte:

kubectl describe constrainttemplate CONSTRAINT_TEMPLATE_NAME

Também pode ver todos os modelos de restrições na biblioteca.

Defina uma restrição

Define uma restrição através de YAML e não precisa de compreender nem escrever Rego. Em alternativa, uma restrição invoca um modelo de restrição e fornece-lhe parâmetros específicos da restrição.

Se estiver a usar a sincronização de configuração com um repositório hierárquico, recomendamos que crie as restrições no diretório cluster/.

As restrições têm os seguintes campos:

  • O valor kind em letras minúsculas corresponde ao nome de um modelo de restrição.
  • O elemento metadata.name é o nome da restrição.
  • O campo match define a que objetos a restrição se aplica. Todas as condições especificadas têm de ser correspondidas antes de um objeto estar no âmbito de uma restrição. match As condições são definidas pelos seguintes subcampos:
    • kinds são os tipos de recursos aos quais a restrição se aplica, determinados por dois campos: apiGroups é uma lista de grupos de API Kubernetes que correspondem e kinds é uma lista de tipos que correspondem. "*" corresponde a tudo. Se, pelo menos, uma entrada apiGroup e uma entrada kind corresponderem, a condição kinds é satisfeita.
    • scope aceita *, Cluster ou Namespaced, o que determina se são selecionados recursos com âmbito de cluster ou com âmbito de espaço de nomes (predefinição: *).
    • namespaces é uma lista de nomes de espaços de nomes aos quais o objeto pode pertencer. O objeto tem de pertencer a, pelo menos, um destes namespaces. Os recursos do espaço de nomes são tratados como se fossem autónomos.
    • excludedNamespaces é uma lista de espaços de nomes aos quais o objeto não pode pertencer.
    • labelSelector é um seletor de etiquetas do Kubernetes que o objeto tem de cumprir.
    • namespaceSelector é um seletor de etiquetas no espaço de nomes ao qual o objeto pertence. Se o espaço de nomes não satisfizer o objeto, não vai haver correspondência. Os recursos de espaço de nomes são tratados como se pertencessem a si próprios.
  • O campo parameters define os argumentos para a restrição, com base no que o modelo de restrição espera.

A seguinte restrição, denominada ns-must-have-geo, invoca um modelo de restrição denominado K8sRequiredLabels, que está incluído na biblioteca de modelos de restrições fornecida pela Google. A restrição define parâmetros que o modelo de restrição usa para avaliar se os espaços de nomes têm a etiqueta geo definida para algum valor.

# ns-must-have-geo.yaml

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
  name: ns-must-have-geo
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Namespace"]
  parameters:
    labels:
      - key: "geo"

Para criar a restrição, use kubectl apply -f:

kubectl apply -f ns-must-have-geo.yaml

Audite uma restrição

Se a restrição estiver configurada e instalada corretamente, o respetivo campo status.byPod[].enforced é definido como true, quer a restrição esteja configurada para aplicar ou apenas testar a restrição.

As restrições são aplicadas por predefinição e uma violação de uma restrição impede uma determinada operação de cluster. Pode definir o spec.enforcementAction de uma restrição como dryrun para denunciar violações no campo status.violations sem impedir a operação.

Para saber mais sobre a auditoria, consulte o artigo Audite através de restrições.

Advertências ao sincronizar restrições

Se estiver a sincronizar as restrições com uma origem centralizada, como um repositório Git, com o Config Sync ou outra ferramenta no estilo GitOps, tenha em atenção as seguintes ressalvas ao sincronizar as restrições.

Consistência eventual

Pode consolidar restrições numa fonte de verdade, como um repositório Git, e pode limitar os respetivos efeitos através de ClusterSelectors ou NamespaceSelectors. Uma vez que a sincronização é eventualmente consistente, tenha em atenção as seguintes ressalvas:

  • Se uma operação de cluster acionar uma restrição cujo NamespaceSelector se refere a um espaço de nomes que não foi sincronizado, a restrição é aplicada e a operação é impedida. Por outras palavras, um espaço de nomes em falta "falha fechado".
  • Se alterar as etiquetas de um espaço de nomes, a cache pode conter dados desatualizados durante um breve período.

Minimize a necessidade de mudar o nome de um espaço de nomes ou alterar as respetivas etiquetas e teste as restrições que afetam um espaço de nomes com o nome alterado ou reetiquetado para garantir que funcionam conforme esperado.

Configure o Policy Controller para restrições referenciais

Antes de poder ativar as restrições referenciais, tem de criar uma configuração que indique ao Policy Controller que tipos de objetos monitorizar, como os espaços de nomes.

Guarde o seguinte manifesto YAML num ficheiro e aplique-o com kubectl. O manifesto configura o controlador de políticas para monitorizar os espaços de nomes e as entradas. Crie uma entrada com group, version e kind em spec.sync.syncOnly, com os valores para cada tipo de objeto que quer monitorizar.

apiVersion: config.gatekeeper.sh/v1alpha1
kind: Config
metadata:
  name: config
  namespace: "gatekeeper-system"
spec:
  sync:
    syncOnly:
      - group: ""
        version: "v1"
        kind: "Namespace"
      - group: "extensions"
        version: "v1beta1"
        kind: "Ingress"

Ative as restrições referenciais

Uma restrição referencial faz referência a outro objeto na respetiva definição. Por exemplo, pode criar uma restrição que exija que os objetos Ingress num cluster tenham nomes de anfitriões exclusivos. A restrição é referencial se o respetivo modelo de restrição contiver a string data.inventory no Rego.

As restrições referenciais estão ativadas por predefinição se instalar o Policy Controller através da Google Cloud consola. Se instalar o Policy Controller através da Google Cloud CLI, pode optar por ativar as restrições referenciais quando instalar o Policy Controller. As restrições referenciais só têm garantia de consistência eventual e isto cria riscos:

  • Num servidor de API sobrecarregado, o conteúdo da cache do Policy Controller pode ficar desatualizado, o que faz com que uma restrição referencial "falhe ao abrir", o que significa que a ação de aplicação parece estar a funcionar quando não está. Por exemplo, pode criar entradas com nomes de anfitrião duplicados demasiado rapidamente para permitir que o controlador de admissão detete os duplicados.

  • A ordem pela qual as restrições são instaladas e a ordem pela qual a cache é atualizada são aleatórias.

Pode atualizar um cluster existente para permitir restrições referenciais.

Consola

Para desativar as restrições referenciais, conclua os passos seguintes:

  1. Na Google Cloud consola, aceda à página Política na secção Gestão de postura.

    Aceder à política

  2. No separador Definições, na tabela de clusters, selecione Editar na coluna Editar configuração.
  3. Expanda o menu Editar configuração do Policy Controller.
  4. Selecione a caixa de verificação Ativar modelos de restrições que fazem referência a objetos que não sejam o objeto que está a ser avaliado.
  5. Selecione Guardar alterações.

gcloud

Para ativar o suporte para restrições referenciais, execute o seguinte comando:

gcloud container fleet policycontroller update \
    --memberships=MEMBERSHIP_NAME \
    --referential-rules

Substitua MEMBERSHIP_NAME pelo nome da associação do cluster registado para ativar as regras referenciais. Pode especificar várias subscrições separadas por uma vírgula.

Desative as restrições referenciais

Quando desativa as restrições referenciais, todos os modelos que usam restrições referenciais também são removidos do cluster, juntamente com todas as restrições que usam esses modelos.

Consola

As restrições referenciais estão ativadas por predefinição quando instala o Policy Controller com a consola. Google Cloud Para desativar as restrições referenciais, conclua os passos seguintes:

  1. Na Google Cloud consola, aceda à página Política na secção Gestão de postura.

    Aceder à política

  2. No separador Definições, na tabela de clusters, selecione Editar na coluna Editar configuração.
  3. Expanda o menu Editar configuração do Policy Controller.
  4. Desmarque a caixa de verificação Ativar modelos de restrições que fazem referência a objetos que não sejam o objeto que está a ser avaliado.
  5. Selecione Guardar alterações.

gcloud

Para desativar o suporte para restrições referenciais, execute o seguinte comando:

gcloud container fleet policycontroller update \
    --memberships=MEMBERSHIP_NAME \
    --no-referential-rules

Substitua MEMBERSHIP_NAME pelo nome da associação do cluster registado para ativar as regras referenciais. Pode especificar várias subscrições separadas por uma vírgula.

Apresente todas as restrições

Para apresentar uma lista de todas as restrições instaladas num cluster, use o seguinte comando:

kubectl get constraint

Também pode ver uma vista geral das restrições aplicadas na Google Cloud consola. Para mais informações, consulte o artigo Métricas do Policy Controller.

Remova uma restrição

Para encontrar todas as restrições que usam um modelo de restrição, use o seguinte comando para listar todos os objetos com o mesmo kind que o metadata.name do modelo de restrição:

kubectl get CONSTRAINT_TEMPLATE_NAME

Para remover uma restrição, especifique o respetivo kind e name:

kubectl delete CONSTRAINT_TEMPLATE_NAME CONSTRAINT_NAME

Quando remove uma restrição, esta deixa de ser aplicada assim que o servidor da API marca a restrição como eliminada.

Remova todos os modelos de restrições

Consola

Para desativar a biblioteca de modelos de restrições, conclua os seguintes passos:

  1. Na Google Cloud consola, aceda à página Política na secção Gestão de postura.

    Aceder à política

  2. No separador Definições, na tabela de clusters, selecione Editar na coluna Editar configuração.
  3. No menu Adicionar/editar conjuntos de políticas, desative a biblioteca de modelos e todos os conjuntos de políticas .
  4. Selecione Guardar alterações.

gcloud

Para desativar a biblioteca de modelos de restrições, execute o seguinte comando:

gcloud container fleet policycontroller content templates disable \
    --memberships=MEMBERSHIP_NAME

Substitua MEMBERSHIP_NAME pelo nome da subscrição do cluster registado no qual quer desativar a biblioteca de modelos de restrições. Pode especificar várias associações separadas por uma vírgula.

Restaure a biblioteca de modelos de restrições

Consola

Para ativar a biblioteca de modelos de restrições, conclua os seguintes passos:

  1. Na Google Cloud consola, aceda à página Política na secção Gestão de postura.

    Aceder à política

  2. No separador Definições, na tabela de clusters, selecione Editar na coluna Editar configuração.
  3. No menu Adicionar/editar pacotes de políticas, ative a biblioteca de modelos . Também pode ativar qualquer um ou todos os conjuntos de políticas.
  4. Selecione Guardar alterações.

gcloud

Para restaurar a biblioteca de modelos de restrições, execute o seguinte comando:

gcloud container fleet policycontroller content templates enable \
    --memberships=MEMBERSHIP_NAME

Substitua MEMBERSHIP_NAME pelo nome da associação do cluster registado para ativar a biblioteca de modelos de restrições. Pode especificar várias associações separadas por uma vírgula.

O que se segue?