Aktionen

Ubuntu Server sicheres SFTP für Uploads einrichten: Unterschied zwischen den Versionen

Aus znilwiki

KKeine Bearbeitungszusammenfassung
 
(4 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 47: Zeile 47:
Der Port muss noch in der Firewall aktiviert werden:<br>
Der Port muss noch in der Firewall aktiviert werden:<br>
  sudo ufw allow 2222/tcp
  sudo ufw allow 2222/tcp
Jetzt müsst Ihr das System einmal neu starten - Ubuntu 24.04 arbeitet ab Werk mit der {{code|ssh.socket}}, dieser liest die {{code|sshd_config}} erst bei einem Neustart vollständig ein. Das neu Starten des Dienstes reicht da nicht.<br>
----
----
===Konfigurationsdatei erstellen===
===Konfigurationsdatei erstellen===
Nun erstellen wir eine neue Konfigurationsdatei für OpenSSH per<br>
Nun erstellen wir eine neue Konfigurationsdatei für OpenSSH per<br>
Zeile 53: Zeile 55:
mit folgendem Inhalt:<br>
mit folgendem Inhalt:<br>
  # Regeln nur für Zugriffe über Port 2222 anwenden
  # Regeln nur für Zugriffe über Port 2222 anwenden
  Match Port 2222
  Match LocalPort 2222 Group sftp-uploaders
    Match Group sftp-uploaders
     ChrootDirectory /var/sftp/%u
     ChrootDirectory /var/sftp/%u
     ForceCommand internal-sftp -u 0027
     ForceCommand internal-sftp -u 0027
Zeile 62: Zeile 63:
     AuthorizedKeysFile /etc/ssh/authorized_keys/%u
     AuthorizedKeysFile /etc/ssh/authorized_keys/%u
Durch die Zeile {{code|ForceCommand internal-sftp -u 0027}} wird explizit nur SFTP erlaubt!<br>
Durch die Zeile {{code|ForceCommand internal-sftp -u 0027}} wird explizit nur SFTP erlaubt!<br>
<br>
----
==SSH Public Key hinterlegen==
===SSH Key für den Benutzer erzeugen===
Die Anmeldung erfolgt per SSH Schlüssel. Zur Anmeldung braucht der der Benutzer {{code|mytestuser}} ein SSH-Schlüssel.<br>
Eventuell ist aber auf der Quellseite der Benutzername ein anderer als {{code|mytestuser}}, deshalb geben wir den Schlüsselnamen explizit mit an:<br>
{{Warnung|Der Befehl wird auf dem System ausgeführt von dem Ihr euch mit dem SFTP Server verbinden wollt! Natürlich würde das auch lokal klappen, dann muss Ihr diesen später aber auf das Quellsystem kopieren}}
ssh-keygen -t ecdsa -f ~/.ssh/mytestuser
Kennwort könnt Ihr vergeben (müsst ihr aber nicht). Vergebt Ihr ein Kennwort, so müsst Ihr es bei der Nutzung des Schlüssels eingeben.<br>
Der Befehl erzeugt euch 2 Dateien unterhalb von {{code|.ssh}}:<br>
mytestuser
mytestuser.pub
Der Inhalt von {{code|mytestuser.pub}} sieht dann z.B. so aus:
cat ~/.ssh/mytestuser.pub
Beispielinhalt:<br>
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLKcmtEK4WmXLZG34Ae8HyTs7oA0nHzwsWxTPln+p0z/cXluJeq03IecDT6KT72DkyvCSYDLCutlInqLTmpWJVs= manfred@testsystem
----
===SSH Key auf dem SFTP-Server hinterlegen===
sudo mkdir -p /etc/ssh/authorized_keys
sudo touch /etc/ssh/authorized_keys/mytestuser
sudo chown root:root /etc/ssh/authorized_keys/mytestuser
sudo chmod 644 /etc/ssh/authorized_keys/mytestuser
# Public Key eintragen
sudo nano /etc/ssh/authorized_keys/mytestuser
und in der Datei den Inhalt von
mytestuser.pub
einfügen.<br>
<br>
----
==Zugriff testen==
auf dem Quellsystem führt Ihr folgenden Befehl aus (IP-Adresse des SFTP-Servers anpassen):<br>
sftp -P 2222 mytestuser@192.168.0.181
Es sollte folgende Meldung geben:<br>
mytestuser@192.168.0.181: Permission denied (publickey).
Connection closed
Ok, Anmeldung nur mit Public-Key-Verfahren!<br>
Neuer Versuch, diesmal geben wir dem Befehl unseren Private-Key mit:<br>
sftp -P 2222 -i ~/.ssh/mytestuser mytestuser@192.168.0.181
und es sollte klappen:<br>
Connected to 192.168.0.181.
sftp>
mit
dir
sollten wir das {{code|incoming}}-Verzeichnis sehen:<br>
sftp> dir
incoming
sftp>
mit
exit
beenden wir die Sitzung.<br>
Gegenprobe: SSH dürfte nicht funktionieren:<br>
ssh -p 2222 -i ~/.ssh/mytestuser mytestuser@192.168.0.181
Ausgabe:<br>
This service allows sftp connections only.
Connection to 192.168.0.181 closed.
<br>
<br>
Jetzt kopieren wir testweise eine Datei per Einzeiler hoch.<br>
Testdatei erzeugen (als Inhalt 10 zufällige Namen von Diensten):<br>
grep -v '^#' /etc/services | awk '{print $1}' | shuf -n 10 > /tmp/zufall.txt
und rüberkopieren:<br>
sftp -P 2222 -i /root/.ssh/mytestuser mytestuser@192.168.0.181:incoming/ <<< "put /tmp/zufall.txt"
Beispielausgabe:<br>
Connected to 192.168.0.181.
Changing to: /incoming/
sftp> put /tmp/zufall.txt
Uploading /tmp/zufall.txt to /incoming/zufall.txt
zufall.txt                         
Auf dem SFTP Server sollte die Datei nun zu sehen sein:<br>
ll /var/sftp/mytestuser/incoming
Beispielausgabe:<br>
insgesamt 12K
drwxr-x--- 2 mytestuser sftp-uploaders 4,0K Sep 14 13:21 ./
drwxr-xr-x 3 root      root          4,0K Sep 14 12:10 ../
-rw-r----- 1 mytestuser sftp-uploaders  67 Sep 14 13:22 zufall.txt
<br>
----
==Ubuntu Firewall - nur bestimmte Gegenstellen erlauben==
In Ubuntu Server ist ab Werk die '''ufw'''-Firewall inaktiv.<br>
Wir haben zwar weiter oben eine allgemeine Regel erstellt, die greift aber nicht (außer die Firewall ist bei euch schon vorher aktiviert gewesen).<br>
Wir fügen nun mindestens Port 22 hinzu und aktivieren die Firewall:<br>
sudo ufw allow 22/tcp
sudo ufw enable
Die vorherige allgemeine Regel lösche ich (ich will das pro Quell-IP konfigurieren):<br>
sudo ufw delete allow 2222/tcp
Jetzt füge ich meine erlaubten Systeme wieder hinzu:<br>
----
===Beispiel 1: einzelner Host===
sudo ufw allow from 80.153.150.156 to any port 2222 proto tcp comment 'SFTP Partner A'
Das funktioniert auch bei NAT mit einer Portfreigabe von außen, das System sieht die echte externe IP des Quellsystems<br>
----
===Beispiel 2: Adressbereich===
sudo ufw allow from 192.168.0.0/24 to any port 2222 proto tcp comment 'SFTP lokales Subnetz'
oder auch
sudo ufw allow from 198.51.100.0/24 to any port 2222 proto tcp comment 'SFTP Partner Subnetz'
<br>
----
==Kommentare==
<comments />

Aktuelle Version vom 14. September 2026, 15:41 Uhr

Changelog:

  • 14.09.2026 erste Version

Vorwort

Nachfolgend beschreibe ich wie ich einen SFTP-Server unter Ubuntu 24.04 aufgesetzt habe. Dieser sollte Ziel für automatisierte Uploads sein.
Ich habe versucht das System bestmöglich abzusichern. Unter anderem ist im Echtsystem der Zugriff auf bestimmte Gegenstellen beschränkt, ich nutze aber auch die Ubuntu-Firewall in diesem Beispiel.
Zudem verwende ich einen extra Port und nicht den Standard-Port 22, die Anmeldung erfolgt nicht per Passwort sondern per SSH-Public-Key


Voraussetzungen

Ein installiertes Ubuntu Server 24.04.
Meines ist nach meiner Anleitung / Vorlage https://znil.net/index.php?title=Vorlage:Installation-Ubuntu-2404 installiert worden.
Sollte auch mit der Nicht-Server Variante sowie neueren oder älteren Versionen.


Benutzer und Zielverzeichnisse anlegen

# Upload-Gruppe "sftp-uploaders"
sudo groupadd sftp-uploaders
# Benutzer "mytestuser" ohne Shell anlegen
sudo useradd -m -g sftp-uploaders -s /bin/false mytestuser

Jetzt die Chroot-Ordnerstruktur

# Chroot-Basis (MUSS root gehören und 755 Rechte haben)
sudo mkdir -p /var/sftp/mytestuser
sudo chown root:root /var/sftp/mytestuser
sudo chmod 755 /var/sftp/mytestuser

Und den eigentlichen Upload-Ordner des Benutzers

# Eigentlicher Upload-Ordner
sudo mkdir -p /var/sftp/mytestuser/incoming
sudo chown mytestuser:sftp-uploaders /var/sftp/mytestuser/incoming
sudo chmod 750 /var/sftp/mytestuser/incoming

Die Uploads des Benutzers landen dann später also im Pfad

/var/sftp/mytestuser/incoming



OpenSSH konfigurieren

Nein, wir müssen SFTP nicht extra installieren, zu OpenSSH gehört ja auch der Befehl scp, und der nutzt unten drunter schon länger SFTP.
SFTP nutzt ja auch den gleichen Port wie SSH, also ab Werk Port 22 TCP.

Zusätzlichen Port aktivieren

Ich möchte später nicht Port 22 sondern Port 2222 verwenden:

sudo nano /etc/ssh/sshd_config

Da gibt es eine auskommentierte Zeile mit

#Port 22

die ändern wir wie folgt ab:

Port 22
Port 2222


Der Port muss noch in der Firewall aktiviert werden:

sudo ufw allow 2222/tcp

Jetzt müsst Ihr das System einmal neu starten - Ubuntu 24.04 arbeitet ab Werk mit der ssh.socket, dieser liest die sshd_config erst bei einem Neustart vollständig ein. Das neu Starten des Dienstes reicht da nicht.


Konfigurationsdatei erstellen

Nun erstellen wir eine neue Konfigurationsdatei für OpenSSH per

sudo nano /etc/ssh/sshd_config.d/sftp-jail.conf

mit folgendem Inhalt:

# Regeln nur für Zugriffe über Port 2222 anwenden
Match LocalPort 2222 Group sftp-uploaders
    ChrootDirectory /var/sftp/%u
    ForceCommand internal-sftp -u 0027
    AllowTcpForwarding no
    X11Forwarding no
    PasswordAuthentication no
    AuthorizedKeysFile /etc/ssh/authorized_keys/%u

Durch die Zeile ForceCommand internal-sftp -u 0027 wird explizit nur SFTP erlaubt!


SSH Public Key hinterlegen

SSH Key für den Benutzer erzeugen

Die Anmeldung erfolgt per SSH Schlüssel. Zur Anmeldung braucht der der Benutzer mytestuser ein SSH-Schlüssel.
Eventuell ist aber auf der Quellseite der Benutzername ein anderer als mytestuser, deshalb geben wir den Schlüsselnamen explizit mit an:

Warnung: Der Befehl wird auf dem System ausgeführt von dem Ihr euch mit dem SFTP Server verbinden wollt! Natürlich würde das auch lokal klappen, dann muss Ihr diesen später aber auf das Quellsystem kopieren
ssh-keygen -t ecdsa -f ~/.ssh/mytestuser

Kennwort könnt Ihr vergeben (müsst ihr aber nicht). Vergebt Ihr ein Kennwort, so müsst Ihr es bei der Nutzung des Schlüssels eingeben.
Der Befehl erzeugt euch 2 Dateien unterhalb von .ssh:

mytestuser
mytestuser.pub

Der Inhalt von mytestuser.pub sieht dann z.B. so aus:

cat ~/.ssh/mytestuser.pub

Beispielinhalt:

ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBLKcmtEK4WmXLZG34Ae8HyTs7oA0nHzwsWxTPln+p0z/cXluJeq03IecDT6KT72DkyvCSYDLCutlInqLTmpWJVs= manfred@testsystem

SSH Key auf dem SFTP-Server hinterlegen

sudo mkdir -p /etc/ssh/authorized_keys
sudo touch /etc/ssh/authorized_keys/mytestuser
sudo chown root:root /etc/ssh/authorized_keys/mytestuser
sudo chmod 644 /etc/ssh/authorized_keys/mytestuser
# Public Key eintragen
sudo nano /etc/ssh/authorized_keys/mytestuser

und in der Datei den Inhalt von

mytestuser.pub

einfügen.


Zugriff testen

auf dem Quellsystem führt Ihr folgenden Befehl aus (IP-Adresse des SFTP-Servers anpassen):

sftp -P 2222 mytestuser@192.168.0.181

Es sollte folgende Meldung geben:

mytestuser@192.168.0.181: Permission denied (publickey).
Connection closed

Ok, Anmeldung nur mit Public-Key-Verfahren!
Neuer Versuch, diesmal geben wir dem Befehl unseren Private-Key mit:

sftp -P 2222 -i ~/.ssh/mytestuser mytestuser@192.168.0.181

und es sollte klappen:

Connected to 192.168.0.181.
sftp>

mit

dir

sollten wir das incoming-Verzeichnis sehen:

sftp> dir
incoming
sftp>

mit

exit

beenden wir die Sitzung.
Gegenprobe: SSH dürfte nicht funktionieren:

ssh -p 2222 -i ~/.ssh/mytestuser mytestuser@192.168.0.181

Ausgabe:

This service allows sftp connections only.
Connection to 192.168.0.181 closed.



Jetzt kopieren wir testweise eine Datei per Einzeiler hoch.
Testdatei erzeugen (als Inhalt 10 zufällige Namen von Diensten):

grep -v '^#' /etc/services | awk '{print $1}' | shuf -n 10 > /tmp/zufall.txt

und rüberkopieren:

sftp -P 2222 -i /root/.ssh/mytestuser mytestuser@192.168.0.181:incoming/ <<< "put /tmp/zufall.txt"

Beispielausgabe:

Connected to 192.168.0.181.
Changing to: /incoming/
sftp> put /tmp/zufall.txt
Uploading /tmp/zufall.txt to /incoming/zufall.txt
zufall.txt                           

Auf dem SFTP Server sollte die Datei nun zu sehen sein:

ll /var/sftp/mytestuser/incoming

Beispielausgabe:

insgesamt 12K
drwxr-x--- 2 mytestuser sftp-uploaders 4,0K Sep 14 13:21 ./
drwxr-xr-x 3 root       root           4,0K Sep 14 12:10 ../
-rw-r----- 1 mytestuser sftp-uploaders   67 Sep 14 13:22 zufall.txt



Ubuntu Firewall - nur bestimmte Gegenstellen erlauben

In Ubuntu Server ist ab Werk die ufw-Firewall inaktiv.
Wir haben zwar weiter oben eine allgemeine Regel erstellt, die greift aber nicht (außer die Firewall ist bei euch schon vorher aktiviert gewesen).
Wir fügen nun mindestens Port 22 hinzu und aktivieren die Firewall:

sudo ufw allow 22/tcp
sudo ufw enable

Die vorherige allgemeine Regel lösche ich (ich will das pro Quell-IP konfigurieren):

sudo ufw delete allow 2222/tcp

Jetzt füge ich meine erlaubten Systeme wieder hinzu:


Beispiel 1: einzelner Host

sudo ufw allow from 80.153.150.156 to any port 2222 proto tcp comment 'SFTP Partner A'

Das funktioniert auch bei NAT mit einer Portfreigabe von außen, das System sieht die echte externe IP des Quellsystems


Beispiel 2: Adressbereich

sudo ufw allow from 192.168.0.0/24 to any port 2222 proto tcp comment 'SFTP lokales Subnetz'

oder auch

sudo ufw allow from 198.51.100.0/24 to any port 2222 proto tcp comment 'SFTP Partner Subnetz'



Kommentare

Loading comments...