Segurança de software não é o mesmo que software de segurança. Aqui, estamos interessados em tópicos como autenticação, controle de acesso, confidencialidade, criptografia e gestão de privilégios.
streamingConnectionIdleTimeout
de uma configuração do Kubelet especifica a quantidade máxima de tempo que uma conexão de streaming fica inativa antes que a conexão seja fechada automaticamente. Definir tempos limite ociosos protege contra ataques de negação de serviço e a falta de conexões. Definir o valor do campo como 0
desabilita o tempo limite ocioso.streamingConnectionIdleTimeout
como 0
.
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
streamingConnectionIdleTimeout: 0
AlwaysAllow
porque permite todas as solicitações.AlwaysAllow
como um dos modos de autorização.
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --authorization-mode=...,AlwaysAllow,...
...
--root-ca-file
que especifica um arquivo raiz de autoridade de certificação (CA). Como resultado, o gerenciador do controlador Kubernetes não publica um certificado CA raiz correspondente nos pods. Sem o certificado de raiz CA, os pods não podem verificar o certificado de serviço do servidor de API antes de estabelecer conexões. Isso deixa o aplicativo vulnerável a um ataque MITM (man-in-the-middle).--root-ca-file
.
...
kind: Pod
...
spec:
containers:
- command:
- kube-controller-manager
image: k8s.gcr.io/kube-controller-manager:v1.9.7
imagePullPolicy: IfNotPresent
...
...
kind: Pod
...
spec:
containers:
- command:
- kube-controller-manager
image: example.domain/kube-controller-manager:v1.9.7
imagePullPolicy: IfNotPresent
...
AlwaysAllow
ou o modo Webhook
. Um modo de autorização não especificado é padronizado como AlwaysAllow
. O Kubelet não realiza nenhuma verificação de autorização no modo AlwaysAllow
porque permite todas as solicitações. Como os Kubelets são os principais agentes do Kubernetes para gerenciar a carga de trabalho de uma máquina de trabalho, os invasores podem usar solicitações não controladas para obter acesso a APIs de serviço com proteção insuficiente e sensíveis à segurança.AlwaysAllow
.
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
authorization:
mode: AlwaysAllow
clientCAFile
que especifica o pacote de CA usado para verificar certificados do cliente.
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
--kubelet-client-certificate
e o sinalizador --kubelet-client-key
, respectivamente, para habilitar a autenticação baseada em certificado para Kubelets.
...
spec:
containers:
- command:
- kube-apiserver
- --audit-log-maxage=50
- --audit-log-maxbackup=20
- --audit-log-maxsize=200
image: gcr.io/google_containers/kube-apiserver-amd64:v1.6.0
...
--kubelet-certificate-authority
.
...
spec:
containers:
- command:
- kube-apiserver
- --audit-log-maxage=50
- --audit-log-maxbackup=20
- --audit-log-maxsize=200
image: gcr.io/google_containers/kube-apiserver-amd64:v1.6.0
...
Node
é um modo de autorização de propósito especial que autoriza especificamente solicitações de API feitas por Kubelets. Isso garante que os Kubelets tenham o conjunto mínimo de permissões necessárias para operar corretamente.Node
.
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --authorization-mode=RBAC,Webhook
...
NodeRestriction
para um servidor de API do Kubernetes. O controlador de admissão NodeRestriction
limita cada Kubelet a modificar seus objetos Node e Pod, bem como negar acesso a objetos confidenciais do sistema. Isso impede que qualquer nó comprometido obtenha privilégios em outros nós de um cluster do Kubernetes.Pod
a seguir inicia um servidor da API Kubernetes sem habilitar o controlador de admissão NodeRestriction
.
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --enable-admission-plugins=PodSecurityPolicy
...
PodSecurityPolicy
é indicativo de controles de segurança fracos, a menos que haja uma ferramenta alternativa de aplicação de políticas para Kubernetes, como K-Rail, Kyverno, OPA/Gatekeeper. O controlador de admissão PodSecurityPolicy
impõe políticas de segurança de pod que especificam atributos de pod relacionados à segurança permitidos em um cluster. Por exemplo, usando PodSecurityPolicy
, você pode proibir contêineres privilegiados e desabilitar o escalonamento de privilégios por padrão sempre que um Pod
é criado.Pod
a seguir inicia um servidor da API Kubernetes sem habilitar o controlador de admissão PodSecurityPolicy
.
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --enable-admission-plugins=NodeRestriction
...
RBAC
) controla o acesso a recursos de computador ou rede com base nas funções de usuários individuais em uma organização. O RBAC é o modo de autorização mais seguro.RBAC
.
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --authorization-mode=Node,Webhook
...
Pod
sem qualquer contexto de segurança porque não há o campo securityContext
.
apiVersion: v1
kind: Pod
...
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
protocol: TCP
SecurityContextDeny
impede que os Pods definam determinados campos do SecurityContext que permitem o escalonamento de privilégios em um cluster do Kubernetes. A menos que haja uma ferramenta alternativa de aplicação de políticas para o Kubernetes, como políticas de segurança de Pods apropriadas, o controlador de admissão SecurityContextDeny
deve ser habilitado.Pod
a seguir inicia um servidor de API do Kubernetes sem habilitar o controlador de admissão SecurityContextDeny
.
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --enable-admission-plugins=NodeRestriction
...
--service-account-private-key-file
para especificar a chave de assinatura do token.--service-account-private-key-file
.
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-controller-manager
image: k8s.gcr.io/kube-controller-manager:v1.9.7
...
ServiceAccount
automatiza o gerenciamento da conta de serviço. Alguns benefícios do controlador de admissão ServiceAccount
são para mitigar a exfiltração de token de acesso com rotação automatizada de credenciais e eliminar a necessidade de persistir segredos no armazenamento. O controlador de admissão ServiceAccount
está habilitado por padrão, mas foi deliberadamente desabilitado.Pod
a seguir inicia um servidor de API do Kubernetes e desabilita o controlador de admissão ServiceAccount
.
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --disable-admission-plugins=ServiceAccount,PodNodeSelector
...
NamespaceLifecycle
mantém a integridade dos sistemas Kubernetes de duas maneiras. Primeiro, ele evita que objetos sejam criados em namespaces inexistentes ou em namespaces que estão sendo encerrados. Em segundo lugar, evita que os namespaces reservados do sistema, que contêm serviços essenciais do Kubernetes, sejam excluídos.NamespaceLifecycle
é ativado por padrão, mas o comando para iniciar o servidor da API Kubernetes o desativou com o sinalizador --disable-admission-plugin
.NamespaceLifecycle
incluído no sinalizador --disable-admission-plugins
desativa o controlador de admissão NamespaceLifecycle
.
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --disable-admission-plugins=...,NamespaceLifecycle,...
...
--peer-auto-tls
como true
. Como resultado, a instância etcd usa certificados autoassinados para conexões TLS com pares.
...
spec:
containers:
- command:
...
- etcd
...
- --peer-auto-tls=true
...
root
sem dar acesso root
pleno. A capacidade CAP_SYS_ADMIN
concede a permissão para realizar a maior variedade possível de operações de administração do sistema em um pod.CAP_SYS_ADMIN
para um contêiner em um pod.
...
kind: Pod
...
spec:
containers:
...
securityContext:
capabilities:
add:
- CAP_SYS_ADMIN
- SYS_TIME
...
privileged
permite ao contêiner quase todos os mesmos privilégios de outros processos em execução no host. Isso expande a superfície de ataque e viola o princípio de execução de imagens com o mínimo de privilégios.privileged: true
.
...
kind: Pod
...
spec:
containers:
- name: ...
image: ...
securityContext:
privileged: true
...