ip real con frontal proxy nginx, backend apache y wordpress

Por fin he encontrado la solución! otra de estas tareas pendientes que hacía que una instalación no funcionase como era esperado! en este caso me encuentro con dos frontales de nginx que actúan como proxy http y detrás de ellos está un wordpress sobre apache. Hace un tiempo, hice un post similar a éste, pero detrás estaba otro nginx.

Así que aquí dejo la solución.

Frontal nginx
En este caso tengo 2 ficheros, el de la configuración del dominio y otro con la configuración específica para los wordpress almacenado en el directorio snippets

# vi /etc/nginx/sites-available/lamardebits.org
server {
    listen 80;
    listen [::]:80;

    server_name lamardebits.org
                www.lamardebits.org;
    return 301 https://lamardebits.org$request_uri;

    #root /var/www/html/;
    include snippets/certbot.conf;
}


server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name lamardebits.org;

    include snippets/certbot.conf;

    # Aquí s'inclou el servidor intern i la protecció específica de WP
    include snippets/wordpress10.conf;

    ssl_certificate /etc/letsencrypt/live/lamardebits.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/lamardebits.org/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_trusted_certificate /etc/letsencrypt/live/lamardebits.org/chain.pem;
}

Y la configuración específica para los wordpress

# vi /etc/nginx/snippets/wordpress10.conf
include conf.d/external-log.conf;
location / {
    proxy_pass http://172.31.0.145:6081;
    include proxy_params;

    location ~ \.php$ {
        proxy_pass http://172.31.0.145:6081;
        include proxy_params;

        location ~* wp\-login\.php {
            client_max_body_size 40M;
            proxy_pass http://172.31.0.145:6081;
            include proxy_params;
            include snippets/lmdb-protected.conf;
        }
    }

    proxy_headers_hash_max_size 512;
    proxy_headers_hash_bucket_size 128;

    fastcgi_read_timeout 300;
    proxy_read_timeout 300;

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

    add_header X-Frame-Options SAMEORIGIN;

}

La configuración de proxy de nginx la tengo así

# vi /etc/nginx/conf.d/proxy.conf
proxy_buffer_size         128k;
proxy_buffers           4 256k;
proxy_busy_buffers_size   256k;
client_max_body_size      32M;

proxy_read_timeout 1800;
proxy_connect_timeout 1800;
proxy_send_timeout 1800;
send_timeout 1800;             

Backend apache + wordpress

A …

Grub cambiar nombres interfaz de red ens0 a eth0 wlan0

Pequeño tip para renombrar las interfaces de red a los nombres de toda la vida, eth0, wlan0, etc.

Editar el fichero /etc/default/grub y en GRUB_CMDLINE_LINUX añadir esto

# vi /etc/default/grub
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"

Cargamos la configuración a grub

# grub-mkconfig -o /boot/grub/grub.cfg

Editamos el fichero de configuración de la red para definir los nuevos nombres de interfaz

# vi /etc/network/interfaces

Y reiniciamos…

Script para comprobar el estado de varios certificados SSL

Hola, hoy os dejo un script que he desarrollado para comprobar el estado de los certificados SSL de varios dominios.

 
#!/bin/bash

############################################
# SCRIPT CREATED BY: Laura Mora i Aubert   #
# SCRIPT DATE: 2021-04-01                  #
# WEBSITE: blackhold.nusepas.com           #
# INFO: Script that checks domain ssl      #
#       certificates                       #
#       tested with openssl 1.1            #
# LICENSE: creative commons (by:sa)        #
############################################

############################################
#             INSTRUCTIONS                 #
############################################
#                                          #
# 1. Create a file on /root/scripts/ with  #
#    the content of this file              #
# 2. Edit $ADMIN_MAIL with your mail       #
# 3. Edit $DOMAINS array with your domains #
# 3. Give permissions and run the script   #
# 4. Put your script on /etc/crontab or    #
#    /etc/cron.d/check_ssl with this line  #
# # check ssl certificates
# 0  7    * * *   root /root/scripts/check_certificates.sh /var/log/ssl_checks/check_certificates-$(date "+\%Y\%m\%d").log && cat /var/log/ssl_checks/check_certificates-$(date "+\%Y\%m\%d").log |mail -s "[Check Certificates] your-server-name" your-admin-email@domain.com 
#                                          #
# That's all folks! have a nice day :)     #
#                                          #
# - Blackhold                              #
#                                          #
############################################

