Bearbeiten von „Automatische Datentransfers per SFTP mit Passwort und via Proxy“

Aus UUGRN

Warnung: Du bist nicht angemeldet. Deine IP-Adresse wird bei Bearbeitungen öffentlich sichtbar. Melde dich an oder erstelle ein Benutzerkonto, damit Bearbeitungen deinem Benutzernamen zugeordnet werden.

Die Bearbeitung kann rückgängig gemacht werden. Bitte prüfe den Vergleich unten, um sicherzustellen, dass du dies tun möchtest, und speichere dann unten deine Änderungen, um die Bearbeitung rückgängig zu machen.

Aktuelle Version Dein Text
Zeile 1: Zeile 1:
 
Dieser Artikel beschreibt einen Spezialfall aus dem Bereich [[OpenSSH]], bei dem mehrere erschwerende Bedingungen zusammenkommen:
 
Dieser Artikel beschreibt einen Spezialfall aus dem Bereich [[OpenSSH]], bei dem mehrere erschwerende Bedingungen zusammenkommen:
 
* Es sollen automatisiert Dateien per '''SFTP''' ausgetauscht werden
 
* Es sollen automatisiert Dateien per '''SFTP''' ausgetauscht werden
* Zugriffe sollen '''gescriptet''' werden (Batch-Mode, Shell-Scripte), also nicht-interaktiv
 
 
* Zugriff auf den Server ausschließlich mit '''SFTP''' möglich, keine normale SSH-Shell, kein scp, kein rsync+ssh oder ähnliches.
 
* Zugriff auf den Server ausschließlich mit '''SFTP''' möglich, keine normale SSH-Shell, kein scp, kein rsync+ssh oder ähnliches.
 
* Zugriff auf das Zielsystem nur per HTTP-Proxy möglich
 
* Zugriff auf das Zielsystem nur per HTTP-Proxy möglich
 
* Zugriff auf den Account '''nur mit Benutzername und Passwort''' möglich, keine Public-Key Authentifikation möglich
 
* Zugriff auf den Account '''nur mit Benutzername und Passwort''' möglich, keine Public-Key Authentifikation möglich
 +
* Zugriffe sollen '''gescriptet''' werden (Batch-Mode, Shell-Scripte), also nicht-interaktiv
 +
  
 
__TOC__
 
__TOC__
Zeile 95: Zeile 96:
 
* aus einem Filedescriptor über -dnumber
 
* aus einem Filedescriptor über -dnumber
 
* oder aus einer Umgebungsvariable SSHPASS mittels -e
 
* oder aus einer Umgebungsvariable SSHPASS mittels -e
 
 
== Gesamtlösung ==
 
Die Gesamtlösung ist mehr als der oben vorgestellten Einzelaspekte. Die Lösung berücksichtigt den Aspekt, dass man bei OpenSSH mehrere parallele oder aufeinander folgende SSH-Verbindungen durch eine '''ControlMaster'''-Verbindung leiten kann, lediglich der erste Zugriff muss dabei Authentifiziert werden ('''ControlMaster''', '''ControlPath''', '''ControlPersist'''). Diese Eigenschaft machen wir uns hier zunutze.
 
 
=== ssh_config ===
 
Zunächst eine vollständige ~/.ssh/config mit Zeilennummern:
 
<pre>
 
01      Host ftp.example.com
 
02              Hostname ftp.example.com
 
03              Port 22
 
04              Protocol 2
 
05              StrictHostKeyChecking no
 
06              ServerAliveCountMax 30
 
07              ServerAliveInterval 10
 
08              ProxyCommand /usr/bin/nohup /bin/nc.openbsd -X CONNECT -x proxy.dmz.lan:3128 %h %p
 
09              ControlMaster auto
 
10              ControlPath /run/shm/ssh_master_%r@%h:%p.sock
 
11              ControlPersist yes
 
12              KbdInteractiveAuthentication no
 
13              PasswordAuthentication yes
 
14              PubkeyAuthentication no
 
15              PreferredAuthentications password
 
16              RequestTTY no
 
</pre>
 
 
; ProxyCommand (Zeile 8):
 
:* '''ESSENZIELL''' wichtig: Das '''nohup''' im ProxyCommand verhindert, dass '''sshpass''' den netcat-Prozess ('''nc.openbsd''') beendet (SIGHUP), das scheint mir einer der Bugs von sshpass zu sein.
 
:* /bin/nc.openbsd -X CONNECT -x proxy.dmz.lan:3128 %h %p verwendet die CONNECT-Methode des HTTP-Proxy-Servers proxy.dmz.lan auf Port 3128, um die TCP-Verbindung zum Zielserver (%h:%p ftp.example.com:22) herzustellen. Anstelle eines HTTP-Proxys könnte auch ein SOCKS-Proxy verwendet werden (-X 5), anstelle von /bin/nc.openbsd kann auch ein SSH-Aufruf stehen, der dann netcat als remote command ausführt
 
