Comment configurer ssh pour essayer non seulement le port 22 mais le port secondaire à chaque fois?

9

Dans le cadre de mes efforts pour réduire le bruit dans les journaux et réduire légèrement la découvrabilité (et en plus de fail2ban, autorisant uniquement l'authentification par clé publique, etc.), je change régulièrement les ports sshd sur les serveurs que j'ai configurés sur un autre port, disons 5492. Actuellement J'ajoute -p 5492 à ma commande ssh ou j'ajoute le port de chaque serveur spécifique dans mon ssh_config.

Existe-t-il un moyen de configurer ssh pour essayer de se connecter au port 22 et au port 5492 si le port 22 ne fonctionne pas?

Riley
la source
1
Je préfère au lieu d'avoir une sécurité par l'obscurité, de configurer un VPN et de ne pas avoir du tout de ports ssh ouverts sur Internet.
Rui F Ribeiro
2
@RuiFRibeiro Je suis d'accord, ce n'est pas plus sûr. Cependant, il réduit le bruit dans les fichiers journaux. On pourrait également utiliser le port knocking pour réduire les tentatives de connexion, ce qui augmente la sécurité.
Ned64
2
@RuiFRibeiro Un serveur VPN est-il cependant plus sécurisé qu'un serveur SSH?
Riley
Tout dépend de la mise en œuvre. Dans mon ancien travail, j'ai défini 2 entrées VPN pour la redondance, et aucune sshprésence pour l'extérieur.
Rui F Ribeiro
2
La sécurité par obscurité est une bonne couche SUPPLÉMENTAIRE en plus d'une bonne configuration, surtout quand il s'agit d'attaquants opportunistes.
rackandboneman

Réponses:

11

Vous pouvez envelopper un script shell, sshmais sshlui-même ne le fera pas.

Une façon d'utiliser une fonction bash est la suivante (mise en ~/.bashrc):

function ssh() { command ssh -p 22 "$@" || command ssh -p 5492 "$@"; }

Soit dit en passant, il est recommandé d'utiliser des rootports réservés pour les services système, sshafin d'éviter aux utilisateurs d'avoir un processus qui écoute, par exemple, le port 5492. Ils peuvent sinon jouer l'homme au milieu et éventuellement capturer les données de connexion. Utilisez donc un port <1024.

Ned64
la source
1
Voilà une excellente solution. Aussi une bonne note sur les ports!
Riley
5
Notez que la deuxième connexion sera établie même si la première réussit si la commande exécutée par sshretourne non nulle. Un exemple trivial serait ssh user@server false.
Kusalananda
1
@Kusalananda Merci, j'ai écrit commandmaintenant. Je voulais juste éviter la récursivité, comme vous l'avez deviné.
Ned64
Le problème mentionné par @Kusalananda peut être (principalement) évité en testant l'état de sortie spécifique de ssh- s'il y a une erreur ssh (par opposition à l'échec de la commande à distance), il se terminera avec un état de 255. Ainsi, cela command ssh -p 22 "$@"; if [ "$?" -eq 255 ]; then command ssh -p 5492 "$@"; fidevrait fonctionner.
Gordon Davisson
10

sshlui-même peut le faire via Matchdocumenté dans ssh_config(5)bien que la documentation soit quelque peu clairsemée d'exemples. Cette forme peut convenir si l'on veut pousser la complexité dans la configuration SSH, bien qu'elle soit limitée par les limitations de la ssh_config(5)syntaxe et peut nécessiter quelques manipulations pour le résultat souhaité. Notamment, le port personnalisé ne peut pas être défini ou peut être défini de manière incorrecte lors de la Matchtentative précédente . C'est pourquoi, ci-dessous, il est défini deux fois lors des tests ou une fois pour la valeur par défaut, et n'est pas défini lors de l'établissement des valeurs par défaut canoniques.

# here we set the defaults for the host (no port!)
Match !canonical host testhost
  CanonicalizeHostname yes
  Hostname 192.0.2.42
  IdentityFile ~/.ssh/id_blahblah
  ...
# port available?
Match canonical host 192.0.2.42 exec "is-ssh-up %h 2222"
  Port 2222
# or the default port
Match canonical host 192.0.2.42
  Port 22

is-ssh-up vérifie simplement si quelque chose répond sur le port donné et pourrait ressembler

#!/usr/bin/env expect
package require Tcl 8.5
if {[llength $argv] < 2} {
   puts stderr "Usage: is-ssh-up host port"
   exit 1
}
puts stderr "is-ssh-up: DEBUG trying $argv"
set socket [socket -async [lindex $argv 0] [lindex $argv 1]]
chan event $socket readable [list exit 0]
after 3000 [list exit 1]
vwait godot
branler
la source
1
if-then-else dans .ssh / config? Je ne l'aurais pas cru !!
Archemar
1

Vous pouvez utiliser la fonction générique de ~.ssh/config, en mettant cette entrée dans votre liste:

Host *
Port 5492

Mais cela ne retombera pas à 22 en lui-même.

Si vous le mettez à la fin, vous pouvez toujours le remplacer pour les hôtes dont vous avez besoin 22 en mettant une valeur différente au-dessus. (Et vous pouvez toujours le remplacer sur la ligne de commande.)

Paŭlo Ebermann
la source