Wie kann man ssh so einstellen, dass nicht jedes Mal nicht nur Port 22, sondern auch der sekundäre Port ausprobiert wird?

9

Im Rahmen meiner Bemühungen, das Rauschen in Protokollen zu reduzieren und die Erkennbarkeit geringfügig zu verringern (und zusätzlich zu fail2ban nur die Authentifizierung mit öffentlichem Schlüssel usw. zuzulassen), ändere ich routinemäßig sshd-Ports auf Servern, die ich auf einen anderen Port eingerichtet habe, beispielsweise 5492. Derzeit Ich füge entweder -p 5492 an meinen Befehl ssh an oder füge den Port für jeden bestimmten Server zu meinem hinzu ssh_config.

Gibt es eine Möglichkeit, ssh so zu konfigurieren, dass versucht wird, eine Verbindung zu Port 22 und Port 5492 herzustellen, wenn Port 22 nicht funktioniert?

Riley
quelle
1
Ich bevorzuge es, anstatt Sicherheit durch Dunkelheit zu haben, ein VPN einzurichten und überhaupt keine offenen SSH-Ports zum Internet zu haben.
Rui F Ribeiro
2
@RuiFRibeiro Ich stimme zu, dass es nicht sicherer ist. Das Rauschen in Protokolldateien wird jedoch gering gehalten. Man könnte auch Port-Knocking verwenden, um Anmeldeversuche zu reduzieren, was die Sicherheit erhöht.
Ned64
2
@RuiFRibeiro Ist ein VPN-Server jedoch sicherer als ein SSH-Server?
Riley
Es hängt alles von der Implementierung ab. In meinem früheren Job habe ich 2 VPN-Einträge für Redundanz definiert und keinerlei sshPräsenz nach außen.
Rui F Ribeiro
2
Sicherheit durch Dunkelheit ist eine gute ZUSÄTZLICHE Schicht zusätzlich zu einem guten Setup, insbesondere wenn es um opportunistische Angreifer geht.
Rackandboneman

Antworten:

11

Sie könnten ein Shell-Skript umwickeln, sshaber es sshselbst wird es nicht tun.

Eine Möglichkeit, eine Bash-Funktion zu verwenden, ist folgende ~/.bashrc:

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

Übrigens wird empfohlen, für Systemdienste rootreservierte Ports zu verwenden, sshum zu vermeiden, dass Benutzer einen Prozess haben, der beispielsweise Port 5492 abhört. Andernfalls spielen sie möglicherweise den Mann in der Mitte und erfassen möglicherweise Anmeldedaten. Verwenden Sie also einen Port <1024.

Ned64
quelle
1
Das ist eine großartige Lösung. Auch ein toller Hinweis zu den Häfen!
Riley
5
Beachten Sie, dass die zweite Verbindung auch dann hergestellt wird , wenn die erste erfolgreich ist, wenn der von ausgeführte Befehl sshungleich Null zurückgibt. Ein triviales Beispiel wäre ssh user@server false.
Kusalananda
1
@Kusalananda Danke, ich habe commandjetzt geschrieben . Ich wollte nur eine Rekursion vermeiden, wie Sie richtig erraten haben.
Ned64
Das Problem, das @Kusalananda erwähnt, kann (meistens) vermieden werden, indem der spezifische Beendigungsstatus von getestet wird. sshWenn ein SSH-Fehler auftritt (im Gegensatz zum fehlgeschlagenen Remote-Befehl), wird er mit dem Status 255 beendet. Sollte also command ssh -p 22 "$@"; if [ "$?" -eq 255 ]; then command ssh -p 5492 "$@"; fifunktionieren.
Gordon Davisson
10

sshselbst kann dies über Matchdokumentiert in tun, ssh_config(5)obwohl die Dokumentation auf Beispielen etwas spärlich ist. Diese Form kann geeignet sein, wenn man die Komplexität in die SSH-Konfiguration verschieben möchte, obwohl sie durch die Einschränkungen der ssh_config(5)Syntax eingeschränkt ist und möglicherweise ein wenig an dem gewünschten Ergebnis herumspielen muss. Insbesondere kann der benutzerdefinierte Port entweder nicht oder falsch aus dem vorherigen MatchVersuch festgelegt werden. Aus diesem Grund wird es im Folgenden beim Testen zweimal oder einmal als Standard festgelegt und beim Festlegen der kanonischen Standardeinstellungen nicht festgelegt.

# 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 Überprüft lediglich, ob etwas auf den angegebenen Port reagiert und möglicherweise so aussieht

#!/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
Thrig
quelle
1
Wenn-dann-sonst in .ssh / config? Ich hätte es nicht geglaubt !!
Archemar
1

Sie können die Platzhalterfunktion von verwenden ~.ssh/config, um diesen Eintrag in Ihre Liste aufzunehmen:

Host *
Port 5492

Dies wird jedoch nicht von alleine auf 22 zurückfallen.

Wenn Sie es am Ende setzen, können Sie es dennoch für die Hosts überschreiben, für die Sie 22 benötigen, indem Sie einen anderen Wert darüber setzen. (Und Sie können es jederzeit in der Befehlszeile überschreiben.)

Paŭlo Ebermann
quelle