:* Man kann den Proxy-Zugriff testen, indem man das ProxyCommand einzeln aufruft:
 
<pre>/bin/nc.openbsd -X CONNECT -x proxy.dmz.lan:3128 ftp.example.com 22
 
SSH-2.0-OpenSSH_6.0p1 Debian-4+deb7u2
 
^C
 
</pre>
 
 
;Timeout vermeiden (Zeilen 6+7): Aufgrund von mit '''ServerAliveInterval''' und '''ServerAliveCountMax''' werden regelmäßig (zB alle 10sec) Dummy-Pakete durch die SSH-Verbindung geschickt. Das soll verhindern, dass der Proxy-Server oder ein NAT-Router die Verbindung aufgrund von Inaktivität vergisst oder aktiv beendet..
 
 
;ControlMaster (Zeilen 9-11): Die ControlMaster Optionen erzeugen einen UnixDomain-Socket zB '''/run/shm/ssh_master_username@ftp.example.com:22.sock'''. Alle SSH-Zugriffe in der Form '''username@ftp.example.com:22''' werden (sofern vorhanden) durch diesen Socket geleitet, welcher durch die initiale SSH-Verbindung gehalten wird.
 
 
;Authentifikationsmethode gezielt wählen(Zeilen 12-15): Mit '''KbdInteractiveAuthentication''', '''PasswordAuthentication''', '''PubkeyAuthentication''' und '''PreferredAuthentications''' wird die passwortbasierte Authentifikation erzwungen, andere Möglichkeiten (zB Public-Keys) werden hier unterbunden und können somit auch bei vorhadenen Keys nicht zu Fehlversuchen führen.
 
 
;RequestTTY (Zeile 16): Mit '''RequestTTY no''' sagen wir dem initialen SSH-Aufruf, dass er obwohl er in einem TTY-Kontext (durch sshpass) aufgerufen wird selbst kein TTY auf dem Server anfordern soll. Es wird für sftp nicht benötigt und könnte nur zu Fehlern führen.
 
 
=== Verbindungsaufbau ===
 
Die initiale SSH-Verbidung (sftp) wird authentifiziert und tut sonst nichts weiter als die dann offene Verbindung aufrecht zu erhalten.
 
<pre>
 
export SSHPASS=geheimespasswort
 
/usr/bin/sshpass -e ssh username@ftp.example.com -s sftp -f -N
 
</pre>
 
'''sshpass''' soll das Passwort aus dem Prozess-Environment beziehen. Es wird '''ssh''' statt '''sftp''' ausgeführt, jedoch mit speziellen Parametern: durch "-s sftp" sprechen wir gezielt das "sftp"-Subsystem an, mit "-f -N" wird der Client in den Hintergerund geforkt (-f) und führt sonst nichts weiter aus (-N).
 
 
sshpass führt ssh aus und das wiederum dann <pre>/usr/bin/nohup /bin/nc.openbsd -X CONNECT -x proxy.dmz.lan:3128 %h %p</pre>.
 
 
;Alle weiteren Zugriffe auf '''username@ftp.example.com''' verwenden dann die bestehende Verbindung, zB:
 
<pre>
 
sftp username@ftp.example.com  < <(echo dir)
 
</pre>
 
 
;oder auch als sshfs-Mount (verwendet sftp):
 
<pre>
 
sshfs username@ftp.example.com ./ftp/
 
ls -la ./ftp/
 
</pre>
 
 
 
[[Kategorie:Anwendungsbeispiel]]
 
[[Kategorie:OpenSSH]]
 

Bitte kopiere keine Inhalte, die nicht Deine eigenen sind!

Du gibst uns hiermit Deine Zusage, dass
  • Du den Text nicht aus Wikipedia kopiert hast
  • Du den Text selbst verfasst hast
  • oder der Text entweder
    • Allgemeingut (public domain) ist
    • oder der Copyright-Inhaber seine Zustimmung gegeben hat.
Wichtig
  • Benutze keine urheberrechtlich geschützten Werke ohne Erlaubnis des Copyright-Inhabers!
  • Falls dieser Text bereits woanders veröffentlicht wurde, weise bitte auf der 'Diskussion:'-Seite darauf hin.
  • Bitte beachte, dass alle UUGRN-Beiträge automatisch unter der der Creative Commons Lizenz stehen.
  • Falls Du nicht möchtest, dass Deine Arbeit hier von anderen verändert und verbreitet wird, dann drücke nicht auf "Artikel Speichern".

Bitte beantworte die folgende Frage, um diese Seite speichern zu können (weitere Informationen):

Abbrechen Bearbeitungshilfe (wird in einem neuen Fenster geöffnet)

Folgende Vorlagen werden auf dieser Seite verwendet: