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

Nesta página, mostramos como usar as restrições do Policy Controller para ter muitas das mesmas proteções do PodSecurityPolicies, com a capacidade extra de testar suas políticas antes de aplicá-las. Os exemplos neste documento não abrangem todas as restrições relacionadas, mas mostram como começar.

O código-fonte das restrições e dos modelos de restrição discutidos neste documento está disponível no pod-security-policy (em inglês) do repositório do projeto do Gakeeper. Cada um dos modelos de restrição também inclui testes de unidade.

Antes de começar

Como impedir que os Pods executem contêineres privilegiados

Recomendamos que você impeça os pods de executar contêineres privilegiados, já que eles podem afetar o sistema operacional do host no nó ou outras cargas de trabalho em execução no nó.

Essa restrição impede que os pods executem contêineres privilegiados 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"]
    excludedNamespaces: ["kube-system"]

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. É possível exigir um sistema de arquivos raiz somente leitura em contêineres usando um PodSecurityPolicy ou 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:
    # - "*" # * can 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 bloqueio ativo. Para saber mais, consulte Como fazer auditoria usando restrições.

A seguir