Solución para gestión remota con OpenVPN, TigerVNC y Guacamole – PART 3

En esta tercera parte analizaremos la seguridad de cada servidor, desde el punto de vista de las conexiones a cada uno de los servicios que albergan.

1.      Iptables

El filtrado de paquetes es un componente fundamental dentro del concepto de seguridad de todo sistema informático en red. Por defecto, el núcleo de Linux incluye un filtro de paquetes de este tipo, que es proporcionado por los módulos del paquete de software Netfilter y es conocido por iptables.

Para facilitar el almacenamiento y recuperación de las reglas, instalamos el siguiente paquete:

apt install iptables-persistent -y

1.1.         Para host “vpn”

Modificamos el fichero que contendrá las reglas para IPv4:

cat /dev/null > /etc/iptables/rules.v4
nano /etc/iptables/rules.v4

Agregamos lo siguiente adaptando a su red:

*mangle
:PREROUTING ACCEPT [0:0]
:logging - [0:0]
#==================== PREROUTING RULES ====================#
-A PREROUTING -m conntrack --ctstate INVALID -j logging
-A PREROUTING -m conntrack --ctstate INVALID -j DROP
-A PREROUTING ! -s 192.168.3.0/24 -d 192.168.130.103 -m conntrack --ctstate NEW -p tcp -m tcp --dport 22 -j logging
-A PREROUTING ! -s 192.168.3.0/24 -d 192.168.130.103 -m conntrack --ctstate NEW -p tcp -m tcp --dport 22 -j DROP
#==================== END PREROUTING RULES ====================#
#======== LOGGING ========#
-A logging -m conntrack --ctstate INVALID -j NFLOG --nflog-prefix "[fw: INVALID BLOCK]" -m limit --limit 3/min --limit-burst 10
-A logging -m conntrack --ctstate NEW -p tcp -m tcp --dport 22 -j NFLOG --nflog-prefix "[fw: SSH BLOCK]" -m limit --limit 3/min --limit-burst 10
-A logging -j RETURN
#======== END LOGGING ========#
COMMIT

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:eth0-input - [0:0]
:eth0-forward - [0:0]
:tun10-input - [0:0]
:tun10-forward - [0:0]
:tun11-input - [0:0]
:tun11-forward - [0:0]
#==================== INPUT RULES ====================#
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -j eth0-input
-A INPUT -i tun10 -j tun10-input
-A INPUT -i tun11 -j tun11-input
#======== ETH0 ========#
# SSH
-A eth0-input -s 192.168.3.0/24 -m conntrack --ctstate NEW -p tcp -m tcp --dport 22 -j ACCEPT

# ICMP
-A eth0-input -m conntrack --ctstate NEW -p icmp -m icmp --icmp-type echo-request -j REJECT -m comment --comment "Deny PING"

# Traceroute
-A eth0-input -m conntrack --ctstate NEW -p udp -m udp --dport 33434:33534 -j REJECT -m comment --comment "Deny traceroute"

# OpenVPN (TUN10 y TUN11)
-A eth0-input -s 172.25.124.0/24 -m conntrack --ctstate NEW -p udp -m udp -m multiport --dports 11940,11941 -j ACCEPT
-A eth0-input -s 192.168.120.50 -m conntrack --ctstate NEW -p udp -m udp -m multiport --dports 11940,11941 -j ACCEPT
-A eth0-input -j RETURN
#======== END ETH0 ========#

#======== TUN10 ========#
-A tun10-input -j RETURN
#======== END TUN10 ========#

#======== TUN11 ========#
-A tun11-input -j RETURN
#======== END TUN11 ========#
#==================== END INPUT RULES ====================#

#==================== FORWARD RULES ====================#
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -j eth0-forward
-A FORWARD -i tun10 -j tun10-forward
-A FORWARD -i tun11 -j tun11-forward
#======== ETH0 ========#
-A eth0-forward -j RETURN
#======== END ETH0 ========#

#======== TUN10 ========#
-A tun10-forward -j RETURN
#======== END TUN10 ========#

#======== TUN11 ========#
-A tun11-forward -j RETURN
#======== END TUN11 ========#
#==================== END FORWARD RULES ====================#
COMMIT

Aplicamos las reglas:

iptables-apply /etc/iptables/rules.v4

Puede verificar las reglas anteriores, con el siguiente comando:

iptables -t mangle -L -v
iptables -L -v
iptables -t nat -L -v

1.2.         Para host “tservice”

Modificamos el fichero que contendrá las reglas para IPv4:

cat /dev/null > /etc/iptables/rules.v4
nano /etc/iptables/rules.v4

Agregamos lo siguiente adaptando a su red:

