Linux下vsftp虚拟用户配置与主动模式被动模式
VSFTP是一个在UNIX/Linux操作系统上运行的FTP服务器,安全性是它的一个最大的特点。它可以运行在诸如Linux、BSD、Solaris、 HP-UNIX等系统上面,是一个完全免费的、开发源代码的FTP服务器软件,支持很多其他的FTP服务器所不支持的特征。比如:非常高的安全性需求、带宽限制、良好的可伸缩性、可创建虚拟用户、支持IPv6、速率高等。
本文所有配置是在CentOS 5.8-64位系统上进行,配置的是vsftp虚拟用户模式,虚拟用户的特点是只能访问服务器为其提供的FTP服务,而不能访问系统的其它资源。所以,如果想让用户对FTP服务器站内具有写权限,但又不允许访问系统其它资源,可以使用虚拟用户来提高系统的安全性。
VSFTP安装与配置
安装
使用yum命令来安装vsftpd和DB软件包:
yum -y install vsftpd db4-utils
建立口令库文件
建立虚拟用户口令库文件,使用文本编辑器创建一个文本文件,第一行写:用户名;第二行写:密码,依此类推:
vim logins.txt sunkai <--虚拟用户名 123456 <--密码
生成认证文件
使用db_load命令生成vsftpd的认证文件,将用户信息文件转换为数据库并使用hash加密:
db_load -T -t hash -f logins.txt /etc/vsftpd/vsftpd_login.db
赋权:
chmod 600 /etc/vsftpd/vsftpd_login.db
数据库生成后最好清空该文本文件,并在安全的地方记录用户名和密码:
rm -f logins.txt
db_load参数解释:
- 选项
-T
允许应用程序能够将文本文件转译载入进数据库。由于我们之后是将虚拟用户的信息以文件方式存储在文件里的,为了让Vsftpd这个应用程序能够通过文本来载入用户数据,必须要使用这个选项。如果指定了选项-T
,那么一定要追跟子选项-T
。 - 子选项
-T
,追加在在-T
选项后,用来指定转译载入的数据库类型。扩展介绍下,-T
可以指定的数据类型有Btree、Hash、Queue和Recon数据库。 - 选项
-f
的参数是包含用户名和密码的文本文件,文件的内容是:奇数行用户名、偶数行密码。
建立PAM配置文件
建立虚拟用户所需的PAM配置文件,目的是对虚拟用户的安全和账户权限进行验证。
- auth是对用户密码进行验证。
- accout是对用户的权限进行验证。
vim /etc/pam.d/vsftpd 加入下面内容,其他行全部注释: auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login account required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login 64位系统: auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
创建账户和设置权限
创建虚拟用户
创建一个不能登录系统的用户ftpuser用于映射虚拟用户,用户名ftpuser可以随意设置:
useradd -d /home/ftpsite -s /sbin/nologin ftpuser chmod 700 /home/ftpsite/
在vsftpd.conf
中添加配置项:
guest_enable=YES guest_username=ftpuser
当guest_enable
激活(YES)时,guest_username
是定义了虚拟用户在系统中的用户名。
创建宿主目录,也可以指定系统其他目录:
mkdir /home/ftpsite/sunkai
设置权限
对不同虚拟用户设置不同权限,创建虚拟用户配置文件存放位置:
mkdir /etc/vsftpd/vsftpd_user_conf
vim /etc/vsftpd/vsftpd_user_conf/sunkai #建立用户单独配置文件,文件名就是虚拟用户名。 local_root=/home/ftpsite/sunkai #这里的目录可以是系统中其他目录,根据用途定义。 file_open_mode=0777 write_enable=YES virtual_use_local_privs=YES #配置虚拟用户具有写权限(上传、下载、删除、重命名)
在vsftpd.conf
添加配置项:
user_config_dir=/etc/vsftpd/vsftpd_user_conf
禁锢FTP用户在宿主目录
将需要禁锢的用户名写入chroot_list
文件,将用户固定在local_root
定义的目录内。当chroot_list_enable
激活(YES)时,在chroot_list_file
指定文件中的用户将会禁锢在宿主目录中。
vim /etc/vsftpd/chroot_list chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list #每一行写一个用户名。
其他权限配置方案
虚拟用户和本地用户有相同的权限 virtual_use_local_privs=YES 虚拟用户和匿名用户有相同的权限,默认是NO virtual_use_local_privs=NO 虚拟用户具有写权限(上传、下载、删除、重命名) virtual_use_local_privs=YES write_enable=YES 虚拟用户不能浏览目录,只能上传文件,无其他权限 virtual_use_local_privs=NO write_enable=YES anon_world_readable_only=YES anon_upload_enable=YES 虚拟用户只能下载文件,无其他权限 virtual_use_local_privs=NO write_enable=YES anon_world_readable_only=NO anon_upload_enable=NO 虚拟用户只能上传和下载文件,无其他权限 virtual_use_local_privs=NO write_enable=YES anon_world_readable_only=NO anon_upload_enable=YES 虚拟用户只能下载文件和创建文件夹,无其他权限 virtual_use_local_privs=NO write_enable=YES anon_world_readable_only=NO anon_mkdir_write_enable=YES 虚拟用户只能下载、删除和重命名文件,无其他权限 virtual_use_local_privs=NO write_enable=YES anon_world_readable_only=NO anon_other_write_enable=YES
FTP的主动端口与被动端口配置
大多数的TCP服务是使用单个的连接,一般是客户端向服务器的一个已知端口发起连接,然后使用这个连接进行通讯。但FTP协议却是例外,它使用双向的多个连接 ,而且使用的端口很难预计。
FTP协议连接和端口
- 一个控制连接(control connection):用于传递客户端和服务器端之间的命令响应。使用TCP 21端口,生存期是整个FTP会话时间。
- N个数据连接(data connection):用于传输数据,这种连接是在数据传输时建立的,一旦数据传输完毕就关闭,每次使用的端口也不一定相同。而且,这种数据 连接既可能是客户端发起的,也可能是服务器端发起的。
- FTP协议使用一个标准的端口20作为ftp-data端口,但是这个端口只用于连接的源地址是服务器端的情况,在这个端口上根本就没有监听进程。
主动与被动模式
FTP的数据连接和控制连接一般是相反方向,即服务器向客户端发起一个用于数据传输的连接。连接的端口是由服务器端和客户端协商确定的,这就是vsftpd的主动模式(port mod)。FTP协议的这个特征对iptables防火墙和NAT的配置增加了很多困难。在FTP被动模式(passive mod)下,数据连接是由客户程序发起的,和主动模式相反。
选择模式的原则
- 客户端没有防火墙时,用主动模式连接即可。
- 服务器端没有防火墙时,用被动模式即可。
- 双方都有防火墙时,vsftpd设置被动端口范围,服务器端防火墙打开被动端口范围,客户端用被动模式连接即可。
是否采取被动模式取决于客户程序:
- 在ftp命令行中使用
passive
命令就可以关闭/打开被动模式。 - 在Windows命令行模式下使用ftp命令连接服务器,用的是主动模式。
- 在浏览器方式下连接ftp服务器,可以修改访问使用模式:
- 用FileZilla Client软件连接服务器,在“编辑”-“设置”-“连接”选项内设置使用模式:
iptables中配置vsftp的方法
使用主动模式
配置iptables防火墙:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp -m multiport --dport 20,21 -m state --state NEW -j ACCEPT
使用被动模式
方法1
加载模块ip_conntrack_ftp
,优点:不影响ftp的配置,缺点:客户端会感觉到连接有些延迟。
- 在
/etc/sysconfig/iptables-config
中添加:IPTABLES_MODULES="ip_conntrack_ftp"
- 加载模块:
/sbin/modprobe ip_conntrack_ftp
- 开机启动,在
/etc/rc.local
添加:/sbin/modprobe ip_conntrack_ftp
注意:如果需要修改FTP 21端口为2121:
- 在
vsftpd.conf
中增加:listen_port=2121
- 加载模块:
/sbin/modprobe ip_conntrack_ftp ports=2121
最后需要在iptables开放21端口:
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
方法2
在vsftpd配置文件中配置被动端口,优点:对连接速度没有影响。缺点:限制了客户端并发连接的数量。
在/etc/vsftpd/vsftpd.conf
中添加:
pasv_enable=YES pasv_min_port=3000 pasv_max_port=3005
在iptables中开放这段端口:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT iptables -A INPUT -p tcp --dport 3000:3005 -j ACCEPT
解除SELinux阻止
如果开启了SELinux,执行以下命令:
setsebool -P ftpd_disable_trans 1 service vsftpd restart
更多Vsftpd相关教程见以下内容: