Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Visão geral da biblioteca de regras de política de segurança de contêineres

Última atualização: Jun 27, 2026

Valide solicitações de implantação e atualização de pods com base em 54 políticas predefinidas do Gatekeeper, organizadas em cinco categorias integradas: Compliance, Infra, K8s-general, PSP e FinOps.

Categorias de políticas

Categoria

Descrição

Compliance

Políticas baseadas em padrões de conformidade, como o Alibaba Cloud Kubernetes Security Hardening.

Infra

Protege recursos da infraestrutura de nuvem.

K8s-general

Restringe e padroniza configurações sensíveis em clusters ACK para fortalecer a segurança das aplicações no cluster.

PSP

Substitui as políticas de segurança de pod (PSPs) do Kubernetes e oferece restrições equivalentes às do gerenciamento legado de políticas do ACK.

Políticas de segurança predefinidas

As cinco categorias abrangem 54 políticas predefinidas.

Categoria

Política

Descrição

Severidade

Compliance

ACKNoEnvVarSecrets

Impede o uso de secretKeyRef para referenciar Secrets em variáveis de ambiente de pods.

Média

Compliance

ACKPodsRequireSecurityContext

Exige que pods em namespaces especificados incluam um securityContext.

Baixa

Compliance

ACKRestrictNamespaces

Bloqueia a implantação de tipos de recursos específicos em namespaces definidos.

Baixa

Compliance

ACKRestrictRoleBindings

Limita RoleBindings em namespaces específicos para vincular apenas funções ou cluster roles permitidas.

Alta

Compliance

ACKNamespacesDeleteProtection

Evita a exclusão de namespaces especificados.

Média

Compliance

ACKServicesDeleteProtection

Protege instâncias de Service contra exclusão em namespaces definidos.

Média

Infra

ACKBlockProcessNamespaceSharing

Proíbe pods em namespaces específicos de usar shareProcessNamespace.

Alta

Infra

ACKEmptyDirHasSizeLimit

Torna obrigatório definir sizeLimit ao montar volumes emptyDir.

Baixa

Infra

ACKLocalStorageRequireSafeToEvict

Requer a anotação cluster-autoscaler.kubernetes.io/safe-to-evict: "true" em pods que montam volumes hostPath ou emptyDir.

Baixa

Infra

ACKOSSStorageLocationConstraint

Controla quais regiões de buckets do OSS podem ser montadas em pods de namespaces específicos.

Baixa

Infra

ACKPVSizeConstraint

Define uma capacidade máxima de disco para persistent volumes (PVs) no cluster.

Média

Infra

ACKPVCConstraint

Restringe os namespaces onde persistent volume claims (PVCs) podem ser implantados e estabelece um limite de capacidade para PVs.

Média

Infra

ACKBlockVolumeTypes

Veda o uso de tipos de volume especificados por pods em namespaces definidos.

Média

K8s-general

ACKAllowedRepos

Permite que pods em namespaces específicos baixem imagens apenas de repositórios autorizados.

Alta

K8s-general

ACKBlockAutoinjectServiceEnv

Exige enableServiceLinks: false nos pods para evitar a injeção de endereços IP de Services nas variáveis de ambiente.

Baixa

K8s-general

ACKBlockAutomountToken

Impõe automountServiceAccountToken: false nos pods para impedir a montagem automática de tokens de conta de serviço.

Alta

K8s-general

ACKBlockEphemeralContainer

Bloqueia a criação de contêineres efêmeros em pods de namespaces específicos.

Média

K8s-general

ACKBlockLoadBalancer

Impede a implantação de Services do tipo LoadBalancer em namespaces definidos.

Alta

K8s-general

ACKBlockNodePort

Veta a criação de Services do tipo NodePort em namespaces especificados.

Alta

K8s-general

ACKContainerLimits

Torna obrigatória a definição de limits de recursos para todos os contêineres em pods de namespaces específicos.

Baixa

K8s-general

ACKExternalIPs

Restringe Services em namespaces específicos ao uso exclusivo de endereços IP externos listados na política.

Alta

K8s-general

ACKImageDigests

Obriga pods em namespaces definidos a utilizar imagens com digests no formato especificado.

Baixa

K8s-general

ACKRequiredLabels

Exige que pods em namespaces específicos possuam rótulos correspondentes à política.

Baixa

K8s-general

ACKRequiredProbes

Determina que pods em namespaces definidos tenham tipos específicos de readiness probes e liveness probes.

Média

K8s-general

ACKCheckNginxPath

Bloqueia valores de alto risco em spec.rules[].http.paths[].path para recursos Ingress. Ative para versões do Ingress-nginx anteriores a 1.2.1.

Alta

K8s-general

ACKCheckNginxAnnotation

Impede valores de alto risco em metadata.annotations para recursos Ingress. Ative para versões do Ingress-nginx anteriores a 1.2.1.

Alta

K8s-general

ACKBlockInternetLoadBalancer

Bloqueia a criação de Services LoadBalancer acessíveis pela internet.

Alta

K8s-general

RatifyVerification

Utiliza o Ratify para verificar assinaturas de imagens ou metadados de segurança (como SBOM) em pods de namespaces específicos.

Alta

PSP

ACKPSPAllowPrivilegeEscalationContainer

Exige a configuração allowPrivilegeEscalation em pods de namespaces definidos.

Média

PSP

ACKPSPAllowedUsers

Requer as definições de user, group, supplementalGroups e fsGroup em pods de namespaces específicos.

Média

PSP

ACKPSPAppArmor

Torna obrigatórias as configurações de AppArmor em pods de namespaces definidos.

Baixa

PSP

ACKPSPCapabilities

Exige a definição de capabilities do Linux em pods de namespaces específicos.

Alta

PSP

ACKPSPFSGroup

Obriga pods em namespaces definidos a usar configurações fsGroup compatíveis com a política.

Média

PSP

ACKPSPFlexVolumes

Restringe pods em namespaces específicos ao uso exclusivo de drivers FlexVolume listados na política.

Média

PSP

ACKPSPForbiddenSysctls

Bloqueia o uso de sysctls especificados por pods em namespaces definidos.

Alta

PSP

ACKPSPHostFilesystem

Aplica condições aos volumes hostPath montados em pods de namespaces específicos.

Alta

PSP

ACKPSPHostNamespace

Impede que pods em namespaces definidos compartilhem namespaces do host.

Alta

PSP

ACKPSPHostNetworkingPorts

Controla se pods em namespaces específicos podem usar a rede do host e portas determinadas.

Alta

PSP

ACKPSPPrivilegedContainer

