SSH. Un poco de seguridad Parte 5

En esta ocasión generaremos un par de claves (publica/privada) para conectarnos a nuestra maquina sin necesidad de introducir nuestra contraseña, aunque esto también tiene sus riesgos,  por eso daremos unos consejos para una utilización segura de este sistema de acceso.

Primero generamos un par de claves de protocolo 2 con ssh-keygen -t RSA , donde RSA puede ser sustituido por RSA1 para el protocolo 1, o DSA  para el protocolo 2,  también las podemos generar indicando el numero de bits (-b 1024,-b 2048,-b 4096)

mrpako@ecorp$ ssh-keygen -t RSA
Generating public/private rsa key pair.
Enter file in which to save the key (/home/mrpako/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):***************************
Enter same passphrase again:***************************
Your identification has been saved in /home/mrpako/.ssh/id_rsa.
Your public key has been saved in /home/mrpako/.ssh/id_rsa.pub.

Esto crea dos archivos, id.rsa (clave privada) e id.rsa.pub (clave publica) este ultimo debemos incluirlo en el archivo /home/mrpako/.ssh/authorized_keys.

mrpako@ecorp$ echo `cat ~/id.rsa.pub` >> ~/.ssh/authorized_keys
Y después procedemos a su eliminación.
mrpako@ecorp$ rm /home/mrpako/id.rsa.pub

Y para finalizar configuramos el archivo /etc/ssh/sshd_config , deshabilitaremos  el acceso como root, según se indica en la parte 1 de esta serie, y podemos añadir algo mas de seguridad siguiendo las indicaciones de la parte  2.

Ahora debemos proteger y distribuir por un canal seguro la clave privada y reiniciar el servicio con service sshd restart, y ya podemos proceder a conectarnos desde cualquier otra ubicación que disponga de la llave con israelgmo@umbrellacorp$ ssh -i id.rsa mrpako@192.251.68.254

 

Guía Hardening – Configuración de redes y Firewall – IPtables Parte 2

En la primera parte de esta entrada se vio como funcionaba muy básicamente IPtables, y para ver el potencial y funcionamiento de un Firewall con IPtables, hemos decidido coger un script que teníamos a mano, y así poder ver de una manera mas completa el potencial de IPtables. Tenéis que tener en cuenta que este FW se ha puesto como ejemplo, no es que se haya realizado super securizado, es simplemente para que veáis algunos ejemplos de lo que se puede hacer con iptables.

ESQUEMA DE RED

Mr.Pako = KALI
FIREWALL = CERBERO
ECORP = eth2 Debian
UMBRELLA = eth0 Win

ARCHIVO INTERFACE

up /etc/fw.sh start
down /etc/fw.sh stop

ARCHIVO BLACKLIST

Este es un simple archivo de texto en el que para el ejemplo hemos decidido incluir  direcciones URL de sitios web a bloquear, se puede utilizar este mismo ejemplo para otros menesteres,  se invoca desde el script al inicio, por ejemplo.

Variables

BLACKLIST="/etc/blacklist"

ejemplo de contenido:

---- inicio archivo blacklist ----
marca.es
elmundo.es
elpais.com
etc.
--- fin archivo blacklist ----

SCRIPT Firewall

He decidido crear un script e iniciarlo al arrancar el equipo, personalmente me gusta hacerlo así, pero bueno aquí cada cual que elija el método que más le guste.

Hemos comentado todo el script, además consideramos que es auto explicativo. Vamos al tajo.

1.- Stop, borrado de reglas y Start
La primera parte del script elimina todas las reglas anteriormente creadas, de este modo evitamos posibles conflictos con alguna regla existente, para esta tarea utilizamos la opción –flush o -F, acompañada de -X (borra todas las cadenas) y -Z (pone a cero los contadores de paquetes) y finalizamos poniendo todas las políticas por defecto en ACCEPT y aplicando reglas para el Firewall.

 

========= INICIO SCRIPT ==========

#!/bin/sh
#
#
# Variables
BLACKLIST="/etc/blacklist"

stop(){
# Eliminamos reglas (flush)

echo -ne "[.] Eliminando reglas anteriores "
iptables --flush
iptables -X
iptables -Z
iptables --table nat --flush
iptables --table mangle --flush

# Ponemos las politicas por defecto en ACCEPT.

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
echo -ne " -> [ OK ]\n "
}