ADMIN_MAIL="your-admin-email"
DOMAINS=(
# control domains
"google.com"
"expired.badssl.com"
"wrong.host.badssl.com"
# my domains
"capa8.net"
"aspertic.org"
"cacavaca.capa8.net"
)

for DOMAIN in "${DOMAINS[@]}"
do
    echo "---------------------------"
    echo "domain ${DOMAIN} is: "

    touch check_ssl.txt
    echo | openssl s_client -servername ${DOMAIN} -connect ${DOMAIN}:443 check_ssl.txt 2/dev/null
    if [ `cat check_ssl.txt |wc -l` != 0 ]
    then
        cat check_ssl.txt | openssl x509 -noout -dates check_ssl.txt
    else	
        echo "Verify return code: -1 (certificate does not exist)" check_ssl.txt
    fi

    # badssl.com
    # ok: Verify return 

Añadir un chivato al ssh cuando alguien hace login

Con tanto ransomware, accesos indebidos a sistemas y demás ataques varios a sistemas, la concienciación de tener los sistemas al día está al día y supongo que algo habréis notado queridos lectores que mi actividad éstas últimas semanas ha sido frenética. Mi objetivo es ponerlos a punto y cada vez mas ir mejorando la seguridad sin que se vea afectada la usabilidad.

Está claro que un sistema conectado a la red es victima de intentos de acceso continuos y sólo nos interesan los que han tenido éxito. Es por esto que hoy os traigo un pequeño “tip” para avisar de los accesos a nuestro sistema, sean legítimos o no.

Hace años tenía implantada esta política de seguridad en mis servidores y me sirvió para paliar un ataque aún mayor. La primera reacción fue echar el malhechor de mis sistemas, al mismo tiempo que cambiaba las contraseñas de todos los servidores (ahí aprendí que tenemos que ir con mucho cuidado con nuestra política de passwords).

Éste post se basa en esta respuesta del foro de ubuntu y un poco a mi friki-artesanía.

Lo primero será crear los dos scripts y los pondremos donde ejecutemos los scripts del sistema

root@frontal1-nginx:~# vi /root/scripts/login-notify-pam.sh
#!/bin/sh

/root/scripts/login-notify-script.sh &
root@frontal1-nginx:~# vi /root/scripts/login-notify-script.sh
#!/bin/sh

sleep 3
# Change these two lines:
sender="noreply-valido@capa8.net"
recepient="cuenta-de-notificaciones@capa8.net"

if [ "$PAM_TYPE" != "close_session" ]; then
    host="`hostname`"
    subject="SSH Login: $PAM_USER from $PAM_RHOST on $host"
    # Message to send, e.g. the current environment variables.
    message="Algú ($PAM_RHOST) ha entrat al sistema $host per SSH!\n\n`ps aux 

Instalación y configuración de Apache Guacamole en Debian 10

Hola, hoy veremos cómo instalar, configurar y usar Apache Guacamole, una herramienta que nos permite conectarnos remotamente por web mediante protocolos cómo SSH, RDP, VNC.

¿Qué es Apache Guacamole?
Apache Guacamole es una herramienta libre y Open-Source que nos permite conectarnos remotamente a un servidor mediante el navegador web sin necesidad de usar un cliente.

Gracias a HTML5, una vez tengamos instalado y configurado Apache Guacamole, tan solo tenemos que conectarnos mediante el navegador web para empezar a trabajar remotamente.

¿Qué es Tomcat?
Apache Guacamole no es una aplicación web autónoma y está compuesta de muchas partes. La aplicación web en realidad está diseñada para ser simple y mínima.

Una de esas partes, y esencial, es Tomcat. Tomcat es una especie de contenedor de ServLets que nos permite ejecutar herramientas desarrolladas con Java Server Page (JSP).

Para poder usar aplicaciones con Tomcat, este las “comprime” en ficheros .war.

¿Qué es un fichero .war?
Un fichero .war es una Aplicación Web que permite a Tomcat acceder a su utilización. El fichero .war en sí no es legible sino que tiene que ser expandido/descomprimido para ser leído.

Instalación de Guacamole-server
Comezamos con la instalación de Apache Guacamole-Server. Primero debemos instalar los paquetes mínimos necesarios, después podrémos elegir qué protocolos usar según nuestras necesidades.

Instalamos los paquetes principales necesarios:

root@guacamole:~# apt install libcairo2-dev libjpeg62-turbo-dev libpng-dev libossp-uuid-dev gcc make tomcat9 tomcat9-admin tomcat9-user

