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
sugerencia
Explore las
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. El segundo implica el cifrado del tráfico mientras está en tránsito. Los mecanismos para implementar estas medidas de seguridad en EKS son variados, pero suelen incluir los siguientes elementos:
Control de tráfico
-
Políticas de red
-
Grupos de seguridad
Network encryption
-
Service Mesh
-
Controladores de ingreso y balanceadores de carga
-
Instancias Nitro
-
ACM Private CA con cert-manager
Política de red
En 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 promover la experimentación, no se considera segura. Las políticas de red de Kubernetes ofrecen un mecanismo para restringir el tráfico de red entre los Pods (lo que suele denominarse East/West tráfico), 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 pods, selectores de espacios de nombres y etiquetas 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 estos. Las políticas de red se pueden aplicar tanto a las conexiones entrantes como salientes al pod, lo que suele denominarse reglas de entrada y salida.
Gracias a la compatibilidad nativa con las 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 de políticas de red de Kubernetes original, lo que garantiza la compatibilidad y el cumplimiento de los estándares de Kubernetes. Puedes definir políticas usando diferentes identificadores compatibles con la API principal. https://kubernetes.io/docs/concepts/services-networking/network-policies/
importante
Cuando aprovisionas un clúster de EKS por primera vez, la funcionalidad de política de red CNI de la VPC no está habilitada de forma predeterminada. Asegúrese de haber implementado la Add-on versión de CNI de VPC compatible y de configurarla true en el ENABLE_NETWORK_POLICY complemento vpc-cni para habilitarla. Consulte la guía del usuario de Amazon EKS para obtener instrucciones detalladas.
Recomendaciones
Introducción a las políticas de red: siga el principio del mínimo privilegio
Crear una política de denegación predeterminada
Al igual que con las políticas de RBAC, se recomienda seguir los principios de acceso con menos privilegios junto con 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
nota
La imagen de arriba fue creada por el visor de políticas de red de Tufin. https://orca.tufin.io/netpol/
Cree una regla para permitir las consultas de DNS
Una vez que hayas establecido la regla predeterminada de denegar todo, puedes empezar a agregar 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
permitir el acceso al DNS
Agregue reglas de forma incremental para permitir de forma selectiva el flujo de tráfico entre namespaces/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 desde el puerto 80. 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
Supervisar la aplicación de 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 con regularidad 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 las pruebas automatizadas creando un entorno de pruebas que refleje su entorno de producción e implemente periódicamente cargas de trabajo que intenten infringir las 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 supervisar el estado de los agentes 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 sus aplicaciones. A medida que su aplicación evoluciona, una auditoría le brinda la oportunidad de eliminar las reglas de entrada y salida redundantes y asegurarse de que sus aplicaciones no tengan permisos excesivos.
-
-
Asegúrese de que existan políticas de red mediante Open Policy Agent (OPA)
-
Usa la política OPA como se muestra a continuación para asegurarte de que la política de red siempre exista antes de incorporar los módulos de aplicaciones. Esta política niega la incorporación de los pods de k8s con una etiqueta
k8s-app: sample-appsi 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 }
Resolución de problemas
Supervise los registros de vpc-network-policy-controller y node-agent
Habilite los registros del administrador de controladores del plano de control del EKS para diagnosticar la funcionalidad de la política de red. Puede transmitir los registros del plano de control a un CloudWatch grupo de registros y utilizar la información de los CloudWatch registros para realizar consultas avanzadas. En los registros, puede ver qué objetos de punto final del pod están resueltos en una política de red, el estado de conciliación de las políticas y depurar si la política funciona según lo esperado.
Además, el CNI de Amazon VPC le permite habilitar la recopilación y exportación de registros de cumplimiento de políticas a Amazon
Amazon VPC CNI también incluye un SDK que proporciona una interfaz para interactuar con los programas de eBPF del nodo. El SDK se instala cuando se implementa en los nodosaws-node. 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 los programas y mapas del eBPF.
sudo /opt/cni/bin/aws-eks-na-cli ebpf progs
Registra los metadatos del tráfico de red
Los registros de flujo de la VPC de AWS capturan los 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 accepted/dropped los paquetes. 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 descifrado de los flujos de tráfico entre los pods.
Grupos de seguridad
EKS usa los grupos de seguridad (SG) de VPC de AWS 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 la VPC, así como las direcciones IP externas. Cuando aprovisionas 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 para ti. 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 agregar el SG del clúster a todos los grupos de nodos, incluidos los grupos de nodos no administrados.
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 del grupo de nodos se encuentran en Las reglas mínimas para https://docs.aws.amazon.com/eks/latest/userguide/sec-group-reqs.html. el grupo de seguridad del plano de control permiten la entrada del puerto 443 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; el 10250 es el puerto en el que escuchan los kubelets. Del mismo modo, las reglas de grupos de nodos mínimos permiten que el puerto 10250 entre desde el plano de control SG y el 443 salga desde el plano de control SG. Por último, existe una regla que permite la comunicación sin restricciones entre los nodos de un grupo de nodos.
Si necesitas 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, considera la posibilidad de usar grupos de seguridad para los pods. Con los grupos de seguridad para pods, puede asignar un grupo de seguridad existente a una colección de pods.
aviso
Si hace referencia a un grupo de seguridad que no existía antes de la creación de los pods, los pods no se programarán.
Para controlar qué pods se asignan a un grupo de seguridad, cree un SecurityGroupPolicy objeto y especifique a PodSelector o aServiceAccountSelector. Si se configuran los selectores en, {} se asignarán los SGs a los que se hace referencia en ellos 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 usa los grupos de seguridad para los pods, debe crear grupos de seguridad 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 úsalos con prudencia.
importante
Debes crear reglas para el tráfico entrante desde el grupo de seguridad del clúster (kubelet) para todos los sondeos configurados 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, una controladora de VPC asocia un ENI de sucursal del grupo de nodos al pod. Si no hay suficientes ENI de sucursal disponibles en un grupo de nodos en el momento en que se programa el pod, el pod permanecerá en estado pendiente. La cantidad de ENI de sucursal que puede admitir una instancia varía según la instancia. type/family 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 AWS-native forma de controlar el tráfico de red dentro y fuera del clúster sin la sobrecarga de un demonio de políticas, hay otras opciones disponibles. Por ejemplo, el motor de políticas de Cilium permite hacer referencia a un nombre DNS en una política de red. Calico Enterprise incluye una opción para asignar las políticas de red a los grupos de seguridad de AWS. Si ha implementado una red de servicios como Istio, puede usar una puerta de enlace de salida para restringir la salida de la red a dominios o direcciones IP específicos y totalmente calificados. Para obtener más información sobre esta opción, lee 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 pods?
¿Cuándo usar la política de red de Kubernetes?
-
Controlar el tráfico de un pod a otro
-
Adecuado para controlar el tráfico de red entre los pods de un clúster (tráfico de este a oeste)
-
-
Controle el tráfico a nivel de dirección IP o puerto (capa OSI 3 o 4)
Cuándo usar los grupos de seguridad de AWS para pods (SGP)
-
Aproveche las configuraciones de AWS existentes
-
Si ya dispone de un conjunto complejo de grupos de seguridad de EC2 que administran el acceso a los servicios de AWS y está migrando aplicaciones de instancias de EC2 a EKS, los SGP pueden ser una excelente opción, ya que le permiten reutilizar los recursos de los grupos de seguridad y aplicarlos a sus pods.
-
-
Controle el acceso a los servicios de AWS
-
Si las aplicaciones que se ejecutan en un clúster de EKS desean comunicarse con otros servicios de AWS (base de datos RDS), utilice los SGP 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 de pods del resto del tráfico de nodos, usa el
POD_SECURITY_GROUP_ENFORCING_MODE=strictmodo SGP.
-
Prácticas recomendadas para usar los grupos de seguridad para los pods y la política de red
-
Seguridad por niveles
-
Utilice una combinación de políticas de red de SGP y Kubernetes para adoptar un enfoque de seguridad por niveles
-
Utilice los SGP 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 del clúster
-
-
Principio de privilegios mínimos
-
Permita únicamente el tráfico necesario entre los pods o los espacios de nombres
-
-
Segmenta tus aplicaciones
-
Siempre que sea posible, segmente las aplicaciones según la política de red para reducir el radio de expansión si una aplicación se ve comprometida
-
-
Mantenga las políticas simples y claras
-
Las políticas de red de Kubernetes pueden ser bastante granulares y complejas, por lo que es mejor mantenerlas lo más sencillas 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. Debes usar el standard modo cuando utilices tanto las funciones de política de red como las de grupos de seguridad para pods en un clúster de EKS.
En lo que respecta a la seguridad de la red, la solución más eficaz suele ser un enfoque por capas. El uso combinado de la política de red de Kubernetes y el SGP puede proporcionar una estrategia sólida de defensa en profundidad 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 agregar a sus aplicaciones. Le permite agregar de manera transparente capacidades como la observabilidad, la administración del tráfico y la seguridad, sin agregarlas a su propio código.
La malla de servicios 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 ámbito, 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 del tráfico, equilibrio 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 las mTLS
-
Elige la política de red de Kubernetes para casos de uso más sencillos
-
Limite los pods que pueden comunicarse entre sí
-
Las políticas de red requieren menos recursos que una malla de servicios, por lo que son ideales para casos de uso más sencillos o para clústeres más pequeños en los que la sobrecarga de ejecutar y administrar 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. Usa las políticas de red para proporcionar un nivel básico de seguridad y aislamiento entre tus pods y, luego, usa una malla de servicios para agregar funciones adicionales, como la administració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 host de DNS, reglas de capa 7, reglas ServiceAccount basadas y deny/log acciones explícitas, etc. Calico
Puedes encontrar una lista de políticas de red comunes de Kubernetes en. https://github.com/ahmetb/kubernetes-network-policy-recipes. Un conjunto similar de reglas para Calico está disponible en https://docs.projectcalico.org/security/calico-network-policy.
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 de 3P a VPC CNI Network Policy Engine, te recomendamos que conviertas tus NetworkPolicy CRD de 3P existentes en NetworkPolicy recursos de Kubernetes antes de habilitar la compatibilidad con las políticas de red CNI de VPC. Además, prueba las políticas migradas en un clúster de prueba independiente antes de aplicarlas en tu entorno de producción. Esto le permite identificar y abordar cualquier posible problema o incoherencia en el comportamiento de comunicación del pod.
Herramienta de migración
Para ayudarlo en su proceso de migración, hemos desarrollado una herramienta llamada K8s Network Policy Migrator
importante
La herramienta de migración solo convertirá las políticas 3P que sean compatibles con la API de políticas de red nativa de Kubernetes. Si utilizas las funciones avanzadas de política de red que ofrecen los complementos de 3P, la herramienta de migración las omitirá y las notificará.
Tenga en cuenta que, por el momento, el equipo de ingeniería de políticas de la red CNI de AWS VPC no admite la herramienta de migración; por el contrario, se pone a disposición de los clientes en la medida de 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 GitHub problema
Recursos adicionales
-
Kubernetes y Tigera: políticas de red, seguridad y auditoría
-
NetworkPolicyEdita
un editor de políticas interactivo de Cilium -
El dispositivo Inspektor Gadget asesora sobre políticas de red
Sugiere políticas de red basándose en un análisis del tráfico de red
Cifrado en tránsito
Es posible que las aplicaciones que deben cumplir las normativas PCI, HIPAA u otras normativas tengan que cifrar los datos mientras están en tránsito. Hoy en día, TLS es la opción de facto para cifrar el tráfico en la red. TLS, al igual que su predecesor 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 maneras de cifrar los 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 cargas, el tráfico no se cifra. Consulta el cifrado en tránsito para obtener más información sobre el cifrado en tránsito, así como la lista completa de los tipos de instancias que admiten el cifrado de red de forma predeterminada.
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 X.509 certificados o con el Servicio Secreto de Descubrimiento (SDS) de Envoy. Tanto Linkerd como Istio son compatibles con los mTLS.
El GitHub repositorio
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 GitHub repositorio
Controladores de ingreso y balanceadores de carga
Los controladores de ingreso permiten enrutar de manera inteligente el HTTP/S tráfico que proviene del exterior del clúster a los servicios que se ejecutan dentro del clúster. Con frecuencia, estos ingresos están dirigidos por un balanceador de cargas de nivel 4, como el balanceador de cargas clásico o el balanceador de cargas de red (NLB). El tráfico cifrado puede terminar en diferentes lugares de la red, por ejemplo, en el balanceador de cargas, en el recurso de entrada o en el pod. En última instancia, la política de seguridad de red de la organización determinará cómo y dónde se interrumpa la conexión SSL. Por ejemplo, si tienes una política que exige el cifrado de extremo a extremo, tendrás que descifrar el tráfico del Pod. Esto supondrá una carga adicional para tu Pod, ya que tendrá que dedicar varios ciclos a establecer el apretón de manos inicial. En general, el SSL/TLS procesamiento consume mucha CPU. Por lo tanto, si tienes la flexibilidad necesaria, prueba a realizar la descarga de SSL en el Ingress o en el balanceador de cargas.
Utilice el cifrado con los balanceadores de cargas de AWS Elastic
Tanto el balanceador de carga de aplicaciones (ALB) como el balanceador de carga de red (NLB) de AWS admiten el cifrado del transporte (SSL y TLS). La alb.ingress.kubernetes.io/certificate-arn anotación de la ALB le permite especificar qué certificados desea agregar a la ALB. Si omite la anotación, el controlador intentará agregar certificados a los oyentes que lo requieran haciendo coincidir los certificados de AWS Certificate Manager (ACM) disponibles mediante el campo de host. A partir de la versión 1.15 de EKS, puede usar la service.beta.kubernetes.io/aws-load-balancer-ssl-cert anotación con el NLB, tal y como se muestra en el ejemplo siguiente.
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
A continuación se muestran 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 hacerlo como parte de la especificación de ingreso.
ACM Private CA con cert-manager
Puede habilitar TLS y mTLS para proteger las cargas de trabajo de las aplicaciones de EKS en el momento de la entrada, en el pod y entre los pods mediante ACM Private Certificate Authority (CA) y cert-manager
Short-Lived Modo CA para TLS mutuo entre cargas de trabajo
Cuando utilice ACM Private CA para mTLS en EKS, se recomienda utilizar certificados de corta duración en modo CA de corta duración. Si bien es posible emitir certificados de corta duración en el modo 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 en los que es necesario emitir nuevos certificados con frecuencia. Además, debes intentar alinear el período de validez de los certificados privados con la vida útil de los pods de tu 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 la documentación técnica 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 de EKS para permitir el acceso a la CA privada de ACM. Sustituya el <CA_ARN> 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": "arn:aws:acm-pca:us-west-2:123456789012:certificate-authority/12345678-1234-1234-1234-123456789012" } ] }
También se pueden usar 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.
Cree un emisor en Amazon EKS creando un archivo de definición de recursos personalizado denominado cluster-issuer.yaml con el texto siguiente y sustituyendo <CA_ARN> 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 de una CA privada. Ahora puede usar el Certificate recurso de cert-manager para emitir certificados cambiando los valores del issuerRef campo por los del emisor de CA privado que creó anteriormente. Para obtener más información sobre cómo especificar y solicitar los recursos de certificación, consulte la guía de recursos de certificación de cert-manager. https://cert-manager.io/docs/usage/certificate/
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 la autoridad de certificación (CA) raíz y configurar ACM Private CA como la 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 de 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 la asignará 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 administración de identidades y CA. Cuando se inicia una carga de trabajo con su proxy sidecar Envoy, es necesario que Istio le asigne una identidad para que se considere fiable y se le permita 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 poder verificar la identidad de la carga de trabajo antes de procesarla. Este proceso de verificación lo gestiona istiod la entidad que actúa como autoridad de registro (o RA) y como entidad emisora de certificados. La RA actúa como un guardián que se asegura de que solo una CSR verificada llegue a la CA. Una vez verificada la CSR, se reenviará a la CA, que emitirá un certificado con una identidad de
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 usar un complemento de gestión de certificados denominado agente de solicitud de firma de certificados de Istio (https://cert-manager.io/docs/projects/istio-csr/
Siempre que haya una CSR 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 emisor de AWS Private CA. https://github.com/cert-manager/aws-privateca-issuer
Flujo de solicitudes de firma de certificados de Istio con istio-csr
image: :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
-
Instale el complemento emisor
-
Establezca los permisos y cree un emisor. El emisor representa a la CA y se usa para firmar
istiody combinar los certificados de carga de trabajo. Se comunicará con ACM Private CA. -
Cree un espacio de
istio-systemnombres. Aquí es donde se desplegarán estosistiod certificatey otros recursos de Istio. -
Instale la CSR de Istio configurada con el complemento AWS Private CA Issuer. Puede conservar las solicitudes de firma de certificados de las cargas de trabajo para comprobar que se aprueban y firman ().
preserveCertificateRequests=truehelm 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" -
Instala Istio con configuraciones personalizadas para reemplazarlo por
istiodotrocert-manager istio-csrcomo proveedor de certificados para la malla. Este proceso se puede llevar a cabo mediante 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 los mTLS.
Solicitudes de firma de certificados de Istio
image: :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 red
-
El plugin privado de gestión de certificados de Kubernetes para CA está activado. GitHub
-
Guía de usuario del plugin privado de gestión de certificados de CA Kubernetes.
-
Cómo utilizar el modo de certificado 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 del clúster sin inspeccionar el protocolo -
NeuVector La plataforma de seguridad de contenedores de código
abierto Zero Trust de SUSE proporciona políticas, reglas de red, prevención de pérdida de datos (DLP), firewall de aplicaciones web (WAF) y firmas de amenazas de red.