I can not cage ftp users :(

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:

chroot_local_user = YES Chroot_list_enable = 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.

Submit an answer

This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Sign In or Sign Up to Answer

These answers are provided by our Community. If you find them useful, show some love by clicking the heart. If you run into issues leave a comment, or add your own answer to help others.


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 – then:

chmod +x

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

./ newuser
./ mynewuser
./ 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.

This comment has been deleted