Table of Contents

This is my first attempt at documentation so please don't hold anything against me if it is not clear. I like “vim” as my editor and have that installed so I will use that but feel free to use any other editor like “joe” if you feel more comfortable with it. Thanks to fonz for helping me out with my installation. This wouldn't be possible without him!

Why Use VSFTP?

Well, you may have a different reason but mine was that I simply wanted more control over my ftp client. I also wanted to force my users to use some sort of encryption. I have the DNS-321 which is a great little device and according to my reading these instructions should work for the DNS-323, DNS-343, and probably any CH3SNAS device.

How to Set Up VSFTPD

The first step is to install fun_plug. You can find the wiki http://dns323.kood.org/ and that should get you going. Or you can use these instructions http://www.iterasi.net/openviewer.aspx?sqrlitid=1hqeasef7eavz8rdkus60a which were the original ones I used.

Installation

Log into your device using ssh or telnet and download the package using rsync. The packages are already precompiled so its actually pretty simple to do.

cd /ffp/pkg/
rsync -av --delete inreto.de::dns323/fun-plug/0.5/extra-packages/All/vsftpd-2.0.7-2.tgz .

(note the version number at the time of my install this was the latest and greatest)

Now you have the package so lets install it.

funpkg -i vsftpd-2.0.7-2.tgz

You should see some notes about it having been installed correctly…

Some Prep Work

We need to set up some stuff before we continue.

To make things neet lets create a vsftd folder

mkdir -p  /ffp/etc/vsftpd

Lets also make the chroot directory. Note: I am still not 100% sure what it is for but read that it has something to do with security and it's a good thing to have. If anyone has any better insight feel free to update this…

mkdir -p /ffp/var/empty

I also like to periodically check logs so I keep all my logs in /ffp/var/log lets create that directory as well.

mkdir -p /ffp/var/log

Adding FTP Users and CHROOTING

Let's make the necessary user and chroot files

cd /ffp/etc/vsftpd
vim vsftpd.chroot_list

File contents should look like this assuming you want “john” & “jane” to be chrooted

john
jane

Of course if you dont care just leave the file empty but I would create it anyway.

cd /ffp/etc/vsftpd
vim vsftpd.user_list

File contents should look like this with all the users you want to give access to.

harry
john
jane
bob
marry

By the way these must be real users on your box. If they dont exist you must create them.

Adding Users to Your Box

You can check which users exist on your box by seeing the contents of your /etc/passwd file.

After installation of fun_plug, your default user list should look like this:

vim /etc/passwd
root:x:0:0:Linux User,,,:/mnt/HD_a2/home/root:/ffp/bin/sh
admin:x:500:500:Linux User,,,:/home/admin:/bin/sh
nobody:x:501:501:Linux User,,,:/home/nobody:/bin/sh
sshd:x:33:33:sshd:/:/bin/false

Now we add a user via the useradd command. Here is an example: -d = home directory this is where your user will be chrooted -s = shell /bin/sh is like a false shell to my understanding

useradd bob
passwd bob  (enter your password twice)
usermod -d /mnt/HD_a2/bob bob
usermod -s /bin/sh bob

Ok now user bob is added, so we can see the /etc/passwd file has changed:

vim /etc/passwd
root:x:0:0:Linux User,,,:/mnt/HD_a2/home/root:/ffp/bin/sh
admin:x:500:500:Linux User,,,:/home/admin:/bin/sh
nobody:x:501:501:Linux User,,,:/home/nobody:/bin/sh
sshd:x:33:33:sshd:/:/bin/false
bob:x:508:702:some random comment goes here not really important:/mnt/HD_a2/bob:/bin/sh

:!: But wait! Don't go too fast! We need to save our changes because if we reboot now that new user go bye-bye. Save changes with:

store-passwd.sh

Now we have our users, user_list, and chrootlist files, our log directory set up, our chroot directory set up, and the package installed. The last things that need to be done are to set up the certificate file and key, configure the server, and write our startup script. We are almost done, I promise.

To create your ssl key and crt files

:!: if you dont have openssl installed on your box follow this section below otherwise skip to the next section

cd /ffp/pkg/
rsync -av --delete inreto.de::dns323/fun-plug/0.5/packages/openssl-0.9.8k-1.tgz .

(note the version number at the time of my install this was the latest and greatest)

Now you have the package so lets install it.

funpkg -i openssl-0.9.8k-1.tgz

You should see some notes about it having been installed correctly…

Continue here if you already have openssl installed

Step 1: Generate a Private Key

    openssl genrsa -des3 -out server.key 1024
 
    Generating RSA private key, 1024 bit long modulus
    .........................................................++++++
    ........++++++
    e is 65537 (0x10001)
    Enter PEM pass phrase:
    Verifying password - Enter PEM pass phrase:

Step 2: Generate a CSR (Certificate Signing Request) Note: When I put a passord in the challenge it kept failing on me so left it blank and it worked. I am not sure if that is a bug with openssl…

openssl req -new -key server.key -out server.csr
 
    Country Name (2 letter code) [US]:US
    State or Province Name (full name) [Florida]:Florida
    Locality Name (eg, city) [Miami]:Miami
    Organization Name (eg, company) [My Company Ltd]:urbanlime.com
    Organizational Unit Name (eg, section) []:
    Common Name (eg, your name or your server's hostname) []:www.urbanlime.com
    Email Address []:noatmaildotcom
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:

Step 3: Remove Passphrase from Key

    cp server.key server.key.org
    openssl rsa -in server.key.org -out server.key
 
    -rw-r--r-- 1 root root 745 Jun 29 12:19 server.csr
    -rw-r--r-- 1 root root 891 Jun 29 13:22 server.key
    -rw-r--r-- 1 root root 963 Jun 29 13:22 server.key.org

Step 4: Generating a Self-Signed Certificate (Generate a temporary certificate which is good for 365 days)

    openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
    Signature ok
    subject=/C=US/ST=Florida/L=Miami/CN=www.urbanlime.com/Email=noatmaildotcom
    Getting Private key

Step 5: Installing the Private Key and Certificate

  cp server.crt /ffp/etc/vsftpd/xxx.crt
  cp server.key /ffp/etc/vsftpd/xxx.key

This completes the SSL portion lets move on to the configuration

Alternate Creation of SSL

Another way to create the SSL is to use the following command:

openssl req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem

Configuration

cd /ffp/etc
vim vsftpd.conf

The following is a tested working configuration which requires TLS authentication.

#The chroot dir
secure_chroot_dir=/ffp/var/empty
#dont allow anonymous users
anonymous_enable=NO
local_enable=YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
dirmessage_enable=YES
connect_from_port_20=YES
chown_uploads=NO
xferlog_enable=YES
xferlog_std_format=YES
#set your location for your logs if you want them
xferlog_file=/ffp/var/log/vsftpdxf.log
vsftpd_log_file=/ffp/var/log/vsftpd.log
idle_session_timeout=600
data_connection_timeout=120
nopriv_user=nobody
ascii_upload_enable=YES
ascii_download_enable=YES
ftpd_banner=Your Fancy Banner Here!
#The following will allow you to put specific users in a chroot so that they cant move back from the chroot dir
chroot_list_enable=YES
#file to keep the chroot users
chroot_list_file=/ffp/etc/vsftpd/vsftpd.chroot_list
userlist_deny=NO
userlist_enable=YES
#file to keep all users able to access ftp
userlist_file=/ffp/etc/vsftpd/vsftpd.user_list
#background=YES
#enable the listen to allow the ftp to listen we use this also so that we can write a startup script...
listen=YES
#pasv_promiscuous=YES
pasv_enable=YES
pasv_min_port=5000
pasv_max_port=5500
# You should not need this if you not going to use it through the web
pasv_address=YOUR.PUBLIC.IP.HERE
ls_recurse_enable=NO
#finally force the ssl connection
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
#point to your certificate and key
rsa_cert_file=/ffp/etc/vsftpd/xxx.crt
rsa_private_key_file=/ffp/etc/vsftpd/xxx.key

Configuration (More Secure)

The following configuration is more secure although it takes a little more effort.

Using the userlist feature of vsftpd has a security implication: The connection is dropped right after the user has provided the username. This can be used (although with a fairly time-comsuming brute force attack) to deduce the available usernames on the system. It is better if the user (attacker) has to provide both username and password before she is rejected. This way the attacker won't know whether the username or the password was incorrect and thus it expands the search space immensely.

The configuration below supports a scenario where a few persons need to share a ftp directory from the Internet. It does this using a master config file which is very strict (empty local_root dir, no upload, no download, guest account, etc.) and then there is a vsftpd_user_conf dir with a config file per user that relaxes the strict permissions.

joe /ffp/etc/vsftpd.conf
# vsftpd configuration file
#
# This file is for multiple users sharing the same ftp directory but such
# that each user has his own login and the uploaded files are stored with
# the userid of each user
#
# Anonymous access is turned off such that only local users can login
#
# The default access is that users are logged in with the guest account without
# download nor upload permissions
# Special priviledged users have each a configuration file in the
# etc/vsftpd_user_conf directory where the permissions are relaxed with the
# following configuration:
#   write_enable=YES
#   download_enable=YES
#   guest_enable=NO
#   local_root=/mnt/HD_a2/ftp
 
 
listen=YES
listen_port=10021
pasv_enable=YES
pasv_address=[YOUR EXTERNAL IP ADDRESS GOES HERE]
# Remember to port forward these ports if you are behind a firewall!
pasv_min_port=10022
pasv_max_port=10099
 
ssl_enable=YES
force_local_logins_ssl=YES
force_local_data_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=YES
rsa_cert_file=/ffp/etc/vsftpd/server.pem
 
# Allow local users to login and chroot them to the specified directory
# Note that chroot_local_user=YES means that text_userdb_names will NOT work!
# The local_root directory is overriden in the per-user configuration file
local_enable=YES
chroot_local_user=YES
local_root=/ffp/var/empty
file_open_mode=0666
local_umask=007
# Show usernames instead of "ftp". This does NOT work when chroot_local_user=YES
text_userdb_names=YES
hide_ids=NO
 
# By default, local users are logged in under the guest account with the specified userid
guest_enable=YES
guest_username=nobody
 
# We make a directory of user configuration files such that only the allowed users
# will have access
user_config_dir=/ffp/etc/vsftpd_user_conf
 
# Disallow upload and download. Can be relaxed in the per-user configuration file
write_enable=NO
download_enable=NO
 
# 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.
nopriv_user=ftp
secure_chroot_dir=/ffp/var/empty
 
# Print directory's .message file if it exists
dirmessage_enable=YES
 
vsftpd_log_file=/ffp/var/log/vsftpd.log
xferlog_enable=YES
xferlog_file=/ffp/var/log/xfer_vsftpd.log
log_ftp_protocol=YES

Now make the per-user configuration files:

mkdir /ffp/etc/vsftpd_user_conf
cd /ffp/etc/vsftpd_user_conf
cat > default_user_config
write_enable=YES
download_enable=YES
guest_enable=NO
local_root=/mnt/HD_a2/ftp
^D
ln -s default john
ln -s default jane

Now John and Jane share the same configuration. You can also make special files to each if you want.

Lets start this bad boy

To start it manually the command is broken up as follows

vsftpd = tells it to run vsftpd /ffp/etc/vsftpd.conf = use this config file not default which would be somewhere in /etc instead of /ffp/etc

/dev/null 2>&1 </dev/null & = throw the job in the background
vsftpd /ffp/etc/vsftpd.conf >/dev/null 2>&1 </dev/null &

Once you have seen that it is running and you tested it and it works you can set up a startup script like the one that follows. It has also been tested and works great.

vim /ffp/start/vsftpd.sh
#!/ffp/bin/sh
 
# PROVIDE: vsftpd
# REQUIRE: LOGIN
 
. /ffp/etc/ffp.subr
 
name="vsftpd"
command="/ffp/sbin/vsftpd"
vsftpd_flags="/ffp/etc/vsftpd.conf"
required_files="/ffp/etc/vsftpd.conf"
start_cmd="vsftpd_start"
 
vsftpd_start()
{
  proc_start_bg "$command"
}
 
run_rc_command "$1"

You need to change the permissions to allow it to start up

chmod a+x /ffp/start/vsftpd.sh

REBOOT AND YOU ARE DONE!!! 8-)