Nginx como proxy inverso con SSL

Hace unos días me plantearon la necesidad de publicar en Internet u servicio que estaba corriendo sin ningún tipo de encriptacion, con lo que los passwords se estaban transmitiendo en claro.
Dándole vueltas encontré este tutorial donde se exponía un caso similar con la aplicación Jenkins:
(por cierto, muy buena la página de tutoriales de Digital Ocean)

La idea de este tutorial es la de montar un nginx delante del servicio que se quiere securizar de forma que encripte las comunicaciones que van por la red publica. Esta configuración se conoce como «reverse proxy» y el diagrama seria el mostrado a continuación:

Instalación de nginx

Para instalar nginx descargaremos el rpm ccorrespondiente desde la web del proyecto Nginx . Éste rpm nos configurara el repositorio lo que nos permitira instalarlo con yum:

[root@nginxprxy tmp]# yum -y install nginx-release-rhel-6-0.el6.ngx.noarch.rpm [root@nginxprxy tmp]# yum install -y nginx

Configuración del proxy reverso con ssl 

Como este servidor va a servir exclusivamente para la securización de un servicio no seguro editaremos el fichero de configuración default.conf. Lo deberemos dejar de la siguiente forma:
[root@nginxprxy tmp]# cd /etc/nginx/conf.d 
[root@nginxprxy conf.d]# cat default.conf 
server {
listen 80;
return 301 https://$host$request_uri;
}


# HTTPS server
#
server {
listen 443;
server_name service.enterprise.com;

ssl_certificate /etc/nginx/certs/service.enterprise.com.crt;
ssl_certificate_key /etc/nginx/certs/service.enterprise.comm.key;

ssl on;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;

access_log /var/log/nginx/service.access.log;

location / {

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

# Fix the “It appears that your reverse proxy set up is broken" error.
proxy_pass http://
unsecureservice.enterprise.com;
proxy_read_timeout 90;

proxy_redirect http://unsecureservice.enterprise.com https://service.enterprise.com;
}
}
En la primera parte, se redigirán todas las peticiones a la misma URL pero al puerto de HTTPS. Así, cualquier petición al puerto por defecto de HTTP será redirigida, sin posibilidad de servir contenido que no esté cifrado.
En la segunda parte, es donde se especifica el puerto de escucha HTTPS, los certificados y varias opciones del protocolo SSL. 

Por último se establecen las reglas de redirección del proxy de forma que todo lo que entre a través de la URL https://service.enterprise.com; lo redirija a la http://unsecureservice.enterprise.com.

Antes de arrancar el servidor deberemos conseguir los certificados. Lo primero será generar el CSR en el directorio que hemos especificado en el fichero de configuración:

[root@nginxprxy tmp]# cd /etc/nginx/
[root@nginxprxy tmp]# mkdir certs
[root@nginxprxy certs]# openssl req -new -newkey rsa:2048 -nodes -keyout service.enterprise.com.key -out service.enterprise.com.csr
Generating a 2048 bit RSA private key
……………………………………….+++
…+++
writing new private key to ‘service.enterprise.com.key’
—–
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [XX]:XX
State or Province Name (full name) []:XXXX
Locality Name (eg, city) [Default City]:XXXX 
Organization Name (eg, company) [Default Company Ltd]:XXXX
Organizational Unit Name (eg, section) []:XXXX
Common Name (eg, your name or your server’s hostname) []:service.enterprise.com
Email Address []:XXXX@enterprise.com

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Una vez obtengamos el certificado deberemos crear el fichero crt con el contenido del certificado: 

[root@nginxprxy certs]# vi service.enterprise.com.crt  —–BEGIN CERTIFICATE—– MIIFWjCCBEKgAwIBAgIDCmMEMA0GCSqGSIb3DQEBBQUAMGExCzAJBgNVBAYTAlVT8WjFirPK7+2Gbq+9w4DpJ+a5FJjTOKfcRvIrZION 

—–END CERTIFICATE—–

Será el momento de arrancar el servidor Nginx y probar la conexión desde un navegador, donde deberemos ver que inmediatamente se redirecciona a un puerto seguro y que el certificado es válido:

[root@nginxprxy conf.d]# service nginx stop Stopping nginx: [FAILED] [root@nginxprxy conf.d]# service nginx start  Starting nginx: [ OK ]

Anuncio publicitario

Publicado por Julián García-Sotoca

Ingeniero de Telecomunicación y administrador de sistemas (GNU/Linux - UNIX). Entusiasta del Software libre y Open Source. Working behind the scenes

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto: