1、理论知识
1.1、配置文件
1.1.1、vsftp的简介
vsftp的名字是“very secure FTP daemon”的简称,他工作在chroot模式下(程序限定一个访问目录),故而比较安全。
1.1.2、工作模式
1)PORT模式(主动模式)
主动模式工作流程如下:
-- 客户端与服务器TCP 21端口建立连接通道
-- 接收数据时在此通道上发送PORT命令(声明一个大于1024的客户端端口)
-- 服务器端通过TCP 20向客户端传送数据(建立新的连接)
注:防火墙OUTBOUND过程
2)PASV模式(被动模式)
被动模式工作流程如下:
-- 客户端与服务器TCP 21端口建立连接通道
-- 客户端发送PASV命令给服务器
-- 服务器默认开启1024至5000之间的随机端口并通知客户端在此端口请求数据
-- 服务器端通过此端口传送数据
注:防火墙INBOUND过程
1.1.3、运行模式
1)standalone模式
-- 一次性启动,常驻内存
-- 接入反省快,消耗系统资源
-- 支持PAM验证功能
2)inetd(xinetd)模式
-- 外部请求则调用ftp进程
-- 反应慢,不占系统资源
-- 单一IP限制
1.1.4、主配置文件
1
|
/etc/vsftpd/vsftpd
.conf
|
1.1.5、PAM配置文件
1)配置文件位置:
1
|
/etc/pam
.d
/vsftpd
|
2)PAM配置文件的修改
vim编辑/etc/pam.d/vsftpd
更改前(在列表中的不允许chroot):
1
|
auth required pam_listfile.so item=user sense=deny
file
=
/etc/vsftpd/ftpusers
onerr=succeedd
|
更改后(只有在列表中的用户才允许chroot):
1
|
auth required pam_listfile.so item=user sense=allow
file
=
/etc/vsftpd/ftpusers
onerr=faile
|
1.2、主机访问控制
/etc/hosts.deny
1.3、启动失败调试方法
启动失败解决:
1
|
bash
-x
/etc/init
.d
/vsftpd
start
|
1.4、帮助
1
|
man
vsftpd.conf
|
1.5、配置文件参数
1.5.1、全局配置参数
注:参数与注解正式环境下分开两行写,否则报错
1)权限参数
1
|
write_enable=YES
#允许改变命令(STOR, DELE,RNFR, RNTO, MKD, RMD, APPE and SITE,默认NO)
|
2)登录信息参数
1
2
3
4
|
dirmessage_enable=YES #换目录时,显示目录下“.message”文件的内容
ftpd_banner=Welcome to www.cmdschool.org FTP servers #登录欢迎信息
banner_file=/etc/vsftpd/banner_file #登录成功信息
banner_fail=/etc/vsftpd/banner_fail #登录失败信息
|
注意:
ftp_banner会覆盖vsftpd默认连接后的信息显示;
banner_file设置会覆盖ftp_banner的提示;
3)日志文件参数
1
2
3
|
xferlog_enable=YES #开启日志
xferlog_std_format=YES #wu-ftpd风格记录日志
xferlog_file=/
var
/log/xferlog #记录上传下载的日志
|
4)性能参数
1
2
3
4
5
6
7
8
9
|
idle_session_timeout=600
#闲置会话中断超时
data_connection_timemout=120
#闲置数据连接超时
accept_timeout=60
#PASV模式响应数据超时
ls_recurse_enable=YES
#是否允许递归查询ls -R(默认YES)
dirlist_enable=YES
#允许使用dir/ls(默认YES)
download_enable=YES
#允许用户下载文件
max_clients=30
#客户端最大数量
max_per_ip=3
#一个IP的最大连接数
use_localtime=YES
#启用当地时间(默认GMT)
|
5)安全参数
1
2
3
4
5
6
|
tcp_wrappers=
yes
#开启tcp_wrapper访问控制
max_login_fails=3
#默认试探密码的次数
pam_service_name=vsftpd
#PAM验证配置文件名称
nopriv_user=
ftp
| nobody
#vsftp服务运行时的账号
deny_file={*.exe,*.dll}
#拒绝上传下载的文件类型
async_abor_enable=YES
#是否允许运行特殊的ftp命令async ABOR.
|
6)安全SSL协议
1
2
3
4
5
6
7
|
ssl_enable=YES
#开启SSL加密协议
ssl_sslv2=YES
#指定加密方式
ssl_sslv3=YES
ssl_tlsv1=YES
require_ssl_reuse=NO
#禁用数据与控制流使用相同的ssl通道
ssl_ciphers=HIGH
#加密套件
rsa_cert_file=
/etc/vsftpd/
.sslkey
/vsftpd
.pem
#指定加密证书文件
|
7)传输协议
1
2
3
|
#ASCII模式传送文件
ascii_upload_enable=YES
ascii_download_enable=YES
|
8)进程相关
1
2
3
4
5
6
7
8
|
background=YES #vsftp将以监听(listen)模式启动
connect_timeout=60 #PORT模式响应数据超时
listen=yes #vsftp则运行在standalone模式
listen_port=21 #vsftpd监听端口
connect_from_port_20=YES #启用默认的20端口监听
listen_ipv6=YES #开启ipv6支持
pasv_min_port=50000 #PASV模式最小端口
pasv_max_port=60000 #PASV模式最大端口
|
1.5.2、本地用户配置参数
1)前提参数
1
|
local_enable=YES #开启普通用户ftp访问(默认NO,不限制chroot)
|
2)权限参数
1
2
3
4
5
6
7
8
|
local_umask=0022 #上传文件默认权限设置为6644,不设置默认为0077,目录为700
chroot_local_user=NO #禁止用户chroot
chroot_list_enable=YES #开启chroot控制列表
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list #chroot控制列表(默认在列拒绝)
userlist_enable=yes #开启用户登录控制列表
userlist_deny= #拒绝或允许用户登录
userlist_file=/etc/vsftpd.user_list #用户登录控制列表
local_root= #指定ftp家目录
|
3)性能参数
1
|
local_max_rate=128 #本地账号最大速率128B/s(0不限制)
|
4)安全SSL协议
1
2
|
force_local_logins_ssl=YES
#强制本地和虚拟用户登录使用SSL协议
force_local_data_ssl=YES
#强制本地和虚拟用户数据使用SSL协议
|
1.5.3、匿名用户配置参数
1)前提参数
1
2
|
anonymous_enable=YES #开启匿名用户登录(默认YES)
ftp_username=ftp #匿名用户的系统用户名(默认ftp)
|
2)权限参数
1
2
3
4
5
6
7
|
anon_world_readable_only=YES #开启匿名用户文件只读
anon_upload_enable=YES #允许匿名用户上传文件
anon_mkdir_write_enable=YES #允许匿名用户创建文件夹
anon_other_write_enable=YES #允许匿名用户其他写操作(删除,重命名)
anon_umask=022 #默认0077
chown_uploads= YES #修改匿名用户所上传文件的所有权
chown_username = username #指定拥有匿名用户上传文件所有权的用户
|
3)性能参数
1
2
3
|
anon_upload_enable=NO #匿名用户上传文件
anon_mkdir_write_enable=NO #匿名用户上传目录权限
anon_max_rate=64 #匿名账号最大下载速度64B/s
|
4)安全SSL协议
1
2
3
|
allow_anon_ssl=YES
#允许匿名用户使用SSL协议
force_anon_logins_ssl=YES
#强制匿名用户登录使用SSL协议
force_anon_data_ssl=YES
#强制匿名用户数据使用SSL协议
|
1.5.4、虚拟用户配置参数
1)前提参数
1
2
|
guest_enable=YES
#开启虚拟用户
guest_username=
#指定虚拟用户映射的本地用户
|
2)权限参数
1
2
|
user_config_dir=
/etc/vsftpd/config
#虚拟用户配置文件目录
local_root=
#虚拟用户家目录
|
3)安全SSL协议
1
2
|
force_local_logins_ssl=YES
#强制本地和虚拟用户登录使用SSL协议
force_local_data_ssl=YES
#强制本地和虚拟用户数据使用SSL协议
|
2、本地用户验证的FTP实践
2.1、基础信息
ftpSer:
ipaddress=10.168.0.166
hostname=vsFTPSer
client:
ipaddress=10.168.0.8
hostname=client
应用场景:
ftp用于上传网站源代码,故需要考虑到apache的权限。
2.2、yum源安装
In ftpSer:
1
|
yum -y
install
vsftpd httpd
|
In client:
1
|
yum -y
install
ftp
|
2.3、配置
In ftpSer:
2.3.1、step1
启动服务和配置开机默认启动
1
2
|
/etc/init
.d
/vsftpd
start
chkconfig vsftpd on
|
2.3.2、step2
1)修改配置文件
vim编辑/etc/vsftpd/vsftpd.conf
清空之前的配置,加入如下配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
#--------日志参数-------
#开启日志
xferlog_enable=YES
#wu-ftpd风格记录日志
xferlog_std_format=YES
#记录上传下载的日志
xferlog_file=
/var/log/xferlog
#开启登录日志
dual_log_enable=YES
#登录日志保存路径
vsftpd_log_file=
/var/log/vsftpd
.log
#-------权限参数--------
#禁止匿名用户登录
anonymous_enable=NO
#禁止匿名用户上传文件
anon_upload_enable=NO
#禁止匿名用户创建文件夹
anon_mkdir_write_enable=NO
#禁止匿名用户其他写操作(删除,重命名)
anon_other_write_enable=NO
#开启普通用户ftp访问
local_enable=YES
#上传文件默认权限
local_umask=022
#开启用户登录控制列表
userlist_enable=YES
#禁止用户chroot
chroot_local_user=NO
#开启chroot控制列表
chroot_list_enable=YES
#chroot控制列表
chroot_list_file=
/etc/vsftpd/vsftpd
.chroot_list
#允许改变系统
write_enable=YES
#---------安全参数----------
#允许运行特殊的ftp命令async ABOR.
async_abor_enable=YES
#开启tcp_wrapper访问控制
tcp_wrappers=YES
#PAM验证配置文件名称
pam_service_name=vsftpd
#---------登录消息----------
dirmessage_enable=YES
ftpd_banner=Welcome to www.cmdschool.org FTP servers
#---------进行配置---------
#listen模式启动
background=YES
#运行在standalone模式
listen=YES
#PAM验证配置文件名称
pam_service_name=vsftpd
#PASV模式最小端口
pasv_min_port=50000
#PASV模式最大端口
pasv_max_port=60000
#---------传输相关---------
ascii_upload_enable=YES
ascii_download_enable=YES
|
2)重启服务
1
|
/etc/init
.d
/vsftpd
restart
|
2.3.3、step3
配置防火墙
vim编辑/etc/sysconfig/iptables
1
2
|
-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 50000:60000 -j ACCEPT
|
2.3.4、step4
创建ftp目录
1
2
|
mkdir
/var/www/www
.cmdschool.org/
echo
www.cmdschool.org > index.html
|
2.3.5、step5
创建ftp用户并修改密码
1
2
3
|
useradd
ftp_user1 -d
/var/www/www
.cmdschool.org/ -s
/sbin/nologin
echo
ftppwd |
passwd
--stdin ftp_user1
usermod
-G apache ftp_user1
|
2.3.6、step6
权限调整
1
2
3
|
chown
:apache -R
/var/www/www
.cmdschool.org/
chmod
g+s
/var/www/www
.cmdschool.org/
chmod
770 -R
/var/www/www
.cmdschool.org/
|
2.3.7、step7
配置自动生成chroot_list
1)创建脚本文件夹
1
|
mkdir
~
/script
|
2)vim编辑~/script/ftp_chroot.sh
键入如下内容:
1
|
cat
/etc/passwd
|
cut
-d : -f1 >
/etc/vsftpd/vsftpd
.chroot_list
|
3)添加计划任务
1
|
crontab
-e
|
加入如下内容:
1
|
*
/5
* * * * sh ~
/script/ftp_chroot
.sh
|
2.3.8、step8
关闭selinux
1
2
|
setenforce 0
sed
-i
's/SELINUX=enforcing/SELINUX=disabled/g'
/etc/selinux/config
|
2.3.9、step9
1
2
|
usermod
-L ftp_user1
usermod
-U ftp_user1
|
3、本地用户验证的SSL加密实践
2.1、yum源
In ftpSer:
1
|
yum -y
install
tcpdump
|
In ftpSer:
1
|
yum -y
install
lftp
|
2.2、SSL加密的必要性
In ftpSer:
1
|
tcpdump port 21 -nA
|
In client:
1
2
3
4
5
|
lftp
open
10.168.0.166
user ftp_user1
#输入用户名
ftppwd
#输入密码
ls
|
In ftpSer:
显示如下:
1
2
3
4
5
|
#前有节删
..%. ...USER ftp_user1
#中间有节删
..%. ...PASS 123
#后有节删
|
2.3、配置
In ftpSer:
2.3.1、创建证书目录
1
2
|
mkdir
/etc/vsftpd/
.sslkey
cd
/etc/vsftpd/
.sslkey
|
2.3.2、创建证书
1
|
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout vsftpd.pem -out vsftpd.pem
|
交互模式如下(根据实际情况填写):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
Generating a 1024 bit RSA private key
....++++++
...........++++++
writing new private key to
'vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter
'.'
, the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:GD
Locality Name (eg, city) [Default City]:DG
Organization Name (eg, company) [Default Company Ltd]:cmdschool.org
Organizational Unit Name (eg, section) []:MIS
Common Name (eg, your name or your server's
hostname
) []:ftpSer
Email Address []:will@cmdschool.org
|
2.3.3、设置证书目录权限
In ftpSer:
1
|
chmod
-R 400
/etc/vsftpd/
.sslkey/
|
2.3.4、加载证书配置参数
In ftpSer:
vim编辑/etc/vsftpd/vsftpd.conf
末尾加入如下配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#--------SSL-------
#开启SSL加密协议
ssl_enable=YES
#指定加密方式
ssl_sslv2=YES
ssl_sslv3=YES
ssl_tlsv1=YES
#强制本地和虚拟用户登录使用SSL协议
force_local_logins_ssl=YES
#强制本地和虚拟用户数据使用SSL协议
force_local_data_ssl=YES
#禁用数据与控制流使用相同的ssl通道
require_ssl_reuse=NO
#加密套件
ssl_ciphers=HIGH
#指定加密证书文件
rsa_cert_file=
/etc/vsftpd/
.sslkey
/vsftpd
.pem
|
2.3.5、验证
In ftpSer:
1
|
tcpdump port 21 -nA
|
In client:
1
2
3
4
5
|
lftp
open
10.168.0.166
user ftp_user1
#输入用户名
ftppwd
#输入密码
ls
|
In ftpSer:
注:监听的信息无法找到明文的用户名和密码。