Limite el acceso SSH a clientes específicos por dirección IP

22

¿Cómo permitimos que cierto conjunto de IP privadas ingrese a través del inicio de sesión SSH (par de claves RSA) en el servidor Linux?

Ranjan Kumar
fuente
3
Las reglas de firewall son un curso de acción normal a seguir
Raman Sailopal el
2
firewall o /etc/hosts.allow si compila ssh con envoltorios TCP o / etc / ssh / sshd_config reglas de archivo.
Rui F Ribeiro
más de una forma de hacerlo, consulte linux.die.net/man/5/sshd_config que explica todo en/etc/ssh/sshd_config
ron el

Respuestas:

42

Puede limitar qué hosts pueden conectarse configurando contenedores TCP  o filtrando el tráfico de red (firewall) usando iptables . Si desea utilizar diferentes métodos de autenticación según la dirección IP del cliente, configure el demonio SSH en su lugar (opción 3).

Opción 1: filtrado con IPTABLES

Las reglas de Iptables se evalúan en orden, hasta la primera coincidencia.

Por ejemplo, para permitir el tráfico de la red 192.168.0.0/24 y, de lo contrario, soltar el tráfico (al puerto 22). La DROPregla no es necesaria si su política predeterminada de iptables está configurada para DROP.

iptables -A INPUT -p tcp --dport 22 --source 192.168.0.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

Puede agregar más reglas antes de la regla de caída para que coincida con más redes / hosts. Si tiene muchas redes o direcciones de host, debe usar el módulo ipset . También hay un módulo iprange que permite usar cualquier rango arbitrario de direcciones IP.

Iptables no son persistentes en todos los reinicios. Necesita configurar algún mecanismo para restaurar iptables en el arranque.

iptablesse aplica solo al tráfico IPv4. Los sistemas que tienen ssh escuchando direcciones IPv6 pueden hacer la configuración necesaria ip6tables.

Opción 2: uso de contenedores TCP

También puede configurar qué hosts pueden conectarse mediante contenedores TCP. Con los contenedores TCP, además de las direcciones IP, también puede usar nombres de host en las reglas.

Por defecto, denegar todos los hosts.

/etc/hosts.deny:

sshd : ALL

Luego, enumere los hosts permitidos en hosts.allow. Por ejemplo, para permitir la red 192.168.0.0/24 y localhost .

/etc/hosts.allow:

sshd : 192.168.0.0/24
sshd : 127.0.0.1
sshd : [::1]

Opción 3: configuración del demonio SSH

Puede configurar ssh daemon en sshd_config para usar un método de autenticación diferente según la dirección del cliente / nombre de host. Si solo desea bloquear la conexión de otros hosts, debe usar iptables o envoltorios TCP en su lugar.

Primero elimine los métodos de autenticación predeterminados:

PasswordAuthentication no
PubkeyAuthentication no

Luego agregue los métodos de autenticación deseados después de un Match Addressal final del archivo. Colocar Matchal final del archivo es importante, ya que todas las líneas de configuración posteriores se colocan dentro del bloque condicional hasta la siguiente Matchlínea. Por ejemplo:

Match Address 127.0.0.*
    PubkeyAuthentication yes

Otros clientes aún pueden conectarse, pero los inicios de sesión fallarán porque no hay métodos de autenticación disponibles.

Los argumentos de coincidencia y las opciones de configuración condicional permitidas se documentan en la página del comando man sshd_config . Los patrones de coincidencia se documentan en la página de manual ssh_config .

sebasth
fuente
¿Qué pasa con la adición de una directiva ListenAddress en / etc / ssh / sshd_config?
Jerome
Es posible en situaciones específicas (por ejemplo, escuchar una dirección de red privada), dependiendo de la configuración de su red y de los hosts que desea permitir.
Sebasth
2
Además, sshd_config puede establecer filtraciones con la directiva AlowUsers, y también se pueden establecer las claves autorizadas con 'desde IP o subred "para filtrar también.
tonioc
@tonioc Gran solución para mi caso de uso. Expanda esta sugerencia en una respuesta.
simlev
si usted tiene una tarjeta de red con 4 puertos cada uno va a una red diferente, entonces el valor por defecto #ListenAddress ::en /etc/ssh/sshd_configle dirá al servidor SSH para aceptar entrante de cualquiera de esas redes. De lo contrario, haga ListenAddress <ip address>dónde <ip address>está el de esos puertos NIC que desea permitir. Por eth0lo 192.168.3.4tanto, mi ListenAddress 192.168.3.4resultado es que SSH solo funciona en la red 192.168.3.4 que está en eth0; y eth1 eth2 eth3 es denegado.
ron
5

Aquí alguna configuración adicional para el demonio SSH para ampliar la respuesta anterior:

  • Agregar usuario filtrando con AllowUsers opción en el sshd_configarchivo:

    AllowUsers [email protected].* [email protected].* otherid1 otherid2
    

    Esto permite johndoe y admin2 solo desde 192.168.1.*direcciones y otherid1 , otherid2 desde cualquier lugar.

  • Restrinja una clave ssh o una clave basada en ca a un conjunto de direcciones en .ssh/authorized_keys archivo del directorio de inicio de un usuario dado:

    from="192.168.1.*,192.168.2.*" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABA...etc...mnMo7n1DD useralias
    

    En este ejemplo, la clave pública para useralias será efectiva solo desde direcciones dadas.

tonioc
fuente