Ubuntu 16.04 VSFTP服务器搭建

在NanoPi NEO开发板的ubuntu core 16.04下安装成功。2017-4-16

1 安装vsftpd
1.1 查看是否已经安装vsftpd
service vsftpd status

1.2 如果没有,就安装
1.2.1 更新源列表
apt-get update
如果不运行该命令,直接安装vsftpd,会出现”有几个软件包无法下载,您可以运行apt-get update——“的错误提示,导致无法安装

1.2.2 安装vsftpd
apt-get -y install vsftpd

查看vsftpd都安装了那些文件:
#dpkg -L vsftpd |tac

其中/etc/init/vsftpd.conf、/etc/vsftpd.conf比较重要。
/etc/init/vsftpd.conf是vsftpd的初始化文件,而/etc/vsftpd.conf是vsftpd的配置文件。
为什么在此指出这一点呢?是因为原以为ubuntu下vsftpd和centos下的一样,可以把vsftpd的配置文件存放到/etc/vsftpd/目录下。这一点是和centos不同的。
除此之外,还有一点不同,就是vsftpd的启动、停止、重启脚本。
在ubuntu下要启动、停止、重启vsftpd,我们必须使用以下命令:
sudo service vsftpd stop
sudo service vsftpd start
sudo service vsftpd restart

而在centos下,我们可以使用以下命令:
service vsftpd stop
/etc/init.d/vsftpd stop

1.3 判断vsftpd是否安装成功
sudo service vsftpd restart
重启vsftpd服务。如果vsftpd处于运行状态,说明安装成功。

2 配置vsftpd服务器
有两种配置方式,一种是基于系统中存在的用户,一种是虚拟用户。
2.1 基于系统中存在的用户
(这种还没试过)
2.1.1 创建虚拟用户
sudo mkdir /home/vftp
sudo useradd vftp -d /home/uftp -s /bin/bash
sudo chown vftp:vftp /home/vftp

2.1.2 修改配置文件/etc/vsftpd.conf
sudo vi /etc/vsftpd.conf
添加:
userlist_deny=NO
userlist_enable=YES
userlist_file=/etc/allowed_users
seccomp_sandbox=NO
local_enable=YES”

2.1.3 新建/etc/allowed_users文件
sudo vi/etc/allowed_users
输入vftp

2.1.4 查看/etc/ftpusers文件
sudo vi /etc/ftpusers
打开这个文件后,看一看有没有vftp这个用户名,如果没有,就直接退出。如果有就删除uftp。
因为这个文件中记录的是不能访问FTP服务器的用户清单。

2.1.5 重新启动vsftpd
service vsftpd restart

2.2 基于虚拟用户的配置
所谓虚拟用户就是没有使用真实的帐户,只是通过映射到真实帐户和设置权限的目的。虚拟用户不能登录ubuntu系统。
2.2.1 为虚拟用户创建本地系统用户
sudo mkdir /home/vftp
sudo useradd vftp -d /home/vftp -s /bin/false
sudo chown vftp:vftp /home/vftp
创建的用户vftp是无法登录到系统的,因为没有给该用户设置密码。在此,我们也无需vftp登录到系统,这样相对来说比较安全。

2.2.2 创建虚拟用户数据库
2.2.2.1 创建文本文件login.txt
设置登录vsftp的虚拟用户与密码文件login.txt。
sudo mkdir /etc/vsftpd/
sudo vi /etc/vsftpd/login.txt
sudo chmod 600 /etc/vsftpd/login.txt
login.txt的内容为:
用户名1
用户1的密码
用户名2
用户2的密码

如:
user1
user1password
user2
user2password

2.2.2.2 生成数据库
使用db_load对login.txt进行加密
db_load需要db-util这个软件。现在安装db-util,如下:
sudo apt-get -y install db-util

db-util安装完毕后,使用db_load对loginx.txt进行加密。如下:
sudo db_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db
sudo chmod 0600 /etc/vsftpd/login.db

2.2.3 配置PAM文件
loginx.txt加密完成后,开始配置vsftpd的PAM验证。
在此没有使用vsftpd安装时所生成的/etc/pam.d/vsftpd文件。
因为经过多次的测试,发现如果使用该文件进行验证的话,无法验证通过。不知道为什么,猜想很有可能是vsftpd的一个BUG。
创建验证文件,如下:
sudo vi /etc/pam.d/vsftpd.virtual
加入以下内容
auth required pam_userdb.so db=/etc/vsftpd/login
account required pam_userdb.so db=/etc/vsftpd/login

vsftpd.virtual文件的内容,也可以根据OS的版本进行调整。我现在使用的是ubuntu x64,所以也可以填写为:
auth required /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd/login
account required /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd/login

其中/etc/vsftpd/login对应/etc/vsftpd/login.db文件

2.2.4 配置/etc/vsftpd.conf
vsftp权限配置。现在正式配置vsftpd,vsftpd的几乎所有配置项都在/etc/vsftpd.conf文件中进行。
sudo mv /etc/vsftpd.conf /etc/vsftpd.conf.bak
sudo vi /etc/vsftpd.conf
根据业务要求,/etc/vsftpd.conf配置内容如下:
listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
chroot_local_user=YES
chroot_list_enable=NO
allow_writeable_chroot=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO
guest_enable=YES
pam_service_name=vsftpd.virtual
user_config_dir=/etc/vsftpd/vuser_conf
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000
#listen_port=8801

在以上配置文件中,有几点需要重点指出。
local_enable=YES
write_enable=YES
local_umask=022
这两项是启用系统用户的写权限。特别是write_enable=YES项一定要启用,否则vsftpd虚拟用户将无法登录vsftpd。
为什么会是这样?因为虚拟用户依赖于系统用户。

chroot_local_user=YES
chroot_list_enable=NO
allow_writeable_chroot=YES
这三项是配置vsftpd用户禁止切换上级目录的权限。

guest_enable=YES
pam_service_name=vsftpd.virtual
user_config_dir=/etc/vsftpd/vuser_conf
这三项是启用vsftpd虚拟用以及虚拟用户账号配置目录。

pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000
这三项是启用vsftpd被动模式及相关端口。

2.2.5 配置虚拟用户相关数据/etc/vsftpd/vuser_conf
vsftpd配置文件修改文件后,现在开始配置虚拟用户的相关权限。如下:
sudo mkdir /etc/vsftpd/vuser_conf
sudo chmod 0600 /etc/vsftpd/vuser_conf
sudo vi /etc/vsftpd/vuser_conf/user1

user1文件内容如下:
guest_username=vftp
local_root=/www/
virtual_use_local_privs=YES
anon_umask=133

以上配置参数,其中guest_username=vftp表示的是设置FTP对应的系统用户为vftp
local_root=/www/ 表示使用本地用户登录到ftp时的默认目录。
virtual_use_local_privs=YES 虚拟用户和本地用户有相同的权限。
anon_umask 表示文件上传的默认掩码。计算方式是777减去anon_umask就是上传文件的权限。在此我们设置的是133,也就是说上传后文件的权限是644。即上传的文件对所属用户来说只有读写权限,没有执行权限。

注意不能有空格,不然登录的时候会提示出错。

以上配置文件觉的太长的话,来个简单的:
(在该目录下只有只读权限)
local_root=/home/vsftpd/dbzh3

(在该目录下拥有所有权限)
local_root=/home/vsftpd/dbzh3
write_enable=yes
anon_umask=022
anon_world_readable_only=no
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes

2.2.7 以上全部配置完毕后,我们来重启vsftpd,如下:
sudo service vsftpd restart

IPtables配置
在实际环境中,为了安全起见,我们一般是开启防火墙的。
在ubuntu上,我们也可以使用IPtables来进行防护。
IPtables配置如下:
sudo iptables-save >/home/vftp/iptables.rule
sudo vi /home/vftp/iptables.rule

在iptables.rule文件的 *filter 的COMMIT前添加
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 30000:31000 -j ACCEPT

然后
sudo iptables-restore < /home/vftp/iptables.rule
sudo iptables -nL

然后
sudo vi /etc/network/interfaces
在文件最后添加
pre-up iptables-restore < /home/vftp/iptables.rule
post-down iptables-save < /home/vftp/iptables.rule

常见错误
错误:
500 OOPS: bad bool value in config file for: guest_enable Login failed.

500 OOPS: bad bool value in config file for: anon_upload_enable Login failed.
等等之类的错误的布尔值提示
原因:/etc/vsftpd/vuser_conf目录下的用户配置文件里面有空格
那个YES/NO 布尔值(bool value)后边加了一个空格,即:
anon_world_readable_only=NO空格
正确的格式应该是:
anon_world_readable_only=NO(无空格)!!!!!!
注意,NO后边的空格,要用退格键将其删除。

错误:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
如果出现该错误,说明你ftp主文件夹的权限太大了,要去掉root,如下: chmod -x /home/vsftpd 就OK了!
为了避免一个安全漏洞,从 vsftpd 2.3.5 开始,chroot 目录必须不可写。使用命令:
chmod a-w /home/vsftpd
chmod a-w /home/vsftpd/dbzh1
chmod a-w /home/vsftpd/dbzh2
chmod a-w /home/vsftpd/dbzh3

错误:
500 OOPS: cannot change directory:
解决:
google好多都是 执行这个就OK setsebool ftpd_disable_trans 1 service vsftpd restart
但是执行的时候遇到这个问题 Could not change active booleans: Invalid boolean
搜了好久终于解决
setsebool -P ftp_home_dir=1

Leave a comment

Your email address will not be published. Required fields are marked *