El problema fundamental que aborda ReadyOn es la seguridad y el aislamiento de datos en entornos multi-inquilino de Kubernetes, donde la compartición de recursos introduce un modelo de amenaza significativamente diferente al de clústeres de un solo inquilino. Históricamente, Kubernetes no fue diseñado con los namespaces como un límite de seguridad estricto, lo que requiere capas adicionales para proteger datos sensibles de accesos no autorizados entre inquilinos. La necesidad de una solución robusta se agudiza en plataformas que manejan datos críticos para empresas Fortune 100, donde una brecha podría tener implicaciones regulatorias y de confianza severas.
La solución de ReadyOn, el modelo de las 'Cuatro Paredes', aborda esta deficiencia inherente al diseño de Kubernetes al implementar una estrategia de defensa en profundidad. En lugar de depender de una única capa de aislamiento, se construyen barreras independientes en diferentes niveles de la pila tecnológica. Esto eleva drásticamente el costo y la complejidad para un atacante que intente acceder a datos de otro inquilino, ya que requeriría superar múltiples mecanismos de seguridad simultáneamente, cada uno con una técnica de ataque fundamentalmente diferente.
Arquitectura del Sistema
La arquitectura de ReadyOn se articula en cuatro capas de aislamiento independientes, cada una operando en un nivel distinto de la pila. La 'Pared 1' es el aislamiento a nivel de namespace de Kubernetes, donde cada inquilino reside en un namespace dedicado con políticas estrictas de RBAC, cuotas de recursos y control de admisión. La consistencia se asegura mediante GitOps con Argo CD ApplicationSet, que genera todos los recursos necesarios a partir de una única entrada de configuración, garantizando una postura de seguridad idéntica para todos los inquilinos y corrigiendo automáticamente cualquier desviación del estado declarado.
La 'Pared 2' se enfoca en el aislamiento de cómputo. Karpenter provisiona pools de nodos dedicados y autoescalables para cada inquilino, utilizando una estrategia de 'dual-taint'. Cada nodo lleva un taint de identificación de inquilino y otro de tipo de carga de trabajo, y los pods deben tolerar ambos para ser programados, impidiendo la colocación de pods entre inquilinos. Un controlador de admisión valida que las toleraciones de los pods coincidan con la identidad del inquilino del namespace. Además, se aplican credenciales de nodo con alcance limitado (IMDSv2 con hop limit reducido) y roles IAM específicos por inquilino, restringiendo el impacto de un posible escape de contenedor.
La 'Pared 3' implementa aislamiento de red a nivel de Amazon VPC y Security Groups. Cada clúster Amazon Aurora de un inquilino está protegido por un Security Group que solo permite conexiones entrantes desde el Security Group asociado a los nodos de aplicación de ese mismo inquilino. Esto es una regla de red definida por software de AWS, independiente de Kubernetes. Las políticas de red de Kubernetes aplican un 'default-deny' para el tráfico entre namespaces. La VPC se segmenta en cuatro tiers (público, aplicación, base de datos, control plane) y el API server de EKS es privado, accesible solo vía VPN con OIDC y MFA.
Finalmente, la 'Pared 4' aborda el aislamiento de datos. Cada inquilino tiene un clúster Amazon Aurora dedicado, eliminando la necesidad de filtrado a nivel de fila en una base de datos compartida. Esto también permite el uso de claves de cifrado AWS KMS únicas por inquilino. Las cargas de trabajo utilizan credenciales de corta duración a través de IAM Roles for Service Accounts (IRSA), asumiendo roles IAM únicos y con alcance limitado al inquilino. La observabilidad (métricas, logs, trazas) también se segrega a backends dedicados por inquilino mediante OpenTelemetry.
Flujo de Aislamiento Multi-Inquilino (Ataque de Movimiento Lateral)
- 1 Pod Inquilino A Proceso no autorizado intenta acceder a recursos de Inquilino B
- 2 Pared 1: Aislamiento Namespace RBAC, Cuotas, Control de Admisión bloquean creación/modificación de recursos ...
- 3 Pared 2: Aislamiento Cómputo Karpenter dual-taint y validación de admisión impiden scheduling en nodos de ...
- 4 Pared 3: Aislamiento Red Security Groups de VPC y Network Policies default-deny bloquean conexiones TC...
- 5 Pared 4: Aislamiento Datos Aurora dedicado, IRSA, KMS por inquilino bloquean acceso a datos/secretos/obs...
- 6 Recursos Inquilino B Acceso denegado en todas las capas.
| Capa | Tecnología | Justificación |
|---|---|---|
| orchestration | Amazon EKS | Plataforma de orquestación de contenedores base para las cargas de trabajo multi-inquilino. |
| orchestration | Kubernetes Namespaces | Límite lógico primario para la segregación de inquilinos, base para otras capas de aislamiento. RBAC, Resource Quotas, Admission Control por namespace. |
| orchestration | Karpenter | Provisionamiento y autoescalado de nodos de cómputo dedicados por inquilino. vs Cluster Autoscaler Estrategia de dual-taint (tenant-identifier y workload-type). |
| networking | Amazon VPC Security Groups | Aislamiento de red a nivel de infraestructura, controlando el acceso a bases de datos entre inquilinos. Reglas de entrada/salida por Security Group de nodo de aplicación a Security Group de base de datos. |
| networking | Kubernetes Network Policies | Control de tráfico de red a nivel de pod/namespace, aplicando un modelo de 'default-deny'. Default-deny para tráfico inter-namespace. |
| storage | Amazon Aurora | Base de datos relacional dedicada por inquilino para garantizar el aislamiento de datos. vs Bases de datos compartidas con RLS Clústeres dedicados por inquilino, cifrado con AWS KMS por inquilino. |
| security | IAM Roles for Service Accounts (IRSA) | Provisión de credenciales de AWS de corta duración y con alcance limitado para cargas de trabajo. vs Credenciales de larga duración en pods Federación OIDC entre EKS e IAM, roles IAM únicos por inquilino. |
| security | AWS Secrets Manager | Almacenamiento seguro de secretos por inquilino, integrados con GitOps. vs Almacenamiento de secretos en Git Rutas de secretos con alcance de inquilino, External Secrets Operator. |
| observability | OpenTelemetry | Recopilación y enrutamiento de métricas, logs y trazas a backends de observabilidad dedicados por inquilino. Backends de observabilidad dedicados por inquilino. |
| orchestration | Argo CD ApplicationSet | Automatización de la provisión y gestión de recursos de Kubernetes mediante GitOps. vs Helm, Kustomize sin GitOps Generación de recursos de namespace, RBAC, Network Policies, Resource Quotas y secretos. |
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: tenant-applications
spec:
generators:
- list:
elements:
- tenant: acme-corp
awsAccountId: "123456789012"
- tenant: example-inc
awsAccountId: "987654321098"
template:
metadata:
name: '{{tenant}}-app'
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/readyon/tenant-configs.git
targetRevision: HEAD
path: '{{tenant}}'
destination:
server: https://kubernetes.default.svc
namespace: '{{tenant}}'
syncPolicy:
automated:
prune: true
selfHeal: true
---# Karpenter Provisioner para nodos de inquilino
apiVersion: karpenter.sh/v1alpha5
kind: Provisioner
metadata:
name: tenant-acme-corp-frontend
spec:
requirements:
- key: kubernetes.io/arch
operator: In
values: ["amd64"]
- key: kubernetes.io/os
operator: In
values: ["linux"]
- key: karpenter.sh/capacity-type
operator: In
values: ["on-demand"]
- key: tenant
operator: In
values: ["acme-corp"]
- key: workload
operator: In
values: ["frontend"]
taints:
- key: tenant
value: acme-corp
effect: NoSchedule
- key: workload
value: frontend
effect: NoSchedule
# ... otros campos de Karpenter
---
# Pod de aplicación con tolerations
apiVersion: v1
kind: Pod
metadata:
name: acme-corp-frontend-pod
namespace: acme-corp
spec:
containers:
- name: app
image: myapp:latest
tolerations:
- key: tenant
operator: Equal
value: acme-corp
effect: NoSchedule
- key: workload
operator: Equal
value: frontend
effect: NoSchedule
# ... otros campos del PodFundamentos Teóricos
El concepto de 'defensa en profundidad' (defense-in-depth) es un principio de seguridad bien establecido que se remonta a estrategias militares y ha sido adoptado en la informática. Implica la aplicación de múltiples capas de controles de seguridad para proteger los activos, de modo que si una capa falla, otra pueda mitigar la amenaza. Este principio fue formalizado en el contexto de la seguridad de sistemas por autores como Saltzer y Schroeder en su seminal paper 'The Protection of Information in Computer Systems' (1972), donde describen la necesidad de múltiples mecanismos de protección para lograr un sistema seguro.
La estrategia de ReadyOn de combinar aislamiento a nivel de namespace, cómputo, red y datos refleja directamente este principio. Cada 'pared' representa una capa de control independiente, diseñada para ser superada con una técnica diferente. Esto se alinea con la idea de que la seguridad no es un punto único de fallo, sino una composición de barreras que incrementan la dificultad para un atacante. La elección de bases de datos dedicadas por inquilino, en lugar de una base de datos compartida con filtrado a nivel de fila, también se relaciona con el principio de 'mínimo privilegio' y la reducción de la superficie de ataque, ya que elimina la posibilidad de errores lógicos en la aplicación que podrían llevar a la divulgación de datos entre inquilinos.