woensdag 31 december 2025

SFTP instellen op een Linux Mint 22.2

De casus is alsvolgt: Ik draai CasaOS op een linux mint 22.2 machine  waarop CasaOS draait met docker containers. Ik wil toegang tot enkele mappen hebben via sftp met de gewone gebruiker of met een  speciale sftpuser. De dockers moeten ook toegang behouden tot de mappen.

De mappen die ik wil delen zijn:

/media/Disk3-3Tb
/media/Disk2-6Tb
/media/Kingston480

Eerst maken we een groep voor gedeelde toegang:

sudo groupadd storage

Voeg gebruikers toe aan de groep

sudo usermod -aG storage user1
sudo usermod -aG storage sftpuser
sudo usermod -aG storage user2  # andere gebruikers die toegang moeten


Maak SFTP-only gebruiker

sudo adduser sftpuser
sudo usermod -s /usr/sbin/nologin sftpuser


Maak chroot-structuur voor SFTP


sudo mkdir -p /srv/sftp/sftpuser
sudo chown root:root /srv/sftp
sudo chmod 755 /srv/sftp
sudo chown root:root /srv/sftp/sftpuser
sudo chmod 755 /srv/sftp/sftpuser

Maak zichtbare mappen voor SFTP

sudo mkdir /srv/sftp/sftpuser/Disk3-3Tb
sudo mkdir /srv/sftp/sftpuser/Disk2-6Tb
sudo mkdir /srv/sftp/sftpuser/Kingston480
sudo chown root:root /srv/sftp/sftpuser/*

Bind-mount de echte USB-schijven

sudo mount --bind /media/Disk3-3Tb /srv/sftp/sftpuser/Disk3-3Tb
sudo mount --bind /media/Disk2-6Tb /srv/sftp/sftpuser/Disk2-6Tb
sudo mount --bind /media/Kingston480 /srv/sftp/sftpuser/Kingston480

Eigenaarschap en rechten op de echte schijven

sudo chown -R root:storage /media/Disk3-3Tb
sudo chown -R root:storage /media/Disk2-6Tb
sudo chown -R root:storage /media/Kingston480

sudo chmod -R 2770 /media/Disk3-3Tb
sudo chmod -R 2770 /media/Disk2-6Tb
sudo chmod -R 2770 /media/Kingston480

ACL’s voor Docker (PUID/PGID 1000)

sudo setfacl -R -m g:1000:rwx /media/Disk3-3Tb
sudo setfacl -R -m g:1000:rwx /media/Disk2-6Tb
sudo setfacl -R -m g:1000:rwx /media/Kingston480

sudo setfacl -R -d -m g:1000:rwx /media/Disk3-3Tb
sudo setfacl -R -d -m g:1000:rwx /media/Disk2-6Tb
sudo setfacl -R -d -m g:1000:rwx /media/Kingston480

SSH configuratie voor SFTP-only gebruiker


sudo -H xed /etc/ssh/sshd_config

Voeg onderaan toe:

Match User sftpuser
    ChrootDirectory /srv/sftp
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no

Sla op en verlaat xed en herstart SSH:

sudo systemctl restart ssh

Permanent maken van bind mounts


sudo -H xed /etc/fstab

voeg deze regels toe:

/media/Disk3-3Tb    /srv/sftp/sftpuser/Disk3-3Tb    none    bind    0 0
/media/Disk2-6Tb    /srv/sftp/sftpuser/Disk2-6Tb    none    bind    0 0
/media/Kingston480  /srv/sftp/sftpuser/Kingston480  none    bind    0 0

Controle


# Rechtencheck
getfacl /media/Disk3-3Tb
ls -ld /media/Disk3-3Tb /media/Disk2-6Tb /media/Kingston480

# Test SFTP
sftp sftpuser@IP-ADRES

# Test Docker
docker exec -it <container> sh
touch /media/Disk3-3Tb/test.txt

# Test andere gebruikers
su - user2
touch /media/Disk3-3Tb/test2.txt

Eindresultaat:

  • SFTP-user alleen SFTP

  • user1 + andere gebruikers RW

  • Docker PUID/PGID 1000 RW

  • Nieuwe bestanden automatisch juiste groep en rechten

  • Veilig, geen 777


Alles in een script:

Maak een nieuw bestand aan:

xed install-ftps.sh

en voeg dit daarin in:

#!/bin/bash
# Setup SFTP met verwijderrechten, chroot veilig, Docker toegang

# --- Configuratie ---
SFTP_USER="sftpuser"
GROUP="storage"
DOCKER_GID=1000
CHROOT_BASE="/srv/sftp"
SHARES=("/media/Disk3-3Tb" "/media/Disk2-6Tb" "/media/Kingston480")
OTHER_USERS=("jeroen" "quinnten") # pas aan indien nodig

# --- 1️⃣ Maak groep storage ---
if ! getent group $GROUP > /dev/null; then
    sudo groupadd $GROUP
fi

# --- 2️⃣ Voeg gebruikers toe aan storage ---
for user in "${OTHER_USERS[@]}" "$SFTP_USER"; do
    sudo usermod -aG $GROUP $user
done

# --- 3️⃣ SFTP-only gebruiker ---
if ! id -u $SFTP_USER > /dev/null 2>&1; then
    sudo adduser $SFTP_USER
    sudo usermod -s /usr/sbin/nologin $SFTP_USER
fi

# --- 4️⃣ Chroot map ---
sudo mkdir -p $CHROOT_BASE/$SFTP_USER
sudo chown root:root $CHROOT_BASE
sudo chmod 755 $CHROOT_BASE
sudo chown root:root $CHROOT_BASE/$SFTP_USER
sudo chmod 755 $CHROOT_BASE/$SFTP_USER

# --- 5️⃣ Maak submappen in chroot voor SFTP ---
for SHARE in "${SHARES[@]}"; do
    BASENAME=$(basename $SHARE)
    sudo mkdir -p $CHROOT_BASE/$SFTP_USER/$BASENAME
    sudo chown root:root $CHROOT_BASE/$SFTP_USER/$BASENAME
done

# --- 6️⃣ Bind-mount de echte schijven ---
for SHARE in "${SHARES[@]}"; do
    BASENAME=$(basename $SHARE)
    sudo mount --bind $SHARE $CHROOT_BASE/$SFTP_USER/$BASENAME
done

# --- 7️⃣ Eigenaarschap en rechten op de echte schijven ---
for SHARE in "${SHARES[@]}"; do
    # Owner = SFTP-user, groep = storage
    sudo chown -R $SFTP_USER:$GROUP $SHARE
    # setgid + RW voor owner en groep
    sudo chmod -R 2770 $SHARE
done

# --- 8️⃣ ACL voor Docker PUID/PGID=1000 ---
for SHARE in "${SHARES[@]}"; do
    sudo setfacl -R -m g:$DOCKER_GID:rwx $SHARE
    sudo setfacl -R -d -m g:$DOCKER_GID:rwx $SHARE
done

# --- 9️⃣ SSH configuratie voor SFTP-only ---
SSHD_CONF="/etc/ssh/sshd_config"
if ! grep -q "Match User $SFTP_USER" $SSHD_CONF; then
    sudo bash -c "cat >> $SSHD_CONF" <<EOL

Match User $SFTP_USER
    ChrootDirectory $CHROOT_BASE
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no
EOL
    sudo systemctl restart ssh
fi

# --- 🔟 Permanent bind mounts in fstab ---
FSTAB="/etc/fstab"
for SHARE in "${SHARES[@]}"; do
    BASENAME=$(basename $SHARE)
    ENTRY="$SHARE $CHROOT_BASE/$SFTP_USER/$BASENAME none bind 0 0"
    if ! grep -q "$CHROOT_BASE/$SFTP_USER/$BASENAME" $FSTAB; then
        echo "$ENTRY" | sudo tee -a $FSTAB
    fi
done

echo "✅ Setup voltooid: SFTP verwijderrechten, chroot veilig, Docker en groep toegang ingesteld."



Sla deze tekst op in een tekstbestand:

xed setup_sftp.sh
chmod +x setup_sftp.sh
sudo ./setup_sftp.sh

Wat dit script doet

  • Groep storage aanmaken en gebruikers toevoegen

  • SFTP-only gebruiker aanmaken (/usr/sbin/nologin)

  • Chroot en SFTP-mappen maken

  • Bind mounts naar de echte USB-schijven

  • Eigenaarschap + 2770 + setgid instellen

  • ACL’s voor Docker PGID=1000 instellen

  • SSH configuratie voor SFTP-only

  • Bind mounts permanent in /etc/fstab

Nu zijn er systemen zoals de QNAP nas die niet kunnen schrijven en lezen van een sftp systeem. Die kunnen alleen ftp of ftps aan. Dan moet alles anders worden ingericht:

Daar moet op een andere manier toegang voor gecreeërd worden via FTP of FTPS

We beginnen bij het begin, sla onderdleen over die je al gedaan hebt:

Installeer vsftpd

sudo apt update
sudo apt install -y vsftpd

Maak FTPS-only gebruiker:

sudo adduser ftpuser
sudo usermod -s /usr/sbin/nologin ftpuser
sudo usermod -aG storage ftpuser

Chroot map voor FTP:

sudo mkdir -p /srv/ftp/ftpuser
sudo chown root:root /srv/ftp
sudo chmod 755 /srv/ftp
sudo chown root:root /srv/ftp/ftpuser
sudo chmod 755 /srv/ftp/ftpuser

Maak submappen voor bind mounts:

sudo mkdir -p /srv/ftp/ftpuser/Disk3-3Tb
sudo mkdir -p /srv/ftp/ftpuser/Disk2-6Tb
sudo mkdir -p /srv/ftp/ftpuser/Kingston480
sudo chown root:root /srv/ftp/ftpuser/*

Bind mounts van de echte schijven:

sudo mount --bind /media/Disk3-3Tb /srv/ftp/ftpuser/Disk3-3Tb
sudo mount --bind /media/Disk2-6Tb /srv/ftp/ftpuser/Disk2-6Tb
sudo mount --bind /media/Kingston480 /srv/ftp/ftpuser/Kingston480

Eigenaarschap en rechten op de echte mappen

sudo chown -R ftpuser:storage /media/Disk3-3Tb
sudo chown -R ftpuser:storage /media/Disk2-6Tb
sudo chown -R ftpuser:storage /media/Kingston480

sudo chmod -R 2770 /media/Disk3-3Tb
sudo chmod -R 2770 /media/Disk2-6Tb
sudo chmod -R 2770 /media/Kingston480

ACL voor Docker PUID/PGID=1000:

sudo setfacl -R -m g:1000:rwx /media/Disk3-3Tb
sudo setfacl -R -m g:1000:rwx /media/Disk2-6Tb
sudo setfacl -R -m g:1000:rwx /media/Kingston480

sudo setfacl -R -d -m g:1000:rwx /media/Disk3-3Tb
sudo setfacl -R -d -m g:1000:rwx /media/Disk2-6Tb
sudo setfacl -R -d -m g:1000:rwx /media/Kingston480

Configureer vsftpd voor FTPS. Bewerk /etc/vsftpd.conf:

sudo -H xed /etc/vsftpd.conf

en voeg dit in in de plaats van de oude tekst:

listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES
user_sub_token=$USER
local_root=/srv/ftp/$USER
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
pasv_min_port=40000
pasv_max_port=50000

en sla dit bestand op en verlaat xed.

Maak SSL-certificaat:

sudo mkdir -p /etc/ssl/private
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /etc/ssl/private/vsftpd.pem \
  -out /etc/ssl/private/vsftpd.pem \
  -subj "/C=NL/ST=Noord-Holland/L=Amsterdam/O=Home/OU=IT/CN=localhost"

Herstart vsftpd

sudo systemctl restart vsftpd

Permanent bind mounts in fstab:

sudo -H xed /etc/fstab

en voeg deze regels toe:

/media/Disk3-3Tb    /srv/ftp/ftpuser/Disk3-3Tb    none    bind    0 0
/media/Disk2-6Tb    /srv/ftp/ftpuser/Disk2-6Tb    none    bind    0 0
/media/Kingston480  /srv/ftp/ftpuser/Kingston480  none    bind    0 0

en sla dit bestand weer op en verlaat Xed.

SFTP en FTPS delen nu dezelfde fysieke mappen.
Rechten via groep storage en ACL’s voor Docker blijven geldig.
Chroot-mappen blijven root:root, veilig.
Gebruik altijd FTPS (TLS), want gewone FTP stuurt wachtwoorden onveilig.

Als je dit in een script wilt hebben doe dan:
Maak een nieuw bestand aan:

xed install-ftps.sh

en voeg dit daarin in:

#!/bin/bash
# Setup FTPS (vsftpd) voor gedeelde USB-mappen
# Veilig, gedeelde rechten met SFTP en Docker

# --- Configuratie ---
FTP_USER="ftpuser"
GROUP="storage"
DOCKER_GID=1000
CHROOT_BASE="/srv/ftp"
SHARES=("/media/Disk3-3Tb" "/media/Disk2-6Tb" "/media/Kingston480")
OTHER_USERS=("user1" "user2") # pas aan indien nodig

# --- 1️⃣ Install vsftpd ---
sudo apt update
sudo apt install -y vsftpd

# --- 2️⃣ Maak FTP-only gebruiker ---
if ! id -u $FTP_USER > /dev/null 2>&1; then
    sudo adduser $FTP_USER
    sudo usermod -s /usr/sbin/nologin $FTP_USER
fi

# --- 3️⃣ Voeg FTP-gebruiker toe aan storage ---
sudo usermod -aG $GROUP $FTP_USER

# --- 4️⃣ Chroot map voor FTP ---
sudo mkdir -p $CHROOT_BASE/$FTP_USER
sudo chown root:root $CHROOT_BASE
sudo chmod 755 $CHROOT_BASE
sudo chown root:root $CHROOT_BASE/$FTP_USER
sudo chmod 755 $CHROOT_BASE/$FTP_USER

# --- 5️⃣ Maak submappen voor bind mounts ---
for SHARE in "${SHARES[@]}"; do
    BASENAME=$(basename $SHARE)
    sudo mkdir -p $CHROOT_BASE/$FTP_USER/$BASENAME
    sudo chown root:root $CHROOT_BASE/$FTP_USER/$BASENAME
done

# --- 6️⃣ Bind mounts naar echte schijven ---
for SHARE in "${SHARES[@]}"; do
    BASENAME=$(basename $SHARE)
    sudo mount --bind $SHARE $CHROOT_BASE/$FTP_USER/$BASENAME
done

# --- 7️⃣ Eigenaarschap en rechten op de echte schijven ---
for SHARE in "${SHARES[@]}"; do
    sudo chown -R $FTP_USER:$GROUP $SHARE
    sudo chmod -R 2770 $SHARE
done

# --- 8️⃣ ACL voor Docker PUID/PGID=1000 ---
for SHARE in "${SHARES[@]}"; do
    sudo setfacl -R -m g:$DOCKER_GID:rwx $SHARE
    sudo setfacl -R -d -m g:$DOCKER_GID:rwx $SHARE
done

# --- 9️⃣ Configureer vsftpd ---
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
sudo bash -c "cat > /etc/vsftpd.conf" <<EOL
listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
allow_writeable_chroot=YES
user_sub_token=\$USER
local_root=$CHROOT_BASE/\$USER
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
pasv_min_port=40000
pasv_max_port=50000
EOL

# --- 10️⃣ Maak zelfondertekend SSL-certificaat ---
sudo mkdir -p /etc/ssl/private
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/ssl/private/vsftpd.pem \
    -out /etc/ssl/private/vsftpd.pem \
    -subj "/C=NL/ST=Noord-Holland/L=Amsterdam/O=Home/OU=IT/CN=localhost"

# --- 11️⃣ Herstart vsftpd ---
sudo systemctl restart vsftpd

# --- 12️⃣ Permanent bind mounts in fstab ---
FSTAB="/etc/fstab"
for SHARE in "${SHARES[@]}"; do
    BASENAME=$(basename $SHARE)
    ENTRY="$SHARE $CHROOT_BASE/$FTP_USER/$BASENAME none bind 0 0"
    if ! grep -q "$CHROOT_BASE/$FTP_USER/$BASENAME" $FSTAB; then
        echo "$ENTRY" | sudo tee -a $FSTAB
    fi
done

echo "✅ FTPS setup voltooid: bind mounts, chroot, Docker ACL en groeprechten ingesteld."
echo "Gebruik FTP-client met TLS/SSL voor veilige verbinding."


Belangrijke punten

  1. Chroot-map blijft root:root → veilig

  2. Bind mounts → eigenaar = ftpuser, groep = storage, chmod 2770 → RW voor gebruiker + groep

  3. Setgid → nieuwe bestanden automatisch in groep storage

  4. ACL → Docker PUID/PGID=1000 heeft RW

  5. FTPS (TLS) → geen plaintext wachtwoorden

  6. SFTP en FTPS delen dezelfde fysieke mapp







Geen opmerkingen:

Een reactie posten

Opmerking: Alleen leden van deze blog kunnen een reactie posten.

SFTP instellen op een Linux Mint 22.2

De casus is alsvolgt: Ik draai CasaOS op een linux mint 22.2 machine  waarop CasaOS draait met docker containers. Ik wil toegang tot enkele ...