Veda a execução de contêineres privilegiados em pods de namespaces definidos.

Alta

PSP

ACKPSPProcMount

Exige que pods em namespaces específicos usem o tipo Proc Mount definido na política.

Baixa

PSP

ACKPSPReadOnlyRootFilesystem

Obriga pods em namespaces definidos a executar com sistemas de arquivos raiz somente leitura.

Média

PSP

ACKPSPSELinuxV2

Limita pods em namespaces específicos às opções SELinux listadas na política.

Baixa

PSP

ACKPSPSeccomp

Requer o uso de perfis seccomp especificados em pods de namespaces definidos.

Baixa

PSP

ACKPSPVolumeTypes

Restringe pods em namespaces específicos à montagem de volumes apenas dos tipos permitidos.

Média

Compliance

ACKNoEnvVarSecrets

Impede o uso de secretKeyRef para referenciar Secrets em variáveis de ambiente de pods.

Severidade: Média

Parâmetros: Nenhum

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKNoEnvVarSecrets
metadata:
  name: no-env-var-secrets
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces: ["test-gatekeeper"]

Permitido — secrets montados como volume:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
  namespace: test-gatekeeper
spec:
  containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
  volumes:
  - name: foo
    secret:
      secretName: mysecret
      items:
      - key: username
        path: my-group/my-username

Não permitido — secrets referenciados via secretKeyRef em variáveis de ambiente:

apiVersion: v1
kind: Pod
metadata:
  name: bad
  namespace: test-gatekeeper
spec:
  containers:
  - name: mycontainer
    image: redis
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password
  restartPolicy: Never

ACKPodsRequireSecurityContext

Exige que pods em namespaces especificados incluam um securityContext.

Severidade: Baixa

Parâmetros: Nenhum

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKPodsRequireSecurityContext
metadata:
  name: pods-require-security-context
  annotations:
    description: "Requires that Pods must have a `securityContext` defined."
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces: ["test-gatekeeper"]

Permitido — securityContext presente no nível do pod:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: test
  namespace: test-gatekeeper
spec:
  securityContext:
    runAsNonRoot: false
  containers:
  - image: test
    name: test
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}

Não permitido — securityContext definido apenas no contêiner, não no pod:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: bad
  namespace: non-test-gatekeeper
spec:
  containers:
  - image: test
    name: test2
  - image: test
    name: test
    resources: {}
    securityContext:
      runAsNonRoot: false

ACKRestrictNamespaces

Bloqueia a implantação de tipos de recursos específicos em namespaces definidos.

Severidade: Baixa

Parâmetros:

Parâmetro

Tipo

Descrição

restrictedNamespaces

array

Namespaces onde os tipos de recursos correspondentes não podem ser implantados.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKRestrictNamespaces
metadata:
  name: restrict-default-namespace
  annotations:
    description: "Restricts resources from using the restricted namespace."
spec:
  match:
    kinds:
      - apiGroups: ['']
        kinds: ['Pod']
  parameters:
    restrictedNamespaces:
      - "test-gatekeeper"

Permitido — pod em um namespace não restrito:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: test
  namespace: non-test-gatekeeper
spec:
  containers:
  - image: test
    name: test
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}

Não permitido — pod no namespace restrito:

apiVersion: v1
kind: Pod
metadata:
  name: bad
  namespace: test-gatekeeper
spec:
  containers:
  - name: mycontainer
    image: redis
  restartPolicy: Never

ACKRestrictRoleBindings

Limita RoleBindings em namespaces específicos para vincular apenas funções ou cluster roles permitidas.

Severidade: Alta

Parâmetros:

Parâmetro

Tipo

Descrição

restrictedRole

object

A cluster role ou role que não pode ser vinculada.

allowedSubjects

array

Subjects autorizados a receber o vínculo.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKRestrictRoleBindings
metadata:
  name: restrict-clusteradmin-rolebindings
  annotations:
    description: "Restricts use of sensitive role in specific rolebinding."
spec:
  match:
    kinds:
      - apiGroups: ["rbac.authorization.k8s.io"]
        kinds: ["RoleBinding"]
  parameters:
    restrictedRole:
      apiGroup: "rbac.authorization.k8s.io"
      kind: "ClusterRole"
      name: "cluster-admin"
    allowedSubjects:
      - apiGroup: "rbac.authorization.k8s.io"
        kind: "Group"
        name: "system:masters"

Permitido — o vínculo utiliza um subject autorizado:

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: good-2
  namespace: test-gatekeeper
subjects:
  - kind: Group
    name: 'system:masters'
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

Não permitido — o vínculo usa um subject não listado em allowedSubjects:

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: bad-1
  namespace: test-gatekeeper
subjects:
  - kind: ServiceAccount
    name: policy-template-controller
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io

ACKNamespacesDeleteProtection

Evita a exclusão de namespaces especificados.

Severidade: Média

Requer Gatekeeper 3.10.0.130-g0e79597d-aliyun ou superior.

Parâmetros:

Parâmetro

Tipo

Descrição

protectionNamespaces

array

Nomes dos namespaces protegidos contra exclusão.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKNamespacesDeleteProtection
metadata:
  name: namespace-delete-protection
spec:
  match:
    kinds:
      - apiGroups: ['']
        kinds: ['Namespace']
  parameters:
    protectionNamespaces:
      - test-gatekeeper

Permitido — namespace fora da lista de proteção:

apiVersion: v1
kind: Namespace
metadata:
  name: will-delete

Não permitido — namespace incluído na lista de proteção:

apiVersion: v1
kind: Namespace
metadata:
  name: test-gatekeeper

ACKServicesDeleteProtection

Protege instâncias de Service contra exclusão em namespaces definidos.

Severidade: Média

Parâmetros:

Parâmetro

Tipo

Descrição

protectionServices

array

Nomes das instâncias de Service protegidas contra exclusão.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKServicesDeleteProtection
metadata:
  name: service-delete-protection
  annotations:
    description: "Protect to delete specific service."
spec:
  enforcementAction: deny
  match:
    kinds:
      - apiGroups: ['']
        kinds: ['Service']
    namespaces: ["test-gatekeeper"]
  parameters:
    protectionServices:
      - test-svc

Permitido — Service fora da lista de proteção:

apiVersion: v1
kind: Service
metadata:
  name: good
  namespace: test-gatekeeper

Não permitido — Service incluído na lista de proteção:

apiVersion: v1
kind: Service
metadata:
  name: test-svc

Infra

ACKBlockProcessNamespaceSharing

Proíbe pods em namespaces específicos de usar shareProcessNamespace.

Severidade: Alta

