Protección de Container Engine for Kubernetes

En este tema se proporcionan recomendaciones de seguridad de uso de Container Engine for Kubernetes (también conocido como OKE) de Oracle Cloud Infrastructure.

Clusters multiinquilino

Cargas de trabajo que se distribuyen mutuamente

En este momento, no se recomienda ejecutar cargas de trabajo que no sean de confianza mutua en el mismo cluster. Por ejemplo, no debe ejecutar las siguientes cargas de trabajo en el mismo cluster:

  • Cargas de trabajo de desarrollo y cargas de trabajo de producción
  • Plano de control y plano de datos
  • Cargas de trabajo que ejecutan un código de cliente arbitrario

Cargas de trabajo con diferentes niveles de confianza

Considere la posibilidad de tener clusters independientes si tiene varios clientes, equipos o usuarios que acceden al mismo cluster con distintos niveles de confianza. Como se menciona en las secciones siguientes, Kubernetes y OKE ofrecen métodos para aislar las cargas de trabajo. Sin embargo, estos métodos no son actualmente suficientes para la configuración estricta de multi-arrendamiento.

Kubelets tiene acceso de lectura a los recursos

Un kubelet que se ejecuta en un nodo de trabajador en un cluster creado por OKE no puede modificar los recursos que no pertenecen al nodo del kubelet. Para obtener más información, consulte los detalles sobre el controlador de admisión NodeRestriction en la documentación de Kubernetes.

Tenga en cuenta, especialmente cuando se ejecutan cargas de trabajo multi-inquilino, que aunque un kubelet no puede modificar recursos que no pertenecen a su nodo, el kubelet aún puede leer esos recursos. Estos recursos pueden incluir:

  • Servicios
  • terminales
  • nodos
  • pods
  • secretos, configmaps y volúmenes persistentes enlazados al nodo de kubelet

Para obtener más información, consulte Uso de autorización de nodos en la documentación de Kubernetes.

Control de acceso basado en roles (RBAC)

Kubernetes incluye un componente de control de acceso basado en roles (RBAC) integrado que coincide con un usuario o grupo de entrada con un conjunto de permisos que están agrupados en roles. Estos permisos combinan verbos (get, create, delete) con recursos (pods, servicios, nodos) y se pueden acotar a un espacio de nombres o un cluster. Se proporciona un conjunto de roles preconfigurados que ofrecen una separación de responsabilidad razonable por defecto, según las acciones que un cliente puede que desee realizar.

Es importante saber de qué manera las actualizaciones en un objeto pueden provocar acciones en otros lugares. Por ejemplo, puede que un usuario no sea capaz de crear pods directamente, pero permitiéndoles crear un despliegue, lo que crea pods en su nombre, les permitirá crear esos pods indirectamente. Del mismo modo, al suprimir un nodo de la API, se programarán los pods para que ese nodo se termine y se vuelva a crear en otros nodos. Los roles preconfigurados representan un equilibrio entre la flexibilidad y los casos de uso comunes, pero los roles más limitados se deben revisar con cuidado para evitar una escalada accidental de privilegios. Puede hacer que los roles sean específicos del caso de uso si los roles preconfigurados no responden a sus necesidades.

Siempre debe seguir el principio de privilegio mínimo para garantizar que los usuarios y las cuentas de servicio de Kubernetes tengan el conjunto mínimo de privilegios necesarios. Por defecto, cualquier usuario con acceso USE CLUSTER en Oracle Cloud Infrastructure IAM o cualquier cuenta de servicio de Kubernetes no tendrá acceso a la API de Kubernetes, excepto a los roles de detección. Consulte Acerca del control de acceso y Container Engine for Kubernetes para saber cómo se integra IAM con OKE.

Debe utilizar el OCID del principal al crear enlaces de RBAC (por ejemplo, OCID de usuario, OCID de instancia y nombre de servicio).

Seguridad de cluster

Puede controlar las operaciones que pueden realizar los pods en un cluster creado con Container Engine for Kubernetes mediante la configuración de políticas de seguridad de pod para el cluster. Las políticas de seguridad de pods son una forma de garantizar que los pods cumplen las condiciones relacionadas con la seguridad antes de que un cluster las pueda aceptar. Por ejemplo, puede utilizar políticas de seguridad de pod para:

  • limitar las opciones de almacenamiento disponibles para pods
  • restringir la red de host y los puertos a los que pueden acceder los pods
  • evitar que los pods se ejecuten como usuario raíz
  • evitar que los pods se ejecuten en modo con privilegios

Al haber definido una política de seguridad de pod para un cluster, debe autorizar al usuario o pod solicitante a utilizar la política creando roles y enlaces. A continuación, puede especificar si un cluster aplica las políticas de seguridad de pod definidas para él al activar el controlador de admisión de PodSecurityPolicy del cluster.

Para obtener más información, consulte Uso de políticas de seguridad de pod con contenedor para Kubernetes.

Nota

El proyecto ascendente de Kubernetes desaprobó las políticas de seguridad de pod en Kubernetes versión 1.21 y eliminó la función en Kubernetes versión 1.25. Por lo tanto, Container Engine for Kubernetes no soporta políticas de seguridad de pod y el controlador de admisión PodSecurityPolicy en clusters que ejecutan la versión 1.25 y posteriores de Kubernetes.

Si necesita una funcionalidad similar, considere utilizar los estándares de seguridad de pod de Kubernetes y el controlador de admisión PodSecurity en su lugar (junto con las políticas con privilegios, base y restringidas). Por defecto, Container Engine for Kubernetes activa el controlador de admisión PodSecurity en clusters que ejecutan la versión 1.23 y posteriores de Kubernetes para soportar estándares de seguridad de pod. Para obtener más información sobre los estándares de seguridad de pod de Kubernetes y el controlador de admisión PodSecurity, consulte Estándares de seguridad de pod en la documentación de Kubernetes.

Otra posibilidad es utilizar otras alternativas que se están desarrollando en el ecosistema de Kubernetes para aplicar políticas.

Si decide pasar de utilizar políticas de seguridad de pod y el controlador de admisión PodSecurityPolicy a utilizar estándares de seguridad de pod y el controlador de admisión PodSecurity, consulte Migración de PodSecurityPolicy al controlador de admisión PodSecurity incorporado en la documentación de Kubernetes. Tenga en cuenta que es importante completar la migración antes de crear un nuevo cluster que ejecute la versión 1.25 de Kubernetes o antes de actualizar un cluster de Kubernetes versión 1.24 existente para ejecutar la versión 1.25 de Kubernetes. Tenga en cuenta también que la consola proporciona una forma práctica de desactivar el uso del controlador de admisión PodSecurityPolicy en clusters de Kubernetes existentes creados y gestionados por Container Engine for Kubernetes (consulte Uso de la consola para desactivar el controlador de admisión PodSecurityPolicy).

Seguridad del pool de nodos

Compartimentos de pools de nodos

Los pools de nodos de un cluster pueden abarcar compartimentos. Sin embargo, si bien el uso de varios compartimentos ofrece una manera práctica de agrupar y gestionar nodos de trabajo, no proporciona ningún tipo de aislamiento entre los nodos de trabajo del cluster. Se puede programar cualquier carga de trabajo en cualquier pool de nodos, independientemente del compartimento. Un caso de uso válido para usar más de un compartimento para un pools de nodos sería crear fácilmente grupos dinámicos y políticas de IAM para nodos de trabajo. Un caso de uso no válido para varios compartimentos sería colocar cada pool de nodos que ejecuta una carga de trabajo del cliente en un compartimento independiente bajo la suposición de que los compartimentos proporcionan algún tipo de aislamiento o límite de seguridad.

Subredes de pool de nodos

Se recomienda utilizar únicamente subredes privadas para los pools de nodos. Se debe configurar un gateway de servicio para proporcionar acceso a los servicios de Oracle Cloud Infrastructure. No se puede utilizar un gateway de servicio si las subredes son públicas con un gateway de Internet. Si sus subredes privadas requieren acceso a Internet, utilice un gateway NAT.

Control de a qué pods de nodos puede acceder

Por defecto, se puede programar un pod en cualquier nodo del cluster. Kubernetes ofrece un amplio conjunto de políticas para controlar la ubicación de los pods en los nodos y la ubicación y expulsión de pods basada en marcado que estén disponibles para los usuarios finales. Para muchos clusters, el uso de estas políticas para separar cargas de trabajo puede ser una convención que los autores adoptan o aplican mediante herramientas. Estos controles de ubicación no son adecuados en un entorno multiinquilino cuando los usuarios con capacidades de despliegue no son de confianza. Si hay usuarios que no son de confianza que despliegan código, debe considerar un cluster por grupo que no es de confianza.

Límite del acceso especificado a principales de instancia

Por defecto, todos los pods de un nodo pueden acceder a los certificados principales de la instancia mediante el punto final de metadatos de la instancia. Para evitar la escalada de privilegios a través de principales de instancia, debe aislar las cargas de trabajo entre los pools de nodos con distintos grupos dinámicos para que los pods de un pool de nodos determinado tengan el conjunto mínimo de privilegios necesarios para la función.

Por ejemplo, suponga que tiene las dos siguientes cargas de trabajo y que ambas requieren acceso distinto:

  • LogArchiver: necesita acceso para gestionar bloques y objetos de Object Storage
  • HostMonitor: necesita acceso a la API de Compute para gestionar instancias

El enfoque más sencillo sería programarlo en el mismo pool de nodos y proporcionar el principal de la instancia con todos los accesos necesarios. Sin embargo, esto aumenta el impacto en el caso de que una de las cargas de trabajo se vea comprometida. Un mejor enfoque sería programar las cargas de trabajo en pools de nodos independientes con el conjunto limitado de acceso que los principales de instancias requieren para la carga de trabajo aplicable.

Bloqueo del acceso de contenedor a los metadatos de la instancia

El método preferido de bloquear el acceso es utilizando un plugin de política de red con una política por defecto de tipo "denegar todo". A continuación, se otorga explícitamente acceso a pods y redes que utilizan recursos de NetworkPolicy en Kubernetes mediante selectores de etiquetas. Si no tiene instalado un plugin de política de red, puede utilizar una regla IPTables para restringir el acceso de todos los pods del host. Le recomendamos que no utilice este enfoque para bloquear un subconjunto de pods en un host.

Importante: NetworkPolicys y la siguiente regla de IPTable solo se aplican a los contenedores de la red de superposición de pod. Los contenedores y los servicios que se ejecutan en la red del host no se ven afectados por ninguna de las siguientes opciones:

iptables --insert FORWARD 1 --in-interface veth+ --destination 169.254.0.0/16 --jump DROP

Seguridad de la red

Los pods que se ejecutan en el cluster de OKE a menudo se deben comunicar con otros pods del cluster o con servicios fuera del cluster. Container Engine for Kubernetes ofrece varias opciones para proteger la comunicación hacia las cargas de trabajo del cluster y desde ellas. Para contar con la mejor estrategia de seguridad de red, debe evaluar el uso de una combinación de políticas de red (para proteger la comunicación de red en el nivel del pod) y listas de seguridad (para proteger la comunicación de red en el nivel de host).

Políticas de red

Las políticas de red de Kubernetes permiten a los administradores definir cómo los grupos de pods se pueden comunicar con otros pods del cluster. Además, las políticas de red le permiten definir la forma en que los grupos de pods se pueden comunicar con servicios fuera del cluster (por ejemplo, servicios de Oracle Cloud Infrastructure ).

Para restringir el acceso mediante políticas de red, necesita instalar un plugin de red. Los plugins de red configuran y aplican las políticas de red definidas en Kubernetes. Numerosas opciones de complementos de red están disponibles. Puede seguir estas instrucciones que le ofrecemos para instalar y configurar Calico en el cluster. Los plugins de políticas de red funcionan restringiendo el acceso al host. Para obtener información sobre la instalación de Calico en OKE, consulte Ejemplo: instalación de Calico y configuración de políticas de red.

Listas de seguridad del pool de nodos

Los administradores de la red pueden definir reglas de listas de seguridad en subredes de pools de nodos para restringir el acceso a nodos de trabajo y desde ellos. La definición de reglas de listas de seguridad permite a los administradores aplicar restricciones de red que no se pueden sustituir en los hosts del cluster.

Dado que toda la comunicación entre los podes se produce en una red de superposición de VXLAN en los nodos de trabajo, no puede usar reglas de la lista de seguridad para restringir la comunicación entre los pods. Sin embargo, puede usar listas de seguridad para restringir el acceso a los nodos de trabajo y desde ellos.

Importante: Debe existir un conjunto mínimo de reglas de listas de seguridad en subredes de pools de nodos para garantizar que el cluster pueda funcionar. Consulte Configuración de recursos de red de ejemplo para obtener información sobre el conjunto mínimo de reglas de listas de seguridad antes de modificar las reglas de listas de seguridad.