start(){
clear 
echo -ne "***** Aplicando Reglas de Firewall *****\n"
 
# Politicas por defecto (drop) 
# creo las politicas por defecto en drop para que 
# lo deniege todo, excepto el PRE Y POSTROUTING.

echo -ne "[.] Estableciendo POLITICAS (DROP) por defecto"
iptables --policy INPUT DROP
iptables --policy OUTPUT DROP
iptables --policy FORWARD DROP
iptables --table nat --policy PREROUTING ACCEPT
iptables --table nat --policy POSTROUTING ACCEPT
echo -ne " -> [ OK ]\n "

2.- Protección
Para protegernos frente a algunos ataques comunes debemos habilitar varios módulos, esto lo hacemos con echo 1  >  seguido del modulo que queremos activar, además añadimos protección para 3 tipos de escaneo de red comunes.

# Ahora hacemos enmascaramiento de la red local y activamos el BIT 
# DE FORWARDING (imprescindible)
echo -ne "[.] Estableciendo MASQUERADE Y FORWARD para la red local"
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
echo -ne " -> [ OK ]\n "

# Habilitamos protección broadcast echo.
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

# Habilitamos protección tcp_syn cookie.
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

# Protecciones a 3 tipos de escaneo 
# NULL, XMAS, SYN-FIN-scan
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP

# Permitir hacer pings al servidor
echo -ne "[.] Permitiendo ping al FW desde la LAN y desde Internet"
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A INPUT -i eth2 -p icmp -j ACCEPT
iptables -A INPUT -i eth0 -p icmp -j ACCEPT
iptables -A INPUT -i eth1 -p icmp -j ACCEPT 
echo -ne " -> [ OK ]\n "

3.- SSH
Para poder trabajar a través de SSH debemos indicarle al firewall las direcciones de origen y puertos que se utilizaran normalmente para conectarse utilizando SSH, además podemos indicarle la mac address del equipo para brindar un poco mas de seguridad en la conexiones.

# Reglas para poder acceder al servidor por ssh
echo -ne "[.] Permitiendo ACCESO SSH hacia CERBERO desde puesto de trabajo y laptop Mr.Pako"
iptables -A INPUT -i eth2 -s IP ORIGEN -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -s IP ORIGEN.46 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth2 -s IP ORIGEN.179 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -s IP ORIGEN.179 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth2 -s IP ORIGEN.46 -p udp --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -s IP ORIGEN.46 -p udp --dport 22 -j ACCEPT
#iptables -A INPUT -m mac --mac 00:00:00:00:00:00 -p tcp --dport 22 -j ACCEPT
#iptables -A INPUT -m mac --mac 00:00:00:00:00:00 -p udp --dport 22 -j ACCEPT
#iptables -A INPUT -m mac --mac 00:00:00:00:00:11 -p tcp --dport 22 -j ACCEPT
#iptables -A INPUT -m mac --mac 00:00:00:00:00:11 -p udp --dport 22 -j ACCEPT
iptables -A OUTPUT -o eth0 -s IP ORIGEN.80.1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o eth2 -s IP ORIGEN.1 -m state --state ESTABLISHED,RELATED -j ACCEPT
echo -ne " -> [ OK ]\n "

 

# ntp 
iptables -A FORWARD -p udp --dport 123 -j ACCEPT
iptables -A FORWARD -p tcp --dport 123 -j ACCEPT 
 
# Reglas para el DNS local
echo -ne "[.] Permitiendo peticiones DNS desde ECORP hacia inet" 
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
echo -ne " -> [ OK ]\n " 
 
echo -ne "[.] Permitiendo peticiones DNS desde Lan hacia ECORP" 
iptables -A INPUT -i eth2 -p tcp --dport 53 -d IP DESTINO/24 -j ACCEPT
iptables -A INPUT -i eth2 -p udp --dport 53 -d IP DESTINO/24 -j ACCEPT
iptables -A OUTPUT -o eth2 -m state --state ESTABLISHED,RELATED -j ACCEPT
echo -ne " -> [ OK ]\n "

 

4 – VPN, RDP, WEB, VozIP, CITRIX, FTP

 

# Reglas para conexiones VPN desde INTERNET
echo -ne "[.] Permitiendo conexiones vpn desde inet" 
iptables -t nat -A PREROUTING -i eth0 -p 47 -s 0/0 -j DNAT --to IP DESTINO
iptables -t nat -A PREROUTING -i eth0 -p tcp -s 0/0 --dport 1723 -j DNAT --to IP DESTINO:1723
iptables -A FORWARD -i eth0 -o eth2 -d IP DESTINO -p 47 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth2 -d IP DESTINO -p tcp --dport 1723 -j ACCEPT
echo -ne " -> [ OK ]\n "

# Regla para permitir pptp (VPN)
echo -ne "[.] Activando reglas FORWARD para conexion vpn desde el SERVIDOR DE ECORP hacia otros destinos"
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 1723 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p 47 -o eth0 -j ACCEPT
echo -ne " -> [ OK ]\n "

# Permito RDP 3389.
echo -ne "[.] Permitiendo conexiones RDP a laptop Mr.Pako" 
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 3389 -s IP ORIGEN -j DNAT --to IP DESTINO:3389
iptables -t nat -A PREROUTING -i eth0 -m mac --mac 00:00:00:00:00:00 -p tcp --dport 3389 -j DNAT --to IP DESTINO:3389
iptables -A FORWARD -i eth0 -s IP ORIGEN -o eth2 -d IP DESTINO -p tcp --dport 3389 -j ACCEPT 
iptables -A FORWARD -i eth0 -m mac --mac 00:00:00:00:00:00 -p tcp --dport 3389 -j ACCEPT
echo -ne " -> [ OK ]\n "

# Reglas para permitir al equipo 51 y 57 salir por el puerto 3390 y 3391 por rdp.
echo -ne "[.] Activando reglas FORWARD para conexión RDP"
iptables -A FORWARD -i eth2 -s IP ORIGEN.51 -p tcp --dport 3390:3391 -o eth0 -d IP DESTINO -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN.57 -p tcp --dport 3390:3391 -o eth0 -d IP DESTINO -j ACCEPT
echo -ne " -> [ OK ]\n "

# Regla para navegación web.
echo -ne "[.] Activando reglas FORWARD para www y https"
iptables -A FORWARD -i eth0 -o eth2 -m state --state ESTABLISHED,RELATED -j ACCEPT 
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 80 -m state --state NEW -o eth0 -j ULOG --ulog-prefix="WEB: -->"
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 80 -m state --state NEW -o eth0 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 443 -m state --state NEW -o eth0 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p udp --dport 443 -m state --state NEW -o eth0 -j ACCEPT
echo -ne " -> [ OK ]\n "

# Regla para permitir el pop3.
echo -ne "[.] Activando reglas FORWARD para pop3"
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 110 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p udp --dport 110 -o eth0 -j ACCEPT
echo -ne " -> [ OK ]\n "

# Regla para permitir el smtp.
echo -ne "[.] Activando reglas FORWARD para smtp"
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 25 -o eth0 -j ACCEPT
echo -ne " -> [ OK ]\n "

# Reglas para la VOIP.
echo -ne "[.] Activando reglas FORWARD para la VozIP"
iptables -A FORWARD -i eth0 -s IP ORIGEN/24 -p tcp --dport 5060:5081 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -s IP ORIGEN/24 -p udp --dport 5060:5081 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -s IP ORIGEN/24 -p tcp --dport 6060:6061 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -s IP ORIGEN/24 -p udp --dport 6060:6061 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -s IP ORIGEN/24 -p tcp --dport 34567 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -s IP ORIGEN/24 -p udp --dport 34567 -o eth0 -j ACCEPT
echo -ne " -> [ OK ]\n "

# Reglas para acceder por CITRIX a los servidores de UMBRELLA CORPORATION.
echo -ne "[.] Activando reglas FORWARD para conectar por CITRIX a UMBRELLA CORPORATION"
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 1494 -o eth0 -d IP DESTINO.230 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 1494 -o eth0 -d IP DESTINO.234 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 1494 -o eth0 -d IP DESTINO.235 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p udp --dport 1604 -o eth0 -d IP DESTINO.230 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p udp --dport 1604 -o eth0 -d IP DESTINO.234 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p udp --dport 1604 -o eth0 -d IP DESTINO.235 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 2598 -o eth0 -d IP DESTINO.230 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 2598 -o eth0 -d IP DESTINO.234 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 2598 -o eth0 -d IP DESTINO.235 -j ACCEPT
echo -ne " ->[ OK ]\n "

# Regla para permitir FTP a los servidores.
echo -ne "[.] Activando reglas FORWARD para ftp a la IP de eth2"
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 20:21 -o eth0 -d IP DESTINO -j ACCEPT
echo -ne " -> [ OK ]\n "

iptables -A FORWARD -i eth2 -o eth0 -s 192.168.0.0/24 -m state --state ESTABLISHED,RELATED -j ACCEPT }
Lines=0
cat $BLACKLIST | while read line;
do {
 echo -ne "[.]Denegando acceso a $line"
 iptables -A FORWARD -d $line -p tcp --dport 80-j DROP
 echo -ne "-> [ OK ]\n"
 ((Lines++))
   }
done


case "$1" in
 start)
 start
 ;;
 
 stop)
 stop
 ;;
 
 restart)
 stop
 start;;
 *)
 echo -ne " Uso: $0 {start | stop | restart } \n"

esac
exit

============== FIN SCRIPT ==================

Las prisas son malas compañeras y durante la redacción de este post, el becario en lugar de guardar le dió a publicar 🙂 , esperamos que este post (algo distinto de lo habitual) os sirva para tener una idea de lo que se puede hacer. Más adelante, veremos como testear las distintas reglas y algún truco más.