*mangle
:PREROUTING ACCEPT [0:0]
:logging - [0:0]
#==================== PREROUTING RULES ====================#
-A PREROUTING -m conntrack --ctstate INVALID -j logging
-A PREROUTING -m conntrack --ctstate INVALID -j DROP
-A PREROUTING ! -s 192.168.3.0/24 -d 192.168.120.50 -m conntrack --ctstate NEW -p tcp -m tcp --dport 22 -j logging
-A PREROUTING ! -s 192.168.3.0/24 -d 192.168.120.50 -m conntrack --ctstate NEW -p tcp -m tcp --dport 22 -j DROP
#==================== END PREROUTING RULES ====================#

#======== LOGGING ========#
-A logging -m conntrack --ctstate INVALID -j NFLOG --nflog-prefix "[fw: INVALID BLOCK]" -m limit --limit 3/min --limit-burst 10
-A logging -m conntrack --ctstate NEW -p tcp -m tcp --dport 22 -j NFLOG --nflog-prefix "[fw: SSH BLOCK]" -m limit --limit 3/min --limit-burst 10
-A logging -j RETURN
#======== END LOGGING ========#
COMMIT

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:eth0-input - [0:0]
:eth0-forward - [0:0]
:eth1-input - [0:0]
:eth1-forward - [0:0]
:eth2-input - [0:0]
:eth2-forward - [0:0]
:eth3-input - [0:0]
:eth3-forward - [0:0]
:tun10-input - [0:0]
:tun10-forward - [0:0]
:tun11-input - [0:0]
:tun11-forward - [0:0]
#==================== INPUT RULES ====================#
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -j eth0-input
-A INPUT -i eth1 -j eth1-input
-A INPUT -i eth2 -j eth2-input
-A INPUT -i eth3 -j eth3-input
-A INPUT -i tun10 -j tun10-input
-A INPUT -i tun11 -j tun11-input
#======== ETH0 ========#
# SSH
-A eth0-input -s 192.168.3.0/24 -m conntrack --ctstate NEW -p tcp -m tcp --dport 22 -j ACCEPT

# ICMP
-A eth0-input -m conntrack --ctstate NEW -p icmp -m icmp --icmp-type echo-request -j REJECT -m comment --comment "Deny PING"

# Traceroute
-A eth0-input -m conntrack --ctstate NEW -p udp -m udp --dport 33434:33534 -j REJECT -m comment --comment "Deny traceroute"

# HTTP, HTTPS, HTTPS-alt
-A eth0-input -m conntrack --ctstate NEW -p tcp -m tcp -m multiport --dports 80,443,8443 -j ACCEPT
-A eth0-input -j RETURN
#======== END ETH0 ========#

#======== ETH1 ========#
-A eth1-input -j RETURN
#======== END ETH1 ========#

#======== ETH2 ========#
-A eth2-input -j RETURN
#======== END ETH2 ========#

#======== ETH3 ========#
-A eth3-input -j RETURN
#======== END ETH3 ========#

#======== TUN10 ========#
# ICMP
-A tun10-input -s 192.168.254.0/24 -m conntrack --ctstate NEW -p icmp -m icmp --icmp-type echo-request -j ACCEPT

# Traceroute
-A tun10-input -s 192.168.254.0/24 -m conntrack --ctstate NEW -p udp -m udp --dport 33434:33534 -j ACCEPT

# HTTPS-alt
-A tun10-input -m conntrack --ctstate NEW -p tcp -m tcp --dport 8443 -j ACCEPT
-A tun10-input -j RETURN
#======== END TUN10 ========#

#======== TUN11 ========#
# ICMP
-A tun11-input -s 192.168.253.0/24 -m conntrack --ctstate NEW -p icmp -m icmp --icmp-type echo-request -j ACCEPT

# Traceroute
-A tun11-input -s 192.168.253.0/24 -m conntrack --ctstate NEW -p udp -m udp --dport 33434:33534 -j ACCEPT

# HTTPS-alt
-A tun11-input -m conntrack --ctstate NEW -p tcp -m tcp --dport 8443 -j ACCEPT
-A tun11-input -j RETURN
#======== END TUN10 ========#
#==================== END INPUT RULES ====================#

#==================== FORWARD RULES ====================#
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -j eth0-forward
-A FORWARD -i eth1 -j eth1-forward
-A FORWARD -i eth2 -j eth2-forward
-A FORWARD -i eth3 -j eth3-forward
-A FORWARD -i tun10 -j tun10-forward
-A FORWARD -i tun11 -j tun11-forward
#======== ETH0 ========#
-A eth0-forward -j RETURN
#======== END ETH0 ========#

