Limiter l'accès SSH à des clients spécifiques par adresse IP

22

Comment autoriser certains ensembles d'adresses IP privées à entrer via une connexion SSH (paire de clés RSA) dans Linux Server?

Ranjan Kumar
la source
3
Les règles de pare-feu sont une ligne de conduite normale à suivre
Raman Sailopal
2
pare-feu ou /etc/hosts.allow si ssh compile avec des wrappers TCP ou des règles de fichier / etc / ssh / sshd_config.
Rui F Ribeiro
plus d'une façon de faire, reportez-vous à linux.die.net/man/5/sshd_config qui explique tout/etc/ssh/sshd_config
ron

Réponses:

42

Vous pouvez limiter les hôtes pouvant se connecter en configurant des wrappers TCP  ou en filtrant le trafic réseau (pare-feu) à l'aide d' iptables . Si vous souhaitez utiliser différentes méthodes d'authentification en fonction de l'adresse IP du client, configurez plutôt le démon SSH (option 3).

Option 1: filtrage avec IPTABLES

Les règles d'Iptables sont évaluées dans l'ordre, jusqu'à la première correspondance.

Par exemple, pour autoriser le trafic provenant du réseau 192.168.0.0/24 et supprimer le trafic (vers le port 22). La DROPrègle n'est pas requise si votre stratégie par défaut iptables est configurée pour 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

Vous pouvez ajouter plus de règles avant la règle de suppression pour correspondre à plus de réseaux / hôtes. Si vous avez beaucoup de réseaux ou d'adresses d'hôte, vous devez utiliser le module ipset . Il existe également un module iprange qui permet d'utiliser n'importe quelle plage arbitraire d'adresses IP.

Les ptables ne sont pas persistants lors des redémarrages. Vous devez configurer un mécanisme pour restaurer iptables au démarrage.

iptabless'appliquent uniquement au trafic IPv4. Les systèmes qui ont une écoute ssh de l'adresse IPv6 avec laquelle la configuration nécessaire peut être effectuée ip6tables.

Option 2: utilisation de wrappers TCP

Vous pouvez également configurer les hôtes qui peuvent se connecter à l'aide de wrappers TCP. Avec les wrappers TCP, en plus des adresses IP, vous pouvez également utiliser des noms d'hôtes dans les règles.

Par défaut, refusez tous les hôtes.

/etc/hosts.deny:

sshd : ALL

Ensuite, répertoriez les hôtes autorisés dans hosts.allow. Par exemple, pour autoriser le réseau 192.168.0.0/24 et localhost .

/etc/hosts.allow:

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

Option 3: configuration du démon SSH

Vous pouvez configurer le démon ssh dans sshd_config pour utiliser une méthode d'authentification différente selon l'adresse / le nom d'hôte du client. Si vous souhaitez uniquement empêcher d'autres hôtes de se connecter, vous devez utiliser à la place iptables ou des wrappers TCP.

Supprimez d'abord les méthodes d'authentification par défaut:

PasswordAuthentication no
PubkeyAuthentication no

Ajoutez ensuite les méthodes d'authentification souhaitées après un Match Addressà la fin du fichier. Le placement Matchà la fin du fichier est important, car toutes les lignes de configuration après celui-ci sont placées à l'intérieur du bloc conditionnel jusqu'à la Matchligne suivante . Par exemple:

Match Address 127.0.0.*
    PubkeyAuthentication yes

D'autres clients peuvent toujours se connecter, mais les connexions échoueront car aucune méthode d'authentification n'est disponible.

Les arguments de correspondance et les options de configuration conditionnelle autorisées sont documentés dans la page de manuel sshd_config . Les modèles de correspondance sont documentés dans la page de manuel ssh_config .

sebasth
la source
Qu'en est-il de l'ajout d'une directive ListenAddress dans / etc / ssh / sshd_config?
Jerome
Cela est possible dans des situations spécifiques (par exemple, écouter une adresse de réseau privé), en fonction de la configuration de votre réseau et des hôtes que vous souhaitez autoriser.
sebasth
2
De plus, sshd_config peut définir des filtrages avec la directive AlowUsers, et également, les authorized_keys peuvent être définies avec 'from IP or subnet "pour filtrer également.
tonioc
@tonioc Excellente solution pour mon cas d'utilisation. Veuillez développer cette suggestion en une réponse.
simlev
si vous avez une carte réseau avec 4 ports allant chacun vers un réseau différent, la valeur #ListenAddress ::par défaut en /etc/ssh/sshd_configdira au serveur SSH d'accepter les entrées de l'un de ces réseaux. Sinon, faites ListenAddress <ip address><ip address>est celui des ports NIC que vous souhaitez autoriser. Mon résultat eth0est 192.168.3.4donc ListenAddress 192.168.3.4que SSH ne fonctionne que sur le réseau 192.168.3.4 qui est sur eth0; et eth1 eth2 eth3 est refusé.
ron
5

Voici une configuration supplémentaire pour le démon SSH pour étendre la réponse précédente:

  • Ajouter un filtrage utilisateur avec AllowUsersoption dans le sshd_configfichier:

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

    Cela permet johndoe et admin2 seulement des 192.168.1.*adresses et otherid1 , otherid2 de partout.

  • Restreignez une clé ssh ou une clé basée sur ca à un ensemble d'adresses dans le .ssh/authorized_keysfichier du répertoire personnel d'un utilisateur donné:

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

    Dans cet exemple, la clé publique pour les pseudonymes ne sera effective qu'à partir d'adresses données.

tonioc
la source