Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Seguridad de la red
La seguridad de la red tiene varias facetas. La primera implica la aplicación de reglas que restringen el flujo del tráfico de red entre los servicios. La segunda implica el cifrado del tráfico mientras está en tránsito. Los mecanismos para implementar estas medidas de seguridad en el EKS son variados, pero a menudo incluyen los siguientes elementos:
Control de tráfico
-
Políticas de red
-
Grupos de seguridad
Network encryption
-
Malla de servicios
-
Interfaces de red de contenedores (CNIs)
-
Controladores de ingreso y balanceadores de carga
-
Instancias Nitro
-
ACM Private CA con administrador de certificados
Política de red
Dentro de un clúster de Kubernetes, todas las comunicaciones de un pod a otro están permitidas de forma predeterminada. Si bien esta flexibilidad puede ayudar a fomentar la experimentación, no se considera segura. Las políticas de red de Kubernetes te proporcionan un mecanismo para restringir el tráfico de red entre los Pods (a menudo denominado tráfico Este/Oeste), así como entre los Pods y los servicios externos. Las políticas de red de Kubernetes funcionan en las capas 3 y 4 del modelo OSI. Las políticas de red utilizan etiquetas y selectores de espacios de nombres para identificar los pods de origen y destino, pero también pueden incluir direcciones IP, números de puerto, protocolos o una combinación de ambos. Las políticas de red se pueden aplicar a las conexiones entrantes o salientes del pod, lo que suele denominarse reglas de entrada y salida.
Con el soporte nativo de políticas de red del complemento CNI de Amazon VPC, puede implementar políticas de red para proteger el tráfico de red en los clústeres de Kubernetes. Esto se integra con la API básica de políticas de red de Kubernetes, lo que garantiza la compatibilidad y el cumplimiento de los estándares de Kubernetes. Puede definir políticas mediante distintos identificadores compatibles con la API upstream.
importante
Cuando aprovisiona un clúster de EKS por primera vez, la funcionalidad de política de red CNI de VPC no está habilitada de forma predeterminada. Asegúrese de implementar la versión compatible del complemento CNI de VPC y establezca la ENABLE_NETWORK_POLICY
marca true
en el complemento vpc-cni para habilitarla. Consulte la guía del usuario de Amazon EKS para obtener instrucciones detalladas.
Recomendaciones
Cómo empezar con las políticas de red: siga el principio del mínimo privilegio
Cree una política de denegación predeterminada
Al igual que con las políticas RBAC, se recomienda seguir los principios de acceso con menos privilegios en las políticas de red. Comience por crear una política de denegación total que restrinja todo el tráfico entrante y saliente dentro de un espacio de nombres.
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny namespace: default spec: podSelector: {} policyTypes: - Ingress - Egress
default-deny

Cree una regla para permitir las consultas de DNS
Una vez que hayas establecido la regla de denegación de todo predeterminada, puedes empezar a añadir reglas adicionales, como una regla que permita a los pods consultar CoredNS para la resolución de nombres.
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-dns-access namespace: default spec: podSelector: matchLabels: {} policyTypes: - Egress egress: - to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: kube-dns ports: - protocol: UDP port: 53
allow-dns-access

Agrega reglas de forma incremental para permitir de forma selectiva el flujo de tráfico entre espacios de nombres o pods
Comprenda los requisitos de la aplicación y cree reglas de entrada y salida detalladas según sea necesario. El siguiente ejemplo muestra cómo restringir el tráfico de entrada del puerto 80 al puerto de origen. app-one
client-one
Esto ayuda a minimizar la superficie de ataque y reduce el riesgo de acceso no autorizado.
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-ingress-app-one namespace: default spec: podSelector: matchLabels: k8s-app: app-one policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: k8s-app: client-one ports: - protocol: TCP port: 80
allow-ingress-app-one

Supervisión del cumplimiento de las políticas de red
-
Utilice el editor de políticas de red
-
El editor de políticas de red
ayuda con las visualizaciones, la puntuación de seguridad y se genera automáticamente a partir de los registros de flujo de la red -
Cree políticas de red de forma interactiva
-
-
Registros de auditoría
-
Revise periódicamente los registros de auditoría de su clúster de EKS
-
Los registros de auditoría proporcionan abundante información sobre las acciones que se han realizado en su clúster, incluidos los cambios en las políticas de red
-
Utilice esta información para realizar un seguimiento de los cambios en las políticas de red a lo largo del tiempo y detectar cualquier cambio no autorizado o inesperado
-
-
Pruebas automatizadas
-
Implemente pruebas automatizadas creando un entorno de pruebas que refleje su entorno de producción e implemente periódicamente cargas de trabajo que intenten infringir sus políticas de red.
-
-
Monitorización de las métricas
-
Configure sus agentes de observabilidad para extraer las métricas de Prometheus de los agentes del nodo CNI de la VPC, lo que permite monitorear el estado del agente y los errores del SDK.
-
-
Audite las políticas de red con regularidad
-
Audite periódicamente sus políticas de red para asegurarse de que cumplen con los requisitos actuales de su aplicación. A medida que su aplicación evoluciona, una auditoría le brinda la oportunidad de eliminar las reglas redundantes de entrada y salida y asegurarse de que sus aplicaciones no tengan permisos excesivos.
-
-
Asegúrese de que existan políticas de red mediante Open Policy Agent (OPA)
-
Utilice la política de OPA como se muestra a continuación para garantizar que la política de red esté siempre vigente antes de incorporar los pods de aplicaciones. Esta política deniega la incorporación de los pods k8s con una etiqueta
k8s-app: sample-app
si no existe la política de red correspondiente.
-
package kubernetes.admission import data.kubernetes.networkpolicies deny[msg] { input.request.kind.kind == "Pod" pod_label_value := {v["k8s-app"] | v := input.request.object.metadata.labels} contains_label(pod_label_value, "sample-app") np_label_value := {v["k8s-app"] | v := networkpolicies[_].spec.podSelector.matchLabels} not contains_label(np_label_value, "sample-app") msg:= sprintf("The Pod %v could not be created because it is missing an associated Network Policy.", [input.request.object.metadata.name]) } contains_label(arr, val) { arr[_] == val }
Solución de problemas
Supervise los registros del agente de nodo vpc-network-policy-controller
Habilite los registros del administrador del controlador del plano de control EKS para diagnosticar la funcionalidad de la política de red. Puede transmitir los registros del plano de control a un grupo de CloudWatch registros y utilizar CloudWatchLog Insights para realizar consultas avanzadas. En los registros, puede ver qué objetos de punto final del pod se han resuelto según una política de red, el estado de conciliación de las políticas y depurar si la política funciona según lo previsto.
Además, Amazon VPC CNI le permite habilitar la recopilación y exportación de registros de aplicación de políticas a Amazon Cloudwatch
Amazon VPC CNI también incluye un SDK que proporciona una interfaz para interactuar con los programas eBPF del nodo. El SDK se instala cuando aws-node
se implementa en los nodos. Puede encontrar el binario del SDK instalado en el /opt/cni/bin
directorio del nodo. En el momento del lanzamiento, el SDK proporciona soporte para funcionalidades fundamentales, como la inspección de programas y mapas de eBPF.
sudo /opt/cni/bin/aws-eks-na-cli ebpf progs
Registra los metadatos del tráfico de red
Los registros de flujo de VPC de AWS recopilan metadatos sobre el tráfico que fluye a través de una VPC, como la dirección IP y el puerto de origen y destino, junto con los paquetes aceptados o descartados. Esta información podría analizarse para detectar actividades sospechosas o inusuales entre los recursos de la VPC, incluidos los pods. Sin embargo, dado que las direcciones IP de los pods cambian con frecuencia a medida que se sustituyen, es posible que los registros de flujo no sean suficientes por sí solos. Calico Enterprise amplía los registros de flujo con etiquetas de los pods y otros metadatos, lo que facilita el desciframiento de los flujos de tráfico entre los pods.
Grupos de seguridad
EKS utiliza los grupos de seguridad de VPC de AWS (SGs) para controlar el tráfico entre el plano de control de Kubernetes y los nodos de trabajo del clúster. Los grupos de seguridad también se utilizan para controlar el tráfico entre los nodos de trabajo y otros recursos de VPC y las direcciones IP externas. Al aprovisionar un clúster de EKS (con la versión 1.14-eks.3 o superior de Kubernetes), se crea automáticamente un grupo de seguridad de clúster. Este grupo de seguridad permite una comunicación sin restricciones entre el plano de control de EKS y los nodos de los grupos de nodos gestionados. Para simplificar, se recomienda añadir el clúster SG a todos los grupos de nodos, incluidos los grupos de nodos no gestionados.
Antes de la versión 1.14 de Kubernetes y la versión eks.3 de EKS, había grupos de seguridad independientes configurados para el plano de control y los grupos de nodos de EKS. Las reglas mínimas y sugeridas para los grupos de seguridad del plano de control y los grupos de nodos se encuentran en -group-reqs.html. https://docs.aws.amazon.com/eks/ latest/userguide/sec Las reglas mínimas para el grupo de seguridad del plano de control permiten que el puerto 443 entre desde el nodo de trabajo SG. Esta regla es la que permite a los kubelets comunicarse con el servidor API de Kubernetes. También incluye el puerto 10250 para el tráfico saliente al nodo de trabajo SG; 10250 es el puerto en el que escuchan los kubelets. Del mismo modo, las reglas mínimas del grupo de nodos permiten que el puerto 10250 entre desde el plano de control SG y el 443 que salga desde el plano de control SG. Por último, hay una regla que permite la comunicación sin restricciones entre los nodos de un grupo de nodos.
Si necesita controlar la comunicación entre los servicios que se ejecutan dentro del clúster y los que se ejecutan fuera del clúster, como una base de datos de RDS, considere la posibilidad de utilizar grupos de seguridad para los pods. Con los grupos de seguridad para los pods, puede asignar un grupo de seguridad existente a un conjunto de pods.
aviso
Si haces referencia a un grupo de seguridad que no existía antes de la creación de los pods, estos no se programarán.
Puedes controlar qué pods se asignan a un grupo de seguridad creando un SecurityGroupPolicy
objeto y especificando un PodSelector
o unServiceAccountSelector
. Si se configuran los selectores en, {}
se asignará lo SGs referenciado SecurityGroupPolicy
a todos los pods de un espacio de nombres o a todas las cuentas de servicio de un espacio de nombres. Asegúrese de familiarizarse con todas las consideraciones antes de implementar grupos de seguridad para los pods.
importante
Si los usa SGs para pods, debe crear módulos SGs que permitan la salida del puerto 53 al grupo de seguridad del clúster. Del mismo modo, debe actualizar el grupo de seguridad del clúster para que acepte el tráfico entrante del puerto 53 procedente del grupo de seguridad del pod.
importante
Los límites para los grupos de seguridad se siguen aplicando cuando se utilizan grupos de seguridad para los pods, así que utilícelos con prudencia.
importante
Debes crear reglas para el tráfico entrante desde el grupo de seguridad del clúster (kubelet) para todas las sondas configuradas para el pod.
importante
Los grupos de seguridad para los pods se basan en una función conocida como enlace troncal ENI, que se creó para aumentar la densidad de ENI de una instancia. EC2 Cuando se asigna un pod a un SG, un controlador de VPC asocia un ENI de rama del grupo de nodos al pod. Si no hay suficientes ramas ENIs disponibles en un grupo de nodos en el momento en que el pod está programado, el pod permanecerá en estado pendiente. La cantidad de sucursales que puede admitir ENIs una instancia varía según el tipo o la familia de instancias. Consulta https://docs.aws.amazon.com/eks/latest/userguide/security- groups-for-pods .html# supported-instance-types para obtener más información.
Si bien los grupos de seguridad para pods ofrecen una forma nativa de AWS de controlar el tráfico de red dentro y fuera del clúster sin la sobrecarga de un daemon de políticas, hay otras opciones disponibles. Por ejemplo, el motor de políticas de Cilium le permite hacer referencia a un nombre de DNS en una política de red. Calico Enterprise incluye una opción para asignar políticas de red a los grupos de seguridad de AWS. Si ha implementado una red de servicios como Istio, puede utilizar una pasarela de salida para restringir la salida de la red a dominios o direcciones IP específicos y totalmente cualificados. Para obtener más información sobre esta opción, lea la serie de tres partes sobre el control del tráfico de salida en Istio
¿Cuándo usar la política de red o el grupo de seguridad para los pods?
¿Cuándo usar la política de red de Kubernetes?
-
pod-to-podControlar el tráfico
-
Adecuado para controlar el tráfico de red entre los módulos de un clúster (tráfico de este a oeste)
-
-
Controle el tráfico a nivel de puerto o dirección IP (nivel 3 o 4 de OSI)
Cuándo usar los grupos de seguridad de AWS para los pods (SGP)
-
Aproveche las configuraciones de AWS existentes
-
Si ya tiene un conjunto complejo de grupos de EC2 seguridad que administran el acceso a los servicios de AWS y está migrando aplicaciones de EC2 instancias a EKS, SGPs puede ser una muy buena opción, ya que le permite reutilizar los recursos de los grupos de seguridad y aplicarlos a sus pods.
-
-
Controle el acceso a los servicios de AWS
-
Sus aplicaciones que se ejecutan en un clúster de EKS desean comunicarse con otros servicios de AWS (base de datos RDS) y SGPs utilizarlos como un mecanismo eficaz para controlar el tráfico de los pods a los servicios de AWS.
-
-
Aislamiento del tráfico de pods y nodos
-
Si quieres separar completamente el tráfico del pod del resto del tráfico de nodos, utiliza el
POD_SECURITY_GROUP_ENFORCING_MODE=strict
modo SGP.
-
Prácticas recomendadas para el uso de grupos de seguridad para los pods y de la política de red
-
Seguridad por capas
-
Utilice una combinación de políticas de red de SGP y Kubernetes para lograr un enfoque de seguridad por capas
-
Se usa SGPs para limitar el acceso a nivel de red a los servicios de AWS que no forman parte de un clúster, mientras que las políticas de red de Kubernetes pueden restringir el tráfico de red entre los pods dentro del clúster.
-
-
Principio de privilegios mínimos
-
Permita únicamente el tráfico necesario entre los pods o los espacios de nombres
-
-
Segmente sus aplicaciones
-
Siempre que sea posible, segmente las aplicaciones según la política de red para reducir el radio de cobertura en caso de que una aplicación se vea comprometida
-
-
Mantenga las políticas simples y claras
-
Las políticas de red de Kubernetes pueden ser bastante detalladas y complejas, por lo que es mejor mantenerlas lo más simples posible para reducir el riesgo de errores de configuración y aliviar la sobrecarga de administración
-
-
Reduzca la superficie de ataque
-
Minimice la superficie de ataque limitando la exposición de sus aplicaciones
-
importante
Security Groups for pods ofrece dos modos de aplicación: strict
ystandard
. Debe usar el standard
modo cuando utilice tanto la política de red como los grupos de seguridad para las funciones de los pods en un clúster de EKS.
Cuando se trata de la seguridad de la red, un enfoque por capas suele ser la solución más eficaz. El uso combinado de la política de red de Kubernetes y el SGP puede proporcionar una defense-in-depth estrategia sólida para las aplicaciones que se ejecutan en EKS.
Aplicación de políticas de Service Mesh o política de red de Kubernetes
A service mesh
es una capa de infraestructura dedicada que puede añadir a sus aplicaciones. Le permite añadir de forma transparente funciones como la observabilidad, la gestión del tráfico y la seguridad, sin necesidad de añadirlas a su propio código.
Service Mesh aplica las políticas en la capa 7 (aplicación) del modelo OSI, mientras que las políticas de red de Kubernetes funcionan en la capa 3 (red) y la capa 4 (transporte). Hay muchas ofertas en este espacio, como AWSAppMesh, Istio, Linkerd, etc.
¿Cuándo usar Service Mesh para la aplicación de políticas
-
¿Tiene una inversión existente en una malla de servicios
-
¿Necesita capacidades más avanzadas, como la gestión del tráfico, la observabilidad y la seguridad
-
Control de tráfico, balanceo de carga, interrupción de circuitos, limitación de velocidad, tiempos de espera, etc.
-
Información detallada sobre el rendimiento de sus servicios (latencia, tasas de error, solicitudes por segundo, volúmenes de solicitudes, etc.)
-
¿Desea implementar y aprovechar la malla de servicios para funciones de seguridad como los mTLS
-
Elija la política de red de Kubernetes para casos de uso más sencillos
-
Limite los módulos que pueden comunicarse entre sí
-
Las políticas de red requieren menos recursos que una malla de servicios, lo que las convierte en una buena opción para casos de uso más simples o para clústeres más pequeños en los que la sobrecarga de ejecución y administración de una malla de servicios puede no estar justificada
nota
Las políticas de red y la malla de servicios también se pueden usar juntas. Utilice las políticas de red para proporcionar un nivel básico de seguridad y aislamiento entre sus módulos y, a continuación, utilice una malla de servicios para añadir funciones adicionales, como la gestión del tráfico, la observabilidad y la seguridad.
ThirdParty Motores de políticas de red
Considere la posibilidad de utilizar un motor de políticas de red de terceros si tiene requisitos de política avanzados, como políticas de red globales, compatibilidad con reglas basadas en nombres de servidor DNS, reglas de capa 7, reglas ServiceAccount basadas y deny/log acciones explícitas, etc., Calico
Puede encontrar una lista de las políticas de red habituales de Kubernetes en. https://github.com/ahmetb/kubernetes-network-policy-recipes
Migración al motor de políticas de red CNI de Amazon VPC
Para mantener la coherencia y evitar un comportamiento inesperado de comunicación entre los pods, se recomienda implementar solo un motor de políticas de red en el clúster. Si quieres migrar del motor de políticas de red CNI de 3P a VPC, te recomendamos convertir tu NetworkPolicy CRDs 3P existente a los recursos de NetworkPolicy Kubernetes antes de habilitar el soporte de políticas de red CNI de VPC. Además, pruebe las políticas migradas en un clúster de prueba independiente antes de aplicarlas en su entorno de producción. Esto le permite identificar y abordar cualquier posible problema o incoherencia en el comportamiento de comunicación de los módulos.
Herramienta de migración
Para ayudarte en el proceso de migración, hemos desarrollado una herramienta llamada K8s Network Policy Migrator que convierte tu política de red
importante
La herramienta de migración solo convertirá las políticas de 3P que sean compatibles con la API de políticas de red nativa de Kubernetes. Si utilizas las funciones de política de red avanzadas que ofrecen los complementos de 3P, la herramienta de migración las omitirá e informará de ellas.
Tenga en cuenta que, actualmente, el equipo de ingeniería de políticas de red CNI de AWS VPC no admite la herramienta de migración, sino que se pone a disposición de los clientes haciendo todo lo posible. Le recomendamos que utilice esta herramienta para facilitar el proceso de migración. En caso de que encuentre algún problema o error con la herramienta, le rogamos que cree un GitHubproblema
Recursos adicionales
-
Kubernetes y Tigera: políticas de red, seguridad y auditoría
-
NetworkPolicyEditor: un editor
de políticas interactivo de Cilium -
El dispositivo Inspektor Gadget aconseja políticas de red Sugiere políticas de red basadas en un
análisis del tráfico de la red
Cifrado en tránsito
Es posible que las aplicaciones que deban cumplir con la PCI, la HIPAA u otras normativas necesiten cifrar los datos mientras están en tránsito. Hoy en día, el TLS es la opción de facto para cifrar el tráfico en línea. El TLS, al igual que su predecesor, el SSL, proporciona comunicaciones seguras a través de una red mediante protocolos criptográficos. El TLS utiliza un cifrado simétrico, en el que las claves para cifrar los datos se generan en función de un secreto compartido que se negocia al principio de la sesión. A continuación, se muestran algunas formas de cifrar datos en un entorno de Kubernetes.
Instancias Nitro
El tráfico que se intercambia entre los siguientes tipos de instancias de Nitro, por ejemplo, C5n, G4, I3en, M5dn, M5n, P3dn, R5dn y R5n, se cifra automáticamente de forma predeterminada. Cuando hay un salto intermedio, como una pasarela de tránsito o un balanceador de carga, el tráfico no se cifra. Consulta Cifrado en tránsito para obtener más información sobre el cifrado en tránsito, así como la lista completa de tipos de instancias que admiten el cifrado de red de forma predeterminada.
Interfaces de red de contenedores (CNIs)
WeaveNet
Service Mesh
El cifrado en tránsito también se puede implementar con una malla de servicios como App Mesh, Linkerd v2 e Istio. AppMesh admite mTLs con certificados X.509 o el Servicio de Descubrimiento Secreto (SDS) de Envoy. Tanto Linkerd como Istio admiten mTLS.
El aws-app-mesh-examples
App Mesh también admite el cifrado TLS con un certificado privado emitido por AWS Certificate Manager (ACM) o un certificado almacenado en el sistema de archivos local del nodo virtual.
El aws-app-mesh-examples
Controladores de entrada y balanceadores de carga
Los controladores de ingreso son una forma de enrutar de forma inteligente el HTTP/S traffic that emanates from outside the cluster to services running inside the cluster. Oftentimes, these Ingresses are fronted by a layer 4 load balancer, like the Classic Load Balancer or the Network Load Balancer (NLB). Encrypted traffic can be terminated at different places within the network, e.g. at the load balancer, at the ingress resource, or the Pod. How and where you terminate your SSL connection will ultimately be dictated by your organization’s network security policy. For instance, if you have a policy that requires end-to-end encryption, you will have to decrypt the traffic at the Pod. This will place additional burden on your Pod as it will have to spend cycles establishing the initial handshake. Overall SSL/TLS procesamiento que consume mucha CPU. Por lo tanto, si tiene la flexibilidad necesaria, intente realizar la descarga de SSL en la entrada o en el balanceador de carga.
Utilice el cifrado con los balanceadores de carga elásticos de AWS
Tanto el AWS Application Load Balancer (ALB) como el Network Load Balancer (NLB) admiten el cifrado de transporte (SSL y TLS). La alb.ingress.kubernetes.io/certificate-arn
anotación del ALB le permite especificar qué certificados desea añadir al ALB. Si omite la anotación, el controlador intentará añadir certificados a los oyentes que lo requieran haciendo coincidir los certificados de AWS Certificate Manager (ACM) disponibles mediante el campo host. A partir de la versión 1.15 de EKS, puede utilizar la service.beta.kubernetes.io/aws-load-balancer-ssl-cert
anotación con el NLB, tal y como se muestra en el siguiente ejemplo.
apiVersion: v1 kind: Service metadata: name: demo-app namespace: default labels: app: demo-app annotations: service.beta.kubernetes.io/aws-load-balancer-type: "nlb" service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "<certificate ARN>" service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443" service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http" spec: type: LoadBalancer ports: - port: 443 targetPort: 80 protocol: TCP selector: app: demo-app //--- kind: Deployment apiVersion: apps/v1 metadata: name: nginx namespace: default labels: app: demo-app spec: replicas: 1 selector: matchLabels: app: demo-app template: metadata: labels: app: demo-app spec: containers: - name: nginx image: nginx ports: - containerPort: 443 protocol: TCP - containerPort: 80 protocol: TCP
Los siguientes son ejemplos adicionales de terminación. SSL/TLS
importante
Algunos Ingresses, como el controlador LB de AWS, implementan el SSL/TLS uso de anotaciones en lugar de como parte de la especificación de Ingress.
ACM Private CA con administrador de certificados
Puede habilitar TLS y mTLS para proteger las cargas de trabajo de las aplicaciones de EKS en la entrada, en el pod y entre los pods mediante ACM Private Certificate Authority (CA) y cert-manager
Modo CA de corta duración para un TLS mutuo entre cargas de trabajo
Cuando utilice ACM Private CA para mTLS en EKS, se recomienda utilizar certificados de corta duración con el modo CA de corta duración. Si bien es posible emitir certificados de corta duración en el modo de CA de uso general, utilizar el modo de CA de corta duración resulta más rentable (aproximadamente un 75% más barato que el modo general) en los casos de uso en los que es necesario emitir nuevos certificados con frecuencia. Además, debería intentar ajustar el período de validez de los certificados privados a la vida útil de los módulos de su clúster de EKS. Obtenga más información sobre ACM Private CA y sus ventajas aquí.
Instrucciones de configuración de ACM
Comience por crear una CA privada siguiendo los procedimientos que se proporcionan en los documentos técnicos de ACM Private CA. Una vez que tenga una CA privada, instale cert-manager siguiendo las instrucciones de instalación habituales
Ahora que tiene una CA privada y un clúster de EKS con el administrador de certificados y el complemento instalados, es el momento de establecer los permisos y crear el emisor. Actualice los permisos de IAM del rol de nodo EKS para permitir el acceso a ACM Private CA. <CA_ARN>
Sustitúyalo por el valor de su CA privada:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "awspcaissuer", "Action": [ "acm-pca:DescribeCertificateAuthority", "acm-pca:GetCertificate", "acm-pca:IssueCertificate" ], "Effect": "Allow", "Resource": "<CA_ARN>" } ] }
También se pueden utilizar las funciones de servicio para las cuentas de IAM o IRSA. Consulte la sección de recursos adicionales que aparece a continuación para ver ejemplos completos.
Para crear un emisor en Amazon EKS, cree un archivo de definición de recursos personalizado denominado cluster-issuer.yaml con el siguiente texto y <CA_ARN>
sustituya la información por su CA privada. <Region>
apiVersion: awspca.cert-manager.io/v1beta1 kind: AWSPCAClusterIssuer metadata: name: demo-test-root-ca spec: arn: <CA_ARN> region: <Region>
Implemente el emisor que creó.
kubectl apply -f cluster-issuer.yaml
Su clúster de EKS está configurado para solicitar certificados a Private CA. Ahora puede usar el Certificate
recurso de cert-manager para emitir certificados cambiando los valores del issuerRef
campo por el emisor de CA privado que creó anteriormente. Para obtener más información sobre cómo especificar y solicitar los recursos de certificados, consulte la guía de recursos de certificados de cert-manager.
ACM Private CA con Istio y cert-manager
Si ejecuta Istio en su clúster de EKS, puede deshabilitar el plano de control de Istio (específicamenteistiod
) para que no funcione como autoridad de certificación (CA) raíz y configurar ACM Private CA como CA raíz para los mTLs entre cargas de trabajo. Si opta por este enfoque, considere la posibilidad de utilizar el modo CA de corta duración en ACM Private CA. Consulte la sección anterior y esta entrada del blog
Cómo funciona la firma de certificados en Istio (predeterminado)
Las cargas de trabajo en Kubernetes se identifican mediante cuentas de servicio. Si no especificas una cuenta de servicio, Kubernetes asignará una automáticamente a tu carga de trabajo. Además, las cuentas de servicio montan automáticamente un token asociado. La cuenta de servicio utiliza este token para que las cargas de trabajo se autentiquen en la API de Kubernetes. La cuenta de servicio puede ser suficiente como identidad para Kubernetes, pero Istio tiene su propio sistema de gestión de identidades y CA. Cuando una carga de trabajo se inicia con su proxy sidecar, necesita que Istio le asigne una identidad para que se la considere fiable y pueda comunicarse con otros servicios de la red.
Para obtener esta identidad de Istio, istio-agent
envía una solicitud conocida como solicitud de firma de certificados (o CSR) al plano de control de Istio. Esta CSR contiene el token de la cuenta de servicio para que se pueda verificar la identidad de la carga de trabajo antes de procesarla. De este proceso de verificación se encarga la autoridad de registro (o RA) y la CAistiod
, que actúa como autoridad de registro (o RA). La RA actúa como un guardián que se asegura de que solo los CSR verificados lleguen a la CA. Una vez verificada la CSR, se reenviará a la CA, que emitirá un certificado con la identidad de la SPIFFE
Flujo predeterminado para las solicitudes de firma de certificados de Istio:

