PROXMOX5: Proxy Reverso configuración Faveo

Proxy reverso Faveo
  • Los primero que debemos hacer es configurar una IP fija como esta instalado en Ubuntu 17.10 utiliza netplan
  • Entonces abrimos el archivo
 nano /etc/netplan/01-netcfg.yaml
  • Y los modificamos de la siguiente forma:
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
  version: 2
  renderer: networkd
  ethernets:
    ens18:
      dhcp4: false
      dhcp6: false
      addresses: [10.20.200.11/24]
      gateway4: 10.20.200.1
      nameservers:
        addresses: [10.20.200.1]
  • Aplicamos los cambios
netplan apply

SITUACIÓN:

  • Para comprender lo que vamos hacer el servidor «PROXY-REVERSO» va ser el servidor que tiene una dirección pública, por lo que la solicitud de los usuarios a dominio soporte.siua.ac.cr llegará a este servidor, ahora en este servidor («PROXY-REVERSO») si la solicitud se hace por el puerto 80 («http://soporte.siua.ac.cr») solo lo vamos a redireccionar a SSL («https://soporte.siua.ac.cr»).
  • Para esto lo vamos hacer con letsencrypt para que que nos genere los certificados, luego dentro del servidor interno («faveo») vamos incorporarle los certificados que nos genero letsencrypt para que internamente el sistema pueda se ingresado por SSL por lo que vamos a modificar el archivo de configuracion del nginx para esto
  • Finalmente vamos a crear un script que permita la renovación de los certificados de forma automática y los actualice en en el servidor interno («faveo»).

Host: Proxy- Reverso

  • Ahora para que letsencrypt pueda acceder a un sitio que esta dentro de una máquina virtual, primero dentro dentro del servidor proxy creamos un host virtual con la siguiente información.
nano /etc/apache2/sites-available/soporte.siua.ac.cr.conf
  • Agregamos
NameVirtualHost 181.193.87.6:80

<VirtualHost 181.193.87.6:80>

        #************************************************************************
        #*********  DATOS DEL SITIO WEB  ********************************
        #************************************************************************
        ServerName soporte.siua.ac.cr
        ServerAlias www.soporte.siua.ac.cr
        ErrorLog /var/log/apache2/soporte80.siua.ac.cr-error.log
        CustomLog /var/log/apache2/soporte80.siua.ac.cr-access.log common

        #************************************************************************
        #*********  DATOS DEL WEBMASTER  *****************************
        #************************************************************************
        ServerAdmin interuniversitariadealajuela@gmail.com
        Header add Author "Unidad de Gestion e Innovacion Tecnologica"

        #************************************************************************
        #*********  DATOS DEL REDIRECCIONAMIENTO  ****************
        #************************************************************************

</VirtualHost>
  • Habilitamos el sitio
a2ensite soporte.siua.ac.cr
  • Reiniciamos apache
systemctl reload apache2
  • Mandamos a crear el certificado
certbot --installer apache
  • Resultado:
Saving debug log to /var/log/letsencrypt/letsencrypt.log

How would you like to authenticate with the ACME CA?
-------------------------------------------------------------------------------
1: Apache Web Server plugin - Beta (apache)
2: Spin up a temporary webserver (standalone)
3: Place files in webroot directory (webroot)
-------------------------------------------------------------------------------
Select the appropriate number [1-3] then [enter] (press 'c' to cancel): 1

Plugins selected: Authenticator apache, Installer apache

Which names would you like to activate HTTPS for?
-------------------------------------------------------------------------------
1: soporte.siua.ac.cr
2: www.soporte.siua.ac.cr
-------------------------------------------------------------------------------
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1 2


Saving debug log to /var/log/letsencrypt/letsencrypt.log

Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):interuniversitariadealajuela@gmail.com

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A

Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1 2
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for soporte.siua.ac.cr
http-01 challenge for www.soporte.siua.ac.cr
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/apache2/sites-available/soporte.siua.ac.cr-le-ssl.conf
Deploying Certificate for soporte.siua.ac.cr to VirtualHost /etc/apache2/sites-available/soporte.siua.ac.cr-le-ssl.conf
Enabling available site: /etc/apache2/sites-available/soporte.siua.ac.cr-le-ssl.conf
Deploying Certificate for www.soporte.siua.ac.cr to VirtualHost /etc/apache2/sites-available/soporte.siua.ac.cr-le-ssl.conf

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
  • Como le indicamos que queremos que todas las solicitudes las redirija al puerto 443 me modifica el archivo del puerto 80 quedando así:
  • Lo abrimos
nano /etc/apache2/sites-available/soporte.siua.ac.cr.conf
NameVirtualHost 181.193.87.6:80

<VirtualHost 181.193.87.6:80>

        #**********************************************************
        #*********  DATOS DEL SITIO WEB  **************************
        #**********************************************************
        ServerName soporte.siua.ac.cr
        ServerAlias www.soporte.siua.ac.cr
        ErrorLog /var/log/apache2/soporte80.siua.ac.cr-error.log
        CustomLog /var/log/apache2/soporte80.siua.ac.cr-access.log common

        #*********************************************************
        #********  DATOS DEL WEBMASTER  **************************
        #*********************************************************
        ServerAdmin interuniversitariadealajuela@gmail.com
        Header add Author "Unidad de Gestion e Innovacion Tecnologica"

        #*********************************************************
        #*********  DATOS DEL REDIRECCIONAMIENTO  ****************
        #*********************************************************

       RewriteEngine on
        RewriteCond %{SERVER_NAME} =www.soporte.siua.ac.cr [OR]
        RewriteCond %{SERVER_NAME} =soporte.siua.ac.cr
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

</VirtualHost>
  • Y me crea el archivo
nano /etc/apache2/sites-available/soporte.siua.ac.cr-le-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost 181.193.87.6:443>

        #**********************************************************
        #*********  DATOS DEL SITIO WEB  **************************
        #**********************************************************
        ServerName soporte.siua.ac.cr
        ServerAlias www.soporte.siua.ac.cr
        ErrorLog /var/log/apache2/soporte80.siua.ac.cr-error.log
        CustomLog /var/log/apache2/soporte80.siua.ac.cr-access.log common

        #*********************************************************
        #********  DATOS DEL WEBMASTER  **************************
        #*********************************************************
        ServerAdmin interuniversitariadealajuela@gmail.com
        Header add Author "Unidad de Gestion e Innovacion Tecnologica"

        #*********************************************************
        #*********  DATOS DEL REDIRECCIONAMIENTO  ****************
        #*********************************************************
        Include /etc/letsencrypt/options-ssl-apache.conf
        SSLCertificateFile /etc/letsencrypt/live/soporte.siua.ac.cr/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/soporte.siua.ac.cr/privkey.pem
</VirtualHost>
</IfModule>
  • Ahora vamos a modificarlo en 2 aspectos:
    • Que las solicitudes 443 tengan su propio error_log separado a puerto 80, para identificar los errores de forma separada
    • y vamos activar el proxy reverso para que solicite la información del servidor interno («faveo») así como la funcionalidad de SSL para que podamos dirigir la solitude forma directa a «https://10.20.200.11»
  • Quedando así:
<IfModule mod_ssl.c>
<VirtualHost 181.193.87.6:443>

        #**********************************************************
        #*********  DATOS DEL SITIO WEB  **************************
        #**********************************************************
        ServerName soporte.siua.ac.cr
        ServerAlias www.soporte.siua.ac.cr
        ErrorLog /var/log/apache2/soporte443.siua.ac.cr-error.log
        CustomLog /var/log/apache2/soporte443.siua.ac.cr-access.log common

        #*********************************************************
        #********  DATOS DEL WEBMASTER  **************************
        #*********************************************************
        ServerAdmin interuniversitariadealajuela@gmail.com
        Header add Author "Unidad de Gestion e Innovacion Tecnologica"

        #*********************************************************
        #*********  DATOS DEL REDIRECCIONAMIENTO  ****************
        #*********************************************************
        ProxyPreserveHost On
        ProxyRequests off
        SSLProxyEngine on
        ProxyPass / https://10.20.200.11/
        ProxyPassReverse / https://10.20.200.11/

        Include /etc/letsencrypt/options-ssl-apache.conf
        SSLCertificateFile /etc/letsencrypt/live/soporte.siua.ac.cr/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/soporte.siua.ac.cr/privkey.pem
