De meest gebruikte FTP-servers binnen Linux zijn PureFTPd, ProFTPD en vsftpd. Een overzicht van de verschillen vind je op deze website. Wij raden ProFTPD af omdat het minder goed onderhouden wordt dan PureFTPd en vsftpd.
Een FTP-server biedt je een eenvoudige methode om bestanden naar je VPS of instance te uploaden. Dit is bijvoorbeeld handig voor een webserver om updates van websites op je server te plaatsen, of bij een mediaserver om bestanden te uploaden.
In deze handleiding laten wij zien hoe je met vsftpd (Very Secure FTP Daemon) een FTP-server in een Linux-distributie installeert en configureert, en Let's Encrypt gebruikt om een veilige FTPS-verbinding op te zetten.
Gebruik je liever SFTP? Raadpleeg dan deze handleiding.
De FTP-server installeren en configureren
Stap 1
Verbind met je server via SSH, de VPS-console (VPS) of de OpenStack-console (OpenStack-instance).
Stap 2
Installeer vsftpd met het commando:
Ubuntu/Debian:
sudo apt -y install vsftpd
AlmaLinux/Rocky Linux/CentOS Stream:
sudo dnf -y install vsftpd
vsftpd start automatisch na de installatie en herstarts van je OS.
Stap 3
Voor je je FTP-server start, maak je enkele aanpassingen in de configuratie van vsftpd, met als doel toegang tot je FTP-server specifieker af te stellen.
Open het configuratiebestand met nano of vi:
sudo nano /etc/vsftpd.conf
Stap 4
Pas de volgende instellingen aan/voeg ze toe als ze nog niet bestaan (neem eerst de toelichting door voor je deze instellingen aanpast). Sla de wijzigingen op en sluit het bestand met de toetsencombinatie ctrl + x > y > enter.
anonymous_enable=no
chroot_local_user=YES
allow_writeable_chroot=YES
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO
pasv_enable=Yes
pasv_min_port=20100
pasv_max_port=20200
- anonymous_enable=NO: Voorkomt dat niet-geïdentificeerde gebruikers kunnen inloggen op je FTP-server.
- chroot_local_user=YES: Plaatst FTP-gebruikers in hun eigen home directory (i.e. een chroot jail) na het inloggen op je FTP-server.
- allow_writeable_chroot=YES: Geeft FTP-gebruikers toestemming om wijzigingen te maken in de chroot directory (i.e. de eigen home directory).
- userlist_enable=YES: Schakelt de vsftpd-userlist in, waarmee je gebruikers toestemming kunt geven, of toegang verbieden, tot je FTP-server.
- userlist_file=/etc/vsftpd.userlist: De locatie van de hierboven beschreven userlist.
- userlist_deny=NO: Enkel de user accounts in de userlist file mogen inloggen op je FTP-server. Zet je de optie op 'YES', dan geeft de userlist geen toestemming, maar verbiedt het toegang tot je FTP-server.
- pasv_enable=Yes: Voor het gebruik van vsftpd is het gebruik van passive ports nodig: hiermee zorg je ervoor dat wanneer de verbinding naar poort 21 is opgezet dat voor de daadwerkelijke data transfer de passieve ports gebruikt worden.
- pasv_min_port=20100: Het laagste nummer van de passive port range. In principe is iedere ongebruikte poort boven 1023 die niet gebruikt wordt toereikend.
- pasv_max_port=20200: Het hoogste nummer van de passive port range. Een kleine range van max 100 poorten is normaliter meer dan toereikend.
Stap 5
Ubuntu komt out-of-the-box met UFW als firewall, waarin alle poorten by default dicht staan. Open poort 21 met de commando's:
Ubuntu/Debian:
sudo ufw allow 21/tcp
sudo ufw allow 20100:20200/tcp
AlmaLinux/Rocky Linux/CentOS Stream:
sudo firewall-cmd --zone=public --permanent --add-port=21/tcp
sudo firewall-cmd --zone=public --permanent --add-port=20100-20200/tcp
sudo firewall-cmd --reload
Gebruikers aanmaken en toegang geven tot je FTP-server
In de vorige stappen heb je de vsftpd-userlist optie ingeschakeld, samen met de aanvullende optie dat enkel gebruikersaccounts in de userlist-file toegang hebben tot je FTP-server. In dit onderdeel maak je (optioneel) een nieuwe gebruiker aan, en voeg je de gebruiker toe aan de userlist.
Stap 1
Je maakt FTP-gebruikers op dezelfde manier aan als normale gebruikers binnen Linux. Wil je een bestaand gebruikersaccount gebruiken? Ga dan verder met stap 3.
sudo useradd -m -c "ftp demo" username
sudo passwd username
Toelichting code
- -m: maakt een home directory voor de gebruiker aan. Dit is optioneel en enkel nodig als je daadwerkelijk de user een home directory op je VPS wil geven in /home/username. Geef je de user in het deel 'Home directories van gebruikers aanpassen' een home directory die zich niet in /home bevindt? Dan kun je -m weglaten.
- -c: is eveneens optioneel en voegt een comment toe aan de gebruiker. Dit is vooral handig om een notitie voor jezelf te maken waarvoor een account dient.
- username: de daadwerkelijke gebruikersnaam
- passwd username: geeft de gebruiker een wachtwoord
Optioneel:
Optioneel kun je ook de FTP-gebruikers een specifieke directory geven als home directory en lid maken van een groep door een FTP-groep aan te maken, bijvoorbeeld:
sudo groupadd ftp
sudo useradd -g ftp -d /ftp/username -c "ftp demo" username
sudo passwd username
Stap 2
Open het userlist-bestand met:
sudo nano /etc/vsftpd.userlist
Stap 3
Voeg de naam van de gebruiker toe aan het bestand, sla de wijzigingen op en sluit nano met ctrl + x > y > enter. Iedere gebruikersnaam wordt op een nieuwe regel toegevoegd, bijvoorbeeld:
transip
admin
username
Tip: alternatief kun je ook de gebruikersnaam in één keer met een commando aan het bestand toevoegen:
echo "gebruikersnaam" | sudo tee -a /etc/vsftpd.userlist
Home directories van gebruikers aanpassen
Dankzij de eerdere configuratie komen FTP-gebruikers standaard in hun home directory terecht. In deze paragraaf laten wij zien hoe je optioneel specifieke directories instelt. Dit is bijvoorbeeld handig als je gebruikers naar een specifieke directory wil leiden waar hun website in staat (bij webservers), of bijvoorbeeld een specifieke map (e.g. Block Storage) op een mediaserver.
Stap 1
Wil je een bestaande map gebruiken? Ga dan verder met stap 3. Bestaat de map nog niet? Maak die dan eerst aan en verwijder alle schrijfrechten voor alle gebruikers (vervang gebruikersnaam door de naam van de gebruiker).
Ubuntu/Debian:
sudo mkdir /home/gebruikersnaam/ftp
sudo chown nobody:nogroup /home/gebruikersnaam/ftp
sudo chmod a-w /home/gebruikersnaam/ftp
AlmaLinux/Rocky Linux/CentOS Stream:
sudo mkdir /home/gebruikersnaam/ftp
sudo chown nobody:nobody /home/gebruikersnaam/ftp
sudo chmod a-w /home/gebruikersnaam/ftp
Stap 2
Maak de directory aan waar de gebruiker bestanden in mag plaatsen en geef enkel die gebruiker volledige rechten tot de map. Vervang ‘gebruikersnaam’ door de naam van de gebruiker:
sudo mkdir /home/gebruikersnaam/ftp/files
sudo chown gebruikersnaam:gebruikersnaam /home/gebruikersnaam/ftp/files
sudo chmod 0700 /home/gebruikersnaam/ftp/files
Je stelt nu de home directory van je gebruikers in. Open opnieuw het configuratiebestand van VSFTP:
sudo nano /etc/vsftpd.conf
Stap 4
Voeg de volgende twee regels toe onderaan in het bestand:
user_sub_token=$USER
local_root=/home/$USER/ftp/
- user_sub_token=$USER: de naam van de gebruiker die met je FTP-server verbindt, wordt gebruikt voor de variabele $USER
-
local_root:de directory waar je FTP gebruikers terecht komen. In dit voorbeeld is het de map ftp in de eigen home directory. Tenzij je meer mappen toevoegt in de ftp directory, kun je hier net zo goed direct /home/$USER/ftp/files gebruiken.
- Stel dat je bijvoorbeeld Block Storage aan je VPS gekoppeld hebt en die wil gebruiken (e.g. voor een mediaserver), dan gebruik je local_root=/mnt/bigstorage/ (vervang /mnt/bigstorage/ door de daadwerkelijke map waar je Block Storage gemount is).
- Host je websites (in /var/www/html/) en heb je in de vorige paragraaf je domein als gebruikersnaam gebruikt? Dan zou je hier local_root=/var/www/html/$USER instellen.
Sla de wijzigingen op en sluit het bestand met de toetsencombinatie ctrl + x > y > enter.
Stap 5
Herstart tot slot vsftpd om de nieuwe configuratie toe te passen. Het kan soms een paar minuten duren voor je een dergelijke configuratiewijziging terugziet wanneer je verbindt via je FTP-client.
sudo systemctl restart vsftpd
Je FTP-server beveiligen
Het FTP-protocol versleutelt geen gegevens en is dus onveilig. In de praktijk wordt daarom doorgaans altijd SFTP of FTPS gebruikt (zie dit artikel voor een toelichting op de verschillen). In dit deel van de handleiding beveilig je je FTP-server met FTPS.
Voor deze stappen is een (sub)domein nodig waarvan minimaal het A-record verwijst naar je FTP-server.
Stap 1
Als SSL(TLS)-certificaat gebruiken we een Let's Encrypt-certificaat. Voor de installatie van Let's Encrypt raadt Let's Encrypt aan om Snap te gebruiken.
- Installeer eerst Snap.
- Verwijder eventueel reeds aanwezige Certbot-installaties (de tool die gebruikt wordt om Let's Encrypt certificaten te genereren)
- Installeer vervolgens Certbot met Snap
- Maak vervolgens een symbolic link aan zodat je certbot-commando's rechtstreeks kunt uitvoeren
Ubuntu/Debian:
sudo apt -y install snapd
sudo apt -y remove certbot
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
AlmaLinux/Rocky Linux/CentOS Stream:
sudo dnf -y install snapd
sudo systemctl enable --now snapd.socket
sudo dnf -y remove certbot
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Stap 2
Het is voor de validatie belangrijk dat poort 80 en 443 open staan in je firewall. Indien ze nog niet open staan gebruik je de commando's:
Ubuntu/Debian:
sudo ufw allow 80,443/tcp
AlmaLinux/Rocky Linux/CentOS Stream:
sudo firewall-cmd --zone=public --permanent --add-port=80/tcp
sudo firewall-cmd --zone=public --permanent --add-port=443/tcp
sudo firewall-cmd --reload
Stap 3
Het is belangrijk dat poort 80 en 443 momenteel niet in gebruik zijn. Dit controleer je door net-tools te installeren en netstat te gebruiken:
Ubuntu/Debian:
sudo apt -y install net-tools
sudo netstat -tulpn | less
AlmaLinux/Rocky Linux/CentOS Stream:
sudo dnf -y install net-tools
sudo netstat -tulpn
Je krijgt een overzicht te zien dat lijkt op het volgende:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.54:53 0.0.0.0:* LISTEN 628/systemd-resolve
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 1184/exim4
tcp 0 0 0.0.0.0:45123 0.0.0.0:* LISTEN 1/init
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 628/systemd-resolve
tcp6 0 0 :::80 :::* LISTEN 801/apache2
tcp6 0 0 :::21 :::* LISTEN 15788/vsftpd
tcp6 0 0 :::25 :::* LISTEN 1184/exim4
tcp6 0 0 :::45123 :::* LISTEN 1/init
tcp6 0 0 :::443 :::* LISTEN 801/apache2
udp 0 0 127.0.0.54:53 0.0.0.0:* 628/systemd-resolve
udp 0 0 127.0.0.53:53 0.0.0.0:* 628/systemd-resolve
udp 0 0 12.123.123.2:68 0.0.0.0:* 672/systemd-network
Zoals je ziet zijn beide poorten in gebruik door apache2. Stop de betreffende service tijdelijk, in dit geval met:
sudo systemctl stop apache2
Stap 4
Genereer vervolgens een certificaat met het onderstaande commando. Vervang hier ftp.voorbeeld.nl door je hostname (te controleren met het commando hostnamectl) en admin@voorbeeld.nl door het mailadres waarmee je de certificaten wil beheren.
sudo certbot certonly --standalone -d ftp.voorbeeld.nl -m admin@voorbeeld.nl --agree-tos --non-interactive
Herstart vervolgens eventueel gestopte services weer, bijvoorbeeld:
sudo systemctl start apache2
Stap 5
Je Let's Encrypt-certificaat en keyfile zijn opgeslagen in /etc/letsencrypt/live/<hostname>/ (de exacte locatie staat in de output van het commando in stap 4).
Vervolgens pas je de vsftpd-configuratie aan om inderdaad de Let's Encrypt-certificaten te gebruiken en onveilige verbindingen te weigeren. Open opnieuw /etc/vsftpd.conf:
nano /etc/vsftpd.conf
Stap 6
Voeg de volgende configuratie toe onderaan het bestand, waarbij je server.voorbeeld.nl vervangt door je hostname.
ssl_enable=YES
allow_anon_ssl=NO
require_ssl_reuse=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1_1=YES
ssl_tlsv1_2=YES
ssl_tlsv1_3=YES
# schakel onveilige protocollen uit
ssl_tlsv1=NO
ssl_sslv2=NO
ssl_sslv3=NO
# de locaties waar de bestanden van je certificaat staan
rsa_cert_file=/etc/letsencrypt/live/server.voorbeeld.nl/fullchain.pem
rsa_private_key_file=/etc/letsencrypt/live/server.voorbeeld.nl/privkey.pem
Niet alle FTP-clients kunnen met dezelfde instellingen overweg. Deze stappen zijn getest in FileZilla. Oudere FTP-clients kunnen de optie ssl_tlsv1=YES nodig hebben. Let wel dat het veiliger is om dan een nieuwere FTP client te gebruiken.
Stap 7
Je bent nu zo goed als klaar: je hoeft enkel nog vsftpd te herstarten met commando hieronder.
sudo systemctl restart vsftpd
Tot slot volgt het leukste onderdeel: je kunt nu je verbinding testen!
Verbinden met je vsftpd-server
Om met je FTP-server te verbinden, gebruik je de onderstaande instellingen. De screenshot eronder laat een voorbeeld zien in FileZilla.
- Protocol: FTP - File Transfer Protocol (of FTPS als je FTP-applicatie die expliciet noemt)
- Host: Het IP-adres van je FTP-server of een (sub)domein dat ernaar verwijst. Het (sub)domein is dezelfde als degene waarvoor je optioneel een SSL-certificaat hebt gegenereerd.
- Port: 21
- Encryption: Indien je een SSL-certificaat gebruikt raden we ‘Require explicit FTP over TLS’ aan. Zo niet (onveilig), dan volstaat ‘Use explicit FTP over TLS if available’.
- Logon Type: normal (nooit anonymous).
- User: Een eerder aangemaakt FTP-gebruikersaccount.
- Password: Het wachtwoord van de hierboven genoemde User.