Ahora podemos elegir, según nuestras necesidades, qué paquetes instalar:

Usar Guacenc:

apt install libavcodec-dev libavutil-dev libswscale-dev

Usar el soporte para RDP:

apt 

Cambiar la red de ceph

El sábado hice un taller en vivo sobre proxmox en el que enseñé a configurar tanto ceph como glusterfs.

Aquí el vídeo sólo de la parte de la entrevista:

Instalar proxmox es super fácil, pero preparar bien el entorno ya es otra cosa. Al prepararlo cometí un fallo de diseño al reutilitzar configuración antigua.

Tal como dije, se recomienda destinar una red específicamente para la comunicación de los ceph. Así que vamos a ello.

El contenido de mi fichero de configuración de red es el siguiente

# vi /etc/network/interfaces
auto lo
iface lo inet loopback

iface eth0 inet manual

auto vmbr0
iface vmbr0 inet static
        address 10.139.39.166/27
        gateway 10.139.39.161
        bridge_ports eth0.10
        bridge_stp off
        bridge_fd 0

auto vmbr1
iface vmbr1 inet static
        address 172.31.0.11
        netmask 255.255.0.0
        bridge_ports eth0.1000
        bridge_stp off
        bridge_fd 0
        post-up echo 1 /proc/sys/net/ipv4/ip_forward

auto vmbr2
iface vmbr2 inet manual
        bridge_ports eth0.1001
        bridge_stp off
        bridge_fd 0


# ceph - glusterfs # dades
iface eth1 inet manual

auto vmbr11
iface vmbr11 inet static
        address 192.168.10.1/24
        bridge-ports eth1
        bridge-stp off
        bridge-fd 0

He cambiado los bridge_ports tanto de vmbr1 como de vmbr2 y añadido el bridge vmbr11 sin vlans y con la red 192.168.10.0/24.

He aplicado la configuración correspondiente a cada nodo del cluster y los he reiniciado.

Una vez iniciados de nuevo y comprobado que lleguen los servidores entre ellos por la red 192.168.10.0/24, he ido al fichero de configuración del ceph (/etc/pve/ceph.conf) y he cambiado el parámetro cluster_network

# vi /etc/pve/ceph.conf
[global]
         auth_client_required = cephx
         auth_cluster_required = cephx
         auth_service_required 

CephFS: Montar ceph en local con Proxmox

Telita las vueltas que he dado para encontrar esta solución y todo por no fijarme bien!

Muy bien, partimos de que tenemos un Ceph funcionando correctamente y lo estamos usando para poner ahí nuestros contenedores y máquinas virtuales. Pero al hacer el backup nos interesa los datos pesados dejarlos fuera y tener un disco compartido en red es algo que es una maravilla para poder migrar libremente maquinas de un nodo a otro y además de forma muy rápida ya que no tiene que copiar los datos.

Hace días que me pregunto, ¿y cómo se hace para montar un pool de ceph como mountpoint para los datos mas pesados? Había buscado donde se montaban los datos, nada de nada, si proxmox daba alguna opción, no se daba la opción de montar ceph como mountpoint ni tampoco te deja usar este pool para hacer backups. Así que llevo con la mosca en la nariz unos días con este tema… hasta que hoy! tras instalar un nuevo cluster y poder jugar (sin romper) una instalación nueva me he puesto a mirar a fondo y tras unas horitas, al clavo!

Ceph lleva bastante tiempo en marcha y hay documentación de hace 4 años, además ha ido evolucionando muy rápido y en las últimas versiones han cambiado incluso de tecnología para escribir a disco, siendo bluestore la actual.

Tras muchas formas de hacerlo (desde el kernel, desde fstab, que crear el volumen a mano desde el servidor, etc.), ninguna me parecía muy fiable …

WordPress + apache + varnish + frontal nginx

Hoy os traigo un post completito sobre la parte de sistemas de WordPress.

Hace ya demasiados días que tenía pendiente la actualización de las debian que alojaban mi wordpress multisite y la base de datos mysql (que las tengo en dos contenedores separados). No digo las versiones porqué se me cae la cara de vergüenza :P

El wordpress que tengo en La Mar de Bits tiene por delante 2 frontales haciendo de proxy http con nginx (donde además hago la gestión de los certificados de letsencrypt y redirección de puerto 80 a 443). Éstos apuntan al puerto expuesto de Varnish (servicio de cache) dentro del contenedor donde está el wordpress (puerto 6081). El varnish apunta en el apache y el apache sirve en el puerto 80 las páginas web de wordpress.

