La seguridad de un software no es un software de seguridad. Nos preocupamos de cuestiones como la autenticación, el control de acceso, la confidencialidad, la criptografía y la gestión de privilegios.
streamingConnectionIdleTimeout
de una configuración de Kubelet especifica el máximo de tiempo que una conexión de transmisión puede estar inactiva antes de que la conexión se cierre automáticamente. Establecer límites de tiempo de inactividad protege contra ataques de denegación de servicio y contra el riesgo de quedarse sin conexiones. Al ajustar el valor del campo en 0
se desactiva el límite de tiempo de inactividad.streamingConnectionIdleTimeout
en 0
.
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
streamingConnectionIdleTimeout: 0
AlwaysAllow
porque permite todas las solicitudes.AlwaysAllow
como uno de los modos de autorización.
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --authorization-mode=...,AlwaysAllow,...
...
--root-ca-file
, que especifica un archivo de entidad de certificación raíz (CA). Como resultado, el administrador de controlador de Kubernetes no publica la entidad de certificación raíz correspondiente para los pods. Sin la entidad de certificación raíz, los pods no pueden verificar el certificado de servicio del servidor API antes de establecer conexiones. Estas conexiones son vulnerables a un ataque "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
o Webhook
. Un modo de autorización no especificado tiene como valor predeterminado AlwaysAllow
. El Kubelet no realiza ninguna comprobación de autorización en el modo AlwaysAllow
porque permite todas las solicitudes. Debido a que los Kubelets son los agentes principales de Kubernetes para administrar la carga de trabajo del equipo del componente, los atacantes pueden usar solicitudes no controladas para obtener acceso a las API de servicios sensibles a la seguridad y con protección insuficiente.AlwaysAllow
.
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
authorization:
mode: AlwaysAllow
clientCAFile
que especifica el paquete de CA utilizado para verificar los certificados de cliente.
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
--kubelet-client-certificate
y --kubelet-client-key
respectivamente para habilitar la autenticación basada en certificados en 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
es un modo de autorización con propósito especial que autoriza específicamente las solicitudes de API realizadas por Kubelets. Esto garantiza que Kubelets tenga el conjunto mínimo de permisos necesarios para funcionar correctamente.Node
.
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --authorization-mode=RBAC,Webhook
...
NodeRestriction
para un servidor de API de Kubernetes. El controlador de admisión NodeRestriction
limita cada Kubelet para modificar sus objetos nodo y Pod y para denegar el acceso a objetos confidenciales del sistema. Así se evita que un nodo comprometido obtenga privilegios en otros nodos de un clúster de Kubernetes.Pod
inicia un servidor de API de Kubernetes sin habilitar el controlador de admisión NodeRestriction
.
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --enable-admission-plugins=PodSecurityPolicy
...
PodSecurityPolicy
es indicativo de controles de seguridad débiles, a menos que exista una herramienta alternativa de cumplimiento de políticas para Kubernetes, como K-Rail, Kyverno, OPA/Gatekeeper. El controlador de admisión PodSecurityPolicy
hace cumplir las políticas de seguridad de Pod que especifican los atributos de Pod relacionados con la seguridad permitidos en un clúster. Por ejemplo, con PodSecurityPolicy
puede prohibir contenedores privilegiados y no permitir la escalada de privilegios de forma predeterminada cada vez que se crea un Pod
.Pod
inicia un servidor de API de Kubernetes sin habilitar el controlador de admisión PodSecurityPolicy
.
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --enable-admission-plugins=NodeRestriction
...
RBAC
) controla el acceso a los recursos informáticos o de red en función de los roles de los usuarios individuales dentro de una organización. RBAC es el modo de autorización más seguro.RBAC
.
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --authorization-mode=Node,Webhook
...
Pod
sin ningún contexto de seguridad porque no existe el campo securityContext
.
apiVersion: v1
kind: Pod
...
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
protocol: TCP
SecurityContextDeny
evita que los Pods configuren ciertos campos de SecurityContext que permiten la escalada de privilegios en un clúster de Kubernetes. A menos que exista una herramienta de cumplimiento de políticas alternativa para Kubernetes, como políticas de seguridad de Pod adecuadas, el controlador de admisión SecurityContextDeny
debe estar habilitado.Pod
inicia un servidor de API de Kubernetes sin habilitar el controlador de admisión SecurityContextDeny
.
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --enable-admission-plugins=NodeRestriction
...
--service-account-private-key-file
para especificar la clave para firmar el 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 la gestión de la cuenta de servicio. Algunas ventajas del controlador de admisión ServiceAccount
son que reduce la exfiltración de tokens de acceso con la rotación de credenciales automatizada y elimina la necesidad de conservar los secretos en el almacenamiento. El controlador de admisión ServiceAccount
está habilitado por defecto, pero se ha deshabilitado deliberadamente.Pod
inicia un servidor de API de Kubernetes y deshabilita el controlador de admisión ServiceAccount
.
apiVersion: v1
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --disable-admission-plugins=ServiceAccount,PodNodeSelector
...
NamespaceLifecycle
mantiene la integridad de los sistemas Kubernetes de dos formas. En primer lugar, evita que se creen objetos en espacios de nombres inexistentes o en espacios de nombres en proceso de finalización. En segundo lugar, evita que se eliminen los espacios de nombres reservados del sistema, los cuales contienen servicios críticos de Kubernetes.NamespaceLifecycle
está habilitado de forma predeterminada, pero el comando para iniciar el servidor API de Kubernetes lo ha deshabilitado con la marca --disable-admission-plugin
.NamespaceLifecycle
incluido en la marca --disable-admission-plugins
deshabilita el controlador de admisión NamespaceLifecycle
.
...
kind: Pod
...
spec:
containers:
- command:
- kube-apiserver
...
- --disable-admission-plugins=...,NamespaceLifecycle,...
...
--peer-auto-tls
en true
. Como resultado, la instancia etcd usa certificados autofirmados para conexiones TLS con pares.
...
spec:
containers:
- command:
...
- etcd
...
- --peer-auto-tls=true
...
root
sin dar pleno acceso root
. La capacidad CAP_SYS_ADMIN
otorga el permiso para realizar la gama más amplia posible de operaciones de administración del sistema en un pod.CAP_SYS_ADMIN
a un contenedor en un pod.
...
kind: Pod
...
spec:
containers:
...
securityContext:
capabilities:
add:
- CAP_SYS_ADMIN
- SYS_TIME
...
privileged
permite al contenedor casi todos los mismos privilegios que otros procesos que se ejecutan en el host. Esto expande la superficie de ataque e infringe el principio de ejecutar imágenes con privilegios mínimos.privileged: true
.
...
kind: Pod
...
spec:
containers:
- name: ...
image: ...
securityContext:
privileged: true
...