2

----------

Installing vsftpd on CentOS 7

The vsftpd package is available in the default CentOS repositories. To install it, issue the following command:

sudo yum install vsftpd

Once the package is installed, start the vsftpd daemon and enable it to automatically start at boot time:

sudo systemctl start vsftpd

sudo systemctl enable vsftpd

You can verify the vsftpd service is running by printing its status:

sudo systemctl status vsftpd

The output will look something like below, showing that the vsftpd service is active and running:

● vsftpd.service - Vsftpd ftp daemon    Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor preset: disabled)    Active: active (running) since Thu 2018-11-22 09:42:37 UTC; 6s ago  Main PID: 29612 (vsftpd)    CGroup: /system.slice/vsftpd.service            └─29612 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

Configuring vsftpd

Configuring the vsftpd service involves editing the /etc/vsftpd/vsftpd.conf configuration file. Most of the settings are well documented inside the configuration file. For all available options visit the official vsftpd page.

In the following sections, we will go over some important settings required to configure a secure vsftpd installation.

Start by opening the vsftpd configuration file:

sudo nano /etc/vsftpd/vsftpd.conf

1. FTP Access

We’ll allow access to the FTP server only the local users, find the anonymous_enable and local_enable directives and verify your configuration match to lines below:

/etc/vsftpd/vsftpd.conf

anonymous_enable=NOlocal_enable=YES

Copy

2. Enabling uploads

Uncomment the write_enable setting to allow changes to the filesystem such as uploading and deleting files.

/etc/vsftpd/vsftpd.conf

write_enable=YES

Copy

3. Chroot Jail

Prevent the FTP users to access any files outside of their home directories by uncommenting the chroot directive.

/etc/vsftpd/vsftpd.conf

chroot_local_user=YES

Copy

By default, when chroot is enabled vsftpd will refuse to upload files if the directory that users are locked in is writable. This is to prevent a security vulnerability.

Use one of the methods below to allow uploads when chroot is enabled.

4. Passive FTP Connections

vsftpd can use any port for passive FTP connections. We’ll specify the minimum and maximum range of ports and later open the range in our firewall.

Add the following lines to the configuration file:

/etc/vsftpd/vsftpd.conf

pasv_min_port=30000pasv_max_port=31000

Copy

5. Limiting User Login

To allow only certain users to login to the FTP server add the following lines after the userlist_enable=YES line:

/etc/vsftpd/vsftpd.conf

userlist_file=/etc/vsftpd/user_listuserlist_deny=NO

Copy

When this option is enabled you need to explicitly specify which users are able to login by adding the user names to the /etc/vsftpd/user_list file (one user per line).

6. Securing Transmissions with SSL/TLS

In order to encrypt the FTP transmissions with SSL/TLS, you’ll need to have an SSL certificate and configure the FTP server to use it.

You can use an existing SSL certificate signed by a trusted Certificate Authority or create a self-signed certificate.

If you have a domain or subdomain pointing to the FTP server’s IP address you can easily generate a free Let’s Encrypt SSL certificate.

In this tutorial, we will generate a self-signed SSL certificate using the openssl command.

The following command will create a 2048-bit private key and self signed certificate valid for 10 years. Both the private key and the certificate will be saved in a same file:

sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem

Once the SSL certificate is created open the vsftpd configuration file:

sudo nano /etc/vsftpd/vsftpd.conf

Find the rsa_cert_file and rsa_private_key_file directives, change their values to the pam file path and set the ssl_enable directive to YES:

/etc/vsftpd/vsftpd.conf

rsa_cert_file=/etc/vsftpd/vsftpd.pemrsa_private_key_file=/etc/vsftpd/vsftpd.pemssl_enable=YES

Copy

If not specified otherwise, the FTP server will use only TLS to make secure connections.

Restart the vsftpd Service

Once you are done editing, the vsftpd configuration file (excluding comments) should look something like this:

/etc/vsftpd/vsftpd.conf

anonymous_enable=NOlocal_enable=YESwrite_enable=YESlocal_umask=022dirmessage_enable=YESxferlog_enable=YESconnect_from_port_20=YESxferlog_std_format=YESchroot_local_user=YESlisten=NOlisten_ipv6=YESpam_service_name=vsftpduserlist_enable=YESuserlist_file=/etc/vsftpd/user_listuserlist_deny=NOtcp_wrappers=YESuser_sub_token=$USERlocal_root=/home/$USER/ftppasv_min_port=30000pasv_max_port=31000rsa_cert_file=/etc/vsftpd/vsftpd.pemrsa_private_key_file=/etc/vsftpd/vsftpd.pemssl_enable=YES

Copy

Save the file and restart the vsftpd service for changes to take effect:

sudo systemctl restart vsftpd

Opening the Firewall

If you are running a firewall you’ll need to allow FTP traffic.

To open port 21 (FTP command port), port 20 (FTP data port) and 30000-31000 (Passive ports range), issue the following commands:

sudo firewall-cmd --permanent --add-port=20-21/tcp

sudo firewall-cmd --permanent --add-port=30000-31000/tcp

Reload the firewall rules by typing:

firewall-cmd --reload

Creating an FTP User

To test our FTP server we will create a new user.

At this point your FTP server is fully functional and you should be able to connect to your server with any FTP client that can be configured to use TLS encryption such as FileZilla.

Disabling Shell Access

By default, when creating a user, if not explicitly specified the user will have SSH access to the server.

To disable shell access, we will create a new shell which will simply print a message telling the user that their account is limited to FTP access only.

Run the following commands to create the /bin/ftponly shell and make it executable:

echo -e '#!/bin/sh\necho "This account is limited to FTP access only."' | sudo tee -a  /bin/ftponly

sudo chmod a+x /bin/ftponly

Append the new shell to the list of valid shells in the /etc/shells file:

echo "/bin/ftponly" | sudo tee -a /etc/shells

Change the user shell to /bin/ftponly:

sudo usermod newftpuser -s /bin/ftponly

Use the same command to change the shell for other users you want to give only FTP access.

------