I can not cage ftp users :(

April 21, 2017 295 views
Nginx Firewall WordPress Ubuntu Ubuntu 16.04

Hello everyone :) I have been in a big predicament that may be so simple to solve, I have installed a ubuntu server with wordpress and vsftpd for the FTP server, I have tried to cage users or ftp clients of my server for 8 hours , Ie trying to make ftp users unable to access other directories outside the /home folder of their files, but it happens even with the vsftpd configuration:

chrootlocaluser = YES
Chrootlistenable = YES

It does not work, it still allows ftp users to exit their directories using the folder I want to hide that has as name: / ... and then there they access or view all the files on the root system and I want to hide all that for ftp clients Of filezilla. I have also created the special chroot_list file in your home directory /etc folder

this my code of vsftpd:

# Example config file /etc/vsftpd.conf
# The default compiled in settings are fairly paranoid. This sample file
# loosens things up a bit, to make the ftp daemon more usable.
# Please see vsftpd.conf.5 for all compiled in defaults.
# READ THIS: This example file is NOT an exhaustive list of vsftpd options.
# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
# capabilities.
# Run standalone?  vsftpd can run either from an inetd or as a standalone
# daemon started from an initscript.
# This directive enables listening on IPv6 sockets. By default, listening
# on the IPv6 "any" address (::) will accept connections from both IPv6
# and IPv4 clients. It is not necessary to listen on *both* IPv4 and IPv6
# sockets. If you want that (perhaps because you want to listen on specific
# addresses) then you must run two copies of vsftpd with two configuration
# files.
# Allow anonymous FTP? (Disabled by default).
# Uncomment this to allow local users to log in.
# Uncomment this to enable any form of FTP write command.
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
# Uncomment this to allow the anonymous FTP user to upload files. This only
# has an effect if the above global write enable is activated. Also, you will
# obviously need to create a directory writable by the FTP user.
# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
# Activate directory messages - messages given to remote users when they
# go into a certain directory.
# If enabled, vsftpd will display directory listings with the time
# in  your  local  time  zone.  The default is to display GMT. The
# times returned by the MDTM FTP command are also affected by this
# option.
# Activate logging of uploads/downloads.
# Make sure PORT transfer connections originate from port 20 (ftp-data).
# If you want, you can arrange for uploaded anonymous files to be owned by
# a different user. Note! Using "root" for uploaded files is not
# recommended!
# You may override where the log file goes if you like. The default is shown
# below.
# If you want, you can have your log file in standard ftpd xferlog format.
# Note that the default log file location is /var/log/xferlog in this case.
# You may change the default value for timing out an idle session.
# You may change the default value for timing out a data connection.
# It is recommended that you define on your system a unique user which the
# ftp server can use as a totally isolated and unprivileged user.
# Enable this and the server will recognise asynchronous ABOR requests. Not
# recommended for security (the code is non-trivial). Not enabling it,
# however, may confuse older FTP clients.
# By default the server will pretend to allow ASCII mode but in fact ignore
# the request. Turn on the below options to have the server actually do ASCII
# mangling on files when in ASCII mode.
# Beware that on some FTP servers, ASCII support allows a denial of service
# attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd
# predicted this attack and has always been safe, reporting the size of the
# raw file.
# ASCII mangling is a horrible feature of the protocol.
# You may fully customise the login banner string:
#ftpd_banner=Welcome to blah FTP service.
# You may specify a file of disallowed anonymous e-mail addresses. Apparently
# useful for combatting certain DoS attacks.
# (default follows)
# You may restrict local users to their home directories.  See the FAQ for
# the possible risks in this before using chroot_local_user or
# chroot_list_enable below.
# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
# (Warning! chroot'ing can be very dangerous. If using chroot, make sure that
# the user does not have write access to the top level directory within the
# chroot)
# (default follows)
# You may activate the "-R" option to the builtin ls. This is disabled by
# default to avoid remote users being able to cause excessive I/O on large
# sites. However, some broken FTP clients such as "ncftp" and "mirror" assume
# the presence of the "-R" option, so there is a strong case for enabling it.
# Customization
# Some of vsftpd's settings don't fit the filesystem layout by
# default.
# This option should be the name of a directory which is empty.  Also, the
# directory should not be writable by the ftp user. This directory is used
# as a secure chroot() jail at times vsftpd does not require filesystem
# access.
# This string is the name of the PAM service vsftpd will use.
# This option specifies the location of the RSA certificate to use for SSL
# encrypted connections.

# Uncomment this to indicate that vsftpd use a utf8 filesystem.

2 Answers


The issue you're experiencing is actually in the following text:

# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
# (Warning! chroot'ing can be very dangerous. If using chroot, make sure that
# the user does not have write access to the top level directory within the
# chroot)

Your current configuration is:

# (default follows)

In the above, if chroot_local_user is set to YES, then the list you provide becomes a list of users not to chroot.

So if you have users in that list and those users happen to be the users you're having issues with, they need to be removed. Or, you can simply comment out the last two lines.

# (default follows)

You would then save and restart vsftp.


As a general note, FTP is relatively insecure and I would honestly recommend using SFTP over FTP for the security. SFTP is built-in to SSH (OpenSSH) which is already installed (it's what you use to get in to your Droplet via SSH), and requires only a few small configuration changes to a single file.

When setup properly, the only thing you need to worry about is making sure each user is a member of the right group.

For example, on Ubuntu, we'd be working with this file:


To start, we'd open the file:

nano /etc/ssh/sshd_config


Subsystem sftp /usr/lib/openssh/sftp-server

Replace it with:

Subsystem sftp internal-sftp


UsePAM yes

Below it, add:

Match Group sftpusers
    ChrootDirectory %h
    ForceCommand internal-sftp
    X11Forwarding no
    AllowTCPForwarding no
    PasswordAuthentication yes

... save and close the file.

Add the group sftpusers using:

groupadd sftpusers

Restart SSH:

service ssh restart


Now when we want to add a new user, we'd do the following.

Create a Home Directory

mkdir -p /home/newuser/public

Create a New User

Passing -d tells useradd that the directory we specify is the users home directory.

useradd -d /home/newuser newuser

Add User to sftpusers Group

usermod -aG sftpusers newuser

Setup Initial Permissions

The root directory, /home/newuser needs to be owned by root, which is why we're using the added /* at the end of this command. It ensures that we're only changing ownership of the files and directories inside of this directory, and not the directory itself.

chown -R newuser:newuser /home/newuser/*

Set a Password

passwd newuser

With that, the user newuser is chroot'ed to /home/newuser.


You could even automate this with a Bash Script so you're not having to type in those commands every single time you want to create a new user.

#!/usr/bin/env bash

usercheck=$(id -u ${username} > /dev/null 2>&1; echo $?)

if [ "${usercheck}" -eq 0 ]; then
    echo "User already exists."
    exit 1
    mkdir -p ${userhome}/{public,private} \
    && useradd -d ${userhome} ${username} \
    && usermod -aG sftpusers ${username} \
    && chown -R ${username}:${username} ${userhome}/*

You can modify {public,private} to be whatever directories you wish to create for new users. If you wanted, that could be {public_html,private_html} or any combination you need. The brackets are there for expansion and prevent having to run mkdir on each directory.

mkdir -p ${userhome}/{public,private} is equivalent to:

mkdir -p ${userhome}/public
mkdir -p ${userhome}/private

Simply copy and paste that in to a file -- for example newuser.sh -- then:

chmod +x adduser.sh

And run it with a single argument passed -- the user you wish to create.

./adduser.sh newuser
./adduser.sh mynewuser
./adduser.sh demouser

It's just a quick way to add new users. It won't modify existing users, though you can use the commands above to modify any existing user too.

You'd still need to use passwd to set the password for each user. Also, users would be connecting over SFTP on Port 22, instead of FTP on Port 21.

  • Hello, wow thank you very much for your answer and more for the time to help me, I have not yet done all the steps for sftp, but if the first steps for the chroot, I have commented again those 2 lines of codes that you mentioned to make it work Of the chroot, but when commenting and leaving only chroot_local_user = YES gives me a small error from filezilla which is the following:

    Answer 500 OOPS: vsftpd: refusing to run with writable root inside chroot ()
    Error: Critical error: Could not connect to server
    • @SmilJimenez

      If you only use the list and specify each user, like so:

      # (default follows)

      ... and then restart vsftp, does that work?

      If neither are working:

      1). Have you setup users with their home directories passing -d at creation?

      2). What directory structure are you using (i.e. /home/username/....)?

      3). What permissions are setup for the directories?

      4). Who owns the directories?


      For #1 -- when creating a user, much like in my SFTP guide, you should pass the -d option flag to set their home directory.


      useradd -d /home/myuser myuser

      Once the user is created, you can use usermod to change their directory:

      usermod -d /home/myuser myuser
      • Hello, thank you very much has worked me the second method of creating it SFTP form, but I do not know why when creating a user without SFTP, ie without security with ssh does not connect only I throw error, but I worked with e SFTP and User is locked from your directory :) Thanks!

      • Hello again, I solved it, even if you do not believe it, you helped me a lot!!! :D I have finally learned how to properly configure ftp users thanks to you my dear friend! Really thank you!! You are amazing!!

Have another answer? Share your knowledge.