vsFTPd gebruiken als veilige ftp server
Op deze pagina:
VSFTPD(very secure FTP daemon) is een open-source FTP(File Transfer Protocol) server. VSFTPD ondersteund TLS(Transport-Layer Security), FTPS(File Transfer Protocol Secure) en IPv6.
VSFTPD is een FTP server voor Linux, als deze nog niet is geïnstalleerd, dan kun je vsftpd installeren via je package manager. Op Debian/Ubuntu systemen is dat apt, op Fedora is dat dnf.
# doe eerst een update
sudo apt update -y
# installeer dan vsftpd
sudo apt install vsftpd
Poorten voor vsftp openzetten in de firewall
Om met vsftpd te kunnen werken moeten er een aantal poorten worden opengezet in je firewall.
Hier als voorbeeld hoe je deze poorten openzet in ufw:
# controleer de status van de firewall
sudo ufw status
# de poorten voor vsftpd openzetten:
sudo ufw allow 20,21,990/tcp
# om clients verbinding te laten maken in passive mode moet je ook deze poorten nog openzetten:
sudo ufw allow 40000:50000/tcp
# controleer of het goed is ingesteld:
sudo ufw status verbose
De vsftpd server instellen
Het configuratiebestand voor vsftpd is /etc/vsftpd.conf. Dit configuratiebestand werkt zoals andere configuratiebestanden: regels die met een hekje '#' beginnen zijn commentaar en worden genegeerd. Lege regels worden ook genegeerd. Door bij een commentaarregel het hekje '#' waar de regel mee begint te verwijderen, haal je de regel uit het commentaar en maak je deze actief in de configuratie.
# maak voor de zekerheid eerst een backup van het configuratiebestand:
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
# open het bestand in een editor om het te kunnen bewerken:
sudo nano /etc/vsftpd.conf
Wat je moet aanpassen:
anonymous_enable moet je op NO zetten, anonieme gebruikers zijn bedoeld voor het publiekelijk delen van bestanden, dat wil je meestal niet op je eigen server.
local_enable moet je op YES zetten zodat gebruikers met een account op je server bestanden kunnen overzetten via ftp.
write_enable moet je op YES zetten zodat gebruikers bestanden kunnen uploaden naar je ftp server.
chroot_local_user moet je op YES zetten omdat je ftp gebruiker niet als root moet werken, anders heeft de ftp gebruiker toegang tot je hele server.
allowed_writeable_chroot moet je op YES zetten omdat je anders via chroot_local_user niet mag schrijven.
pasv_min_port moet je op de lage poort (ondergrens) voor passieve ftp verbindingen zetten zoals je die hebt ingesteld in je firewall (40000)
pasv_max_port moet je op de hoge poort (bovengrens) voor passieve ftp verbindingen zetten zoals je die hebt ingesteld in je firewall (50000)
user_sub_token moet je op $USER zetten, samen met d instelling voor local_root zorgt dit ervoor dat ftp gebruikers op hun eigen home directory worden ingesteld voor ftp
local_root moet je op /home/$USER/ftp zetten
Voeg aan het einde van het configuratiebestand deze regels toe om in het bestand /etc/vsftpd.userlist precies te kunnen aangeven welke gebruikers toegang hebben tot je ftp server:
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO
Sla ten slotte het configuratie bestand op en maak het actief door vsftpd te herstarten:
sudo service vsftpd restart
Een speciale gebruiker aanmaken voor de ftp
Het is veiliger om de ftp server niet als root te gebruiken, maar als een gewone gebruiker. Bij voorkeur een gebruiker die je nergens anders voor gebruikt, dus een gebruiker speciaal voor de ftp. Als die gebruiker er nog niet is, moet je deze eerst aanmaken, hier als voorbeeld wordt deze gebruker 'ftp_gebruiker' genoemd:
sudo adduser ftp_gebruiker
Zorg dat deze gebruiker een sterk wachtwoord heeft, want hiermee zul je met de ftp server verbinden.
Om deze gebruiker toegang te geven tot de ftp server, moet deze gebruiker worden toegevoegd aan /etc/vsftpd.userlist:
echo "ftp_gebruiker" | sudo tee -a /etc/vsftpd.userlist
De permissies voor de directories moeten ook goed worden gezet.
Eerst de nieuwe /home/ftp_gebruiker/ftp directory:
sudo mkdir /home/ftp_gebruiker/ftp
# Eigenaar van /home/ftp_gebruiker/ftp moet 'nobody' worden:
sudo chown nobody:nogroup /home/ftp_gebruiker/ftp
# schrijf (w) en lees (a) rechten instellen:
sudo chmod a-w /home/ftp_gebruiker/ftp
Nu de nieuwe /home/ftp_gebruiker/ftp/upload directory:
sudo mkdir /home/ftp_gebruiker/ftp/upload
# de eigennaar van /home/ftp_gebruiker/ftp/upload moet 'ftp_gebruiker' worden:
sudo chown ftp_gebruiker:ftp_gebruiker /home/ftp_gebruiker/ftp/upload
De rechten van de ftp gerbuiker beperken tot alleen ftp
De veiligheid van je systeem kun je verbereren door de speciale ftp gebruiker alleen toe te staan ftp te gebruiken en geen verdere toegang tot je systeem te geven. Je speciale ftp gebruiker mag geen toestemming meer hebben om via ssh in te loggen op de server.
Dit kun je regelen met een klein script dat je in de /bin directory plaatst:
# Dit script schakelt de elke ftp login van je speciale ftp gebruiker uit voor je ftp server.
# Het script laat dan een waarschuwing zien op het scherm die zegt dat deze gebruker beperkt is tot alleen ftp.
echo -e '#!/bin/sh\necho "Deze gebruiker heeft alleen toegang tot ftp."' | sudo tee -a /bin/ftponly
# De rechten op het script goed zetten, het moet uitvoerbaar worden.
sudo chmod a+x /bin/ftponly
# Het script toevoegen aan de shells
echo "/bin/ftponly" | sudo tee -a /etc/shells
# Het script als shell instellen voor de speciale ftp gebruiker
sudo usermod ftp_gebruiker -s /bin/ftponly
De speciale ftp gebruiker 'ftp_gebruiker' zal nu alleen nog ftp kunnen gebruiken op je server en niet meer via ssh toegang hebben tot je server.
Het logbestand van vsftpd
De standaard locatie voor het log van vsftpd is /var/log/vsftpd.log. In de configuratie wordt deze locatie bepaald door xferlog_file. De inhoud van het log bekijken kan met:
sudo more /var/log/vsftpd.log
ftps instellen
Gebruikersnamen en wachtwoorden worden met 'gewone' ftp zonder versleuteling verzonden. Door TLS in te schakelen kun je deze wel versleutelen, je gebruikt dan ftps.
Je hebt hiervoor een SSL certificaat nodig. Je kunt een SSL certificaar speciaal voor vsftpd als volgt aanmaken:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
Door -keyout en -out naar hetzelfde bestand te verwijzen, zullen het certificaat en de private key in hetzelfde bestand staan. Met -days 365 geef je dit certificaat een geldigheid van een jaar.
Tijdens het aanmaken van het certificaat zul je vragen moeten beantwoorden over je naam en adres. Bij Common Name (e.g. server FQDN or YOUR name) kun je het ip-adres van je server invullen.
Als je het certificaat hebt aangemaakt, moet je de configuratie van vsftpd weer aanpassen.
sudo nano /etc/vsftpd.conf
De regels die beginnen met rsa en waar de term snakeoil in voorkomt moet je in het commentaar plaatsen door er hekjes '#' voor te zetten:
# rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
# rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
Voeg dan deze regels toe:
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
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
require_ssl_reuse=NO
ssl_ciphers=HIGH
Sla het bestand op en herstart vsftpd:
sudo systemctl restart vsftpd
je kunt nu alleen nog verbinden via ftps.
Verbinden met de ftp server via Filezilla
De speciale ftp gebruiker kan nu verbinden met de server via een ftp programma zoals Filezilla. Hierbij is het van belang dat in Filezilla bij Encryption wordt gekozen voor Require explicit FTP over TLS, anders zal het verbinden mislukken. De poort die je moet gebruiken voor ftps is 990. Jies bij Logon type voor 'Ask for password'. Je krijgt bij het verbinden de vraag of je het certificaat wil accepteren. Accepteer deze en je kunt beginnen met het uploaden of downloaden van bestanden.
vsftpd starten
Je kunt vsftpd handmatig starten en je kunt vsftp elke keer als de server start automatisch laten starten
# handmatig starten:
sudo service vsftpd start
# automatisch laten starten:
sudo systemctl enable vsftpd
ftp via de opdrachtregel
In een terminal kun je ook ftp gebruiken, een ftp-programma zoals Filezilla heb je dan niet nodig.
Je kunt via ftp met de server verbinden met:
ftp server_ip_adres
Er zal dan gevraagd worden om je gebruikersnaam en je wachtwoord.
Als je in een terminal verbonden bent met een ftp server, dan kun je de volgende opdrachten gebruiken:
pwd huidige directory opvragen
ls lijst met bestanden opvragen
cd / naar een andere directory (in dit voorbeeld '/') gaan
bye afsluiten (de ftp sessie verlaten)
lcd lijst van bestanden opvragen op de lokale computer ipv op de server
lcd /home naar een andere directory (in dit voorbeeld '/home') gaan op de lokale computer ipv op de server
get mijnbestand 'mijnbestand' downloaden
mget bestand1 bestand2 meerdere bestanden downloaden
delete mijnbestand 'mijnbestand' verwijderen van de server
put mijnbestand 'mijnbestand' uploaden naar de server
mput bestand1 bestand2 meerdere bestanden uploaden naar de server
mkdir nieuwe_directory een nieuwe directory aanmaken (in dit voorbeeld 'nieuwe_directory')
rmdir mijn_directory een directory verwijderen van de server (in dit voorbeeld 'mijn_directory')
Er zijn twee modi voor bestandsoverdracht via ftp: ascii en binary. Je kunt deze termen als opdrachten gebruiken om te wisselen tussen de twee.