Saltar al contenido

Configuración de Spring Cloud Config Server y Spring Cloud Vault para producción

No olvides que en las ciencias un error casi siempere suele tener diferentes soluciones, así que nosotros enseñamos lo más óptimo y mejor.

Como menciono en mi respuesta a spensergibb, he tenido cierto éxito en resolver esto yo mismo. Basándome en sus comentarios, aclararé mi intención, ya que ayudará con una comprensión común del problema. Estoy tratando de hacer dos cosas: –

  1. Instale un servidor de configuración que use Vault como backend (a diferencia del backend GIT predeterminado) y exponga la API de Vault a las aplicaciones cliente (a través de TLS) para que puedan recuperar sus propios secretos. No quiero que todas mis aplicaciones cliente se conecten a Vault directamente. Quiero que obtengan su configuración de un servidor de configuración haciendo que el servidor de configuración se conecte a Vault. Hasta anoche no pude lograr este objetivo, a menos que configuré todo como predeterminado con TLS deshabilitado y usando la dirección de bucle invertido, el puerto 8200 para el software Vault, etc. Obviamente, los valores predeterminados no son prácticos para ninguno de nuestros entornos implementados. Mencionaré que el enlace publicado por spencergibb me ayuda a entender por qué esto no funcionaba, pero la sutileza de la razón es por qué me lo perdí antes. Siga leyendo para ver mi explicación.

  2. Quiero que el servidor de configuración se configure solo desde Vault directamente. Es decir, conéctese a Vault a través de Spring Cloud Vault Config. Esto funcionó de inmediato para mí como se describe en la documentación. Sin embargo, este objetivo es algo trivial ya que no tengo un caso de uso real en este momento. Pero quería saber si se podía hacer, ya que no vi ninguna razón real por la que no y parecía un buen primer paso para integrar Vault.

La distinción entre estas dos capacidades me ayudó a comprender que el problema se deriva del hecho de que Spring Cloud Config Server y Spring Cloud Vault parecen estar usando dos beans diferentes para inyectar las propiedades de configuración de Vault. Spring Cloud Config Server usa VaultEnvironmentRepository anotado con @ConfigurationProperties(“spring.cloud.config.server.vault”) y Spring Cloud Vault usa VaultProperties anotado con @ConfigurationProperties(“spring.cloud.vault”).

Esto me hizo agregar dos configuraciones diferentes a mi bootstrap yml.

server:
    port: 8888

spring:
    profiles:
        active: local, vault

    application:
        name: quoting-domain-configuration-server

    cloud:
        vault:
            host: VDDP03P-49A26EF.lm.lmig.com
            port: 8200
            scheme: https
            authentication: TOKEN
            token: 0f1997c3-d8a8-befd-a5a2-01e4e066c50a
            ssl:
                trust-store: configTrustStore.jks
                trust-store-password: changeit

        config:
            server:
                vault:
                    host: VDDP03P-49A26EF.lm.lmig.com
                    port: 8200
                    scheme: https
                    authentication: TOKEN
                    token: 0f1997c3-d8a8-befd-a5a2-01e4e066c50a

Tenga en cuenta los mismos detalles de configuración. Solo diferentes rutas yml. Este es el punto sutil que me perdí dado que comencé haciendo que el objetivo número 1 funcionara primero y asumiendo que la misma configuración funcionaría para ambos objetivos. (Nota: el token y la contraseña son artificiales).

Esto casi funcionó, excepto por un error de protocolo de enlace SSL. Como puede ver, no hay SSL attributes establecido en la ruta spring.cloud.config.server.vault. El bean VaultProperties no los admite. No estaba seguro de cómo lidiar con esto (tal vez otro bean específico que no sea de bóveda que no pude encontrar). Mi solución fue simplemente forzar la configuración del certificado de esta manera:

@SpringBootApplication
@EnableConfigServer
public class Application

    public static void main(String[] args)
    
        System.setProperty("javax.net.ssl.trustStore",
            Application.class.getResource("/configTrustStore.jks").getFile());
        System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
        SpringApplication.run(Application.class, args);
    

Esta solución SSL es bastante fea. Estoy seguro de que debe haber una mejor manera de hacer esta parte. Así que estoy abierto a otras sugerencias. Sin embargo, una vez que completé todos los pasos anteriores, ahora todo funciona.

Comentarios y puntuaciones

Si aceptas, tienes el poder dejar una sección acerca de qué te ha impresionado de este post.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *