Diferencia entre revisiones de «Cortafuegos»

De Guía Ubuntu
Saltar a: navegación, buscar
m (Categorizando)
m (Se adiciona un LSB Init Script para que no genere un WARNING al momento de actualizar el rc.d)
 
(No se muestran 36 ediciones intermedias realizadas por 13 usuarios)
Línea 1: Línea 1:
[[Category:Administración del sistema]][[Category:Securización]]
+
== Descripción ==
Un '''cortafuegos''' o firewall es una herramienta que facilita la protección contra intrusos que quieren acceder a nuestra máquina sin nuestro permiso.
+
Un '''cortafuegos''' o firewall es una herramienta que facilita la protección contra intrusos que pretenden acceder a nuestro ordenador sin nuestro consentimiento.
  
Existen variedad de cortafuegos en GNU/Linux, en modo texto y en modo gráfico.
+
Existen variedad de cortafuegos en GNU/Linux, en modo texto y en modo   gráfico.
Entre ellos, el más destacable por su sencillez de manejo es [http://www.fs-security.com/ Firestarter].
+
  
Para instalarlo, lée [[Primeros pasos/Añadir aplicaciones]].
+
== Modo gráfico (GUI) ==
 +
=== Firestarter ===
 +
El más destacable por su sencillez de manejo es [http://www.fs-security.com/ Firestarter].
 +
 
 +
Para instalarlo, lée [[Añadir aplicaciones]].
 +
 
 +
== Modo texto (Terminal) ==
 +
=== Iptables ===
 +
Otra opción es utilizar la herramienta iptables. En el siguiente artículo publicado por herje en http://www.ubuntu-es.org/node/422 muestra como hacerlo fácil:
 +
 
 +
Para los paranoicos, explico un modo muy simple de implementar iptables con el fin de cerrar todos los puertos que queramos de nuestro pc.
 +
Iptables es un sistema firewall muy potente incluido en el núcleo de Linux y que requiere una serie de conocimientos. Hay cientos de tutoriales en la red.
 +
Es aconsejable no setear iptables con cualquier script copiado de la red, puesto que iptables está capacitado para dejar tu sistema como se dice en román paladino abierto de piernas (desconozco si el script se hay puesto aquí es bueno o te valdrá a tí... esto es un wiki colectivo y cada red es diferente!!!). Podemos buscar otros scripts muy completos e información del funcionamiento de iptables [http://www.netfilter.org/documentation/HOWTO/es/packet-filtering-HOWTO-7.html en el manual del autor][http://bulma.net/body.phtml?nIdNoticia=1522 en bulma.net], [http://www.packetstormsecurity.org/papers/firewall/iptables.txt aquí (inglés)] y [http://www.malibyte.net/iptables/scripts/fwscripts.html aquí (inglés)], o preguntandole a google.
 +
No obstante me voy a centrar en alguien que puede ser un usuario normal y que desea lo siguiente:
 +
 
 +
* Cerrar todos los puertos de entrada
 +
* Navegar por internet
 +
* Permitir el acceso a internet de cualquier aplicación que él inicie.
 +
* Permitir la libre navegación de la LAN de confianza si la tiene
 +
 
 +
En primer lugar instalamos el paquete iptables:
 +
 
 +
$ sudo apt-get install -test iptables
 +
 
 +
Ésto nos activará el servicio por defecto. Sólo queda implementar el script de iptables con nuestras reglas y hacer que se carguen al inicio.
 +
 
 +
El script que yo tengo, sin entrar en detalles viene a ser algo así, muy sencillo:
 +
 
 +
<nowiki>#!/bin/bash
 +
 
 +
### BEGIN INIT INFO
 +
# Provides:          defaultdaemon
 +
# Required-Start:    $remote_fs $syslog
 +
# Required-Stop:    $remote_fs $syslog
 +
# Default-Start:    2 3 4 5
 +
# Default-Stop:      0 1 6
 +
# Short-Description: Start daemon at boot time
 +
# Description:      Enable service provided by daemon.
 +
### END INIT INFO
 +
 
 +
#-s Especifica una dirección de origen
 +
#-d Especifica una dirección de destino
 +
#-p Especifica un prototocolo
 +
#-i Especifica un interface de entrada
 +
#-o Especifica un interface de salida
 +
#-j Especifica la acción a ejecutar sobre el paquete
 +
#--sport Puerto de origen
 +
#--dport Puerto de destino
 +
 
 +
#Borrar todas las reglas
 +
iptables -F
 +
 
 +
#Politica general.Cerramos todo.Dejamos entrar y salir lo solicitado
 +
iptables -P INPUT DROP
 +
iptables -P OUTPUT ACCEPT
 +
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 +
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 +
 
 +
###OTRAS PROTECCIONES####
 +
 
 +
# Quitamos los pings.
 +
/bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
 +
 
 +
# No respondemos a los broadcast.
 +
/bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
 +
 
 +
# Para evitar el spoofing nos aseguramos de que la dirección
 +
# origen del paquete viene del sitio correcto.
 +
for interface in /proc/sys/net/ipv4/conf/*/rp_filter; do
 +
/bin/echo "1" > ${interface}
 +
done
 +
 
 +
# Los ICMPs redirigidos que pueden alterar la tabla de rutas.
 +
for interface in /proc/sys/net/ipv4/conf/*/accept_redirects; do
 +
/bin/echo "0" > ${interface}
 +
done
 +
 
 +
# No guardamos registros de los marcianos.
 +
/bin/echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
 +
 
 +
# Asegurar, aunque no tenga soporte el nucleo, q no hay forward.
 +
/bin/echo "0" > /proc/sys/net/ipv4/ip_forward
 +
 
 +
###Reglas de los puertos####
 +
 
 +
# Permitimos que se conecten a nuestro servidor web.
 +
 
 +
#iptables -A INPUT -m state --state NEW -p TCP --dport 80 -j ACCEPT
 +
 
 +
#Abrimos ssh a la red.
 +
#iptables -A INPUT -s 172.26.0.3 -p TCP --dport 22 -j ACCEPT
 +
#iptables -A INPUT -s 172.26.0.4 -p TCP --dport 22 -j ACCEPT
 +
#iptables -A INPUT -s 172.26.0.5 -p TCP --dport 22 -j ACCEPT
 +
 
 +
#iptables -A INPUT -p TCP --dport 22 -j ACCEPT
 +
 
 +
# Permitimos la comunicación con el servidor dns
 +
iptables -A INPUT -p UDP --dport 53 -j ACCEPT
 +
iptables -A INPUT -p TCP --dport 53 -j ACCEPT
 +
 
 +
#Permitimos uso de ftp.
 +
#iptables -A INPUT -p TCP --dport 21 -j ACCEPT
 +
 
 +
#Permitimos acceso pop3.
 +
#iptables -A INPUT -p TCP --dport 110 -j ACCEPT
 +
 
 +
# Permitimos uso de smtp
 +
#iptables -A INPUT -p TCP --dport 25 -j ACCEPT
 +
 
 +
#Permitimos acceso imap.
 +
#iptables -A INPUT -p TCP --dport 143 -j ACCEPT
 +
#iptables -A INPUT -p UDP --dport 143 -j ACCEPT
 +
 
 +
#Permitimos todo el trafico de la LAN
 +
iptables -A INPUT -s 172.26.0.2 -j ACCEPT
 +
iptables -A INPUT -s 172.26.0.4 -j ACCEPT
 +
iptables -A INPUT -s 172.26.0.5 -j ACCEPT
 +
 
 +
#Dejamos a localhost, para mysql, etc..
 +
iptables -A INPUT -i lo -j ACCEPT</nowiki>
 +
 
 +
 
 +
Lógicamente las líneas van juntas. Sólo se aplican las líneas no comentadas con # , las otras son para mi servidor.
 +
 
 +
El fichero se puede llamar por ejemplo firewall.sh , debemos darle permisos de ejecución:
 +
 
 +
$ chmod +x firewall.sh
 +
 
 +
Ahora si aplicamos el script de este modo:
 +
 
 +
$ sudo sh firewall.sh
 +
 
 +
podemos ver la salida de iptables haciendo:
 +
 
 +
$ sudo iptables -L
 +
 
 +
que viene a ser algo así:
 +
 
 +
<nowiki>root@platas:/home/herje # iptables -L
 +
Chain INPUT (policy DROP)
 +
target prot opt source destination
 +
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
 +
ACCEPT udp -- anywhere anywhere udp dpt:domain
 +
ACCEPT tcp -- anywhere anywhere tcp dpt:domain
 +
ACCEPT all -- glorioso anywhere
 +
ACCEPT all -- minime anywhere
 +
ACCEPT all -- placebo anywhere
 +
ACCEPT all -- anywhere anywhere
 +
 
 +
Chain FORWARD (policy ACCEPT)
 +
target prot opt source destination
 +
 
 +
Chain OUTPUT (policy ACCEPT)
 +
target prot opt source destination
 +
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
 +
root@platas:/home/herje #</nowiki>
 +
 
 +
Sólo falta hacer que las reglas se carguen al inicio, para ello copiamos el script en /etc/init.d y lo ponemos por default:
 +
 
 +
$ sudo cp firewall.sh /etc/init.d/
 +
$ sudo update-rc.d firewall.sh defaults
 +
 
 +
Y listo con esto tenemos nuestro firewall funcionando.
 +
Agradezco cualquier aclaración, complemento etc. teniendo en cuenta que está pensado para un user casero y sin grandes pretensiones.
 +
 
 +
==== Filtro de mac's con iptables ====
 +
 
 +
Últimamente las tecnologías inalámbricas hacen necesario el uso del ''filtro de mac'' como una potente herramienta a la hora de seleccionar a quienes queremos que se conecten a nuestra red inalambrica. Esto sin embargo, no nos asegura que '''no''' puedan tener acceso, lo que si nos asegura es que tendrán que trabajar mucho más, lo que les puede costar lo suficiente como para que dejen de intentarlo. Y sin más, supondremos, para este ejemplo, que la WLAN de nuestro ''computador'' se llama '''ath0''', y que la mac de nuestro ''laptop'' es '''CA:FE:DE:C0:C0''', luego debemos fijarnos que nuestro '''firewal.sh''' contenga lo siguiente (obviamente también debemos fijarnos que en otras cadenas y reglas no interfiramos con lo de a continuación):
 +
 
 +
# Debemos fijarnos que la política de entrada sea
 +
# '''botar cualquier intento de entrada'''
 +
iptables -P INPUT DROP
 +
iptables -t nat -P PREROUTING DROP
 +
 
 +
la primera linea es para impedir el acceso a nuestro ''computador'', mientras que la segunda es para impedir el acceso a ''otros computadores'' que formen parte de la red que tenemos acceso, es decir, impedir que nos utilicen como ''puente''.
 +
 
 +
#Permitimos que salga ''cualquier cosa'' de la WLAN a la red
 +
iptables -A OUTPUT -o ath0 -j ACCEPT
 +
 
 +
#Solo permitimos que entren las siguientes mac's
 +
iptables -A INPUT -m mac --mac-source CA:FE:DE:C0:C0 -j ACCEPT
 +
iptables -t nat -A PREROUTING -m mac --mac-source CA:FE:DE:C0:C0 -j ACCEPT
 +
 
 +
Nuevamente, la primera linea es para que tengan acceso a nuestro ''computador'', y la segunda es para permitir el acceso a ''otros computadores'' que formen parte de la red que tenemos acceso, es decir, permitir que nos utilicen como ''puente''.
 +
 
 +
Ahora bien, si lo que queremos es que desde nuestro ''laptop'', además de podernos conectar a nuestro ''computador'', podamos conectarnos con la red que está conectada a la LAN del ''computador'', que llamaremos '''eth0''', debemos fijarnos además que exista una ''buena'' coneccion entre '''ath0''' y '''eth0'''
 +
 
 +
#Permitimos todas las conexiones que van desde '''ath0''' hacia '''eth0'''
 +
iptables -A FORWARD -i ath0 -o eth0 -m state --state ! INVALID -j ACCEPT
 +
#Son permitidas sólo las conexiones ya establecidas, o relacionadas con
 +
#las conexiones ya establecidas, que vienen de '''eth0''' y van hacia '''ath0'''
 +
iptables -A FORWARD -i eth0 -o ath0 -m state --state ESTABLISHED,RELATED -j ACCEPT
 +
 
 +
y luego debemos indicarle al sistema que exista comunicación entre las interfaces de red (podría ser necesario hacer esto cada vez que se reinicie el sistema, por lo que se recomienda su incorporación al script '''firewall.sh''')
 +
 
 +
$ chmod 666 /proc/sys/net/ipv4/ip_forward
 +
$ echo "1" > /proc/sys/net/ipv4/ip_forward
 +
 
 +
Por último, lo más probable es que la red que tiene acceso la LAN, '''eth0''' del ''computador'', tenga un firewall que imposibilite la conexión de nuestro ''laptop'', por lo cual debemos enmascarar a nuestro ''laptop'' frente a la red, para ello debemos colocarle una mascara a todo lo que salga de la LAN '''eth0'''
 +
 
 +
#Todo lo que sale de '''eth0''' se enmascara
 +
iptables -t nat -A POSTROUTING -o ra0 -j MASQUERADE 
  
 
{{esbozo}}
 
{{esbozo}}
 +
 +
[[Categoría:Administración del sistema]][[Categoría:Seguridad]]

Última revisión de 12:37 27 mar 2009

Descripción

Un cortafuegos o firewall es una herramienta que facilita la protección contra intrusos que pretenden acceder a nuestro ordenador sin nuestro consentimiento.

Existen variedad de cortafuegos en GNU/Linux, en modo texto y en modo gráfico.

Modo gráfico (GUI)

Firestarter

El más destacable por su sencillez de manejo es Firestarter.

Para instalarlo, lée Añadir aplicaciones.

Modo texto (Terminal)

Iptables

Otra opción es utilizar la herramienta iptables. En el siguiente artículo publicado por herje en http://www.ubuntu-es.org/node/422 muestra como hacerlo fácil:

Para los paranoicos, explico un modo muy simple de implementar iptables con el fin de cerrar todos los puertos que queramos de nuestro pc. Iptables es un sistema firewall muy potente incluido en el núcleo de Linux y que requiere una serie de conocimientos. Hay cientos de tutoriales en la red. Es aconsejable no setear iptables con cualquier script copiado de la red, puesto que iptables está capacitado para dejar tu sistema como se dice en román paladino abierto de piernas (desconozco si el script se hay puesto aquí es bueno o te valdrá a tí... esto es un wiki colectivo y cada red es diferente!!!). Podemos buscar otros scripts muy completos e información del funcionamiento de iptables en el manual del autoren bulma.net, aquí (inglés) y aquí (inglés), o preguntandole a google. No obstante me voy a centrar en alguien que puede ser un usuario normal y que desea lo siguiente:

  • Cerrar todos los puertos de entrada
  • Navegar por internet
  • Permitir el acceso a internet de cualquier aplicación que él inicie.
  • Permitir la libre navegación de la LAN de confianza si la tiene

En primer lugar instalamos el paquete iptables:

$ sudo apt-get install -test iptables

Ésto nos activará el servicio por defecto. Sólo queda implementar el script de iptables con nuestras reglas y hacer que se carguen al inicio.

El script que yo tengo, sin entrar en detalles viene a ser algo así, muy sencillo:

#!/bin/bash

### BEGIN INIT INFO
# Provides:          defaultdaemon
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

#-s Especifica una dirección de origen
#-d Especifica una dirección de destino
#-p Especifica un prototocolo
#-i Especifica un interface de entrada
#-o Especifica un interface de salida
#-j Especifica la acción a ejecutar sobre el paquete
#--sport Puerto de origen
#--dport Puerto de destino

#Borrar todas las reglas
iptables -F

#Politica general.Cerramos todo.Dejamos entrar y salir lo solicitado
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

###OTRAS PROTECCIONES####

# Quitamos los pings.
/bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all

# No respondemos a los broadcast.
/bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

# Para evitar el spoofing nos aseguramos de que la dirección
# origen del paquete viene del sitio correcto.
for interface in /proc/sys/net/ipv4/conf/*/rp_filter; do
/bin/echo "1" > ${interface}
done

# Los ICMPs redirigidos que pueden alterar la tabla de rutas.
for interface in /proc/sys/net/ipv4/conf/*/accept_redirects; do
/bin/echo "0" > ${interface}
done

# No guardamos registros de los marcianos.
/bin/echo "1" > /proc/sys/net/ipv4/conf/all/log_martians

# Asegurar, aunque no tenga soporte el nucleo, q no hay forward.
/bin/echo "0" > /proc/sys/net/ipv4/ip_forward

###Reglas de los puertos####

# Permitimos que se conecten a nuestro servidor web.

#iptables -A INPUT -m state --state NEW -p TCP --dport 80 -j ACCEPT

#Abrimos ssh a la red.
#iptables -A INPUT -s 172.26.0.3 -p TCP --dport 22 -j ACCEPT
#iptables -A INPUT -s 172.26.0.4 -p TCP --dport 22 -j ACCEPT
#iptables -A INPUT -s 172.26.0.5 -p TCP --dport 22 -j ACCEPT

#iptables -A INPUT -p TCP --dport 22 -j ACCEPT

# Permitimos la comunicación con el servidor dns
iptables -A INPUT -p UDP --dport 53 -j ACCEPT
iptables -A INPUT -p TCP --dport 53 -j ACCEPT

#Permitimos uso de ftp.
#iptables -A INPUT -p TCP --dport 21 -j ACCEPT

#Permitimos acceso pop3.
#iptables -A INPUT -p TCP --dport 110 -j ACCEPT

# Permitimos uso de smtp
#iptables -A INPUT -p TCP --dport 25 -j ACCEPT

#Permitimos acceso imap.
#iptables -A INPUT -p TCP --dport 143 -j ACCEPT
#iptables -A INPUT -p UDP --dport 143 -j ACCEPT

#Permitimos todo el trafico de la LAN
iptables -A INPUT -s 172.26.0.2 -j ACCEPT
iptables -A INPUT -s 172.26.0.4 -j ACCEPT
iptables -A INPUT -s 172.26.0.5 -j ACCEPT

#Dejamos a localhost, para mysql, etc..
iptables -A INPUT -i lo -j ACCEPT


Lógicamente las líneas van juntas. Sólo se aplican las líneas no comentadas con # , las otras son para mi servidor.

El fichero se puede llamar por ejemplo firewall.sh , debemos darle permisos de ejecución:

$ chmod +x firewall.sh

Ahora si aplicamos el script de este modo:

$ sudo sh firewall.sh

podemos ver la salida de iptables haciendo:

$ sudo iptables -L

que viene a ser algo así:

root@platas:/home/herje # iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT udp -- anywhere anywhere udp dpt:domain
ACCEPT tcp -- anywhere anywhere tcp dpt:domain
ACCEPT all -- glorioso anywhere
ACCEPT all -- minime anywhere
ACCEPT all -- placebo anywhere
ACCEPT all -- anywhere anywhere

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
root@platas:/home/herje #

Sólo falta hacer que las reglas se carguen al inicio, para ello copiamos el script en /etc/init.d y lo ponemos por default:

$ sudo cp firewall.sh /etc/init.d/
$ sudo update-rc.d firewall.sh defaults

Y listo con esto tenemos nuestro firewall funcionando. Agradezco cualquier aclaración, complemento etc. teniendo en cuenta que está pensado para un user casero y sin grandes pretensiones.

Filtro de mac's con iptables

Últimamente las tecnologías inalámbricas hacen necesario el uso del filtro de mac como una potente herramienta a la hora de seleccionar a quienes queremos que se conecten a nuestra red inalambrica. Esto sin embargo, no nos asegura que no puedan tener acceso, lo que si nos asegura es que tendrán que trabajar mucho más, lo que les puede costar lo suficiente como para que dejen de intentarlo. Y sin más, supondremos, para este ejemplo, que la WLAN de nuestro computador se llama ath0, y que la mac de nuestro laptop es CA:FE:DE:C0:C0, luego debemos fijarnos que nuestro firewal.sh contenga lo siguiente (obviamente también debemos fijarnos que en otras cadenas y reglas no interfiramos con lo de a continuación):

# Debemos fijarnos que la política de entrada sea
# botar cualquier intento de entrada
iptables -P INPUT DROP
iptables -t nat -P PREROUTING DROP

la primera linea es para impedir el acceso a nuestro computador, mientras que la segunda es para impedir el acceso a otros computadores que formen parte de la red que tenemos acceso, es decir, impedir que nos utilicen como puente.

#Permitimos que salga cualquier cosa de la WLAN a la red 
iptables -A OUTPUT -o ath0 -j ACCEPT
#Solo permitimos que entren las siguientes mac's
iptables -A INPUT -m mac --mac-source CA:FE:DE:C0:C0 -j ACCEPT
iptables -t nat -A PREROUTING -m mac --mac-source CA:FE:DE:C0:C0 -j ACCEPT

Nuevamente, la primera linea es para que tengan acceso a nuestro computador, y la segunda es para permitir el acceso a otros computadores que formen parte de la red que tenemos acceso, es decir, permitir que nos utilicen como puente.

Ahora bien, si lo que queremos es que desde nuestro laptop, además de podernos conectar a nuestro computador, podamos conectarnos con la red que está conectada a la LAN del computador, que llamaremos eth0, debemos fijarnos además que exista una buena coneccion entre ath0 y eth0

#Permitimos todas las conexiones que van desde ath0 hacia eth0
iptables -A FORWARD -i ath0 -o eth0 -m state --state ! INVALID -j ACCEPT
#Son permitidas sólo las conexiones ya establecidas, o relacionadas con
#las conexiones ya establecidas, que vienen de eth0 y van hacia ath0
iptables -A FORWARD -i eth0 -o ath0 -m state --state ESTABLISHED,RELATED -j ACCEPT

y luego debemos indicarle al sistema que exista comunicación entre las interfaces de red (podría ser necesario hacer esto cada vez que se reinicie el sistema, por lo que se recomienda su incorporación al script firewall.sh)

$ chmod 666 /proc/sys/net/ipv4/ip_forward
$ echo "1" > /proc/sys/net/ipv4/ip_forward 

Por último, lo más probable es que la red que tiene acceso la LAN, eth0 del computador, tenga un firewall que imposibilite la conexión de nuestro laptop, por lo cual debemos enmascarar a nuestro laptop frente a la red, para ello debemos colocarle una mascara a todo lo que salga de la LAN eth0

#Todo lo que sale de eth0 se enmascara
iptables -t nat -A POSTROUTING -o ra0 -j MASQUERADE   

Este artículo es, por ahora, sólo un esbozo.
Ampliándolo ayudarás a mejorar Guía Ubuntu.