---
title: "Chroot_sftp_mit_openssh"
date: 2024-05-28T14:30:00+02:00
slug: 2024-05-28-chroot_sftp_mit_openssh
type: posts
categories:
  - Linux
tags:
  - 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 *(extern)*](https://chaos.social/@schenklklopfer) [hier *(extern)*](https://chaos.social/@schenklklopfer/112514806811978790) 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!
