Configuración correcta del proxy inverso de Apache con SSL para Jenkins y Sonar

11

Estoy ejecutando dos servicios detrás de un servidor Apache: Jenkins (Puerto 8080) y SonarQube (Puerto 9000).

Mi configuración de apache se ve así:

<VirtualHost *:80>
  ServerName server
  Redirect permanent / https://server.domain.com/
</VirtualHost>

<VirtualHost *:80>
  ServerName server.domain.com
  Redirect permanent / https://server.domain.com/
</VirtualHost>

<VirtualHost *:443>
  ServerName server.domain.com

  SSLEngine on
  SSLCertificateFile /etc/ssl/certs/server.crt
  SSLCertificateKeyFile /etc/ssl/private/server.key

  ProxyPass        /jenkins http://localhost:8080/jenkins nocanon
  ProxyPassReverse /jenkins http://localhost:8080/jenkins
  ProxyPassReverse /jenkins http://server.domain.com/jenkins
  ProxyPassReverse /jenkins https://server.domain.com/jenkins

  ProxyPass        /sonar http://localhost:9000/sonar nocanon
  ProxyPassReverse /sonar http://localhost:9000/sonar

  AllowEncodedSlashes NoDecode
  ProxyRequests Off
  ProxyPreserveHost On
  <Proxy http://localhost:8080/*>
    Order deny,allow
    Allow from all
  </Proxy>
</VirtualHost>

Todo parece estar funcionando bien, excepto que Jenkins se queja con este mensaje: parece que su configuración de proxy inverso está rota.

Cuando ejecuto la prueba ReverseProxySetupMonitor proporcionada por Jenkins, el mensaje de error indica que algo con el proxy inverso no está configurado correctamente, ya que no reemplaza http con https:

$ curl -iLk -e https://server.domain.com/jenkins/manage https://server.domain.com/jenkins/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/test
[...]
404 http://server.domain.com/jenkins/manage vs. https://server.domain.com/jenkins/manage
[...]

Esto solo apareció después de habilitar SSL en el servidor (que ahora usa un certificado autofirmado).

Pregunta: ¿Cómo soluciono la configuración del proxy inverso para que Jenkins esté feliz? Puntos de bonificación para obtener consejos sobre cómo mejorar el archivo de configuración de apache.

Ya revisé las siguientes dos preguntas relacionadas:

Friederbluemle
fuente

Respuestas:

9

Esta página en wiki Jenkins mencionó que, en julio de 2014 , la configuración recomendada para el proxy inverso de Jenkins. El parámetro que falta es RequestHeader set X-Forwarded-Proto "https"yRequestHeader set X-Forwarded-Port "443"

Entonces la configuración se convirtió

<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/cert.pem
    ServerAdmin  webmaster@localhost
    ProxyRequests     Off
    ProxyPreserveHost On
    AllowEncodedSlashes NoDecode
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    ProxyPass         /  http://localhost:8080/ nocanon
    ProxyPassReverse  /  http://localhost:8080/
    ProxyPassReverse  /  http://www.example.com/
    RequestHeader set X-Forwarded-Proto "https"
    RequestHeader set X-Forwarded-Port "443"
</VirtualHost>
masegaloeh
fuente
2
¡Impresionante, eso funcionó perfectamente! También tenía que hacerlo sudo a2enmod headers, de lo contrario me pondríaInvalid command 'RequestHeader'
friederbluemle
¿Puedes explicar por qué estás usando dos ProxyPassReversedirectivas para la misma ruta ( /)?
Ortomala Lokni
1

Configuración de front-end de Windows Apache para Jenkins

Las principales diferencias aquí son:

  • Cómo configurar un certificado temporal
  • dejar de apache volando por no tener ningún caché SSL

Mi configuración:

  • La instalación fue a d: \ (no c: \ - adapte esto a sus necesidades)

  • Jenkins está en el puerto 8080

  • Descomprima Apache httpd-2.4.18-win64-VC14.zip (de http://www.apachelounge.com/download/ ) en d: \.

  • Instale OpenSSL Win64OpenSSL_Light-1_0_2f.exe ( http://slproweb.com/products/Win32OpenSSL.html ) en d: \ OpenSSL-Win64

  • Cree el certificado SSL:

    • cd al directorio bin OpenSSL y ejecuta la magia:

       pushd d:\OpenSSL-Win64\bin
       set OPENSSL_CONF=openssl.cfg
       openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt
      
  • Copie los archivos del servidor. * De d: \ OpenSSL-Win64 \ bin a D: \ Apache24 \ conf

  • Editar d: \ Apache24 \ conf \ httpd.conf:

    • Busque y reemplace "c: /" con "d: /"

    • Cambie después de la línea "Listen 80", agregando "Listen 443":

      Listen 80
      Listen 443
      
    • Descomente estas líneas:

      LoadModule headers_module modules/mod_headers.so
      LoadModule proxy_module modules/mod_proxy.so
      LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
      LoadModule proxy_http_module modules/mod_proxy_http.so
      LoadModule rewrite_module modules/mod_rewrite.so
      LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
      LoadModule ssl_module modules/mod_ssl.so
      LoadModule vhost_alias_module modules/mod_vhost_alias.so
      
    • Actualice "#ServerName www.example.com:80" a:

      ServerName myserver.mydomain:80
      
    • Agregue esto al final:

      <IfModule socache_shmcb_module>
      SSLSessionCache "shmcb:logs/ssl_scache(512000)"
      </IfModule>
      
      <VirtualHost *:80>
        ServerName myserver
        Redirect permanent / https://myserver.mydomain/
      </VirtualHost>
      
      <VirtualHost *:80>
        ServerName myserver.mydomain
        Redirect permanent / https://myserver.mydomain/
      </VirtualHost>
      
      <VirtualHost *:443>
                  SSLEngine on
                  SSLCertificateFile conf/server.crt
                  SSLCertificateKeyFile conf/server.key
                  ServerAdmin  me@mydomain
                  ProxyRequests             Off
                  ProxyPreserveHost On
                  AllowEncodedSlashes NoDecode
                  <Proxy *>
                              Order deny,allow
                              Allow from all
                  </Proxy>
                  ProxyPass         /  http://localhost:8080/ nocanon
                  ProxyPassReverse  /  http://localhost:8080/
                  ProxyPassReverse  /  http://myserver.mydomain/
                  RequestHeader set X-Forwarded-Proto "https"
                  RequestHeader set X-Forwarded-Port "443"
      </VirtualHost>
      

No dejé de escuchar a Jenkins en el puerto 8080, por lo que todavía puedo conectarme si falla Apache. Mi objetivo al usar https es ocultar los parámetros.

David Robson
fuente