Construyendo un sistema basado en X.509 "Hola, mundo!" para establecer la confianza entre servidores

1

Quiero crear un sistema de software distribuido con los siguientes elementos:

  • Un número de trabajadores , que administran datos potencialmente confidenciales y ejecutan código en nombre de varios clientes.
  • Varios clientes , que pueden enviar comandos a los trabajadores.
  • Una autoridad de confianza central , que otorga el derecho a ejecutar acciones sobre un trabajador dado a un cliente.

En una operación típica, el cliente se pondría en contacto con la autoridad de confianza y solicitaría la autorización para ejecutar una operación en un trabajador. La autoridad de confianza autentificaría al cliente y, si tiene éxito, otorgará la autorización. El cliente luego se conectaría al servidor de trabajo y emitiría el comando solicitado, presentando la autorización que se obtuvo anteriormente. El servidor trabajador podría verificar la validez de la autorización para la operación solicitada y, si tiene éxito, realizarla.

X.509 parece un ajuste natural para este tipo de problema, y la solución más simple que se me ocurrió es la siguiente:

  • La autoridad de confianza utiliza un certificado X.509 para entregar autorizaciones a los clientes, firmándolos con la clave privada del certificado.
  • El cliente transmite la autorización firmada de la autoridad de confianza al servidor de trabajo.
  • El servidor del trabajador descarga el certificado público del servidor de la autoridad de confianza y usa su clave pública para validar la autorización proporcionada por el cliente.

Para implementar esto, proporcionaría una API REST basada en HTTPS en el servidor de autoridad de confianza. Usando esta API, el servidor del trabajador podría descargar el certificado de clave pública y validarlo localmente contra un certificado de nivel superior (si fue firmado por una CA). Usando la clave pública obtenida de esta manera, el trabajador podría validar una autorización recibida de un cliente.

Para obtener una autorización, un cliente podría usar otro punto final de API en la autoridad de confianza, a la que proporciona todos los detalles relevantes del comando dado y el servidor de trabajo. El servidor de confianza respondería con una autorización firmada que el cliente puede transferir al servidor de trabajo.

(en todos los pasos anteriores, asumo que la comunicación entre todas las partes se puede asegurar y validar utilizando algún tipo de TLS)

Mi pregunta con respecto a esta configuración es triple:

  • ¿Es este un enfoque razonable? Si no, ¿qué sería?
  • ¿Contra qué posibles escenarios de ataque sería vulnerable este esquema?
  • ¿Hay implementaciones de referencia de código abierto de dicho sistema?
pregunta ThePhysicist 13.05.2017 - 16:17
fuente

1 respuesta

3

x509 es un formato de archivo no una arquitectura de aplicación.

Está lejos de ser claro lo que pides o pretendes construir aquí. Un servicio web HTTPS que utiliza certificados de cliente no es exactamente innovador ni esotérico. Ciertamente, si está esperando construir sus propias capacidades criptográficas, le recomendaría encarecidamente que piense de nuevo: están disponibles de forma estándar pero son extremadamente difíciles incluso para que los expertos las implementen correctamente.

La mayoría del software de código abierto son componentes en lugar de patrones de infraestructura distribuidos completos.

Suponiendo que solo desea un servicio web HTTPS utilizando certificados de cliente, entonces la parte del servidor tardaría aproximadamente una hora en configurarse utilizando (por ejemplo) Apache, mod_ssl y un nivel lógico adecuado. Lo que consista en un nivel lógico adecuado depende de dónde desea implementar la autenticación y la autorización. Si esto se hace en Apache (con SSLOptions +SrdEnvVars ) , entonces cualquier lenguaje de script antiguo lo hará (de hecho, incluso podría usar stunnel o stud frente a un servidor web genérico en lugar de mod_ssl dentro de Apache).

Para pruebas: Stunnel o Stud proporcionan una forma fácil de envolver las conexiones mediante TLS y certificados de cliente (suponiendo que no desee simplemente use un navegador )

En términos de generar una "autorización firmada", nuevamente esto es simple, pero ¿existe alguna razón para implementar un mecanismo de autorización secundario sobre las instalaciones disponibles dentro de TLS / x509? Si puede autenticar de manera confiable al cliente y a la autoridad de confianza, incruste la autorización en el certificado del cliente o simplemente proporcione asignaciones de identidad para autorizar a los agentes de la autoridad de confianza.

    
respondido por el symcbean 13.05.2017 - 16:42
fuente

Lea otras preguntas en las etiquetas