SFTP mit Chroot und ohne Shell
Manchmal braucht es nur ein wenig Plattenplatz mit geeignetem Zugang um Dateien auszutauschen, ohne diese gleich auf fremden Servern abzulegen. Dann kann ein SFTP-Zugang auf einem ohnehin vorhandenen Server im Internet hilfreich sein. Auf adminForge findet sich eine Anleitung, um Chroot-SFTP-Zugänge mit OpenSSH ohne Shell-Zugang anzulegen.
Im Wesentlichen geht es dabei um die folgenden Dinge:
- Man legt einmalig eine Gruppe (hier sftp) für die SFTP-Zugänge mit Chroot an.
- Ebenfalls einmalig konfiguriert man den OpenSSH-Server, die entsprechenden Benutzer in ein ChrootDirectory einzusperren und nur SFTP zuzulassen.
- Jeden SFTP-Benutzer fügt man zur Gruppe sftp hinzu, trägt
/bin/false
als Shell ein und sorgt dafür, dass sein$HOME
-Verzeichnis root gehört und nicht von ihm beschrieben werden kann. Unterhalb dieses Verzeichnisses legt man dann noch ein für den Benutzer beschreibbares Verzeichnis an, damit er Dateien hochladen kann.
SFTP-Benutzer anlegen
Für den dritten Schritt habe ich ein Skript geschrieben, das als Option den Namen des SFTP-Benutzers bekommt und diesen anlegt, wenn es noch keinen Benutzer diesen Namens gibt:
#!/bin/sh
#
# create an SFTP only user
#
# requires group sftp
# requires in file /etc/ssh/sshd_config:
#
# Subsystem sftp internal-sftp
#
# Match Group sftp
# ChrootDirectory %h
# ForceCommand internal-sftp
# AllowTcpForwarding no
if [ 1 -gt $# ]; then
echo "Usage: $0 username"
exit 1
fi
SFTPUSER=$1
if getent passwd $SFTPUSER > /dev/null; then
echo "User (${SFTPUSER}) already exists!"
exit 2
fi
adduser --shell /bin/false --no-create-home $SFTPUSER
adduser $SFTPUSER sftp
mkdir -p /home/${SFTPUSER}/upload
chown ${SFTPUSER}: /home/${SFTPUSER}/upload
Posted 2018-11-21