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
vsftpd /ffp/etc/vsftpd.conf >/dev/null 2>&1
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-)