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?

¡Haz clic en una estrella para puntuar!

Promedio de puntuación 5 / 5. Recuento de votos: 3

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

Sobre Franco Diaz Hurtado 27 artículos
Ing. Telecomunicaciones y Electrónica; 1er Especialista en Redes de ECASA Nivel Central

Sé el primero en comentar

Dejar una contestacion

Tu dirección de correo electrónico no será publicada.


*