FileZilla-Logo mit rotem Stempel DENIED und der Aufschrift Too many authentication failures, darunter eine Terminalzeile mit der SSH-Fehlermeldung

FileZilla trennt die Verbindung, bevor es nach dem Passwort fragt

Bei einem Kundenprojekt wollte ich per SFTP auf einen Webserver. Die Site war in FileZilla gespeichert: Host, Port 22, Nutzername, Passwort. Verbinden, kurz warten, „Verbindung getrennt”. Kein Hinweis auf ein falsches Passwort, kein Timeout. FileZilla hat mich nicht einmal nach dem Passwort gefragt.

Der Server war erreichbar, Port 22 offen, SSH antwortete. Also das Gleiche im Terminal, mit ausführlicher Ausgabe:

ssh -v p12345@example.org

Die letzten Zeilen sagen alles:

debug1: Offering public key: /Users/frank/.ssh/key_a ED25519
debug1: Offering public key: /Users/frank/.ssh/key_b RSA
debug1: Offering public key: /Users/frank/.ssh/key_c ED25519
Received disconnect from 185.x.x.x port 22:2: Too many authentication failures

Drei Keys angeboten, drei abgelehnt, Verbindung weg. Das Passwort kam nie dran.

Was da passiert

Ein SSH-Client probiert vor dem Passwort erst die Public-Key-Anmeldung. Läuft ein ssh-agent, bietet er dem Server jeden Key aus dem Agent an, einen nach dem anderen. Jeder Key, den der Server nicht kennt, zählt als fehlgeschlagener Versuch. Wie viele Versuche pro Verbindung erlaubt sind, legt der Server mit MaxAuthTries fest. OpenSSH liefert 6 als Standard aus, dieser Server war auf 3 gestellt.

Auf meinem Mac lagen genau drei Keys im Agent:

ssh-add -l

Drei Keys, drei erlaubte Versuche, Passwort chancenlos. Zur Kontrolle einmal ohne Keys anmelden:

ssh -o PubkeyAuthentication=no p12345@example.org

Jetzt fragt der Server nach dem Passwort. Der Zugang war nie kaputt, nur die Reihenfolge.

Warum FileZilla das nicht abstellt

FileZilla hat für SFTP kein eigenes Protokoll-Modul. Unter der Haube arbeitet fzsftp, ein Ableger von PuTTYs psftp. Der findet auf dem Mac den Agent über die Umgebungsvariable SSH_AUTH_SOCK und macht dasselbe wie OpenSSH: alle Keys anbieten, dann erst das Passwort aus dem Site Manager.

Der Logon-Typ „Normal” mit gespeichertem Passwort ändert daran nichts. Er regelt nur, was FileZilla schickt, wenn der Server nach einem Passwort fragt. Eine Einstellung „Agent nicht verwenden” gibt es nicht, weder pro Site noch global. Das FileZilla-Forum bestätigt das, und das Thema hat ein eigenes Ticket im Bugtracker.

Vier Auswege

Agent für FileZilla ausblenden. Der schnellste Weg. FileZilla beenden und aus dem Terminal mit leerer Variable starten:

SSH_AUTH_SOCK= /Applications/FileZilla.app/Contents/MacOS/filezilla &

FileZilla sieht keinen Agent, bietet keine Keys an, und das gespeicherte Passwort greift beim ersten Versuch. Der Rest des Systems merkt nichts davon.

Agent leeren. ssh-add -D wirft alle Keys aus dem Agent. Funktioniert, kostet dich aber beim nächsten ssh auf einen anderen Server die Passphrase-Eingabe.

Unter der Grenze bleiben. Mit höchstens zwei Keys im Agent kommt das Passwort noch dran, wenn der Server drei Versuche erlaubt. Fragil, weil du die Grenze des Servers nicht kennst.

Key hinterlegen. Die saubere Lösung. Public Key auf dem Server eintragen lassen, im Site Manager Logon-Typ „Schlüsseldatei” mit genau diesem Key. Dann ist der erste Versuch der richtige.

Ein Doppelklick statt Terminal

Weil ich den ersten Weg öfter brauche, habe ich daraus eine kleine App gemacht. Ein AppleScript, das prüft, ob FileZilla läuft, es auf Wunsch beendet und dann ohne Agent neu startet:

set fzBin to "/Applications/FileZilla.app/Contents/MacOS/filezilla"

set isRunning to false
try
    do shell script "pgrep -x filezilla >/dev/null"
    set isRunning to true
end try

if isRunning then
    set answer to display dialog "FileZilla läuft bereits (mit ssh-agent)." & return & return & "Beenden und ohne Agent neu starten?" buttons {"Abbrechen", "Neu starten"} default button "Neu starten" with icon caution
    if button returned of answer is "Abbrechen" then return
    tell application "FileZilla" to quit
    repeat 30 times
        delay 0.5
        try
            do shell script "pgrep -x filezilla >/dev/null"
        on error
            exit repeat
        end try
    end repeat
end if

do shell script "SSH_AUTH_SOCK= nohup " & quoted form of fzBin & " >/dev/null 2>&1 &"

Das Skript als Programm kompilieren und das FileZilla-Icon übernehmen, damit es im Launchpad nicht wie ein Fremdkörper aussieht:

osacompile -o "/Applications/FileZilla ohne Agent.app" fz.applescript
cp /Applications/FileZilla.app/Contents/Resources/filezilla.icns \
   "/Applications/FileZilla ohne Agent.app/Contents/Resources/applet.icns"

Der Dateiname des Icons steht in der Info.plist der App unter CFBundleIconFile.

Beim ersten Start fragt macOS, ob das Programm FileZilla steuern darf. Einmal bestätigen, fertig. Wer FileZilla Pro einsetzt, ersetzt in beiden Blöcken den App-Namen.

Und wenn dir FileZilla das nächste Mal die Verbindung trennt, bevor es nach dem Passwort fragt: Schau erst in den Agent, dann in den Site Manager.

Links

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert