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
Dejar una contestacion