Cómo funciona la firma de certificados en Istio con ACM Private CA
Puede utilizar un complemento de gestión de certificados denominado agente de solicitud de firma de certificados de Istio (istio-csr
Siempre que haya una CSR derivada de una carga de trabajo, se reenviará a istio-csr, que solicitará los certificados de ACM Private CA. Esta comunicación entre istio-csr y ACM Private CA se habilita mediante el complemento de emisión de AWS
Flujo de solicitudes de firma de certificados de Istio con istio-csr
imagen: istio-csr-with-acm -private-ca.png [Flujo de solicitudes de firma de certificados de Istio con istio-csr]
Instrucciones de configuración de Istio con CA privada
-
Comience por seguir las mismas instrucciones de configuración de esta sección para completar lo siguiente:
-
Crear una entidad de certificación privada
-
Instale cert-manager
-
Instala el complemento emisor
-
Establece los permisos y crea un emisor. El emisor representa a la CA y se utiliza para firmar
istiod
y combinar los certificados de carga de trabajo. Se comunicará con ACM Private CA. -
Cree un
istio-system
espacio de nombres. Aquí es donde se desplegarán los recursos de Istioistiod certificate
y otros recursos. -
Instale Istio CSR configurado con el complemento AWS Private CA Issuer. Puede conservar las solicitudes de firma de certificados para las cargas de trabajo para comprobar que se aprueban y se firman ().
preserveCertificateRequests=true
helm install -n cert-manager cert-manager-istio-csr jetstack/cert-manager-istio-csr \ --set "app.certmanager.issuer.group=awspca.cert-manager.io" \ --set "app.certmanager.issuer.kind=AWSPCAClusterIssuer" \ --set "app.certmanager.issuer.name=<the-name-of-the-issuer-you-created>" \ --set "app.certmanager.preserveCertificateRequests=true" \ --set "app.server.maxCertificateDuration=48h" \ --set "app.tls.certificateDuration=24h" \ --set "app.tls.istiodCertificateDuration=24h" \ --set "app.tls.rootCAFile=/var/run/secrets/istio-csr/ca.pem" \ --set "volumeMounts[0].name=root-ca" \ --set "volumeMounts[0].mountPath=/var/run/secrets/istio-csr" \ --set "volumes[0].name=root-ca" \ --set "volumes[0].secret.secretName=istio-root-ca"
-
Instale Istio con configuraciones personalizadas para reemplazarlo
istiod
cert-manager istio-csr
como proveedor de certificados para la malla. Este proceso se puede llevar a cabo utilizando el operador Istio.apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: name: istio namespace: istio-system spec: profile: "demo" hub: gcr.io/istio-release values: global: # Change certificate provider to cert-manager istio agent for istio agent caAddress: cert-manager-istio-csr.cert-manager.svc:443 components: pilot: k8s: env: # Disable istiod CA Sever functionality - name: ENABLE_CA_SERVER value: "false" overlays: - apiVersion: apps/v1 kind: Deployment name: istiod patches: # Mount istiod serving and webhook certificate from Secret mount - path: spec.template.spec.containers.[name:discovery].args[7] value: "--tlsCertFile=/etc/cert-manager/tls/tls.crt" - path: spec.template.spec.containers.[name:discovery].args[8] value: "--tlsKeyFile=/etc/cert-manager/tls/tls.key" - path: spec.template.spec.containers.[name:discovery].args[9] value: "--caCertFile=/etc/cert-manager/ca/root-cert.pem" - path: spec.template.spec.containers.[name:discovery].volumeMounts[6] value: name: cert-manager mountPath: "/etc/cert-manager/tls" readOnly: true - path: spec.template.spec.containers.[name:discovery].volumeMounts[7] value: name: ca-root-cert mountPath: "/etc/cert-manager/ca" readOnly: true - path: spec.template.spec.volumes[6] value: name: cert-manager secret: secretName: istiod-tls - path: spec.template.spec.volumes[7] value: name: ca-root-cert configMap: defaultMode: 420 name: istio-ca-root-cert
-
Implemente el recurso personalizado anterior que creó.
istioctl operator init kubectl apply -f istio-custom-config.yaml
-
Ahora puede implementar una carga de trabajo en la malla de su clúster de EKS y aplicar las MTL.
Solicitudes de firma de certificados de Istio
imagen: istio-csr-requests .png [Solicitudes de firma de certificados de Istio]
Herramientas y recursos
-
Taller de inmersión en seguridad de Amazon EKS: seguridad de redes
-
Configuración del cifrado end-to-end TLS en Amazon EKS con el nuevo AWS Load Balancer Controller y ACM
Private CA. -
El complemento privado CA Kubernetes
cert-manager está activado. GitHub -
Guía del usuario del complemento privado de gestión de certificados de CA Kubernetes.
-
Cómo utilizar el modo de certificación de corta duración de AWS Private Certificate Authority
-
egress-operator Un operador
y un complemento de DNS para controlar el tráfico de salida de su clúster sin necesidad de inspeccionar el protocolo -
NeuVector de SUSE
, una plataforma de seguridad de contenedores de código abierto y de confianza cero, proporciona políticas, normas de red, prevención de pérdidas de datos (DLP), firewall de aplicaciones web (WAF) y firmas de amenazas de red.