</VirtualHost>
</IfModule>
  • Reiniciamos el servidor:
service apache2 reload

Host: Servidor Interno faveo

  • Vamos a crear una carpeta para almacenar  los certificados generados por letsencrypt
mkdir /etc/nginx/ssl/
  • Y dentro de esta creamos otra carpeta para que contenga los certificados del dominio soporte.siua.ac.cr
mkdir /etc/nginx/ssl/soporte.siua.ac.cr
  • Le damos permisos
chmod 777 -R /etc/nginx/ssl

Crear llaves SSH de confianza entre los servidores

Host: Faveo

  • Como el servidor esta en Ubuntu 17.10 debemos habilitar la cuenta de root para poder ingresar por ssh así como otras características para permitir el ingreso por llaves ssh
  • Ingresamos como root
sudo su
o 
sudo -i
  • Establecemos una contraseña para root
passwd root
  • Resultado:
Introduzca la nueva contraseña de UNIX: CA3
Vuelva a escribir la nueva contraseña de UNIX: CA3
passwd: password updated successfully
  • Ahora abrimos el archivo
nano /etc/ssh/sshd_config
  • Modificamos
PermitRootLogin yes
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys .ssh/authorized_keys2
PasswordAuthentication yes
  • Reiniciamos el servicio
service sshd restart
  • Y con esto ya podemos ingresar con el usuario root por ssh
ssh -l root 10.20.200.11

Host: Proxy

  • Ingresamos a la carpeta .ssh del usuario root
cd /root/.ssh/
  • Creamos las llaves para el cliente CON CONTRASEÑA EN BLANCO
ssh-keygen -t rsa
  • Resultado:
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in llave_proxy_rev_ext.
Your public key has been saved in llave_proxy_rev_ext.pub.
The key fingerprint is:
SHA256:Eao0rOXn89R8pg3FjvPKsYUwBlAXaBxHBMZrHt06u78 root@proxy-reverso-ex
The key's randomart image is:
+---[RSA 2048]----+
| .+=*B. |
| . o=+ . |
| =.oo.. |
| = o+..... |
| . oo..S. o |
| o..o= = |
| o .oO = |
| +.. % |
| ooEoo |
+----[SHA256]-----+
  • Ya podemos listar los archivos para ver las llaves
ls
  • Resultado:
id_rsa id_rsa.pub known_hosts
  • Ahora vamos a publicar nuestra llave «pública en el servidor remoto»
ssh-copy-id root@10.20.200.11
  • Resultado:
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.20.200.11's password: 

Number of key(s) added: 1

Now try logging into the machine, with: "ssh 'root@10.20.200.11'"
and check to make sure that only the key(s) you wanted were added.
  • Podemos probar 
ssh root@10.20.200.11

Host: Servidor POXY-Reverso

  • Vamos a copiar los certificados al servidor interno
scp -r /etc/letsencrypt/archive/soporte.siua.ac.cr/fullchain1.pem root@10.20.200.11:/etc/nginx/ssl/soporte.siua.ac.cr/fullchain.pem
scp -r /etc/letsencrypt/archive/soporte.siua.ac.cr/privkey1.pem root@10.20.200.11:/etc/nginx/ssl/soporte.siua.ac.cr/privkey.pem

Host: Servidor Interno faveo

  • Ahora vamos a modificar el archivo de configuración de nginx-faveo para que redirija todas las solicitudes 80 a 443 
  • Abrimos el archivo
# Faveo Helpdesk - Basic, Quick-Start NGINX Server Block
# 16.06.18 Author: Mathieu Aubin