Mejores prácticas de seguridad de la carga de trabajo

Uso de resúmenes de imágenes en lugar de etiquetas

Se recomienda recuperar solo imágenes mediante resúmenes de imagen y no utilizando etiquetas (ya que las etiquetas de imagen se pueden modificar). Los resúmenes de imágenes son el resumen sha256 de la imagen, que permite a docker verificar que la imagen descargada es la que esperaba.

ID de resumen de imagen de ejemplo:

sha256:77af4d6b9913e693e8d0b4b294fa62ade6054e6b2f1ffb617ac955dd63fb0182

Recupere la imagen como se muestra en el siguiente ejemplo:

docker pull acme@sha256:77af4d6b9913e693e8d0b4b294fa62ade6054e6b2f1ffb617ac955dd63fb0182

Puede utilizar el siguiente comando para mostrar todos los resúmenes de las imágenes locales:

docker images --digests

Limitación del uso de recursos

La cuota de recursos limita el número o la capacidad de recursos otorgados a un espacio de nombres. Esto se suele utilizar para limitar la cantidad de CPU, memoria o disco persistente que puede asignar un espacio de nombres, pero también puede controlar cuántos pods, servicios o volúmenes existen en cada espacio de nombres.

Los rangos de límites restringen el tamaño máximo o mínimo de algunos de los recursos anteriores para evitar que los usuarios soliciten valores demasiado altos o bajos para recursos que se suelen reservar, como la memoria, o para proporcionar límites por defecto cuando no se especifique ninguno.

El acceso a cuotas de recursos se puede restringir mediante políticas de RBAC en Kubernetes. Esto puede ayudar a un administrador a garantizar que los usuarios de un cluster no puedan utilizar recursos a los que no deban tener acceso. Consulte Limitación del uso de recursos en un cluster en la documentación de Kubernetes para obtener más información.

Desactivación del complemento de Tiller

OKE ofrece un complemento opcional de Tiller. Esto permite una forma sencilla de instalar y utilizar Helm+Tiller, lo que permite aprovisionar y ejecutar rápidamente Kubernetes. No se recomienda utilizar este complemento para clusters de producción debido a los riesgos de seguridad asociados a Tiller. Los clusters aprovisionados con Tiller no tienen autenticación ni autorización para llamadas de API realizadas a Tiller, lo que significa que no pueden proporcionar atribuciones para solicitudes. Por lo tanto, cualquier operador o servicio que pueda acceder a Tiller puede llamar a sus API con acceso a Tiller.

Para resolver los problemas de seguridad asociados a Tiller, se ha desarrollado Helm V3. La versión de Helm V3 ha eliminado completamente Tiller de Helm. Se recomienda que se plantee utilizar Helm V3 si desea utilizar la funcionalidad que ofrece Helm+Tiller.

Nota

Para desactivar el complemento de Tiller en un cluster existente, póngase en contacto con los Servicios de Soporte Oracle.

Desactivación del complemento del panel de control de Kubernetes

OKE ofrece un complemento opcional de panel de control de Kubernetes, que ofrece una forma sencilla de instalar el panel de control de Kubernetes. OKE instala el panel de control de Kubernetes con el conjunto mínimo de privilegios necesarios para la ejecución. No podrá utilizar el panel de control sin proporcionar credenciales adicionales. Consulte Acceso a un cluster con el panel de control de Kubernetes para obtener más información.

El panel de control es especialmente útil para los nuevos usuarios de Kubernetes. Sin embargo, no recomendamos la instalación de este complemento en clusters de producción debido a la falta de soporte de autenticación ampliable. Por lo tanto, no puede especificar que desea instalar el panel de control de Kubernetes al crear un cluster mediante la consola. Si decide que desea instalar el panel de control de Kubernetes, cree el cluster mediante la API y defina el atributo isKubernetesDashboardEnabled en true.

Si instala el panel de control de Kubernetes, recomendamos que restrinja el acceso al cluster, en lugar de mostrarlo externamente a través de un equilibrador de carga o de un controlador de entrada. El panel de control de Kubernetes es un vector de ataque común que se usa para acceder a un cluster de Kubernetes.

Nota

Para desactivar el complemento del panel de control de Kubernetes en un cluster existente, póngase en contacto con los Servicios de Soporte Oracle.