Geschikt voor: Versie: 9.04, 9.10, 10.04, 10.10
SFTP-server opzetten
SSH-toegang beperken
Voor achtergrondinformatie over SSH zie de OpenSSH pagina. Als een gebruiker SSH-toegang heeft, kunnen (bijna) alle mappen worden bekeken. Dit zal niet direct schade aanrichten, maar soms is het wenselijk de toegang te beperken tot een eigen ("home") map. Om meerdere gebruikers te beperken tot een gezamelijke map zie: Meerdere gebruikers delen een map
Dit artikel legt uit hoe een SFTP-server opgezet kan worden. Waarbij de gebruikers alleen hun eigen map kunnen bekijken, en niet bijna uw hele systeem (zoals standaard bij SSH). FTP staat voor File Transfer Protocol. En SFTP staat voor Secure File Transfer Protocol. Beide protocollen zijn bedoeld om bestanden over te zetten. Echter vindt SFTP plaats over een beveiligde verbinding (namelijk SSH). Dit maakt SFTP veiliger dan FTP.
Eigen map
De onderstaande stappen dienen te worden uitgevoerd in een terminal. Meer info hierover in Werken met de Terminal.
Begin met het installeren van OpenSSH als dit nog niet geïnstalleerd is. Als u dit niet zeker weet, kunt u de onderstaande opdracht gewoon voor de zekerheid uitvoeren:
sudo apt-get install openssh-server
In /etc/ssh/sshd_config moet worden ingesteld dat OpenSSH de interne SFTP gebruikt. Wijzig de configuratie:
sudo nano /etc/ssh/sshd_config
als de Ubuntu desktop geïnstalleerd is kan ook gksudo gedit /etc/ssh/sshd_config gebruikt worden.
Zoek de regel met Subsystem en maak daarvan:
Subsystem sftp internal-sftp
Maak een Match aan. Hiermee krijgen bepaalde gebruikers een eigen (beperkte) toegang. Dit kun je doen door onderaan het bestand de onderstaande regels toe te voegen:
Match group sftponly ChrootDirectory /home/%u X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp
LET OP: dit moet onderaan het bestand staan. Anders kun je niet meer via SSH inloggen als je ssh herstart.
Sla de nieuwe configuratie op.
Maak een gebruikersgroep aan voor de gebruikers met beperkte toegang. In dit voorbeeld noemen we deze groep sftponly.
sudo addgroup sftponly
Maak een gebruikersnaam aan. In dit voorbeeld is de gebruikersnaam gast.
sudo adduser --home / --ingroup sftponly gast
Maak de map aan voor de gebruiker gast:
sudo mkdir /home/gast
Herstart ssh:
sudo /etc/init.d/ssh restart
De gebruiker gast kan nu inloggen maar is beperkt tot (lezen van) de map /home/gast.
Om het mogelijk te maken bestanden te plaatsen kan een submap met schrijfrechten worden gemaakt:
sudo mkdir /home/gast/uploads sudo chgrp sftponly /home/gast/uploads sudo chmod g+w /home/gast/uploads
Gebruiker gast kan bestanden plaatsen in de map uploads
Inloggen
Log vanaf een andere computer in als gast:
sftp gast@ipadres
De opdracht pwd toont de huidige map en als het goed is:
$ pwd Remote working directory: /
Filezilla is een grafische client voor SFTP en FTP ( sudo apt-get install filezilla ) . Voor Windows computers is WinSCP een optie.
Het is veiliger om in plaats van wachtwoorden sleutels te gebruiken om in te loggen. Meer info hierover is te vinden op de pagina over SSH-sleutels
Meerdere gebruikers delen een map
Hierboven is uitgelegd hoe toegang van gebruikers beperkt kan worden tot hun eigen map. In dit gedeelte wordt er beschreven hoe de toegang (voor een groep stfp gebruikers) beperkt kan worden tot dezelfde map. Bijvoorbeeld wanneer u met meerdere mensen dezelfde bestanden wilt delen.
Er wordt vanuit gegaan dat bovenstaande stappen voor het beperken tot een "Eigen map" zijn uitgevoerd.
Opzetten
Maak een gezamelijke map voor de groep SFTP-gebruikers (de groep sftponly). In dit voorbeeld /srv/share maar een andere map is ook mogelijk. Plaats deze map op een schijfpartitie met voldoende vrije ruimte, bij voorkeur gescheiden van het besturingssysteem.
sudo mkdir /srv/share
Wijzig de configuratie:
sudo nano /etc/ssh/sshd_config
Zoek de regel met Match group sftponly:
Match group sftponly ChrootDirectory /home/%u
Wijzig de regel met ChrootDirectory /home/%u in:
ChrootDirectory /srv/share
Sla de nieuwe configuratie op en herstart ssh:
sudo /etc/init.d/ssh restart
Op dit moment kunnen gebruikers van de groep sftponly bestanden toevoegen in dezelfde map. Om het voor deze groep gebruikers mogelijk te maken om ook bestanden te plaatsen kan er een submap met schrijfrechten worden gemaakt:
cd /srv/share sudo mkdir uploads sudo chgrp sftponly uploads sudo chmod g+w uploads
De gebuikers kunnen nu bestanden plaatsen in de map uploads. Om dit te verduidelijken kunt u het onderstaande uitvoeren:
cd /srv/share/ sudo touch zet.nieuw.bestanden.in.uploads
Test of het werkt door in te loggen en een bestand te uploaden.
Als de stappen voor het beperken tot een Eigen map zijn uitgevoerd kan de eigen map van sftp-gebruiker gast /home/gast worden verwijderd. In plaats hiervan wordt nu de gezamelijke map /srv/share gebruikt.
Meer gebruikers toevoegen
Met een adduser opdracht kan een nieuwe sftp gebruiker worden gemaakt voor de gedeelde map.
Vervang GEBRUIKERSNAAM door de gewenste gebruikersnaam.
sudo adduser --home / --no-create-home --ingroup sftponly GEBRUIKERSNAAM
Nadat u het wachtwoord hebt ingevoerd, kan de rest leeggelaten worden.
Permissies
De map /srv/share heeft als eigenaar en groep root en dit moet zo blijven! U mag wel submappen maken met andere rechten. Dit heeft te maken 'chroot'. De sftponly gebruikers hebben alleen schrijfrechten op de map uploads. Waarschijnlijk wilt u zelf makkelijk bestanden in alle mappen kunnen zetten. Dit kan bijvoorbeeld door zelf (EIGEN-GEBRUIKERSNAAM) eigenaar van de submappen te worden met de opdracht:
sudo chown EIGEN-GEBRUIKERSNAAM /srv/share/*
Als u iets kopieert van uploads naar een andere map zal het de eigenaar van degene die het bestand heeft toegevoegd overnemen. Het is ook mogelijk om de gebruiker die kopieert eigenaar te maken. Dit doet u door het volgende commando uit te voeren:
chmod +s /srv/share/*
Opmerkingen
- In principe kun je dit artikel voor elke Linux-distributie volgen. De enige eis is OpenSSH versie 4.8p1 of hoger, welke standaard in het pakketbeheer van Ubuntu wordt meegeleverd sinds versie 9.04.
Ter inspiratie is het artikel OpenSSH SFTP chroot() with ChrootDirectory gebruikt.