更新时间:2022-09-18 18:47:20
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:
注:监听的信息无法找到明文的用户名和密码。