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
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
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
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
-
Chroot-map blijft root:root → veilig
-
Bind mounts → eigenaar = ftpuser, groep = storage, chmod 2770 → RW voor gebruiker + groep
-
Setgid → nieuwe bestanden automatisch in groep storage
-
ACL → Docker PUID/PGID=1000 heeft RW
-
FTPS (TLS) → geen plaintext wachtwoorden
-
SFTP en FTPS delen dezelfde fysieke mapp
Geen opmerkingen:
Een reactie posten
Opmerking: Alleen leden van deze blog kunnen een reactie posten.