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 |
|
Impede o uso de |
Média |
|
Compliance |
|
Exige que pods em namespaces especificados incluam um |
Baixa |
|
Compliance |
|
Bloqueia a implantação de tipos de recursos específicos em namespaces definidos. |
Baixa |
|
Compliance |
|
Limita RoleBindings em namespaces específicos para vincular apenas funções ou cluster roles permitidas. |
Alta |
|
Compliance |
|
Evita a exclusão de namespaces especificados. |
Média |
|
Compliance |
|
Protege instâncias de Service contra exclusão em namespaces definidos. |
Média |
|
Infra |
|
Proíbe pods em namespaces específicos de usar |
Alta |
|
Infra |
|
Torna obrigatório definir |
Baixa |
|
Infra |
|
Requer a anotação |
Baixa |
|
Infra |
|
Controla quais regiões de buckets do OSS podem ser montadas em pods de namespaces específicos. |
Baixa |
|
Infra |
|
Define uma capacidade máxima de disco para persistent volumes (PVs) no cluster. |
Média |
|
Infra |
|
Restringe os namespaces onde persistent volume claims (PVCs) podem ser implantados e estabelece um limite de capacidade para PVs. |
Média |
|
Infra |
|
Veda o uso de tipos de volume especificados por pods em namespaces definidos. |
Média |
|
K8s-general |
|
Permite que pods em namespaces específicos baixem imagens apenas de repositórios autorizados. |
Alta |
|
K8s-general |
|
Exige |
Baixa |
|
K8s-general |
|
Impõe |
Alta |
|
K8s-general |
|
Bloqueia a criação de contêineres efêmeros em pods de namespaces específicos. |
Média |
|
K8s-general |
|
Impede a implantação de Services do tipo LoadBalancer em namespaces definidos. |
Alta |
|
K8s-general |
|
Veta a criação de Services do tipo NodePort em namespaces especificados. |
Alta |
|
K8s-general |
|
Torna obrigatória a definição de |
Baixa |
|
K8s-general |
|
Restringe Services em namespaces específicos ao uso exclusivo de endereços IP externos listados na política. |
Alta |
|
K8s-general |
|
Obriga pods em namespaces definidos a utilizar imagens com digests no formato especificado. |
Baixa |
|
K8s-general |
|
Exige que pods em namespaces específicos possuam rótulos correspondentes à política. |
Baixa |
|
K8s-general |
|
Determina que pods em namespaces definidos tenham tipos específicos de readiness probes e liveness probes. |
Média |
|
K8s-general |
|
Bloqueia valores de alto risco em |
Alta |
|
K8s-general |
|
Impede valores de alto risco em |
Alta |
|
K8s-general |
|
Bloqueia a criação de Services LoadBalancer acessíveis pela internet. |
Alta |
|
K8s-general |
|
Utiliza o Ratify para verificar assinaturas de imagens ou metadados de segurança (como SBOM) em pods de namespaces específicos. |
Alta |
|
PSP |
|
Exige a configuração |
Média |
|
PSP |
|
Requer as definições de |
Média |
|
PSP |
|
Torna obrigatórias as configurações de AppArmor em pods de namespaces definidos. |
Baixa |
|
PSP |
|
Exige a definição de capabilities do Linux em pods de namespaces específicos. |
Alta |
|
PSP |
|
Obriga pods em namespaces definidos a usar configurações fsGroup compatíveis com a política. |
Média |
|
PSP |
|
Restringe pods em namespaces específicos ao uso exclusivo de drivers FlexVolume listados na política. |
Média |
|
PSP |
|
Bloqueia o uso de sysctls especificados por pods em namespaces definidos. |
Alta |
|
PSP |
|
Aplica condições aos volumes hostPath montados em pods de namespaces específicos. |
Alta |
|
PSP |
|
Impede que pods em namespaces definidos compartilhem namespaces do host. |
Alta |
|
PSP |
|
Controla se pods em namespaces específicos podem usar a rede do host e portas determinadas. |
Alta |
|
PSP |
|
Veda a execução de contêineres privilegiados em pods de namespaces definidos. |
Alta |
|
PSP |
|
Exige que pods em namespaces específicos usem o tipo Proc Mount definido na política. |
Baixa |
|
PSP |
|
Obriga pods em namespaces definidos a executar com sistemas de arquivos raiz somente leitura. |
Média |
|
PSP |
|
Limita pods em namespaces específicos às opções SELinux listadas na política. |
Baixa |
|
PSP |
|
Requer o uso de perfis seccomp especificados em pods de namespaces definidos. |
Baixa |
|
PSP |
|
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 |
|
|
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 |
|
|
object |
A cluster role ou role que não pode ser vinculada. |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
string |
|
|
|
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 |
|
|
string |
Capacidade máxima de disco para PVs. Padrão: |
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 |
|
|
string |
Capacidade máxima de disco para PVs. Padrão: |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
array |
Tipos de probe obrigatórios. Valores válidos: |
|
|
array |
Tipos de implementação de probe obrigatórios. Valores válidos: |
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 |
|
|
object |
Configuração de usuário seguindo a semântica PSP do Kubernetes. Consulte Pod Security Policies. |
|
|
object |
Configuração de grupo seguindo a semântica PSP do Kubernetes. Consulte Pod Security Policies. |
|
|
object |
Configuração de grupos suplementares seguindo a semântica PSP do Kubernetes. Consulte Pod Security Policies. |
|
|
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 |
|
|
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 |
|
|
array |
Capabilities do Linux que os contêineres podem adicionar. |
|
|
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 |
|
|
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 |
|
|
array |
Sysctls proibidos para uso pelos pods. Use |
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 |
|
|
string |
Regra fsGroup. Valores válidos: |
|
|
object |
Intervalo válido de ID fsGroup. Defina |
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 |
|
|
object |
Volumes hostPath que os pods podem montar. |
|
|
boolean |
Se o volume deve ser montado como somente leitura. |
|
|
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 |
|
|
boolean |
Se os pods podem usar a rede do host. |
|
|
integer |
Menor número de porta do host permitido. |
|
|
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 |
|
|
string |
Tipo Proc Mount obrigatório. |
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 |
|
|
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 |
|
|
array |
Tipos de perfil seccomp permitidos. |
|
|
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 |
|
|
array |
Tipos de volume permitidos para uso pelos pods. Use |
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