Parâmetros: Nenhum

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKBlockProcessNamespaceSharing
metadata:
  name: block-share-process-namespace
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces: ["test-gatekeeper"]

Permitido — shareProcessNamespace não definido:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: test-3
  namespace: test-gatekeeper
spec:
  containers:
  - image: test
    name: test
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}

Não permitido — shareProcessNamespace: true definido no pod:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: bad
  namespace: test-gatekeeper
spec:
  shareProcessNamespace: true
  containers:
  - image: test
    name: test
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}

ACKEmptyDirHasSizeLimit

Torna obrigatório definir sizeLimit ao montar volumes emptyDir.

Severidade: Baixa

Parâmetros: Nenhum

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKEmptyDirHasSizeLimit
metadata:
  name: empty-dir-has-sizelimit
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces: ["test-gatekeeper"]

Permitido — volume emptyDir com sizeLimit definido:

apiVersion: v1
kind: Pod
metadata:
  name: test-1
  namespace: test-gatekeeper
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir:
      sizeLimit: "10Mi"

Não permitido — volume emptyDir sem sizeLimit:

apiVersion: v1
kind: Pod
metadata:
  name: bad
  namespace: test-gatekeeper
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

ACKLocalStorageRequireSafeToEvict

Requer a anotação cluster-autoscaler.kubernetes.io/safe-to-evict: "true" em pods de namespaces específicos. Por padrão, o Cluster Autoscaler ignora pods com volumes hostPath ou emptyDir; essa anotação permite a evicção desses pods durante o dimensionamento.

Severidade: Baixa

Parâmetros: Nenhum

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKLocalStorageRequireSafeToEvict
metadata:
  name: local-storage-require-safe-to-evict
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces: ["test-gatekeeper"]

Permitido — pod possui a anotação safe-to-evict:

apiVersion: v1
kind: Pod
metadata:
  name: test-1
  namespace: test-gatekeeper
  annotations:
    'cluster-autoscaler.kubernetes.io/safe-to-evict': 'true'
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      path: /data
      type: Directory

Não permitido — pod monta um volume, mas não possui a anotação:

apiVersion: v1
kind: Pod
metadata:
  name: bad
  namespace: test-gatekeeper
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

ACKOSSStorageLocationConstraint

Controla quais regiões de buckets do OSS podem ser montadas em pods de namespaces específicos.

Severidade: Baixa

Parâmetros:

Parâmetro

Tipo

Descrição

mode

string

allowlist (padrão) ativa o modo de lista de permissões; qualquer outro valor ativa o modo de lista de bloqueios.

regions

array

IDs das regiões a incluir na lista de permissões ou de bloqueios.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKOSSStorageLocationConstraint
metadata:
  name: restrict-oss-location
  annotations:
    description: "Restricts location of oss storage in cluster."
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["PersistentVolume", "Pod"]
    namespaces:
      - "test-gatekeeper"
  parameters:
    mode: "allowlist"
    regions:
      - "cn-beijing"

Permitido — bucket do OSS em uma região autorizada (cn-beijing):

apiVersion: v1
kind: Pod
metadata:
  name: pod-oss-csi-good
  namespace: test-gatekeeper
spec:
  containers:
    - name: test
      image: test
  volumes:
    - name: test
      csi:
        driver: ossplugin.csi.alibabacloud.com
        volumeAttributes:
          bucket: "oss"
          url: "oss-cn-beijing.aliyuncs.com"
          otherOpts: "-o max_stat_cache_size=0 -o allow_other"
          path: "/"

Não permitido — bucket do OSS em uma região não autorizada (cn-hangzhou):

apiVersion: v1
kind: Pod
metadata:
  name: pod-oss-csi
  namespace: test-gatekeeper
spec:
  containers:
    - name: test
      image: test
  volumes:
    - name: test
      csi:
        driver: ossplugin.csi.alibabacloud.com
        volumeHandle: pv-oss
        nodePublishSecretRef:
          name: oss-secret
          namespace: default
        volumeAttributes:
          bucket: "oss"
          url: "oss-cn-hangzhou.aliyuncs.com"
          otherOpts: "-o max_stat_cache_size=0 -o allow_other"
          path: "/"

ACKPVSizeConstraint

Define uma capacidade máxima de disco para persistent volumes (PVs) no cluster.

Severidade: Média

Parâmetros:

Parâmetro

Tipo

Descrição

maxSize

string

Capacidade máxima de disco para PVs. Padrão: 50Gi.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKPVSizeConstraint
metadata:
  name: limit-pv-size
  annotations:
    description: "Limit the pv storage capacity size within a specified maximum amount."
spec:
  enforcementAction: deny
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["PersistentVolume"]
  parameters:
    maxSize: "50Gi"

Permitido — PV solicita 25 GiB, dentro do limite de 50 GiB:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-oss-csi
  labels:
    alicloud-pvname: pv-oss
spec:
  capacity:
    storage: 25Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: ossplugin.csi.alibabacloud.com
    volumeHandle: pv-oss
    nodePublishSecretRef:
      name: oss-secret
      namespace: default
    volumeAttributes:
      bucket: "oss"
      url: "oss-cn-beijing.aliyuncs.com"
      otherOpts: "-o max_stat_cache_size=0 -o allow_other"
      path: "/"

Não permitido — PV solicita 500 GiB, excedendo o limite:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-oss-csi-bad
  labels:
    alicloud-pvname: pv-oss
spec:
  capacity:
    storage: 500Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: ossplugin.csi.alibabacloud.com
    volumeHandle: pv-oss
    nodePublishSecretRef:
      name: oss-secret
      namespace: default
    volumeAttributes:
      bucket: "oss"
      url: "oss-cn-beijing.aliyuncs.com"
      otherOpts: "-o max_stat_cache_size=0 -o allow_other"
      path: "/"

ACKPVCConstraint

Restringe os namespaces onde persistent volume claims (PVCs) podem ser implantados e estabelece um limite de capacidade para PVs.

Severidade: Média

Parâmetros:

Parâmetro

Tipo

Descrição

maxSize

string

Capacidade máxima de disco para PVs. Padrão: 50Gi.

allowNamespaces

array

Namespaces onde PVCs podem ser implantados.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKPVCConstraint
metadata:
  name: limit-pvc-size-and-ns
  annotations:
    description: "Limit the maximum pvc storage capacity size and the namespace whitelists that can be deployed."
spec:
  enforcementAction: deny
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["PersistentVolumeClaim"]
  parameters:
    maxSize: "50Gi"
    allowNamespaces:
      - "test-gatekeeper"

