¿Buenas reglas de inicio de iptables para un servidor web?


12

Estoy instalando un nuevo servidor centos 5.4 y me gustaría tener un conjunto de reglas limpias para que mu iptables se inicie.

¿Cuáles serían las buenas reglas para comenzar?

¿Es este un buen punto de partida?

# Allow outgoing traffic and disallow any passthroughs

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

# Allow traffic already established to continue

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow ssh, ftp and web services

iptables -A INPUT -p tcp --dport ssh -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p udp --dport ftp-data -i eth0 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -i eth0 -j ACCEPT

# Allow local loopback services

iptables -A INPUT -i lo -j ACCEPT

# Allow pings

iptables -I INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -I INPUT -p icmp --icmp-type source-quench -j ACCEPT
iptables -I INPUT -p icmp --icmp-type time-exceeded -j ACCEPT

Para qué es esta regla:

iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT

ACTUALIZACIÓN

Será un servidor web con FTP (requerido), apache, SSH, mysql.


Uso esta regla simple ... Cierra todo y trabaja hacia atrás y abre lo que se necesita. Para un servidor web, el puerto 80/443 suele ser el único servicio público. Bloquee todo lo demás o limite el acceso; por ejemplo, limite ssh a IP específicas o redes privadas.
jeffatrackaid

Respuestas:


13

Sus reglas de IPTables parecen ser principalmente apropiadas para su servidor. Pero sugeriría un par de posibles cambios:

  • A menos que necesite permitir el acceso SSH, MySQL y FTP desde todo Internet, sería mucho más seguro usar la opción '--source' para restringir el acceso a esos puertos solo desde ciertas direcciones IP aprobadas. Por ejemplo, para permitir solo el acceso SSH desde la dirección IP 71.82.93.101, cambiaría la quinta regla a 'iptables -A INPUT -p tcp --dport ssh --source 71.82.93.101 -i eth0 -j ACCEPT'. Probablemente necesitará agregar una regla por separado para cada dirección IP individual que desee permitir, consulte esta pregunta para obtener más información al respecto: IP de múltiples fuentes de iptables .

  • A menos que esta máquina esté ejecutando un servidor DNS, probablemente desee bloquear el acceso al puerto 'dominio' (53). Para hacer esto, simplemente elimine la línea 'iptables -A INPUT -p tcp --dport domain -i eth0 -j ACCEPT'. (Esto también debería responder a su pregunta final, por cierto). Sin embargo, si realmente está ejecutando un servidor DNS, deje esta regla en su lugar.

  • Si necesita permitir el acceso remoto del cliente MySQL a través de la red, deberá agregar la línea 'iptables -A INPUT -p tcp --dport 3306 -i eth0 -j ACCEPT' para abrir el acceso externo al puerto estándar MySQL . Pero NO haga esto a menos que sea realmente necesario: si solo necesita acceso local a MySQL (por ejemplo, para una aplicación PHP que se ejecuta bajo Apache), no necesita proporcionar acceso remoto a MySQL. Y, a menos que quiera arriesgarse a ser pirateado, si abre el puerto 3306 a la red, asegúrese de requerir contraseñas seguras para todas las cuentas de usuario de MySQL y que sus paquetes de servidor MySQL estén actualizados.

  • Uno de sus comentarios ('Permitir ssh, dns, ldap, ftp y servicios web') menciona servicios LDAP, pero no existe tal regla en su configuración. Esto me sucede mucho cuando copio una configuración de ejemplo y la modifico. No afectará la función, pero corregiría el comentario, ya que los comentarios engañosos pueden causar indirectamente al confundirlo a usted u otro administrador en el futuro.

En mi experiencia, es difícil encontrar un conjunto perfecto de reglas de IPTables, pero creo que definitivamente estás en el camino correcto. Además, buena suerte al aprender más sobre IPTables: estas reglas pueden parecer complejas al principio, pero es una habilidad muy útil para cualquier administrador de sistemas Linux.


1
En lugar de permitir el acceso remoto de MySQL a través del firewall, puede asegurarse de que todos los que necesitan acceso al servidor MySQL tengan derecho a reenviar el puerto SSH.
ptman

Los puertos SSH hacia adelante son una alternativa potencial para abrir el puerto y bloquear los permisos de MySQL. Pero a menos que esté tratando con datos confidenciales y / o sea un objetivo de alto perfil (lo que haría que las funciones de cifrado de SSH sean útiles), no veo la ventaja. Después de todo, el túnel SSH tiene sus propias desventajas, que incluyen: problemas de configuración / configuración; aumento de la utilización de la CPU y limitación del ancho de banda (debido al tamaño del búfer estático de OpenSSH). ¿Y qué pasa si no quiere que todos sus clientes remotos de MySQL tengan inicios de sesión locales?
Ryan B. Lynch

En lo que respecta a los comentarios que no coinciden con las reglas, las reglas ICMP permiten traceroutes, descubrimiento de PMTU y otros mensajes útiles, pero no permiten pings (solicitud de eco y respuesta de eco).
Gerald Combs

Gerald, es un buen partido, ni siquiera me di cuenta. Probablemente debería cambiar el comentario para tener en cuenta que NO se permite hacer ping, o debe agregar reglas que permitan el tráfico de solicitud / respuesta de eco ICMP.
Ryan B. Lynch

4

Definitivamente, busca restringir tu tráfico saliente también.

He visto muchos casos en los que las vulnerabilidades de PHP provocan que alguien use 'curl' o 'wget' para obtener código malicioso de otro lugar, luego lo ejecuta en su servidor para unirse a una botnet.

Si no espera que Apache (como ejemplo) necesite hablar con otros sitios web, restrinja el tráfico y ahórrese un poco de dolor en el futuro.


2

Estas reglas están listas para importarse mediante "iptables-restore":

*filter
:INPUT DROP [20:2036]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [93:16260]
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT -m comment --comment "allow ICMP: echo-reply"
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -m comment --comment "allow ICMP: echo-request"
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT -m comment --comment "allow ICMP: destination-unreachable"
-A INPUT -p icmp -m icmp --icmp-type 4 -j ACCEPT -m comment --comment "allow ICMP: source-quench"
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT  -m comment --comment "allow ICMP: time-exceeded"
-A INPUT -i lo -j ACCEPT -m comment --comment "allow input from the loop-back adapter"
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT -m comment --comment "allow SSH: ssh"
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m udp --dport 53 -j ACCEPT -m comment --comment "allow DNS: domain"
-A INPUT -i eth0 -p tcp -m tcp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p udp -m udp --dport 21 -j ACCEPT -m comment --comment "allow FTP: ftp"
-A INPUT -i eth0 -p tcp -m tcp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p udp -m udp --dport 20 -j ACCEPT -m comment --comment "allow FTP: ftp-data"
-A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT -m comment --comment "allow MariaDB/MySQL: mysql"
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT -m comment --comment "allow HTTP (apache/nxing/lighttpd)"
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ACCEPT -m comment --comment "allow HTTPS (apache/nxing/lighttpd)"
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  -m comment --comment "allow already established connections"
COMMIT

Y solo para el registro ... estas políticas predeterminadas también deben establecerse, SI no se usa el iptables-restore anterior:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

He editado tu publicación: StackOverflow es un formato de pregunta / respuesta. Lea las preguntas frecuentes: stackoverflow.com/faq
89c3b1b8-b1ae-11e6-b842-48d705

Esto introducirá problemas de rendimiento, ya que la regla con estado aparece en último lugar aquí, y debería aparecer primero, ya que coincide con la gran mayoría de los paquetes.
Michael Hampton

0

¿Por qué permiten ftp y dns? ¿Su servidor proporciona esos servicios? FTP no debería usarse realmente, excepto para algunos casos de uso muy específicos, use SFTP en su lugar (no FTPS). Además, ¿por qué especificar todos los demás puertos con nombres simbólicos y http con el número 80? ¿Acabas de copiar esto de otro lado? No copiar y aconsejar va a compensar la falta de comprensión. Asegúrese de comprender TCP, IP, firewalls y los protocolos de los servicios que proporcionará.


No quiero ofenderte, ptman, pero creo que tu respuesta podría verse como algo descortés y condescendiente. Además, realmente no estás respondiendo la pregunta. Si el autor de la pregunta carece de comprensión, ¿no cree que sería mejor hablar con respeto y darle una educación específica sobre el tema?
Ryan B. Lynch

Probablemente tengas razón. Mis comentarios pueden sonar negativos, pero no fueron hechos como tales. Estaba tratando de enumerar preguntas que desencadenarían procesos de pensamiento relevantes. Y como no conozco el nivel básico de comprensión, no comencé a escribir un libro de texto. Pero tienes toda la razón sobre el tono inútil. Afortunadamente, has escrito una respuesta mucho más útil.
ptman
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.