#======== ETH1 ========#
# DNS, HTTP, HTTPS y Git (clonacion de proyectos de Github)
-A eth1-forward -d 192.168.120.31 -m conntrack --ctstate NEW -p udp -m udp --dport 53 -j ACCEPT
-A eth1-forward -m conntrack --ctstate NEW -p tcp -m tcp -m multiport --dports 53,80,443,9418 -j ACCEPT
-A eth1-forward -j RETURN
#======== END ETH1 ========#

#======== ETH2 ========#
# DNS, HTTP, HTTPS y Git (clonacion de proyectos de Github)
-A eth2-forward -d 192.168.120.31 -m conntrack --ctstate NEW -p udp -m udp --dport 53 -j ACCEPT
-A eth2-forward -m conntrack --ctstate NEW -p tcp -m tcp -m multiport --dports 53,80,443,9418 -j ACCEPT
-A eth2-forward -j RETURN
#======== END ETH2 ========#

#======== ETH3 ========#
-A eth3-forward -j RETURN
#======== END ETH3 ========#

#======== TUN10 ========#
-A tun10-forward -j RETURN
#======== END TUN10 ========#

#======== TUN11 ========#
-A tun11-forward -j RETURN
#======== END TUN11 ========#
#==================== END FORWARD RULES ====================#
COMMIT

*nat
:POSTROUTING ACCEPT [0:0]
#==================== NAT RULES ====================#
# SNAT para ETH1, ETH2
# (descomentar si se desea dar salida a la red publica para la red aislada)
#-A POSTROUTING -s 192.168.100.0/24 -o eth0 -j SNAT --to 192.168.120.50
#-A POSTROUTING -s 192.168.111.0/24 -o eth0 -j SNAT --to 192.168.120.50
#==================== END NAT RULES ====================#
COMMIT

Aplicamos las reglas:

iptables-apply /etc/iptables/rules.v4

Puede verificar las reglas anteriores, con el siguiente comando:

iptables -t mangle -L -v
iptables -L -v
iptables -t nat -L -v

1.3.         Bitacorización de Iptables

Para lograr bitacorizar iptables en un fichero log independiente, debemos seguir una serie de pasos que se describen a continuación. Las siguientes configuraciones se realiaran en ambos servidores (“vpn” y “tservice”).

Debemos crear el archivo “iptables.log” dentro de la carpeta “/var/log/firewall” que debemos crearla, y configurar los permisos:

mkdir -p /var/log/firewall/
touch /var/log/firewall/iptables.log
chmod 600 /var/log/firewall/iptables.log
chown root:adm /var/log/firewall/iptables.log

Rsyslog, el demonio de logueo de Debian, lee la configuración desde «/etc/rsyslog.d», por lo que debemos crear un archivo que yo llamaré «firewall.conf» desde el cual rsyslog, pueda interpretar lo que queremos hacer:

nano /etc/rsyslog.d/firewall.conf

Y dentro le dejamos caer suavemente el siguiente contenido:

:msg, contains, "fw: " -/var/log/firewall/iptables.log
& ~

La primera línea chequea los datos logueados buscando la cadena «fw: » y lo añade al archivo «/var/log/firewall/iptables.log»

La segunda, detiene el procesamiento de la información logueada con el patrón anterior para que no siga siendo enviada a «/var/log/messages».

Debemos crear el archivo «/etc/logrotate.d/iptables.log» para la rotación del fichero de logs:

nano /etc/logrotate.d/iptables.log

Agregamos lo siguiente:

/var/log/firewall/iptables.log
{
rotate 7
daily
size 10M
dateext
missingok
create 600 root adm
notifempty
compress
delaycompress
postrotate
invoke-rc.d rsyslog reload > /dev/null
endscript
}

Para así poder rotar los logs 7 veces antes de borrarlos, 1 vez al día, tamaño máximo del log 10MB, comprimido, con fecha, sin dar error si el log no existe, creado como “root”.

Reiniciar el demonio rsyslog:

/etc/init.d/rsyslog restart

Esto es todo amigos. Espero que haya recorrido este tutorial con las mismas ganas con las que lo redacté y espero sobre todo, que les haya sido de mucha ayuda. Si tienen alguna duda o sugerencia, no dude en comentar.

SL2

 

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

Franco Diaz Hurtado

Ing. Telecomunicaciones y Electrónica; 1er Especialista en Redes de ECASA Nivel Central

Compartir
Publicado por
Franco Diaz Hurtado

Entradas recientes

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…

8 meses hace

Home automation (Parte 3) – ESPHome

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

1 año hace

Home automation (Parte 2) – Home Assistant

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

1 año hace

Home automation (Parte 1)

Desde hace varios meses vengo con la idea de automatizar la casa donde vivo. Poco…

1 año hace

Cocinando una imagen personalizada de OpenWRT

El artículo describe el uso para un caso particular de OpenWRT y la creación de…

1 año hace