================
== Datenkastl ==
================
Datenkastl's Blog and Newspage

Chroot_sftp_mit_openssh

openssh sftp

Einsperren von sftp usern in ein chroot

Ich bin nicht immer so konsequent aufzuschreiben was ich so auf meinem Server mache. Bei Neuinstallationen oder ähnlichem muss ich dann manche Sachen immer wieder nachschlagen…

Da Schenklkopfer hier im Fediverse nach einer Lösung gesucht hat ssh user in ein chroot zu sperren hab ich gedacht ich schreib da mal meine Vorgehensweise nieder.

Als erstes erstellen wir ein Verzeichnis für die sftp-user

mkdir -p /home/shared
# für jeden user wiederholen
mkdir -p /home/shared/sftpuser/files

Für die sftp-user erstellen wir nun eine eigene Gruppe die später in der sshd_config abgefragt wird. Da der neue user nur für sftp benutzt werden soll deaktivieren wir auch gleich den Login.

addgroup sftp
adduser --ingroup sftp --shell /sbin/nologin --home /home/shared/sftpuser/files sftpuser

Als nächstes erstellen wir ein authorized_keys file um ein passwortloses anmelden zu erlauben. Dieses könnt ihr dann mit eurem puplic-key befüllen.

mkdir -p /home/shared/sftpuser/files/.ssh
touch /home/shared/sftpuser/files/.ssh/authorized_keys

Nun ist es ganz wichtig die richtigen Rechte für die Verzeichnisse zu vergeben. Ansonsten wird es nicht funkionieren.

chmod -R 755 /home/shared/sftpuser
chown -R root:sftp /home/shared/sftpuser
chown -R sftpuser:sftp /home/shared/sftpuser/files

Sollte es nicht erwünscht sein, dass die authorized_keys vom user selbst bearbeitet werden dürfen, dann können hier noch die Rechte angepasst werden

chmod 644 /home/shared/sftpuser/files/.ssh/authorized_keys
chown root /home/shared/sftpuser/files/.ssh/authorized_keys

Nachdem jetzt alles vorbereitet ist müssen wir /etc/ssh/sshd_config noch anpassen. Dazu ändern wir das Subsystem (wenn es nicht schon so ist) auf internal-sftp.

# override default of no subsystems
Subsystem       sftp    internal-sftp

Am Ende fügen wir eine Abfrage nach der Gruppe hinzu und schicken alle user die in der gruppe sftp sind ins chroot-Verzeichnis.

Match Group sftp
       ChrootDirectory /home/shared/%u
       ForceCommand internal-sftp
       PermitTunnel no
       AllowAgentForwarding no
       AllowTcpForwarding no
       X11Forwarding no

Es kann auch ein extra Port angegeben werden. Dies finde ich vor allem sehr interessant, wenn der share z.B. im Heimnetzwerk läuft und ins Internet freigegeben werden soll aber kein sshlogin möglich sein muss. So kann der extra Port am Router freigegeben werden und der normale Port wird nicht weitergeleitet. Dazu muss ganz oben in der sshd_config noch ein zweiter Port hinzugefügt werden.

Port 22
Port 2222

Dieser kann nun unten zusätzlich abgefragt werden.

Match LocalPort 2222 Group sftp
       ChrootDirectory /home/shared/%u
       ForceCommand internal-sftp
       PermitTunnel no
       AllowAgentForwarding no
       AllowTcpForwarding no
       X11Forwarding no

Jetzt muss der sshd server einmal neugestartet werden damit die Änderungen übernommen werden. Falls ihr euch nicht per keyfile einloggen könnt, dann sollten die Verzeichnisberechtigungen nochmal kontrolliert werden.

Viel Spaß damit!