#SysAdmin – Asegurar nuestro server web nginx+let’s encrypt+securityheaders

Bueno con uno de mis últimos proyectos Unicatel he tenido que mejorar la seguridad del servidor web a un nivel bien alto, hoy les quiero ensenar como mejorar la seguridad de su webserver con nginx y let’s encrypt mas mejorar los encabezados o headers.
Bueno la idea es optener esto:

  • Certificado SSl firmado por una CA
  • Seguridad de encabezados

Utilizaremos los Examples de dominio.co.cu donde:

dominio.co.cu IN A 200.55.128.130
dominio.co.cu mail exchanger = 10 correo.dominio.co.cu
www IN CNAME dominio.co.cu

Donde el Nginx sera proxy Inverso al Server interno 172.32.1.101

Instalación del Let’s Encrypt

apt-get install git
git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
cd /opt/letsencrypt

Creamos el certificado
En esta caso el servidor que tenemos responde por varios dominios de nuestro server que son vistos desde el exterior en esto caso seria de la siguiente forma

cd /opt/letsencrypt
./letsencrypt-auto certonly --standalone -d dominio.co.cu -d www.dominio.co.cu -d correo.dominio.co.cu

Generate Strong Diffie-Hellman Group
sudo openssl dhparam -out /etc/ssl/certs/dominio.co.cu.pem 2048

Automatizamos el proceso de actualizacion del mismo

crontab -e 
30 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log

#EJEMPLO de Integracion el certificado nuevo a los servicios
#Dovecot

nano /etc/dovecot/dovecot.conf
  ssl_cert = </etc/letsencrypt/live/dominio.co.cu/fullchain.pem
  ssl_key = </etc/letsencrypt/live/dominio.co.cu/privkey.pem
service dovecot restart
#Postfix
postconf -e smtpd_tls_cert_file='/etc/letsencrypt/live/dominio.co.cu/cert.pem'
postconf -e smtpd_tls_key_file='/etc/letsencrypt/live/dominio.co.cu/privkey.pem'
postconf -e smtpd_tls_CAfile='/etc/letsencrypt/live/dominio.co.cu/chain.pem'
/etc/init.d/postfix restart

Configuracion de NGINX

server {
 listen 80;
 server_name www.empresa.co.cu;
 return 301 https://$host$request_uri;
}

server {
listen 443 ssl;
 server_name www.empresa.co.cu;
 resolver 200.55.128.3 200.55.128.4 valid=300s;
 resolver_timeout 5s;
 ssl_certificate           /etc/letsencrypt/live/empresa.co.cu/fullchain.pem;
 ssl_certificate_key       /etc/letsencrypt/live/empresa.co.cu/privkey.pem;
 ssl_trusted_certificate   /etc/letsencrypt/live/empresa.co.cu/chain.pem;
        ssl on;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/ssl/certs/empresa.co.cu.pem;
        ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
        ssl_session_timeout 1440m;
        ssl_session_cache builtin:1000 shared:SSL:10m;
        ssl_stapling on;
        ssl_stapling_verify on;
        spdy_headers_comp 0;
        more_clear_headers 'Server:*';
        add_header Strict-Transport-Security "max-age=15768000; includeSubdomains";
        add_header X-Xss-Protection "1; mode=block";
        add_header X-Frame-Options "DENY";
        add_header X-Frame-Options "SAMEORIGIN";
        add_header X-Content-Type-Options "nosniff";
        add_header X-Permitted-Cross-Domain-Policies "master-only";
        add_header Cache-Control "public";
        add_header Public-Key-Pins 'pin-sha256="94h51gJiEKZVEwaG4r2YHLAOQGepNRzE/PYytHrBr/A="; pin-sha256="YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg="; max-age=2592000';
        add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self'; style-src 'self' data: 'unsafe-inline'; font-src 'self'; child-src 'self'; object-src 'self'; connect-src 'self'";
 index index.html index.htm index.php;
 access_log            /var/log/nginx/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;
  proxy_pass          http://172.32.1.101;
  proxy_read_timeout  90;
  proxy_redirect      http://172.32.1.101 https://www.empresa.co.cu;
 }

if ($request_method !~ ^(GET|HEAD|POST)$ ) {

                 return 444;

                 }
location ~ /.well-known {
                allow all;
}
}

Para verificar si su conf esta bien prueben el dominio en estas webs
Verificar el SSL -> https://www.ssllabs.com/ssltest/analyze.html
Verificar Encabezados -> https://securityheaders.io
Cualquier duda con lo puesto anteriormente por favor comentar el articulo que le contestare nada mas que lea el comentario y le solucionare su duda.

¿De cuánta utilidad te ha parecido este contenido?

Armando Felipe Fuentes Denis

Cloud Architect | DevOps | SecOps | SRE | Cloud | SysAdmins

View Comments

  • Ahora si podemos asegurarnos un poquito. ETECSA toma nota, a ver si no te hacen leña pamarillas.cu.

Share
Published by
Armando Felipe Fuentes Denis

Recent Posts

SquidStat, analizador de logs de squid diferente y 100% cubano

Me complace anunciar la creación de esta útil herramienta (SquidStats), para el análisis y monitoreo…

3 días ago

n8n Transformando la Automatización de Flujos de Trabajo con Inteligencia Artificial

La inteligencia artificial está revolucionando las industrias al automatizar tareas, predecir patrones y permitiendo tomar…

1 semana ago

Alta disponibilidad de sus base de datos con Percona XtraDB Cluster en Kubernetes

Uno de los grandes retos al que nos podemos enfrentar cuando una aplicación crece, es…

2 años ago

Home automation (Parte 3) – ESPHome

Qué es lo que deseo hacer en este capítulo? Básicamente un sonoff, quiero encender/apagar las…

2 años ago

Home automation (Parte 2) – Home Assistant

Hace algunos meses estoy escuchando hablar del proyecto Home Assistant (HA). En palabras literales del…

2 años ago