upstream faveo_php {
server unix://opt/faveo/run/faveo_php.socket;
}


server {
listen 80;
listen 127.0.0.1:80;

# Edit the following line with the correct information.
server_name soporte.siua.ac.cr;

error_log /opt/faveo/log/faveo_error_log;
access_log /opt/faveo/log/faveo_access_log;
root /opt/faveo/faveo-helpdesk/public;
index index.php index.html index.htm;

error_page 403 404 405 500 501 502 503 504 @error;

try_files $uri $uri/ /index.php?$args;

location @error {
rewrite ^/(.*)$ /index.php?$1;
}

location ~ /\. {
deny all;
}

location ~ /(artisan|composer.json|composer.lock|gulpfile.js|LICENSE|package.json|phpspec.yml|phpunit.xml|README.md|readme.txt|release-notes.txt|server.php) {
deny all;
}

location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
include /etc/nginx/fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass faveo_php;
fastcgi_read_timeout 240;
}
}
  • Y lo modificamos a 
# Faveo Helpdesk - Basic, Quick-Start NGINX Server Block
# 16.06.18 Author: Mathieu Aubin 

upstream faveo_php {
 server unix://opt/faveo/run/faveo_php.socket;
}

server {
 listen 80;
 server_name soporte.siua.ac.cr;

 return 301 https://$host$request_uri;
}

server {

 listen 443 ssl;

 # Edit the following line with the correct information.
 server_name soporte.siua.ac.cr;


 ssl on;
 ssl_certificate /etc/nginx/ssl/soporte.siua.ac.cr/fullchain.pem;
 ssl_certificate_key /etc/nginx/ssl/soporte.siua.ac.cr/privkey.pem;


 ssl_session_timeout 5m;
 ssl_protocols SSLv2 SSLv3 TLSv1;
 ssl_ciphers HIGH:!aNULL:!MD5;
 ssl_prefer_server_ciphers on;

 error_log /opt/faveo/log/faveo_error_log;
 access_log /opt/faveo/log/faveo_access_log;
 root /opt/faveo/faveo-helpdesk/public;
 index index.php index.html index.htm;

 error_page 403 404 405 500 501 502 503 504 @error;

 try_files $uri $uri/ /index.php?$args;

 location @error {
 rewrite ^/(.*)$ /index.php?$1;
 }

 location ~ /\. {
 deny all;
 }


 location ~ 
/(artisan|composer.json|composer.lock|gulpfile.js|LICENSE|package.json|phpspec.yml|phpunit.xml|README.md|readme.txt|release-notes.txt|server.php)
 {
 deny all;
 }

 location ~ [^/]\.php(/|$) {
 fastcgi_split_path_info ^(.+?\.php)(/.*)$;
 if (!-f $document_root$fastcgi_script_name) {
 return 404;
 }
 include /etc/nginx/fastcgi_params;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 fastcgi_pass faveo_php;
 fastcgi_read_timeout 240;
 }
}
  •  Reiniciamos el servicio
nginx -t && sudo nginx -s reload

Crear Autorenovación

Host: PROXY

  •  Creamos un archivo de renovación 
nano /root/ssh-renew.sh
  •  Agregamos
#Indicamos que renueve todos los certificados
certbot renew --dry-run

#Servidor soporte (FAVEO)
scp -r /etc/letsencrypt/archive/soporte.siua.ac.cr/fullchain1.pem root@10.20.200.11:/etc/nginx/ssl/soporte.siua.ac.cr/fullchain.pem
scp -r /etc/letsencrypt/archive/soporte.siua.ac.cr/privkey1.pem root@10.20.200.11:/etc/nginx/ssl/soporte.siua.ac.cr/privkey.pem
  •  Le damos permisos de ejecución
chmod 755 /root/ssh-renew.sh
  •  Abrir crontab para ejecutarlo cada 30 días
crontab -e
  • Resultado:
no crontab for root - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/nano <---- easiest 2. /usr/bin/vim.tiny Choose 1-2 [1]: 1 
  • Agregamos
@monthly /root/ssl-renew.sh