VSFTPD ( Very Secure File Transfer Protocol Daemon ) is an FTP server on ubuntu. It is a default FTP server in Ubuntu, CentOS, Fedora, NimbleX, Slackware and RHEL Linux. It is licensed under the GNU General Public License. VSFTPD is Optimized for security, performance, and stability, and it protects against many security problems found in other FTP servers.
FTP (File Transfer Protocol) is a network protocol that was widely used for moving files between a client and server.
SFTP comes with Linux Server preinstalled and works just like FTP. To install vsftpd, execute the following commands. It will update our package list and install the vsftpd daemon.
sudo apt update
sudo apt install vsftpd
After complete installation of vsftpd, The ftp service will automatically start. To check the status of vsftpd, write the following command
sudo service vsftpd status
Output
● vsftpd.service - vsftpd FTP server
Loaded: loaded (/lib/systemd/system/vsftpd.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2021-06-13 12:10:44 UTC; 2min 10s ago
Main PID: 16732 (vsftpd)
Tasks: 1 (limit: 1136)
Memory: 828.0K
CGroup: /system.slice/vsftpd.service
└─16732 /usr/sbin/vsftpd /etc/vsftpd.conf
Jun 13 12:10:44 Programbr-Test systemd[1]: Starting vsftpd FTP server...
Jun 13 12:10:44 Programbr-Test systemd[1]: Started vsftpd FTP server.
Output is showing vsftpd is active (running).
Configure the Firewall to Allow FTP
Open ports 20
(FTP data port) and 21
(FTP command port) for FTP, and ports 40000-50000
for the range of passive FTP, port 990
for TLS.
sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw allow 40000:50000/tcp
sudo ufw allow 990/tcp
Enable the firewall. Press y
and ENTER
if warned about disrupting the SSH connection.
sudo ufw allow OpenSSH
Reload the ufw by disabling and re-enabling ufw.
sudo ufw disable
output
Firewall stopped and disabled on system startup
sudo ufw enable
output
Command may disrupt existing ssh connections. Proceed with operation (y|n)?
Enter y
output
Firewall is active and enabled on system startup
To Check ufw status
sudo ufw status
output
Status: active
To Action From
-- ------ ----
20/tcp ALLOW Anywhere
21/tcp ALLOW Anywhere
40000:50000/tcp ALLOW Anywhere
990/tcp ALLOW Anywhere
OpenSSH ALLOW Anywhere
20/tcp (v6) ALLOW Anywhere (v6)
21/tcp (v6) ALLOW Anywhere (v6)
40000:50000/tcp (v6) ALLOW Anywhere (v6)
990/tcp (v6) ALLOW Anywhere (v6)
OpenSSH (v6) ALLOW Anywhere (v6)
Creating FTP User
We are going to create a new user that will use to log into FTP. Here I am creating a new user programbr
.
Write the following command to create a new FTP user.
sudo adduser programbr
The system will ask you to create a password. Create the New password and Retype new password.
You may also be asked to enter some contact information ( Full Name, Room Number, Work Phone, Home Phone, Other). You can just press ENTER to each of these. At last system will ask, Is the information correct? [Y/n]
, Enter Y.
Configuring VSFTPD Access
By default, vsftpd server configuration is stored at the location /etc/vsftpd.conf. Read more at official VSFTPD.CONF page.
We are going to allow the user with a local shell account to connect with FTP. Start by opening the vsftpd configuration file.
To open the vsftpd configuration file, enter the following command.
sudo nano /etc/vsftpd.conf
In vsftpd.conf
locate and uncomment the write_enable=YES
by removing #
. Doing this will allow users to allow filesystem changes, such as uploading files and removing files.
write_enable=YES
In vsftpd.conf
locate and uncomment the chroot_local_user=YES
by removing #
. Doing this will limit users to their home directory and prevent the FTP-connected user from accessing any files or commands outside their home directory.
chroot_local_user=YES
Limit the range of ports that can be used for passive FTP to make sure enough connections are available. By default, vsftpd
uses active mode. To use passive mode, we have to set the minimum and maximum range of ports. We can use any port for passive FTP connections. When the passive mode is enabled, the FTP client opens a connection to the server on a random port in the range we have chosen.
pasv_min_port=40000
pasv_max_port=50000
We can configure vstpd to allow certain user only (users have access only when they are explicitly added to a list). lets add the following line in vsftpd.conf to allow a certain user only.
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO
save the file and exit the editor.
userlist_deny
toggles the logic. When it is set to, YES
, users on the list are denied FTP access. When it is set to, NO
, only users on the list are allowed access.
We need to explicitly specify which users can log in by adding the user names to the /etc/vsftpd.userlist
(one user per line).
Since, we have already created FTP user using sudo adduser programbr
.
Now add user to /etc/vsftpd.userlist
. Using the -a
flag to append to the file.
echo "programbr" | sudo tee -a /etc/vsftpd.userlist
Now, Check FTP User using following command
cat /etc/vsftpd.userlist
output:
programbr
Restart the vsftpd service for changes to take effect.
sudo systemctl restart vsftpd
Securing FTP
FTP does not encrypt any data including user credentials. So, we will encrypt the FTP transmissions with TLS/SSL, we will need to have an SSL certificate and configure the FTP server to use it. We are going to create a self-signed certificate using openssl
.
We will generate a 2048-bit RSA key and self-signed SSL certificate that will be valid for 365 days. By setting both the -keyout
and -out
flags to the same value, the private key and the certificate will be located in the same file.
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
Provide address information for your certificate. Provide the required information when prompted or keep the default configuration by pressing Enter.
Generating a RSA private key
............+++++
.....+++++
writing new private key to '/etc/ssl/private/vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
Once the SSL certificate is created open the vsftpd configuration file again.
sudo nano /etc/vsftpd.conf
Find two lines that begin with rsa_
. Remove them and also change ssl_enable=NO
to ssl_enable=YES
.
Before, Withought change.
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO
Add the following lines that point to the certificate and private key we created.
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_enable=YES
Restart the vsftpd service for changes to take effect.
sudo systemctl restart vsftpd
Disabling Shell Access (Optional)
Now we are going to create a custom shell. That will print a message telling the user that their account is limited to FTP access only. This will not provide any encryption, but it will limit the access of a compromised account to files accessible by FTP. We are doing this because, by default, when creating a user, user will have SSH access to the server.
Run the following commands to create the ftponly
in the bin
directory.
sudo nano /bin/ftponly
Add a message This account is limited to FTP access only.
#!/bin/sh
echo "This account is limited to FTP access only."
Save and Exit the editor.
Change the permission and make it executable.
sudo chmod a+x /bin/ftponly
Now, Open shells
in etc
directory.
sudo nano /etc/shells
Add the following line.
/bin/ftponly
Change the user shell to /bin/ftponly
using the following command.
sudo usermod programbr -s /bin/ftponly
Now you can login into your ftp server using
ssh username@your_server_ip