Como usar restrições para garantir a segurança do pod

Este tópico ilustra como usar restrições do Policy Controller para conseguir muitas das mesmas proteções que o PodSecurityPolicies, com a capacidade adicional de testar suas políticas antes de aplicá-las. Os exemplos neste tópico não cobrem todas as restrições relacionadas, mas mostram como começar.

Antes de começar

Instale o Policy Controller em um de seus clusters registrados no Anthos Config Management. Certifique-se de deixar a biblioteca de modelos de restrição ativada.

O código-fonte dos modelos de restrições e das restrições discutidos neste tópico está disponível no diretório pod-security-policy do repositório do projeto Gatekeeper. Cada um dos modelos de restrição também inclui testes de unidade.

Como impedir que os Pods executem contêineres privilegiados

Um exemplo no tópico PodSecurityPolicies impede que os Pods executem contêineres privilegiados. Isso é recomendado, porque contêineres privilegiados podem afetar potencialmente o sistema operacional do host no nó ou outras cargas de trabalho em execução no nó.

Essa restrição reimplementa a mesma restrição, usando o modelo de restrição K8sPSPPrivilegedContainer:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPPrivilegedContainer
metadata:
  name: psp-privileged-container
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]

Como exigir um Sistema de Arquivos Raiz Somente Leitura no Contêiner

Por padrão, um contêiner pode gravar em seu sistema de arquivos raiz. Além das preocupações de segurança, isso pode causar gargalos de desempenho devido à latência de gravação na camada gravável do contêiner. Você pode exigir um sistema de arquivos raiz somente leitura em contêineres usando um PodSecurityPolicy ou usando uma restrição. Essa restrição usa o modelo de restrição K8sPSPReadOnlyRootFilesystem.

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPReadOnlyRootFilesystem
metadata:
  name: psp-readonlyrootfilesystem
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]

Como restringir os tipos de volumes que um contêiner pode montar

Por padrão, um contêiner pode montar qualquer tipo de volume registrado com a API Kubernetes no cluster. Essa restrição restringe os contêineres a um conjunto limitado de tipos de volume, usando o modelo de restrição K8sPSPVolumeTypes.

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPVolumeTypes
metadata:
  name: psp-volume-types
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
  parameters:
    volumes:
    # - "*" # * may be used to allow all volume types
    - configMap
    - emptyDir
    - projected
    - secret
    - downwardAPI
    - persistentVolumeClaim
    #- hostPath #required for allowedHostPaths
    - flexVolume #required for allowedFlexVolumes

Resultados da auditoria

É possível testar a eficácia das restrições sem interromper as cargas de trabalho ativas usando a ação de aplicação dryrun. Isso produz resultados de auditoria para suas políticas sem bloquear ativamente. Para saber mais, consulte Como auditar usando restrições.

A seguir