VSFTP(Very Secure FTP。非常安全的FTP)
1、FTP工作模式
(1)主动模式:
在FTP的主动模式下FTP客户端开启一个随机选择的TCP端口连接FTP服务器的21端口请求建立连接。当完成THree-Way Handshake后,连接就成功建立,但这仅是控制连接的建立。当两端需要传送数据的时候,客户端通过控制连接用一个port command告诉服务器,客户端可以用另一个TCP端口做数据通道,然后服务器用20端口和刚才客户端所通知的TCP端口建立数据连接。
- 被动模式
在FTP的被动模式下,FTP客户端开启一个随机选择的TCP端口连接FTP服务器的21端口请求建立连接,完成控制连接的建立。当两端需要传送数据的时候,客户端通过命令通道发送一个PASV command给服务器要求进入被动传输模式,然后服务器随机选择一个TCP端口,并用控制连接告诉客户端,客户端用另一个TCP端口连接刚才服务器指定的TCP端口来建立数据通道。
2、安装vsftpd服务
vsftpd-2.0.5-16.el5-4.1
3、配置vsftp服务器
(1)匿名访问的FTP服务(匿名用户对应的系统用户为ftp,其宿主目录/var/ftp/也就是匿名访问vsftpd服务时所在的FTP根目录)
chown ftp /var/ftp/pub //使匿名用户ftp对该目录拥有写入权限
ls -ld /var/ftp/pub
vi /etc/vsftpd/vsftpd.conf
anonymous_enable=yes //允许匿名用户访问
local_enable=no //若不需启用本地用户,可将此项设为no
anon_umask==022 //设置匿名用户上传数据的权限掩码
anon_upload_enable=yes //允许匿名上传文件
anon_mkdir_write_enable=yes //允许匿名用户创建目录
service vsftpd start
测试匿名ftp服务器
ftp 192.168.1.1
用户名为ftp/anonymous
直接回车
ls
lcd /opt
get *.*
cd pub
put 1.doc
ls
quit
cat 1.doc
rm 1.doc
(2)基本的本地用户验证的ftp服务
vi /etc/vsftpd/vsftpd.conf
local_enable=yes
write_enable=yes //开启本地用户的写入权限
local_umask=077 //提高上传文件的权限
在一些情况下使用FTP 服务的时候,只为了让用户通过FTP方式访问服务器,而不需要登录到系统,可以采用下述方法(在建立用户的时候指定使用nologin脚本)实现:
Useradd tonyzhang -s /sbin/nologin
默认root不允许登录,在ftpusers中文件中被禁止
ftp://wayne@192.168.1.1或ftp://wayne:123456@192.168.1.1
通过ftp命令访问ftp服务器。只要输入正确的用户名,密码验证即可。
ftp 192.168.1.1
name:wayne
password:123456
local_enable配置项开放以后,默认情况下所有的系统用户都可以登录到此ftp服务器
若只希望对一小部分系统用户开放ftp服务,则需要开放用户列表控制的相关配置项
使用user_list用户列表文件,只允许laya,vanko,hunter这三个本地用户登录
vi /etc/vsftpd/user_list
laya
vanko
hunter //添加这三行,并清空其他内容
vi /etc/vsftpd/vsftpd.conf
userlsit_enable=yes //启用user_list用户列表文件
userlist_deny=no
不禁用user_list列表中的用户,且仅允许列表中的用户登录(yes表示仅禁止列表中用户登录)
ftpusers文件相当于黑名单,为vsftpd服务器提供了一份禁止登录的用户列表
service vsftpd reload
- 基于虚拟用户的ftp服务
Vsftpd支持将用户及密码保存在本地数据文件,数据库(mysql)或LDAP中,相对于FTP的本地用户形式来说,虚拟用户只是FTP服务器的专有用户,虚拟用户只能访问FTP服务器所提供的资源,这大大增强系统本身的安全性。相对于匿名用户而言,虚拟用户需要用户名和密码才能获取FTP服务器中的文件,增加了对用户和下载的可管理型。对于需要提供下载服务,但又不希望所有人都可以匿名下载同事又考虑到主机安全和管理方便的FTP站点来说,虚拟用户是一种很好的解决方案。
通过本地数据文件实现虚拟用户访问时,首先需要建立一个文件,将所有用户和密码保存到该文件中,这种方法主要适用在用户比较少及变化不频繁的情况下。配置方法如下。
(1)适用如下命令安装用于生成数据库的软件包db-utils:
rpm -ivh db4-utils-4.3.29-9.fc6.i386.rpm
①在/etc/vsftpd/下建立vlogin.txt文件,用来存储虚拟用户的用户名和密码
vi /etc/vsftpd/vusers.list
Tony
123.com
Tom
123.com 奇数行:用户名 偶数行:密码
②生成数据库
保存虚拟帐号和密码的文本文件无法被系统帐号直接调用哈~我们需要使用db_load命令生成db数据库文件
cd /etc/vsftpd
db_load -T -t hash -f vlogin.txt vlogin.db
修改数据库文件访问权限
数据库文件中保存着虚拟帐号的密码信息,为了防止非法用户盗号哈,我们可以修改该文件的访问权限。生成的认证文件的权限应设置为只对root用户可读可写,即600
chmod 600 /etc/vsftpd/vlogin.db
ls -lh /etc/vsftpd/vlogin.db
-rw------- 1 root root 12K 04-08 17:17 /etc/vsftpd/vusers.db
-rw------- 1 root root 18 04-08 17:05 /etc/vsftpd/vusers.list
③编辑pam文件,注释掉上面的行,添加下面两行,如果使用ftpusers文件,则保留file=/etc/vsftpd/ftpusers的行
vi /etc/pam.d/vsftpd
#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers
④添加一个系统用户来对应虚拟用户,光有虚拟用户是无法登录的,我们需要让虚拟用户对应一个系统实际的用户,这样所有的用户登录之后就会进入到系统实际用户的家目录,我们在通过给各个虚拟用户来分配不同的权限
useradd -g ftp -s /sbin/nologin -d /var/share vuser
修改vsftpd配置,添加如下内容
vi /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd //vsftp使用的pam模块为vsftpd
user_config_dir=/etc/vsftpd/vuserconfig //虚拟行号权限配置的主目录为vuserconfig
guest_enable=yes //允许使用虚拟用户登录FTP
guest_username=vuser //虚拟用户所对应的系统用户为ftp3
//max_clients=1 ftp最大接入客户端数
//max_per_ip=1 每个ip地址的最大连接数
#userlist_enable=YES
tcp_wrappers=YES
为不同的虚拟用户建立独立的配置文件
mkdir /etc/vsftpd/vuserconfig
cd /etc/vsftpd/vuserconfig
touch tony
vi tony
anon_upload_enable=yes 允许上传文件
anon_mkdir_write_enable=yes 允许创建文件夹
service vsftpd reload
vsftpd服务的其他常用配置
修改vsftpd服务的监听地址,端口
listen=yes
listen_address=192.168.1.1
listen_port=2121
允许使用ftp服务器的被动模式
pasv_enable=yes
pasv_min_port=24500
pasv_max_port=24600
限制ftp连接的并发数、传输速度
max_clients=20 //限制并发客户连接最多20个
max_per_ip=2 //限制每个ip地址的连接数最多2个
anan_max_rate=50000 //限制匿名用户传输速率50kb/s
local_max_rate=200000 //限制本地用户传输速率为200kb/s
db_load命令 – 生成db数据库
db_load命令的作用是将用户信息文件转换为数据库并使用 hash 加密,如果需要保存虚拟帐号和密码的文本文件且不让被系统帐号直接调用,我们就需要使用db_load 命令生成db数据库。
语法格式:db_load [参数] [文件]
常用参数:
-t | hash使用hash码加密 |
-f | 指定包含用户名和密码文本文件。此文件格式要示:奇数行用户名、偶数行密码 |
参考实例
新建一个文件users.txt 把用户名密码放入其中:
[root@linuxcool ~]# db_load -T -t hash -f /users.txt /users.db
指定数据库类型为btree,指定数据库环境主目录:
[root@linuxcool ~]# db_load -T -t btree -h /root -f /users.txt /users.db
数据库为recno把用户名密码放入vsftpd_login.db:
[root@linuxcool ~]# db_load -T -t recno -f /etc/vsftpd/logins.txt /etc/vsftd/vsftpd_login.db