Vamos un cristo para llegar al wordpress que no veas :)

Voy a ir detallando las configuraciones que tengo en cada una de las partes de esta máquina

nginx (frontales)

Estas dos maquinas son las que están expuestas a internet y comparten el directorio de configuración gracias a glusterfs.

Para exponer ambas maquinas en internet en bind lo hago así:

@                               IN      A       109.69.10.251
@                               IN      A       109.69.10.241
@                               IN      AAAA    2a00:1508:6000:501::a1
@                               IN      AAAA    2a00:1508:6000:501::a2

frontal                 1H      IN      A       109.69.10.241
frontal                 1H      IN      A       109.69.10.251
frontal                 1H      IN      AAAA    2a00:1508:6000:501::a1
frontal                 1H      IN      AAAA    2a00:1508:6000:501::a2

www                     1H      IN      CNAME   frontal

A continuación, en nginx para cada sitio del wordpress tengo un fichero de configuración similar a éste …

msmtp: enviar correos electrónicos autenticados des de un servidor

Hace unos años hice un post sobre ssmtp. Éste post es exactamente lo mismo pero enseño a configurar msmtp ya que ssmtp ya no está disponible.

Lo primero será instalarlo:

root@asterisk10:~# apt install msmtp

Y lo segundo configurarlo, atención en el /home del usuario que va a ejecutar scripts que requieran mandar correos electrónicos, en el caso de root, su home es /root

root@asterisk10:~# vi .msmtprc
# Set default values for all following accounts.
defaults
auth           on
tls            on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile        ~/.msmtp.log

# Noreply
account        noreply
host           mail.capa8.net
port           587
from           noreply@capa8.net
user           noreply@capa8.net
password       **************

# A freemail service
#account        freemail
#host           smtp.freemail.example
#from           joe_smith@freemail.example
#...

# Set a default account
account default : noreply

Por otro lado instalaremos un cliente de mail, en este caso bsd-mailx

root@asterisk10:~# apt install bsd-mailx

Al ejecutar mailx con el pipe mail, nos sacará un error de que no encuentra sendmail, así que lo engañaremos un poco y le diremos que cuando busque sendmail use msmtp creando en ~ el fichero .mailrc

root@asterisk10:~# vi .mailrc
set sendmail=/usr/bin/msmtp

Ahora para mandar un mail de prueba podremos usar algo similar a ésto

root@asterisk10:~# echo "Blackhold blog rules" | mail correo@dominio.com

Y listos, ahora ya podemos mandar mails sin problemas. A lo mejor te interesa configurar el postmaster (fichero /etc/aliases) del usuario root para que mande los mails del sistema a donde le digas. Más información aquí.…

Docker network + macvlan

Seguimos con los posts de docker y ahora toca uno sobre el tema de networking.

La necesidad básica es la de publicar a Internet un servidor web con nginx. En lugar de definir la IP pública al servidor docker nos interesa ponerla dentro del contenedor de nginx y luego que él sea el que tenga acceso al resto de máquinas.

El servidor de docker con el que estoy trabajando es una máquina física con debian con una IP de guifi (10.90.234.170) y en el datacenter donde está en la VLAN 138 está el rango de IP públicas (5.10.205.128/27).

Crear la network

Docker por defecto trae 3 networks, por defecto cuando creamos un contenedor nuevo asigna la red bridge (driver bridge) 172.17.0.0/16

root@wezen02:~# docker network ls
NETWORK ID          NAME                           DRIVER              SCOPE
f9e3dcfa1e06        bridge                         bridge              local
262f24ac9f10        host                           host                local
c4572142389a        none                           null                local

Para crear una nueva red y vincularla a la vlan correspondiente usaremos lo siguiente:

# docker network create -d macvlan -o parent=eno1.138 public

Cuando creamos una nueva red docker le asigna un rango por defecto correlativo al último rango creado, por ejemplo 172.18.0.0/16 pero nos interesa que cuando asignemos ésta network a un contenedor le asigne una IP de nuestro rango público.

# docker network rm public
# docker network create -d macvlan -o parent=eno1.138 public --subnet=5.10.205.128/27 --gateway=5.10.205.129 --ip-range 5.10.205.152/29

Con –subnet indicamos la red en la que trabaja la network, –gateway la puerta de enlace de nuestro router e –ip-range el rango que asignará automáticamente a los …