Al implementar un proyecto web, la implementación del certificado SSL es un desafío común al que probablemente se enfrenten todos los ingenieros, y yo no soy una excepción.
Por lo general, las nuevas empresas optan por certificados gratuitos como los de Let's Encrypt. Sin embargo, estos vienen con limitaciones e inconvenientes a considerar, los cuales se detallan en .Echemos un vistazo más de cerca a los problemas que he encontrado personalmente con los certificados gratuitos:
Recientemente, me he centrado en una pila de tecnología específica y me gustaría analizar una solución de infraestructura basada en clústeres de Kubernetes en el contexto de un proveedor de nube de Azure. Si bien cert-manager es una solución popular en este ámbito, prefiero instalarlo a través de Helm para mayor comodidad.
Entonces, sin más preámbulos, profundicemos en:
helm repo add jetstack https: //charts.jetstack.io
helm repo update kubectl apply -f https: //github.com/jetstack/cert-manager/releases/download/v1.6.1/cert-manager.crds.yaml
helm install cert-manager jetstack/cert-manager -- namespace cert - manager -- create - namespace -- version v1 . 6 . 1
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-cluster-issuer
spec:
acme:
server: //acme-v02.api.letsencrypt.org/directory
email: p…[email protected] #your e-mail
privateKeySecretRef:
name: letsencrypt-cluster-issuer
solvers:
- http01:
ingress:
class: nginx
En el primer escenario, mis archivos YAML se veían así:
apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: myservice2 namespace : test
Spec : duration : 2160h
renewBefore : 72h
dnsNames : - myservice2 . mydomain . org # you resources
secretName : myservice2 - tls
issuerRef : name : letsencrypt - cluster - issuer
kind : ClusterIssuer
kubectl describe certificates <cert name > -n <namespace name >
Entonces, ¿qué tenemos al final?
annotations : cert-manager .io/cluster-issuer: "letsencrypt-cluster-issuer" cert-manager .io/renew-before: 72h
az aks show -g < RG > -n < AKS_name >
az keyvault set-policy --name < name AKV > --object-id < get from first step value > --secret-permissions get
apiVersion: spv.no/v1 kind: AzureKeyVaultSecret metadata: name: wildcard-cert #any name namespace : default
spec : vault : name : SandboxKeyVault # name you keyvault in Azure
object : name : name_object_id # name object id from Azure AKV this cert
type : secret
output : secret : name : wildcard - cert # any name for secret in your namespace
type : kubernetes . io / tls
chainOrder : ensureserverfirst # very important values !!!
Habiendo discutido los aspectos técnicos y las configuraciones, volvamos a profundizar en las peculiaridades de los certificados de Azure.
Azure ofrece dos opciones para solicitar un certificado, ambas proporcionadas por GoDaddy:El certificado Azure Wildcard solo protege los subdominios de primer nivel. Por ejemplo, si tenemos un dominio llamado mydomain.com , el certificado solo cubrirá los subdominios de primer nivel en forma de .mydomain.com .
Por lo tanto, el certificado funcionará para recursos como service1.mydomain.com, service2.mydomain.com, service3.mydomain.com , pero no cubrirá service1.test.mydomain.com o mail.service1.mydomain.com .
¿Qué opciones tenemos entonces?Es poco probable que la primera opción sea práctica, ya que la cantidad de subdominios, en particular los del segundo nivel, puede ser enorme. Por lo tanto, pagar un certificado wildcard para cada subdominio ( .service1.mydomain.com, *.dev.mydomain.com… ) no es la solución más razonable.
En cuanto a la segunda opción, tuve una larga conversación con el equipo de soporte de Azure sobre este asunto, pasé por todas las etapas de negación, frustración e ira, solo para darme cuenta al final de que la capacidad SAN para certificados aún no se ha implementado. Justo hasta el final, esperaba que tal problema nunca ocurriera en Azure. Por el contrario, su competidor, AWS Amazon, ofrece certificados a través de AWS Certificate Manager (ACM) que admiten hasta 10 nombres de sujetos alternativos, incluidos los comodines. Te permite crear 10 subdominios con un carácter comodín (*), e incluso solicitar un aumento de cuota en AWS de hasta 100k. Para concluir, compartiré cómo puede utilizar certificados con el servicio Front Door en Azure.Para mí, Azure Front Door (AFD) es una puerta de enlace global y escalable que aprovecha la red perimetral mundial de Microsoft para dirigir el tráfico entrante a los puntos finales apropiados, que pueden ser aplicaciones o servicios web. Operando en la capa HTTP/HTTPS (capa 7), Front Door enruta las solicitudes de los clientes a un servidor de aplicaciones disponible desde el grupo. El lado del servidor de la aplicación puede ser cualquier servicio accesible por Internet, ya sea que esté alojado dentro o fuera de Azure.
Un ejemplo del sitio web de documentación
Azure Front Door es una herramienta conveniente que le permite equilibrar y representar el tráfico entrante que accede a aplicaciones y servicios distribuidos en todo el mundo. Ofrece una gama de características que incluyen la capacidad de vincular varias reglas configurando el controlador de reglas, las políticas de unión y la configuración del firewall. No profundizaré demasiado en los detalles del servicio AFD en este artículo, sino que me centraré en las peculiaridades del servicio de los certificados.Como era de esperar, el tráfico entrante a Azure Front Door puede ser http o https . Si elige https , tiene tres opciones: generar un certificado en el propio servicio de Azure Front Door, cargar su propio certificado o sincronizar su certificado existente con Azure Key Vault. Para permitir que el servicio Front Door acceda a Key Vault, deberá configurar los permisos necesarios.
Recomiendo usar la última opción y seleccionar la última versión del certificado para evitar tener que renovarlo o regenerarlo manualmente. Al conectar el certificado de AKV, todo se mantendrá actualizado automáticamente.Esta configuración le dará el siguiente resultado:
El manejo del tráfico http no es un problema, pero hay un detalle sutil que se debe tener en cuenta al configurar un grupo de recursos y especificar la dirección IP externa del clúster de AKS. Asegúrese de dejar en blanco el campo "Encabezado del nodo del componente del servidor" para asegurarse de que se complete automáticamente con los valores que se ingresaron en el campo "IP o nombre del nodo".
Esto permitirá que todos los servicios en el formato *.mydomain.com funcionen correctamente. Una vez que haya completado esta configuración, estará listo.
En determinados escenarios, redirigir el tráfico de Azure Front Door a AKS a través de https puede ser más ventajoso. Para garantizar el correcto funcionamiento de Azure Front Door en la configuración del grupo de servidores, es crucial especificar un nombre de DNS correspondiente a su clúster de AKS , que está relacionado con SNI y comprobaciones de estado. De lo contrario, la configuración no funcionará.
En mi caso, no había ningún nombre asignado a mis clústeres de AKS, solo tenía servicios que antes funcionaban directamente pero tenían que funcionar a través de Azure Front Door. Para solucionar esto, tuve que crear un nombre de DNS independiente para el clúster de AKS, configurar DNS y configurar un servicio independiente con un certificado adjunto a la entrada. Solo entonces podría redirigir el tráfico https a los clústeres de AKS y asegurarme de que funciona correctamente para todos los servicios disponibles.
Es importante tener en cuenta las medidas de seguridad al configurar el permiso de conexión para AKS. Para garantizar una conexión segura, puede limitar el permiso para conectarse a AKS solo desde las direcciones IP de Azure Front Door en el grupo de seguridad de red para AKS (como se muestra en la imagen a continuación).
Escrito por Pavel Shapurau, ingeniero principal de DevOps, Social Discovery Group