Einführung
SFTP (Secure File Transfer Protocol) ist eine leistungsstarke und sichere Lösung für die Dateiübertragung über ein Netzwerk. Dieses Tutorial führt Sie durch das Verständnis von SFTP, die Fehlerbehebung bei 'Permission Denied' Fehlern und die Lösung von SFTP-Berechtigungsproblemen auf Ihrem Linux-System. Sie erfahren, wie Sie einen SFTP-Server einrichten, Benutzer mit entsprechenden Berechtigungen erstellen und häufige Berechtigungsprobleme diagnostizieren, die während der Dateiübertragung auftreten.
Einrichten eines SFTP-Servers unter Ubuntu
SFTP (Secure File Transfer Protocol) bietet eine sichere Methode zur Dateiübertragung zwischen Systemen. Im Gegensatz zu regulärem FTP verschlüsselt SFTP sowohl Befehle als auch Daten während der Übertragung und schützt Ihre Informationen vor unbefugtem Zugriff.
In diesem Schritt richten wir einen einfachen SFTP-Server auf unserem Ubuntu-System ein.
Installieren des OpenSSH-Servers
Zuerst stellen wir sicher, dass unser System auf dem neuesten Stand ist, und installieren den OpenSSH-Server, der SFTP-Funktionen beinhaltet:
sudo apt update
sudo apt install -y openssh-server
Nachdem Sie diese Befehle ausgeführt haben, sollten Sie eine Ausgabe ähnlich der folgenden sehen:
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
openssh-server is already the newest version (1:8.9p1-3ubuntu0.1).
Überprüfen des SSH-Dienststatus
Da wir uns in einem Docker-Container befinden, funktioniert der Standardbefehl systemctl nicht. Überprüfen wir, ob der SSH-Dienst mit dem Befehl zur Prozessstatusanzeige ausgeführt wird:
ps aux | grep sshd
Sie sollten eine Ausgabe sehen, die anzeigt, dass sshd ausgeführt wird:
root 1234 0.0 0.1 12016 5604 ? Ss 10:20 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
Erstellen eines Testbenutzers für SFTP
Erstellen wir einen dedizierten Benutzer zum Testen der SFTP-Funktionalität:
sudo adduser sftpuser
Geben Sie bei der Aufforderung ein einfaches Passwort wie password123 ein und drücken Sie die Eingabetaste, um die zusätzlichen Benutzerinformationsfelder zu überspringen. Sie sollten eine Ausgabe ähnlich der folgenden sehen:
Adding user `sftpuser' ...
Adding new group `sftpuser' (1001) ...
Adding new user `sftpuser' (1001) with group `sftpuser' ...
Creating home directory `/home/sftpuser' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Erstellen von Testdateien für die SFTP-Übertragung
Erstellen wir nun einige Testdateien in unserem Home-Verzeichnis, die wir für SFTP-Übertragungen verwenden werden:
cd ~/project
echo "This is a test file for SFTP transfers" > testfile.txt
echo "This file has different permissions" > restrictedfile.txt
Überprüfen wir, ob die Dateien korrekt erstellt wurden:
ls -l testfile.txt restrictedfile.txt
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
-rw-rw-r-- 1 labex labex 37 Sep 28 10:30 restrictedfile.txt
-rw-rw-r-- 1 labex labex 38 Sep 28 10:30 testfile.txt
Standardmäßig haben beide Dateien Lese- und Schreibberechtigungen für den Eigentümer und die Gruppe sowie Nur-Lese-Berechtigungen für andere. Wir werden in den nächsten Schritten mit der Änderung dieser Berechtigungen experimentieren.
Verständnis von Dateiberechtigungen und deren Auswirkungen auf SFTP
Bevor wir uns mit SFTP-Berechtigungsproblemen befassen, wollen wir das Linux-Dateiberechtigungssystem verstehen und wie es sich auf SFTP-Operationen auswirkt.
Grundlagen der Linux-Dateiberechtigungen
In Linux hat jede Datei und jedes Verzeichnis drei Arten von Berechtigungen:
- Lesen (r): Ermöglicht das Anzeigen von Dateiinhalt oder das Auflisten von Verzeichnisinhalten
- Schreiben (w): Ermöglicht das Ändern von Dateien oder das Erstellen/Löschen von Dateien in einem Verzeichnis
- Ausführen (x): Ermöglicht das Ausführen von Dateien oder den Zugriff auf ein Verzeichnis
Diese Berechtigungen werden drei Benutzerkategorien zugewiesen:
- Eigentümer (Owner): Der Benutzer, der die Datei erstellt hat
- Gruppe (Group): Die der Datei zugewiesene Gruppe
- Andere (Others): Alle anderen
Anzeigen aktueller Berechtigungen
Überprüfen wir die aktuellen Berechtigungen unserer Testdateien:
ls -l ~/project/testfile.txt ~/project/restrictedfile.txt
Sie sehen eine Ausgabe ähnlich der folgenden:
-rw-rw-r-- 1 labex labex 38 Sep 28 10:30 /home/labex/project/testfile.txt
-rw-rw-r-- 1 labex labex 37 Sep 28 10:30 /home/labex/project/restrictedfile.txt
Die Berechtigungszeichenkette -rw-rw-r-- kann wie folgt aufgeschlüsselt werden:
- Das erste Zeichen
-kennzeichnet eine reguläre Datei (wäredfür ein Verzeichnis) - Die nächsten drei Zeichen
rw-zeigen die Berechtigungen des Eigentümers (Lesen, Schreiben, kein Ausführen) - Die nächsten drei Zeichen
rw-zeigen die Gruppenberechtigungen (Lesen, Schreiben, kein Ausführen) - Die letzten drei Zeichen
r--zeigen die Berechtigungen für andere (nur Lesen)
Ändern von Dateiberechtigungen
Ändern wir die Berechtigungen unserer Dateien, um Szenarien zu erstellen, die zu Berechtigungsfehlern in SFTP führen könnten:
## Make testfile.txt readable by everyone but writable only by owner
chmod 644 ~/project/testfile.txt
## Make restrictedfile.txt accessible only to the owner
chmod 600 ~/project/restrictedfile.txt
Überprüfen wir nun die Änderungen:
ls -l ~/project/testfile.txt ~/project/restrictedfile.txt
Sie sollten die aktualisierten Berechtigungen sehen:
-rw-r--r-- 1 labex labex 38 Sep 28 10:30 /home/labex/project/testfile.txt
-rw------- 1 labex labex 37 Sep 28 10:30 /home/labex/project/restrictedfile.txt
Einrichten eines Verzeichnisses für SFTP-Tests
Erstellen wir ein dediziertes Verzeichnis für SFTP-Tests:
mkdir -p ~/project/sftp_test
echo "This file is in the SFTP test directory" > ~/project/sftp_test/test_file.txt
chmod 755 ~/project/sftp_test
Erstellen wir nun ein Verzeichnis mit eingeschränkten Berechtigungen:
mkdir -p ~/project/restricted_sftp
echo "This file is in the restricted directory" > ~/project/restricted_sftp/restricted_file.txt
chmod 700 ~/project/restricted_sftp
Überprüfen wir die Verzeichnisberechtigungen:
ls -ld ~/project/sftp_test ~/project/restricted_sftp
Sie sollten Folgendes sehen:
drwxr-xr-x 2 labex labex 4096 Sep 28 10:35 /home/labex/project/sftp_test
drwx------ 2 labex labex 4096 Sep 28 10:35 /home/labex/project/restricted_sftp
Auf das Verzeichnis sftp_test kann jeder zugreifen, während auf das Verzeichnis restricted_sftp nur der Eigentümer (Benutzer labex) zugreifen kann.
Erleben und Diagnostizieren von SFTP-Berechtigungsfehlern
In diesem Schritt stellen wir eine Verbindung zu unserem SFTP-Server her und erleben Berechtigungsfehler aus erster Hand. Dies hilft uns zu verstehen, wie sich die Berechtigungseinstellungen auf SFTP-Operationen auswirken.
Lokales Verbinden mit dem SFTP-Server
Da wir in einer lokalen Umgebung arbeiten, können wir uns mit der Adresse localhost mit unserem SFTP-Server verbinden. Stellen wir eine Verbindung mit dem zuvor erstellten sftpuser her:
sftp sftpuser@localhost
Geben Sie bei der Aufforderung nach dem Passwort das Passwort ein, das Sie für das Konto sftpuser festgelegt haben (z. B. password123). Wenn die Verbindung erfolgreich ist, sehen Sie eine Eingabeaufforderung wie:
Connected to localhost.
sftp>
Wenn Verbindungsprobleme auftreten, kann dies daran liegen, dass der SSH-Dienst im Container nicht richtig ausgeführt wird. Sie können versuchen, mit exit zu beenden und mit den nächsten Schritten unter Verwendung theoretischer Beispiele fortzufahren.
Grundlegende SFTP-Befehle
Erkunden wir einige grundlegende SFTP-Befehle:
- Anzeigen des aktuellen Verzeichnisses auf dem Remote-Server:
sftp> pwd
Remote working directory: /home/sftpuser
- Auflisten von Dateien im aktuellen Verzeichnis:
sftp> ls
- Navigieren zu einem anderen Verzeichnis:
sftp> cd /tmp
sftp> pwd
Remote working directory: /tmp
- Rückkehr zu Ihrem Home-Verzeichnis:
sftp> cd
sftp> pwd
Remote working directory: /home/sftpuser
Versuchen, auf Dateien mit unterschiedlichen Berechtigungen zuzugreifen
Versuchen wir nun, von der SFTP-Sitzung aus auf unsere Testdateien zuzugreifen:
- Versuchen Sie, eine Datei aus unserem Projektverzeichnis abzurufen:
sftp> get /home/labex/project/testfile.txt
Fetching /home/labex/project/testfile.txt to testfile.txt
Permission denied
Sie werden einen "Permission denied"-Fehler feststellen. Dies liegt daran, dass der sftpuser keine Berechtigung hat, auf Dateien im Home-Verzeichnis des Benutzers labex zuzugreifen.
Beenden der SFTP-Sitzung
Beenden wir die SFTP-Sitzung, um fortzufahren:
sftp> exit
Verstehen von Berechtigungsfehlern
Es gibt mehrere häufige Gründe für "Permission denied"-Fehler in SFTP:
- Dateiberechtigungen (File Permissions): Der Benutzer hat keinen Lese-/Schreibzugriff auf die Datei
- Verzeichnisberechtigungen (Directory Permissions): Der Benutzer kann nicht auf das Verzeichnis zugreifen, das die Datei enthält
- Eigentumsfragen (Ownership Issues): Die Datei/das Verzeichnis gehört einem anderen Benutzer oder einer anderen Gruppe
- Pfad-Traversal-Einschränkungen (Path Traversal Restrictions): Die SFTP-Konfiguration kann Benutzer auf bestimmte Verzeichnisse beschränken
Machen wir eine unserer Testdateien für unseren SFTP-Benutzer zugänglich:
## Create a directory that can be accessed by others
mkdir -p /tmp/shared
echo "This is a shared file for SFTP testing" > /tmp/shared/shared_file.txt
chmod 777 /tmp/shared
chmod 666 /tmp/shared/shared_file.txt
Stellen Sie nun erneut eine Verbindung zu SFTP her und versuchen Sie, auf diese Datei zuzugreifen:
sftp sftpuser@localhost
Versuchen Sie nach dem Verbinden:
sftp> get /tmp/shared/shared_file.txt
Fetching /tmp/shared/shared_file.txt to shared_file.txt
/tmp/shared/shared_file.txt 100% 36 1.0KB/s 00:00
Dies sollte funktionieren, da wir allen Lese-/Schreibberechtigungen für das Verzeichnis und die Datei erteilt haben.
Beenden Sie die SFTP-Sitzung erneut:
sftp> exit
Verwenden von SFTP im Debug-Modus
Um weitere Informationen zu Berechtigungsfehlern zu erhalten, können Sie SFTP im Debug-Modus verwenden:
sftp -v sftpuser@localhost
Die ausführliche Ausgabe zeigt Ihnen detaillierte Informationen über die Verbindung und alle auftretenden Fehler:
debug1: Sending subsystem: sftp
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: channel 0: free: client-session, nchannels 1
Transferred: sent 2412, received 2876 bytes, in 0.1 seconds
Bytes per second: sent 30074.7, received 35857.2
debug1: Exit status 0
Beheben von SFTP-Berechtigungsfehlern
Nachdem wir nun verstanden haben, wie sich Berechtigungen auf den SFTP-Zugriff auswirken, wollen wir lernen, wie man gängige Berechtigungsfehler behebt.
Lösung 1: Anpassen der Datei- und Verzeichnisberechtigungen
Die einfachste Lösung für Berechtigungsprobleme ist die Anpassung der Datei- und Verzeichnisberechtigungen. Erstellen wir einen neuen Testfall:
## Create a new test file with restrictive permissions
echo "This file has restricted permissions" > ~/project/restricted_access.txt
chmod 600 ~/project/restricted_access.txt
Überprüfen Sie die aktuellen Berechtigungen:
ls -l ~/project/restricted_access.txt
Ausgabe:
-rw------- 1 labex labex 35 Sep 28 11:05 /home/labex/project/restricted_access.txt
Machen wir diese Datei nun für andere zugänglich, indem wir ihre Berechtigungen ändern:
chmod 644 ~/project/restricted_access.txt
ls -l ~/project/restricted_access.txt
Ausgabe:
-rw-r--r-- 1 labex labex 35 Sep 28 11:05 /home/labex/project/restricted_access.txt
Mit diesen Berechtigungen (644) kann der Dateieigentümer (labex) die Datei lesen und schreiben, während die Gruppenmitglieder und andere sie nur lesen können.
Lösung 2: Ändern des Dateieigentums
Eine weitere Lösung besteht darin, das Eigentum an Dateien zu ändern, um es an den SFTP-Benutzer anzupassen. Erstellen wir eine weitere Testdatei:
echo "This file will be owned by sftpuser" > ~/project/ownership_test.txt
Ändern wir nun das Eigentum an unseren SFTP-Benutzer:
sudo chown sftpuser:sftpuser ~/project/ownership_test.txt
ls -l ~/project/ownership_test.txt
Ausgabe:
-rw-rw-r-- 1 sftpuser sftpuser 36 Sep 28 11:10 /home/labex/project/ownership_test.txt
Jetzt gehört die Datei sftpuser, der sie lesen und schreiben kann.
Lösung 3: Erstellen eines freigegebenen Verzeichnisses
Eine gängige Lösung für die SFTP-Dateifreigabe ist die Erstellung eines Verzeichnisses mit geeigneten Berechtigungen, auf das mehrere Benutzer zugreifen können:
## Create a new shared directory with appropriate permissions
mkdir -p /tmp/sftp_shared
sudo chown labex:labex /tmp/sftp_shared
chmod 755 /tmp/sftp_shared
## Create a subdirectory for uploads that's writable by everyone
mkdir -p /tmp/sftp_shared/uploads
chmod 777 /tmp/sftp_shared/uploads
## Create a sample file in the shared directory
echo "This file is in the shared SFTP directory" > /tmp/sftp_shared/sample.txt
chmod 644 /tmp/sftp_shared/sample.txt
Überprüfen wir unser Setup:
ls -la /tmp/sftp_shared/
Ausgabe:
total 12
drwxr-xr-x 3 labex labex 4096 Sep 28 11:15 .
drwxrwxrwt 4 root root 4096 Sep 28 11:15 ..
-rw-r--r-- 1 labex labex 39 Sep 28 11:15 sample.txt
drwxrwxrwx 2 labex labex 4096 Sep 28 11:15 uploads
Mit diesem Setup:
- Das Hauptverzeichnis ist für jeden lesbar und ausführbar, aber nur für den Eigentümer beschreibbar
- Das Unterverzeichnis
uploadsist für jeden beschreibbar (geeignet für SFTP-Uploads) - Die Datei
sample.txtist für jeden lesbar, aber nur für den Eigentümer beschreibbar
Diese Konfiguration ermöglicht dem SFTP-Benutzer Folgendes:
- Navigieren zum freigegebenen Verzeichnis
- Lesen der Beispieldatei
- Hochladen von Dateien in das Verzeichnis
uploads
Lösung 4: Verwenden von ACLs für eine detailliertere Kontrolle
Zugriffskontrolllisten (ACLs) bieten eine detailliertere Berechtigungsverwaltung. Installieren wir das erforderliche Paket und verwenden wir ACLs:
sudo apt install -y acl
Erstellen wir nun eine Datei und legen wir mithilfe von ACLs spezifische Berechtigungen fest:
echo "This file uses ACLs for permissions" > ~/project/acl_test.txt
## Set basic permissions
chmod 640 ~/project/acl_test.txt
## Add ACL permission for sftpuser
sudo setfacl -m u:sftpuser:r ~/project/acl_test.txt
## View the ACL settings
getfacl ~/project/acl_test.txt
Ausgabe:
## file: /home/labex/project/acl_test.txt
## owner: labex
## group: labex
user::rw-
user:sftpuser:r--
group::r--
mask::r--
other::---
Diese ACL-Konfiguration ermöglicht Folgendes:
- Dem Dateieigentümer (labex) das Lesen und Schreiben
- Dem
sftpuserdas Lesen der Datei - Der Gruppe das Lesen der Datei
- Andere haben keinen Zugriff
Best Practices für die Verwaltung von SFTP-Berechtigungen
In diesem letzten Schritt behandeln wir einige Best Practices für die Verwaltung von SFTP-Berechtigungen und die effektive Fehlerbehebung bei Berechtigungsproblemen.
Erstellen einer dedizierten SFTP-Benutzergruppe
Es ist eine gute Praxis, eine dedizierte Gruppe für SFTP-Benutzer zu erstellen:
sudo groupadd sftp_users
sudo usermod -a -G sftp_users sftpuser
Überprüfen Sie, ob der Benutzer der Gruppe hinzugefügt wurde:
groups sftpuser
Ausgabe:
sftpuser : sftpuser sftp_users
Einrichten eines gruppenverwalteten Verzeichnisses
Erstellen wir nun ein Verzeichnis, das von der Gruppe sftp_users verwaltet wird:
## Create a new directory for the SFTP group
sudo mkdir -p /tmp/sftp_group_shared
sudo chown labex:sftp_users /tmp/sftp_group_shared
sudo chmod 770 /tmp/sftp_group_shared
## Set the SGID bit to ensure new files inherit the group
sudo chmod g+s /tmp/sftp_group_shared
## Create a test file in this directory
echo "This file is in the SFTP group directory" > /tmp/sftp_group_shared/group_file.txt
Überprüfen wir die Berechtigungen:
ls -la /tmp/sftp_group_shared/
Ausgabe:
total 12
drwxrws--- 2 labex sftp_users 4096 Sep 28 11:25 .
drwxrwxrwt 5 root root 4096 Sep 28 11:25 ..
-rw-rw-r-- 1 labex sftp_users 42 Sep 28 11:25 group_file.txt
Das s in den Gruppenberechtigungen zeigt an, dass das SGID-Bit gesetzt ist, was bedeutet, dass neue Dateien, die in diesem Verzeichnis erstellt werden, die Gruppe sftp_users erben.
Häufige Befehle zur Fehlerbehebung bei SFTP-Berechtigungen
Bei der Fehlerbehebung bei SFTP-Berechtigungsproblemen sind diese Befehle besonders hilfreich:
- Überprüfen der Dateiberechtigungen:
ls -la /path/to/file
- Überprüfen der Benutzergruppen:
groups username
- Überprüfen der aktuellen Benutzer- und Gruppen-IDs:
id
- Anzeigen der SFTP-Serverprotokolle:
## In a production system, you would check system logs
## For our lab environment, we can simulate viewing logs
grep "sshd" /var/log/auth.log | tail
- Testen des Dateizugriffs über die Befehlszeile:
sudo -u sftpuser cat /path/to/file
Entscheidungsbaum für Berechtigungsfehler
Wenn Sie in SFTP auf einen Berechtigungsfehler stoßen, befolgen Sie diesen Entscheidungsbaum:
Kann der SFTP-Benutzer auf das übergeordnete Verzeichnis zugreifen?
- Überprüfen mit:
sudo -u sftpuser ls -la /path/to/directory/ - Beheben mit:
chmod o+x /path/to/directory/
- Überprüfen mit:
Kann der SFTP-Benutzer die Datei lesen?
- Überprüfen mit:
sudo -u sftpuser cat /path/to/file - Beheben mit:
chmod o+r /path/to/fileodersetfacl -m u:sftpuser:r /path/to/file
- Überprüfen mit:
Kann der SFTP-Benutzer in die Datei oder das Verzeichnis schreiben?
- Überprüfen mit:
sudo -u sftpuser touch /path/to/directory/test_file - Beheben mit:
chmod o+w /path/to/directory/odersetfacl -m u:sftpuser:w /path/to/directory/
- Überprüfen mit:
Erstellen eines Testskripts für SFTP-Berechtigungen
Erstellen wir ein einfaches Testskript, das prüft, ob der SFTP-Benutzer auf bestimmte Dateien und Verzeichnisse zugreifen kann:
cat > ~/project/check_sftp_permissions.sh << 'EOF'
#!/bin/bash
USER="sftpuser"
echo "Testing SFTP permissions for user: $USER"
echo "-------------------------------------------"
## Test directories
for DIR in /tmp/shared /tmp/sftp_shared /tmp/sftp_group_shared /home/labex/project; do
echo -n "Can $USER access $DIR? "
if sudo -u $USER ls -la $DIR &>/dev/null; then
echo "YES"
else
echo "NO"
fi
done
## Test files
for FILE in /tmp/shared/shared_file.txt /tmp/sftp_shared/sample.txt /home/labex/project/testfile.txt; do
echo -n "Can $USER read $FILE? "
if sudo -u $USER cat $FILE &>/dev/null; then
echo "YES"
else
echo "NO"
fi
done
echo "-------------------------------------------"
echo "Testing complete!"
EOF
chmod +x ~/project/check_sftp_permissions.sh
Führen Sie nun das Testskript aus:
sudo ~/project/check_sftp_permissions.sh
Sie sollten eine Ausgabe sehen, die anzeigt, auf welche Verzeichnisse und Dateien der SFTP-Benutzer zugreifen kann. Dies hilft Ihnen, Berechtigungsprobleme schnell zu identifizieren.
Abschließende Tipps für die Verwaltung von SFTP-Berechtigungen
- Verwenden Sie das Prinzip der geringsten Privilegien (principle of least privilege): Gewähren Sie nur die minimal erforderlichen Berechtigungen
- Überprüfen Sie regelmäßig die Berechtigungen: Verwenden Sie Tools wie
find, um Dateien mit unangemessenen Berechtigungen zu identifizieren - Dokumentieren Sie Ihre Berechtigungsstruktur: Behalten Sie den Überblick darüber, welche Benutzer und Gruppen Zugriff auf welche Verzeichnisse haben
- Erwägen Sie die Verwendung von SFTP-Chroot-Jails: Beschränken Sie in Produktionsumgebungen Benutzer auf bestimmte Verzeichnisse
- Testen Sie aus der Perspektive des Benutzers: Überprüfen Sie Berechtigungen immer, indem Sie als der tatsächliche SFTP-Benutzer testen
Zusammenfassung
In diesem Tutorial haben Sie gelernt, wie Sie einen SFTP-Server einrichten, Benutzer mit entsprechenden Berechtigungen erstellen und häufige Berechtigungsfehler beheben. Sie haben praktische Erfahrung gesammelt mit:
- Installieren und Konfigurieren eines SFTP-Servers unter Ubuntu
- Verstehen von Linux-Dateiberechtigungen und deren Auswirkungen auf den SFTP-Zugriff
- Erleben und Diagnostizieren von Berechtigungsfehlern
- Implementieren verschiedener Lösungen zur Behebung von Berechtigungsproblemen
- Anwenden von Best Practices für die Verwaltung von SFTP-Berechtigungen
Diese Fähigkeiten helfen Ihnen, Dateiübertragungen in einer sicheren Umgebung effektiv zu verwalten und gleichzeitig berechtigungsbezogene Probleme zu minimieren. Denken Sie daran, dass eine ordnungsgemäße Berechtigungsverwaltung unerlässlich ist, um einen sicheren und dennoch funktionsfähigen SFTP-Server zu erhalten und die Sicherheitsanforderungen mit den Benutzerzugriffsbedürfnissen in Einklang zu bringen.