Permitido — PVC em um namespace autorizado e dentro do limite de tamanho:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: disk-pvc
  namespace: test-gatekeeper
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi

Não permitido — PVC excede o limite de tamanho ou está em um namespace não listado em allowNamespaces:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: bad-disk-pvc
  namespace: test-gatekeeper
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 200Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: bad-namespace-pvc
  namespace: test-gatekeeper-bad
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi

ACKBlockVolumeTypes

Veda o uso de tipos de volume especificados por pods em namespaces definidos.

Severidade: Média

Parâmetros:

Parâmetro

Tipo

Descrição

volumes

array

Tipos de volume proibidos para uso pelos pods.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKBlockVolumeTypes
metadata:
  name: block-volume-types
spec:
  enforcementAction: deny
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces: ["test-gatekeeper"]
  parameters:
    volumes:
      - "gitRepo"

Permitido — pod usa volume emptyDir (não bloqueado):

apiVersion: v1
kind: Pod
metadata:
  name: use-empty-dir
  namespace: test-gatekeeper
spec:
  containers:
    - name: test
      image: test
  volumes:
  - name: emptydir-volume
    emptyDir: {}

Não permitido — pod usa volume gitRepo (bloqueado):

apiVersion: v1
kind: Pod
metadata:
  name: use-git-repo
  namespace: test-gatekeeper
spec:
  containers:
    - name: test
      image: test
  volumes:
  - name: git-volume
    gitRepo:
      repository: "git@***:***/my-git-repository.git"
      revision: "22f1d8406d464b0c08***"

K8s-general

ACKAllowedRepos

Permite que pods em namespaces específicos baixem imagens apenas de repositórios autorizados.

Severidade: Alta

Parâmetros:

Parâmetro

Tipo

Descrição

repos

array

Repositórios de imagens autorizados para download pelos pods.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKAllowedRepos
metadata:
  name: allowed-repos
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "test-gatekeeper"
  parameters:
    repos:
      - "registry-vpc.cn-hangzhou.aliyuncs.com/acs/"
      - "registry.cn-hangzhou.aliyuncs.com/acs/"

Permitido — imagens baixadas de repositórios autorizados:

apiVersion: v1
kind: Pod
metadata:
  name: pod-01
  namespace: test-gatekeeper
spec:
  containers:
  - image: registry.cn-hangzhou.aliyuncs.com/acs/test-webserver
    name: test-container-1
  initContainers:
  - image: registry.cn-hangzhou.aliyuncs.com/acs/test-webserver
    name: test-container

Não permitido — imagens baixadas de um repositório não autorizado:

apiVersion: v1
kind: Pod
metadata:
  name: bad-1
  namespace: test-gatekeeper
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
  initContainers:
  - image: k8s.gcr.io/test-webserver
    name: test-container-3

ACKBlockAutoinjectServiceEnv

Exige enableServiceLinks: false nos pods de namespaces específicos para evitar a injeção de endereços IP de Services nas variáveis de ambiente.

Severidade: Baixa

Parâmetros: Nenhum

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKBlockAutoinjectServiceEnv
metadata:
  name: block-auto-inject-service-env
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "test-gatekeeper"

Permitido — enableServiceLinks: false definido:

apiVersion: v1
kind: Pod
metadata:
  name: pod-0
  namespace: test-gatekeeper
spec:
  enableServiceLinks: false
  containers:
  - image: openpolicyagent/test-webserver:1.0
    name: test-container

Não permitido — enableServiceLinks não definido:

apiVersion: v1
kind: Pod
metadata:
  name: bad-1
  namespace: test-gatekeeper
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container

ACKBlockAutomountToken

Impõe automountServiceAccountToken: false nos pods de namespaces específicos para impedir a montagem automática de tokens de conta de serviço.

Severidade: Alta

Parâmetros: Nenhum

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKBlockAutomountToken
metadata:
  name: block-auto-mount-service-account-token
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "test-gatekeeper"

Permitido — automountServiceAccountToken: false definido:

apiVersion: v1
kind: Pod
metadata:
  name: pod-0
  namespace: test-gatekeeper
spec:
  automountServiceAccountToken: false
  containers:
  - image: openpolicyagent/test-webserver:v1.0
    name: test-container

Não permitido — automountServiceAccountToken não definido como false:

apiVersion: v1
kind: Pod
metadata:
  name: bad-1
  namespace: test-gatekeeper
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container

ACKBlockEphemeralContainer

Bloqueia a criação de contêineres efêmeros em pods de namespaces específicos.

Severidade: Média

Parâmetros: Nenhum

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKBlockEphemeralContainer
metadata:
  name: block-ephemeral-container
spec:
  enforcementAction: deny
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "test-gatekeeper"

Permitido — nenhum contêiner efêmero presente:

apiVersion: v1
kind: Pod
metadata:
  name: good-1
  namespace: test-gatekeeper
spec:
  containers:
  - name: mycontainer
    image: redis

Não permitido — pod inclui contêineres efêmeros:

apiVersion: v1
kind: Pod
metadata:
  name: bad-1
  namespace: non-test-gatekeeper
spec:
  containers:
  - name: mycontainer
    image: redis
  ephemeralContainers:
    - name: test
      image: test

ACKBlockLoadBalancer

Impede a implantação de Services do tipo LoadBalancer em namespaces definidos.

Severidade: Alta

Parâmetros:

Parâmetro

Tipo

Descrição

restrictedNamespaces

array

Namespaces onde Services LoadBalancer não podem ser implantados.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKBlockLoadBalancer
metadata:
  name: block-load-balancer
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Service"]
    namespaces:
      - "test-gatekeeper"

Permitido — Service sem o tipo LoadBalancer:

apiVersion: v1
kind: Service
metadata:
  name: my-service-1
  namespace: test-gatekeeper
spec:
  selector:
    app: MyApp
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 9376

Não permitido — Service do tipo LoadBalancer:

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: test-gatekeeper
spec:
  type: LoadBalancer
  selector:
    app: MyApp
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 9376

ACKBlockNodePort

Veta a criação de Services do tipo NodePort em namespaces especificados.

Severidade: Alta

Parâmetros: Nenhum

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKBlockNodePort
metadata:
  name: block-node-port
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Service"]
    namespaces:
      - "test-gatekeeper"

Permitido — Service sem o tipo NodePort:

apiVersion: v1
kind: Service
metadata:
  name: my-service-1
  namespace: test-gatekeeper
spec:
  selector:
    app: MyApp
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 9376

Não permitido — Service do tipo NodePort:

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: test-gatekeeper
spec:
  type: NodePort
  selector:
    app: MyApp
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 9376

ACKContainerLimits

Torna obrigatória a definição de limits de recursos para todos os contêineres em pods de namespaces específicos.

Severidade: Baixa

Parâmetros: Nenhum

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKContainerLimits
metadata:
  name: container-must-have-limits
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "test-gatekeeper"
  parameters:
    cpu: "1000m"
    memory: "1Gi"

Permitido — contêiner com limites de recursos definidos:

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  namespace: test-gatekeeper
spec:
  containers:
  - image: openpolicyagent/test-webserver
    name: test-container
    resources:
      limits:
        memory: "100Mi"
        cpu: "500m"

Não permitido — limites do contêiner excedem os máximos da política:

apiVersion: v1
kind: Pod
metadata:
  name: pod-2
  namespace: non-test-gatekeeper
spec:
  containers:
  - image: openpolicyagent/test-webserver
    name: test-container
    resources:
      limits:
        memory: "100Gi"
        cpu: "2000m"

ACKExternalIPs

Restringe Services em namespaces específicos ao uso exclusivo de endereços IP externos listados na política.

Severidade: Alta

Parâmetros:

Parâmetro

Tipo

Descrição

allowedIPs

array

Endereços IP externos permitidos para uso pelos Services.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKExternalIPs
metadata:
  name: external-ips
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Service"]
    namespaces:
      - "test-gatekeeper"
  parameters:
    allowedIPs:
      - "192.168.0.5"

Permitido — Service sem IP externo:

apiVersion: v1
kind: Service
metadata:
  name: my-service-3
  namespace: test-gatekeeper
spec:
  selector:
    app: MyApp
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 9376

Não permitido — Service usa um IP externo não listado em allowedIPs:

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: test-gatekeeper
spec:
  selector:
    app: MyApp
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 9376
  externalIPs:
    - 80.11.XX.XX

ACKImageDigests

Obriga pods em namespaces definidos a utilizar imagens com digests no formato especificado.

Severidade: Baixa

Parâmetros: Nenhum

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKImageDigests
metadata:
  name: container-image-must-have-digest
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "test-gatekeeper"

Permitido — referência de imagem inclui digest:

apiVersion: v1
kind: Pod
metadata:
  name: pod-0
  namespace: test-gatekeeper
spec:
  containers:
  - image: openpolicyagent/test-webserver@sha256:12e469267d21d66ac9dcae33a4d3d202ccb2591869270b95d0aad7516c7d075b
    name: test-container

Não permitido — referência de imagem sem digest:

apiVersion: v1
kind: Pod
metadata:
  name: bad-1
  namespace: test-gatekeeper
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
  initContainers:
  - image: k8s.gcr.io/test-webserver
    name: test-container2

ACKRequiredLabels

Exige que pods em namespaces específicos possuam rótulos correspondentes à política.

Severidade: Baixa

Parâmetros:

Parâmetro

Tipo

Descrição

allowedRegex

string

Valores de rótulo obrigatórios expressos como expressão regular.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKRequiredLabels
metadata:
  name: must-have-label-test
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "test-gatekeeper"
  parameters:
    labels:
      - key: test
        allowedRegex: "^test.*$"

Permitido — pod possui rótulo correspondente à regex obrigatória:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  name: test
  namespace: test-gatekeeper
  labels:
    'test': 'test_233'
spec:
  containers:
  - name: mycontainer
    image: redis

Não permitido — valor do rótulo não corresponde à regex obrigatória:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  name: bad2
  namespace: test-gatekeeper
  labels:
    'test': '233'
spec:
  containers:
  - name: mycontainer
    image: redis

ACKRequiredProbes

Determina que pods em namespaces definidos tenham tipos específicos de readiness probes e liveness probes.

Severidade: Média

Parâmetros:

Parâmetro

Tipo

Descrição

probes

array

Tipos de probe obrigatórios. Valores válidos: readinessProbe, livenessProbe.

probeTypes

array

Tipos de implementação de probe obrigatórios. Valores válidos: tcpSocket, httpGet, exec.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKRequiredProbes
metadata:
  name: must-have-probes
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "test-gatekeeper"
  parameters:
    probes: ["readinessProbe", "livenessProbe"]
    probeTypes: ["tcpSocket", "httpGet", "exec"]

Permitido — contêiner possui readiness probe e liveness probe:

apiVersion: v1
kind: Pod
metadata:
  name: p4
  namespace: test-gatekeeper
spec:
  containers:
  - name: liveness
    image: k8s.gcr.io/busybox
    readinessProbe:
      exec:
        command:
          - cat
          - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5
    livenessProbe:
      exec:
        command:
          - cat
          - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

Não permitido — contêiner sem probes:

apiVersion: v1
kind: Pod
metadata:
  name: p1
  namespace: test-gatekeeper
spec:
  containers:
  - name: liveness
    image: k8s.gcr.io/busybox

ACKCheckNginxPath

Bloqueia valores de alto risco em spec.rules[].http.paths[].path para recursos Ingress. Ative para versões do Ingress-nginx anteriores a 1.2.1.

Severidade: Alta

Parâmetros: Nenhum

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKCheckNginxPath
metadata:
  name: block-nginx-path
spec:
  enforcementAction: deny
  match:
    kinds:
      - apiGroups: ["extensions", "networking.k8s.io"]
        kinds: ["Ingress"]
    namespaces:
      - "test-gatekeeper"

Permitido — caminhos contêm valores seguros:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: good-paths
  namespace: test-gatekeeper
spec:
  rules:
    - host: cafe.example.com
      http:
        paths:
          - path: /tea
            pathType: Prefix
            backend:
              service:
                name: tea-svc
                port:
                  number: 80
          - path: /coffee
            pathType: Prefix
            backend:
              service:
                name: coffee-svc
                port:
                  number: 80

Não permitido — caminho contém valor de alto risco:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: bad-path-secrets
  namespace: test-gatekeeper
spec:
  rules:
    - host: cafe.example.com
      http:
        paths:
          - path: /var/run/secrets
            pathType: Prefix
            backend:
              service:
                name: tea-svc
                port:
                  number: 80

ACKCheckNginxAnnotation

Impede valores de alto risco em metadata.annotations para recursos Ingress. Ative para versões do Ingress-nginx anteriores a 1.2.1.

Severidade: Alta

Parâmetros: Nenhum

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKCheckNginxAnnotation
metadata:
  name: block-nginx-annotation
spec:
  match:
    kinds:
      - apiGroups: ["extensions", "networking.k8s.io"]
        kinds: ["Ingress"]
    namespaces:
      - "test-gatekeeper"

Permitido — anotações contêm valores seguros:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: good-annotations
  namespace: test-gatekeeper
  annotations:
    nginx.org/good: "value"
spec:
  rules:
    - host: cafe.example.com
      http:
        paths:
          - path: /tea
            pathType: Prefix
            backend:
              service:
                name: tea-svc
                port:
                  number: 80
          - path: /coffee
            pathType: Prefix
            backend:
              service:
                name: coffee-svc
                port:
                  number: 80

Não permitido — anotação contém valor de alto risco:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: var-run-secrets
  namespace: test-gatekeeper
  annotations:
    nginx.org/bad: "/var/run/secrets"
spec:
  rules:
    - host: cafe.example.com
      http:
        paths:
          - path: /tea
            pathType: Prefix
            backend:
              service:
                name: tea-svc
                port:
                  number: 80
          - path: /coffee
            pathType: Prefix
            backend:
              service:
                name: coffee-svc
                port:
                  number: 80

ACKBlockInternetLoadBalancer

Bloqueia a criação de Services LoadBalancer acessíveis pela internet.

Severidade: Alta

Parâmetros: Nenhum

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKBlockInternetLoadBalancer
metadata:
  name: block-internet-load-balancer
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Service"]
    namespaces: ["test-gatekeeper"]

Permitido — Service LoadBalancer usa tipo de endereço intranet:

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: non-test-gatekeeper
  annotations:
    'service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type': 'intranet'
spec:
  selector:
    app: MyApp
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 9376
  type: LoadBalancer

Não permitido — Service LoadBalancer usa tipo de endereço internet:

apiVersion: v1
kind: Service
metadata:
  name: bad-service-2
  namespace: test-gatekeeper
  annotations:
    'service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type': 'internet'
spec:
  type: LoadBalancer
  selector:
    app: MyApp
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 9376

RatifyVerification

Utiliza o Ratify para verificar assinaturas de imagens ou metadados de segurança — como software bill of materials (SBOM) — em pods de namespaces específicos. Instale o Ratify no Marketplace do cluster antes de ativar esta política.

Severidade: Alta

Parâmetros: Nenhum

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: RatifyVerification
metadata:
  name: ratify-constraint
spec:
  enforcementAction: deny
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces: ["default"]

Permitido — imagem com assinatura válida:

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  namespace: test-gatekeeper
spec:
  containers:
  - image: registry.cn-hangzhou.aliyuncs.com/acs/signed   # Image with a valid signature
    name: test-container

Não permitido — imagem sem assinatura válida:

apiVersion: v1
kind: Pod
metadata:
  name: bad-1
  namespace: test-gatekeeper
spec:
  containers:
  - image: registry.cn-hangzhou.aliyuncs.com/acs/unsigned   # Image without a valid signature
    name: test-container

PSP

Estas políticas substituem diretamente as políticas de segurança de pod (PSPs) do Kubernetes.

ACKPSPAllowPrivilegeEscalationContainer

Exige a configuração allowPrivilegeEscalation em pods de namespaces definidos.

Severidade: Média

Parâmetros: Nenhum

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKPSPAllowPrivilegeEscalationContainer
metadata:
  name: psp-allow-privilege-escalation-container
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "test-gatekeeper"

Permitido — allowPrivilegeEscalation: false definido em todos os contêineres:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: good
  namespace: test-gatekeeper
spec:
  containers:
  - image: test
    name: test
    securityContext:
      allowPrivilegeEscalation: false
  initContainers:
    - image: test
      name: test2
      securityContext:
        allowPrivilegeEscalation: false

Não permitido — allowPrivilegeEscalation não definido:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: bad
  namespace: test-gatekeeper
spec:
  containers:
  - image: test
    name: test

ACKPSPAllowedUsers

Requer as definições de user, group, supplementalGroups e fsGroup em pods de namespaces específicos.

Severidade: Média

Parâmetros:

Parâmetro

Tipo

Descrição

runAsUser

object

Configuração de usuário seguindo a semântica PSP do Kubernetes. Consulte Pod Security Policies.

runAsGroup

object

Configuração de grupo seguindo a semântica PSP do Kubernetes. Consulte Pod Security Policies.

supplementalGroups

object

Configuração de grupos suplementares seguindo a semântica PSP do Kubernetes. Consulte Pod Security Policies.

fsGroup

object

Configuração fsGroup seguindo a semântica PSP do Kubernetes. Consulte Pod Security Policies.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKPSPAllowedUsers
metadata:
  name: psp-pods-allowed-user-ranges
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "test-gatekeeper"
  parameters:
    runAsUser:
      rule: MustRunAs # MustRunAsNonRoot # RunAsAny
      ranges:
        - min: 100
          max: 200
    runAsGroup:
      rule: MustRunAs # MayRunAs # RunAsAny
      ranges:
        - min: 100
          max: 200
    supplementalGroups:
      rule: MustRunAs # MayRunAs # RunAsAny
      ranges:
        - min: 100
          max: 200
    fsGroup:
      rule: MustRunAs # MayRunAs # RunAsAny
      ranges:
        - min: 100
          max: 200

Permitido — todas as configurações de usuário/grupo estão dentro dos intervalos permitidos:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: good2
  namespace: test-gatekeeper
spec:
  securityContext:
    fsGroup: 150
    supplementalGroups:
      - 150
  containers:
  - image: test
    name: test
    securityContext:
      runAsUser: 150
      runAsGroup: 150

Não permitido — configurações de usuário/grupo ausentes:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: bad
  namespace: test-gatekeeper
spec:
  containers:
  - image: test
    name: test

ACKPSPAppArmor

Torna obrigatórias as configurações de AppArmor em pods de namespaces definidos.

Severidade: Baixa

Parâmetros:

Parâmetro

Tipo

Descrição

allowedProfiles

array

Perfis AppArmor permitidos para uso pelos pods.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKPSPAppArmor
metadata:
  name: psp-apparmor
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "test-gatekeeper"
  parameters:
    allowedProfiles:
      - runtime/default

Permitido — anotações AppArmor presentes em todos os contêineres:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: good
  namespace: test-gatekeeper
  annotations:
    'container.apparmor.security.beta.kubernetes.io/test': 'runtime/default'
    'container.apparmor.security.beta.kubernetes.io/test2': 'runtime/default'
spec:
  containers:
  - image: test
    name: test
  initContainers:
  - image: test
    name: test2

Não permitido — sem anotações AppArmor:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: bad
  namespace: test-gatekeeper
spec:
  containers:
  - image: test
    name: test

ACKPSPCapabilities

