viernes, 26 de septiembre de 2014

Instalación de un Servidor Web Nginx

Instalación de Servidor Web con Nginx
Se debe instalar un servidor web ya que el sera quien recibirá las peticiones por la ip publica y no por la ip del contenedor LXC.
# aptitude install nginx

Una vez instalado se debe crear una configuración dom0 que resuelva las peticiones en la ruta:
# nano /etc/nginx/sites-available/juju-gui

y se pega el siguiente código y luego se guarda y se sale para restaurar el servicio web:

server {
listen  80;
server_name jujugui.canaima.net.ve;

access_log  /var/log/nginx/jujugui-net.access.log;
error_log   /var/log/nginx/jujugui-net.error.log;

location / {
    proxy_pass       http://10.0.3.180;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}


error_page   500 502 503 504  /50x.html;
location = /50x.html {
        root   /var/www/nginx-default;
}
}

Se realiza un enlace simbólico
Se debe realizar un enlace simbólico por cada archivo configurado 

# ln -s /etc/nginx/sites-available/juju-gui /etc/nginx/sites-enabled/juju-gui
# service nginx restart

# ln -s /etc/nginx/sites-available/juju-wiki /etc/nginx/sites-enabled/juju-wiki
# service nginx restart

7.- Instalacion de openssl
# aptitude install openssl

Crear una carpeta donde guardaran los archivos
# mkdir /etc/nginx/ssl2
# cd /etc/nginx/ssl2

Generar la Llave con openssl
# openssl genrsa -des3 -out ser.key 4096
Generating RSA private key, 4096 bit long modulus
.....................................................++
.......................++
e is 65537 (0x10001)
Enter pass phrase for ser.key:
Verifying - Enter pass phrase for ser.key:

Crear una petición de firmado del certificado CRS
# openssl req -new -key ser.key -out ser.csr
Enter pass phrase for ser.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) [AU]:VE
State or Province Name (full name) [Some-State]:Caracas
Locality Name (eg, city) []:Distrito Capital
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MMMM
Organizational Unit Name (eg, section) []:juju
Common Name (eg, YOUR name) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
NOTA: NO COLOCAR ESTA CLAVE PASSWORD

Firmar la petición previamente elaborada
# openssl x509 -req -days 1825 -in ser.csr -signkey ser.key -out ser.crt
Signature ok
subject=/C=ve/ST=Caracas/L=Distrito Capital/O=MMMM/OU=juju
Getting Private key
Enter pass phrase for ser.key:

NOTA: COLOCAR ESTA CLAVE PASSWORD LA MISMA DEL INICIO

# ls
ser.crt  ser.csr  ser.key


Crear una versión de la llave que no requiera password
# openssl rsa -in ser.key -out ser.key.insegura
Enter pass phrase for ser.key:
writing RSA key
NOTA: COLOCAR ESTA CLAVE PASSWORD LA MISMA DEL INICIO

Renombrar la llave sin password
# mv ser.key ser.key.seguro
# mv ser.key.insegura ser.key

Y tenemos cuatro archivos
#ls
ser.crt  ser.csr  ser.key  ser.key.seguro

¿Qué archivos usaremos?
Solo usaremos el certificado (ser.crt) y la llave (ser.key)

¿Quien usará la llave y el certificado?
Pues en este caso apache2 y nginx usaran la llave y el certificado. ¿Y pueden usar los mismos? pues si,tanto apache2 y nginx pueden usar la misma llave y el mismo certificado.

Configuración de nginx en el contenedor dom0
Nginx en /etc/ngix/site-availables contiene los archivos de los sitios disponibles, en este caso están configurados como proxy_pass como por ejemplo

# cd /etc/nginx/sites-available
# ls
default  juju-gui
# nano juju-gui

Normalmente un archivo proxy_pass es para responder a las peticiones del puerto 80 (http) y las redirige a una maquina virtual y se ven algo así:
server {
        listen  80;
        server_name jujugui.canaima.net.ve;

        access_log  /var/log/nginx/jujugui-net.access.log;
        error_log   /var/log/nginx/jujugui-net.error.log;

        location / {
            proxy_pass       http://10.0.3.180;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }


        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   /var/www/nginx-default;
        }
}
Esto quiere decir que todas las peticiones hacia el puerto 80 (http) y sean con el dominio jujugui.canaima.net.ve, serán redirigidas a la maquinas virtual cuya IP sea la especificada en el campo proxy_pass (http://192.168.1.x ; http://10.0.3.208 en el caso de la ip que tiene el LXC de juju-gui).

¿Ahora cómo hacer para que el proxy_pass también responda a las peticiones del puerto 443 (https) para así aumentar la seguridad?
En este caso solo debemos agregar algunas cosas al archivo de configuración del proxy_pass que servirá para: Responder a las peticiones del puerto 80 (http), 443 (https) y además haremos que responda siempre por el puerto 443, aun cuando el usuario haga la petición por el puerto 80. Tambien tendrá la configuracion de WebSocket ya que la interfaz gráfica de usuario hablará con Juju en un WebSocket para proporcionar una interfaz en tiempo real con los servicios instalados, las unidades que los componen, y las máquinas disponibles

Para este ejemplo editaremos el archivo de configuración del proxy_pass de la maquina server dom0 de la siguiente manera:

# cd /etc/nginx/sites-available
# ls
default  juju-gui
# nano juju-gui

y debemos dejarlo así:

server {
        listen  80;
        server_name jujugui.canaima.net.ve;
rewrite ^ https://$host$request_uri? permanent;
}

server {
        listen 443;
        server_name jujugui.canaima.net.ve;
        ssl  on;
ssl_certificate  /etc/nginx/ssl2/ser.crt;
ssl_certificate_key  /etc/nginx/ssl2/ser.key;

        access_log  /var/log/nginx/jujugui-net.access.log;
        error_log   /var/log/nginx/jujugui-net.error.log;

        location / {
            proxy_pass       https://10.0.3.180;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                
                # WebSocket support (nginx 1.4)
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        
        }


        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   /var/www/nginx-default;
        }
}

Listo ya esta configurado nuestro virtualhost en el dom0 nuestra maquina fisica.
Restauramos el servicio y listo.
# service nginx restart

No hay comentarios:

Publicar un comentario en la entrada