Uso de Políticas de Segurança com Kubernetes Engine (OKE)
Descubra como usar políticas de segurança de pod com clusters do Kubernetes que você criou usando o Kubernetes Engine (OKE).
O projeto upstream do Kubernetes obsoletou as políticas de segurança de pod no Kubernetes versão 1.21 e removeu o recurso no Kubernetes versão 1.25. Consequentemente, o Kubernetes Engine não suporta políticas de segurança de pod e o controlador de admissão PodSecurityPolicy em clusters que executam o Kubernetes versão 1.25 e posterior.
Se você precisar de uma funcionalidade semelhante, considere o uso de padrões de segurança de pod do Kubernetes e do controlador de admissão PodSecurity (junto com as políticas Privilegiada, Linha de Base e Restrita). Por padrão, o Kubernetes Engine permite o controlador de admissão PodSecurity em clusters que executam o Kubernetes versão 1.23 e posterior, a fim de suportar padrões de segurança de pod. Para obter mais informações sobre os padrões de segurança de pods do Kubernetes e o controlador de admissão PodSecurity, consulte Padrões de Segurança de Pods na documentação do Kubernetes.
Como alternativa, considere o uso de outras alternativas que estão sendo desenvolvidas no ecossistema do Kubernetes para aplicar as políticas.
Se você decidir deixar de usar políticas de segurança de pod e o controlador de admissão PodSecurityPolicy para usar padrões de segurança de pod e o controlador de admissão PodSecurity, consulte Migrar de PodSecurityPolicy para o Controlador de Admissão PodSecurity Incorporado na documentação do Kubernetes. Observe que é importante concluir a migração antes de criar um novo cluster executando o Kubernetes versão 1.25 ou antes de fazer upgrade de um cluster existente do Kubernetes versão 1.24 para executar o Kubernetes versão 1.25. Observe também que a Console fornece uma maneira conveniente de desativar o uso do controlador de admissão PodSecurityPolicy nos clusters existentes do Kubernetes criados e gerenciados pelo Kubernetes Engine (consulte Usando a Console para Desativar o Controlador de Admissão PodSecurityPolicy).
Você pode controlar as operações que os pods têm permissão para executar em um cluster criado com o serviço Kubernetes Engine, configurando políticas de segurança de pod para o cluster. As políticas de segurança de pod são uma maneira de garantir que os pods atendam às condições relacionadas à segurança para que possam ser aceitos por um cluster. Por exemplo, você pode usar políticas de segurança de pod para:
- limitar as opções de armazenamento disponíveis para pods
- restringir a rede do host e as portas que os pods podem acessar
- impedir pods de executar como usuário raiz
- impedir pods de executar no modo privilegiado
Você também pode usar políticas de segurança de pod para fornecer valores padrão para pods, "'fazendo uma mutação" no pod.
Depois de definir uma política de segurança de pod para um cluster, é necessário autorizar a conta de serviço do usuário solicitante ou do pod de destino para usar a política. Isso é feito criando uma atribuição (ou clusterrole) para acessar a política de segurança de pod e, em seguida, criando uma rolebinding (ou clusterrolebinding) entre a atribuição (ou clusterrole) e a conta de serviço do usuário solicitante ou do pod de destino. Para obter mais informações sobre atribuições, clusterroles e bindings, consulte Sobre o Controle de Acesso e o Serviço Kubernetes Engine (OKE).
Você especifica se um cluster impõe as políticas de segurança de pod definidas para ele, ativando o controlador de admissão PodSecurityPolicy do cluster. O controlador de admissão PodSecurityPolicy atua na criação e modificação de um pod e determina se o pod deve ser admitido no cluster com base no contexto de segurança solicitado na especificação do pod e nas políticas de segurança de pod do cluster. Se houver várias políticas de segurança de pod, o controlador de admissão PodSecurityPolicy primeiro comparará o pod com políticas não mutantes em ordem alfabética e usará a primeira política que valida o pod com sucesso. Se nenhum pod não mutante validar o pod, o controlador de admissão PodSecurityPolicy comparará o pod com políticas mutantes em ordem alfabética e usará a primeira política que valida o pod com sucesso.
Cuidado 1:
É muito importante observar que, quando você ativa o controlador de admissão PodSecurityPolicy de um cluster, nenhum pod de aplicativo pode iniciar no cluster, a menos que existam políticas de segurança de pod adequadas, juntamente com atribuições (ou clusterroles) e rolebindings (ou clusterrolebindings) para associar pods a políticas. Você não poderá executar pods de aplicativos em um cluster com um controlador de admissão PodSecurityPolicy ativado, a menos que esses pré-requisitos sejam atendidos.
Recomendamos que você use os controladores de admissão PodSecurityPolicy da seguinte forma:
- Sempre que você criar um novo cluster, ative o Controlador de Admissão de Segurança do Pod.
- Imediatamente após criar um novo cluster, crie as políticas de segurança do pod, com atribuições (ou clusterroles) e rolebindings (ou clusterrolebindings).
Cuidado 2:
Crie políticas de segurança de pod antes de ativar o controlador de admissão PodSecurityPolicy de um cluster existente que já esteja em produção (ou seja, algum tempo depois de criá-lo). Se você decidir ativar o controlador de admissão PodSecurityPolicy de um cluster existente, recomendamos que primeiro verifique as políticas de segurança de pod do cluster em um ambiente de desenvolvimento ou teste. Dessa forma, poderá ter certeza de que as políticas de segurança do pod funcionam conforme esperado e permitir (ou recusar) corretamente o início de pods no cluster.
Quando você ativa o controlador de admissão PodSecurityPolicy de um cluster criado com o Kubernetes Engine, uma política de segurança de pods privilegiados do sistema Kubernetes é criada automaticamente (com o clusterrole e o clusterrolebinding associados). Essa política de segurança de pod, bem como o clusterrole e o clusterrolebinding permitem que os pods do sistema Kubernetes sejam executados. A política de segurança de pod, o clusterrole e o clusterrolebinding são definidos no arquivo kube-system.yaml (consulte Referência do arquivo kube-system.yaml).
Observe que você pode criar políticas de segurança de pod para um cluster antes de ativar o controlador de admissão PodSecurityPolicy do cluster. Observe também que você pode desativar o controlador de admissão PodSecurityPolicy de um cluster que foi ativado anteriormente. Nesse caso, quaisquer políticas de segurança de pod, atribuições (ou clusterroles) e rolebindings (ou clusterrolebindings) criados anteriormente não são excluídos. As políticas de segurança de pod simplesmente não são aplicadas. Qualquer pod de aplicativo poderá ser executado no cluster.
Para obter mais informações sobre políticas de segurança de pod e o controlador de admissão PodSecurityPolicy, consulte a documentação do Kubernetes.
Criando uma Política de Segurança de Pod para Pods de Aplicativo
Para criar uma política de segurança de pod para pods de aplicativo, crie uma atribuição para acessar a política de segurança de pod e crie um rolebinding para ativar os pods de aplicativo para usar a política de segurança de pod:
- Crie a política de segurança de pod para pods de aplicativo:
Defina e salve a política de segurança de pod em um arquivo. Por exemplo, em
acme-app-psp.yaml
).Por exemplo, esta política (obtida da documentação do Kubernetes) simplesmente impede a criação de pods privilegiados:
apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: acme-app-psp spec: privileged: false # Don't allow privileged pods! # The rest fills in some required fields. seLinux: rule: RunAsAny supplementalGroups: rule: RunAsAny runAsUser: rule: RunAsAny fsGroup: rule: RunAsAny volumes: - '*'
Informe o seguinte comando para criar a política de segurança pod:
kubectl create -f <filename>.yaml
Por exemplo:
kubectl create -f acme-app-psp.yaml
- Crie a atribuição (ou clusterrole) para acessar a política de segurança de pod:
Defina e salve uma atribuição (ou clusterrole) em um arquivo. Por exemplo, em
acme-app-psp-crole.yaml
.Por exemplo:
# Cluster role which grants access to the app pod security policy apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: acme-app-psp-crole rules: - apiGroups: - policy resourceNames: - acme-app-psp resources: - podsecuritypolicies verbs: - use
Informe o seguinte comando para criar a atribuição (ou clusterrole):
kubectl create -f <filename>.yaml
Por exemplo:
kubectl create -f acme-app-psp-crole.yaml
- Crie o rolebinding (ou clusterrolebinding) para autorizar os pods do aplicativo a usar a política de segurança de pod:
Defina e salve o rolebinding (ou clusterrolebinding) em um arquivo. Por exemplo, em
acme-app-psp-crole-bind.yaml
.Por exemplo:
# Role binding which grants access to the app pod security policy apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: acme-app-psp-binding namespace: acme-namespace roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: acme-app-psp-crole subjects: # For all service accounts in acme-namespace - apiGroup: rbac.authorization.k8s.io kind: Group name: system:serviceaccounts:acme-namespace
Informe o seguinte comando para criar o rolebinding (ou clusterrolebinding):
kubectl create -f <filename>.yaml
Por exemplo:
kubectl create -f acme-app-psp-crole-bind.yaml
Depois de definir uma política de segurança de pod e autorizar os pods de aplicativos a usá-la, criando uma atribuição e um rolebinding (ou um clusterrole e clusterrolebinding), ative o controlador de admissão PodSecurityPolicy do cluster para impor a política de segurança de pod (se não estiver ativada ainda).
Usando a Console para Ativar o Controlador de Admissão PodSecurityPolicy
Para ativar o controlador de admissão PodSecurityPolicy ao criar novos clusters usando a Console:
- Faça log-in na Console.
-
Siga as instruções para criar um novo cluster em Usando a Console para criar um Cluster com Definições Explicitamente Definidas no workflow 'Criação Personalizada', selecione Mostrar Opções Avançadas e selecione a opção Políticas de Segurança do Pod - Aplicadas. Esta opção ativa o controlador de admissão PodSecurityPolicy.
Nenhum pod de aplicativo será aceito no novo cluster, a menos que existam políticas de segurança de pod adequadas, juntamente com atribuições (ou clusterroles) e rolebindings (ou clusterrolebindings) para associar pods a políticas.
- Siga as instruções para definir os detalhes restantes do cluster e selecione Criar Cluster para criar o novo cluster.
-
Siga as instruções em Criando uma Política de Segurança de Pod para Pods de Aplicativos para criar políticas de segurança de pod para o controlador de admissão PodSecurityPolicy a serem impostas ao aceitar pods no novo cluster.
Para ativar o controlador de admissão PodSecurityPolicy em clusters existentes usando a Console:
-
Siga as instruções em Criando uma Política de Segurança de Pod para Pods de Aplicativos para criar políticas de segurança de pod para o controlador de admissão PodSecurityPolicy a serem impostas ao aceitar pods no cluster existente.
Recomendamos que você primeiro verifique as políticas de segurança de pod em um ambiente de desenvolvimento ou teste. Dessa forma, poderá ter certeza de que as políticas de segurança do pod funcionam conforme esperado e permitir (ou recusar) corretamente o início de pods no cluster.
- Abra o menu de navegação e selecione Serviços ao Desenvolvedor. Em Contêineres e Artefatos, selecione Clusters do Kubernetes (OKE).
- Escolha um Compartimento no qual você tem permissão para trabalhar.
- Na página Lista de Cluster, selecione o nome do cluster que deseja modificar.
- Na guia Detalhes do Cluster, selecione Não Aplicado ao lado de Políticas de Segurança do Pod.
-
Na janela Políticas de Segurança de Pod, selecione Imposta.
A partir de agora, nenhum novo pod de aplicativo será aceito no novo , a menos que existam políticas de segurança de pod adequadas, com atribuições (ou clusterroles) e rolebindings (ou clusterrolebindings) para associar pods a políticas. Observe que todos os pods em execução no momento continuarão a ser executados, independentemente.
- Selecione Salvar Alterações.
Usando a Console para Desativar o Controlador de Admissão PodSecurityPolicy
Para desativar o controlador de admissão PodSecurityPolicy em clusters nos quais ele foi ativado anteriormente:
- Abra o menu de navegação e selecione Serviços ao Desenvolvedor. Em Contêineres e Artefatos, selecione Clusters do Kubernetes (OKE).
- Escolha um Compartimento no qual você tem permissão para trabalhar.
- Na página Lista de Cluster, selecione o nome do cluster que deseja modificar.
- Na guia Detalhes do Cluster, selecione Imposto ao lado de Políticas de Segurança do Pod.
-
Na janela Políticas de Segurança do Pod, selecione Não Aplicado.
A partir de agora, novos pods de aplicativo serão aceitos no cluster sem a necessidade de políticas de segurança de pod, atribuições (ou clusterroles) e rolebins (ou clusterrolebindings). Observe que todos os pods em execução no momento continuarão a ser executados, independentemente.
- Selecione Salvar Alterações.
Usando a API
Para obter informações sobre como usar a API e assinar solicitações, consulte a documentação da API REST e Credenciais de Segurança. Para obter informações sobre SDKs, consulte SDKs e a CLI.
Para ativar o controlador de admissão PodSecurityPolicy, use a:
- OperaçãoCreateCluster ao criar novos clusters
- OperaçãoUpdateCluster ao modificar clusters existentes
Referência de kube-system.yaml
A política de segurança de pod, bem como o clusterrole e o clusterrolebinding associados, para pods privilegiados do sistema Kubernetes são criados automaticamente quando você ativa o controlador de admissão PodSecurityPolicy de um cluster. Eles permitem a execução de qualquer pod no namespace kube-system. Eles são criados com base em definições no arquivo kube-system.yaml mostrado abaixo:
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
annotations:
# See https://kubernetes.io/docs/concepts/policy/pod-security-policy/#seccomp
seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*'
name: oke-privileged
spec:
allowedCapabilities:
- '*'
allowPrivilegeEscalation: true
fsGroup:
rule: 'RunAsAny'
hostIPC: true
hostNetwork: true
hostPID: true
hostPorts:
- min: 0
max: 65535
privileged: true
readOnlyRootFilesystem: false
runAsUser:
rule: 'RunAsAny'
seLinux:
rule: 'RunAsAny'
supplementalGroups:
rule: 'RunAsAny'
volumes:
- '*'
---
# Cluster role which grants access to the privileged pod security policy
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: oke-privileged-psp
rules:
- apiGroups:
- policy
resourceNames:
- oke-privileged
resources:
- podsecuritypolicies
verbs:
- use
---
# Role binding for kube-system - allow kube-system service accounts - should take care of CNI i.e. flannel running in the kube-system namespace
# Assumes access to the kube-system is restricted
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: kube-system-psp
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: oke-privileged-psp
subjects:
# For all service accounts in the kube-system namespace
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: system:serviceaccounts:kube-system