Exige a definição de capabilities do Linux em pods de namespaces específicos.

Severidade: Alta

Parâmetros:

Parâmetro

Tipo

Descrição

allowedCapabilities

array

Capabilities do Linux que os contêineres podem adicionar.

requiredDropCapabilities

array

Capabilities do Linux que os contêineres devem remover.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKPSPCapabilities
metadata:
  name: psp-capabilities
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "test-gatekeeper"
  parameters:
    allowedCapabilities: ["CHOWN"]
    requiredDropCapabilities: ["NET_ADMIN", "SYS_ADMIN", "NET_RAW"]

Permitido — apenas capabilities permitidas adicionadas; capabilities obrigatórias removidas:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: good-4
  namespace: test-gatekeeper
spec:
  containers:
  - image: test
    name: test
    securityContext:
      capabilities:
        add:
          - CHOWN
        drop:
         - "NET_ADMIN"
         - "SYS_ADMIN"
         - "NET_RAW"

Não permitido — nenhuma configuração de capabilities:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: bad-1
  namespace: test-gatekeeper
spec:
  containers:
  - image: test
    name: test

ACKPSPFlexVolumes

Restringe pods em namespaces específicos ao uso exclusivo de drivers FlexVolume listados na política.

Severidade: Média

Parâmetros:

Parâmetro

Tipo

Descrição

allowedFlexVolumes

array

Drivers FlexVolume permitidos para uso pelos pods.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKPSPFlexVolumes
metadata:
  name: psp-flexvolume-drivers
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod", "PersistentVolume"]
    namespaces:
      - "test-gatekeeper"
  parameters:
    allowedFlexVolumes:
      - driver: "alicloud/disk"
      - driver: "alicloud/nas"
      - driver: "alicloud/oss"
      - driver: "alicloud/cpfs"

Permitido — driver FlexVolume está na lista de permissões:

apiVersion: v1
kind: Pod
metadata:
  name: pv-nas
  namespace: test-gatekeeper
spec:
  containers:
    - name: test
      image: test
  volumes:
    - name: test
      flexVolume:
        driver: "alicloud/nas"

Não permitido — driver FlexVolume não está na lista de permissões:

apiVersion: v1
kind: Pod
metadata:
  name: pv-oss-flexvolume
  namespace: test-gatekeeper
spec:
  containers:
    - name: test
      image: test
  volumes:
    - name: test
      flexVolume:
        driver: "alicloud/ossxx"

ACKPSPForbiddenSysctls

Bloqueia o uso de sysctls especificados por pods em namespaces definidos.

Severidade: Alta

Parâmetros:

Parâmetro

Tipo

Descrição

forbiddenSysctls

array

Sysctls proibidos para uso pelos pods. Use * para bloquear todos os sysctls.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKPSPForbiddenSysctls
metadata:
  name: psp-forbidden-sysctls
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "test-gatekeeper"
  parameters:
    forbiddenSysctls:
      # - "*" # Use * to forbid all sysctls
      - "kernel.*"

Permitido — sysctl não está na lista de bloqueios:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: good-2
  namespace: test-gatekeeper
spec:
  securityContext:
    sysctls:
      - name: 'net.ipv4.tcp_syncookies'
        value: "65536"
  containers:
  - image: test
    name: test

Não permitido — sysctl corresponde ao padrão da lista de bloqueios:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: bad-1
  namespace: test-gatekeeper
spec:
  securityContext:
    sysctls:
      - name: 'kernel.shm_rmid_forced'
        value: '1024'
  containers:
  - image: test
    name: test

ACKPSPFSGroup

Obriga pods em namespaces definidos a usar configurações fsGroup compatíveis com a política.

Severidade: Média

Parâmetros:

Parâmetro

Tipo

Descrição

rule

string

Regra fsGroup. Valores válidos: MustRunAs, MayRunAs, RunAsAny. Consulte Volumes and file systems.

ranges

object

Intervalo válido de ID fsGroup. Defina min para o valor mínimo e max para o valor máximo.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKPSPFSGroup
metadata:
  name: psp-fsgroup
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "test-gatekeeper"
  parameters:
    rule: "MayRunAs" # "MustRunAs" or "RunAsAny"
    ranges:
      - min: 1
        max: 1000

Permitido — fsGroup dentro do intervalo permitido:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: good
  namespace: test-gatekeeper
spec:
  securityContext:
    fsGroup: 100
  containers:
  - image: test
    name: test

Não permitido — fsGroup igual a 0 está fora do intervalo permitido:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: bad-1
  namespace: non-test-gatekeeper
spec:
  securityContext:
    fsGroup: 0
  shareProcessNamespace: true
  containers:
  - image: test
    name: test

ACKPSPHostFilesystem

Aplica condições aos volumes hostPath montados em pods de namespaces específicos.

Severidade: Alta

Parâmetros:

Parâmetro

Tipo

Descrição

allowedHostPaths

object

Volumes hostPath que os pods podem montar.

readOnly

boolean

Se o volume deve ser montado como somente leitura.

pathPrefix

string

Prefixo de caminho que o volume hostPath deve corresponder.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKPSPHostFilesystem
metadata:
  name: psp-host-filesystem
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "test-gatekeeper"
  parameters:
    allowedHostPaths:
      - readOnly: true
        pathPrefix: "/foo"

Permitido — volume hostPath usa prefixo permitido e é montado como somente leitura:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: good1
  namespace: test-gatekeeper
spec:
  containers:
  - image: test
    name: test
    volumeMounts:
      - name: test-volume
        mountPath: "/projected-volume"
        readOnly: true
  volumes:
  - name: test-volume
    hostPath:
      path: /foo

Não permitido — volume hostPath usa caminho que não corresponde ao prefixo permitido:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: bad
  namespace: test-gatekeeper
spec:
  containers:
  - image: test
    name: test
  volumes:
  - name: test-volume
    hostPath:
      path: /data
      type: File

ACKPSPHostNamespace

Impede que pods em namespaces definidos compartilhem namespaces do host.

Severidade: Alta

Parâmetros: Nenhum

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKPSPHostNamespace
metadata:
  name: psp-host-namespace
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "test-gatekeeper"

Permitido — pod não compartilha namespaces do host:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: good
  namespace: test-gatekeeper
spec:
  containers:
  - image: test
    name: test
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}

Não permitido — pod compartilha o namespace PID do host:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: bad
  namespace: test-gatekeeper
spec:
  hostPID: true
  containers:
  - image: test
    name: test
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}

ACKPSPHostNetworkingPorts

Controla se pods em namespaces específicos podem usar a rede do host e portas determinadas.

Severidade: Alta

Parâmetros:

Parâmetro

Tipo

Descrição

hostNetwork

boolean

Se os pods podem usar a rede do host.

min

integer

Menor número de porta do host permitido.

max

integer

Maior número de porta do host permitido.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKPSPHostNetworkingPorts
metadata:
  name: psp-host-network-ports
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "test-gatekeeper"
  parameters:
    hostNetwork: true
    min: 80
    max: 9000

Permitido — portas do host estão dentro do intervalo permitido:

apiVersion: v1
kind: Pod
metadata:
  name: good-2
  namespace: test-gatekeeper
spec:
  hostNetwork: true
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    ports:
      - hostPort: 80
        containerPort: 80
  initContainers:
    - image: k8s.gcr.io/test-webserver
      name: test-container2
      ports:
        - hostPort: 8080
          containerPort: 8080

Não permitido — porta do host 22 está fora do intervalo permitido:

apiVersion: v1
kind: Pod
metadata:
  name: bad-1
  namespace: non-test-gatekeeper
spec:
  hostNetwork: true
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    ports:
      - hostPort: 22
        containerPort: 22

ACKPSPPrivilegedContainer

Veda a execução de contêineres privilegiados em pods de namespaces definidos.

Severidade: Alta

Parâmetros: Nenhum

Exemplo

Constraint:

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

Permitido — modo privilegiado não definido:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: good1
  namespace: test-gatekeeper
spec:
  containers:
  - image: test
    name: test

Não permitido — contêiner com privileged: true:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: bad
  namespace: test-gatekeeper
spec:
  containers:
  - image: test
    name: test
    securityContext:
      privileged: true
  dnsPolicy: ClusterFirst
  restartPolicy: Never

ACKPSPProcMount

Exige que pods em namespaces específicos usem o tipo Proc Mount definido na política.

Severidade: Baixa

Parâmetros:

Parâmetro

Tipo

Descrição

procMount

string

Tipo Proc Mount obrigatório. Default bloqueia a montagem de /proc; Unmasked permite. Consulte AllowedProcMountTypes.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKPSPProcMount
metadata:
  name: psp-proc-mount
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "test-gatekeeper"
  parameters:
    procMount: Default  # Default or Unmasked

Permitido — procMount: Default corresponde à política:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: good1
  namespace: test-gatekeeper
spec:
  containers:
  - image: test
    name: test
    securityContext:
      procMount: "Default"

Não permitido — procMount: Unmasked não corresponde à política:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: bad3
  namespace: test-gatekeeper
spec:
  containers:
  - image: test
    name: test
    securityContext:
      procMount: "Unmasked"
  initContainers:
  - image: test
    name: test2

ACKPSPReadOnlyRootFilesystem

Obriga pods em namespaces definidos a executar com sistemas de arquivos raiz somente leitura.

Severidade: Média

Parâmetros: Nenhum

Exemplo

Constraint:

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

Permitido — readOnlyRootFilesystem: true definido:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: good1
  namespace: test-gatekeeper
spec:
  containers:
  - image: test
    name: test
    securityContext:
      readOnlyRootFilesystem: true

Não permitido — readOnlyRootFilesystem: false:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: bad2
  namespace: non-test-gatekeeper
spec:
  containers:
  - image: test
    name: test
    securityContext:
      readOnlyRootFilesystem: false
  initContainers:
  - image: test
    name: test2

ACKPSPSELinuxV2

Limita pods em namespaces específicos às opções SELinux listadas na política.

Severidade: Baixa

Parâmetros:

Parâmetro

Tipo

Descrição

allowedSELinuxOptions

object

Opções SELinux permitidas para uso pelos pods. Consulte SELinuxOptions v1 core.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKPSPSELinuxV2
metadata:
  name: psp-selinux-v2
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "test-gatekeeper"
  parameters:
    allowedSELinuxOptions:
      - level: s0:c123,c456
        role: object_r
        type: svirt_sandbox_file_t
        user: system_u

Permitido — opções SELinux correspondem à lista de permissões:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: good
  namespace: test-gatekeeper
spec:
  securityContext:
    seLinuxOptions:
      level: "s0:c123,c456"
  containers:
  - image: test
    name: test

Não permitido — nível SELinux não está na lista de permissões:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: bad
  namespace: test-gatekeeper
spec:
  containers:
  - image: test
    name: test
    securityContext:
      seLinuxOptions:
        level: "s0:c123,c455"

ACKPSPSeccomp

Requer o uso de perfis seccomp especificados em pods de namespaces definidos.

Severidade: Baixa

Parâmetros:

Parâmetro

Tipo

Descrição

allowedProfileTypes

array

Tipos de perfil seccomp permitidos.

allowedProfiles

array

Nomes de perfis seccomp permitidos.

Exemplo

Constraint:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: ACKPSPSeccomp
metadata:
  name: psp-seccomp
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "test-gatekeeper"
  parameters:
    allowedProfileTypes:
      # - Unconfined
      - RuntimeDefault
      - Localhost
    allowedProfiles:
      - runtime/default
      - docker/default
      - localhost/profiles/audit.json

Permitido — perfil seccomp corresponde a um tipo e nome permitidos:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: good
  namespace: test-gatekeeper
spec:
  containers:
  - image: test
    name: test
    securityContext:
      seccompProfile:
        type: Localhost
        localhostProfile: profiles/audit.json
  initContainers:
  - image: test
    name: test2
    securityContext:
      seccompProfile:
        type: Localhost
        localhostProfile: profiles/audit.json

Não permitido — nenhum perfil seccomp definido:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: bad
  namespace: test-gatekeeper
spec:
  containers:
  - image: test
    name: test

ACKPSPVolumeTypes

Restringe pods em namespaces específicos à montagem de volumes apenas dos tipos permitidos.

Severidade: Média

Parâmetros:

Parâmetro

Tipo

Descrição

volumes

array

Tipos de volume permitidos para uso pelos pods. Use * para permitir todos os tipos de volume.

Exemplo

Constraint:

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

Permitido — pod usa driver FlexVolume (na lista de permitidos):

apiVersion: v1
kind: Pod
metadata:
  name: pv-oss
  namespace: test-gatekeeper
spec:
  containers:
    - name: test
      image: test
  volumes:
    - name: test
      flexVolume:
        driver: "alicloud/oss"

Não permitido — pod usa volume hostPath (não está na lista de permitidos):

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: test
  name: bad-1
  namespace: test-gatekeeper
spec:
  containers:
  - image: test
    name: test
  volumes:
  - name: test-volume
    hostPath:
      path: /data