FTP是File Transfer Protocol(文件传输协议)的英文简称,用于Internet上的文件的双向传输。使用 FTP 来传输时,是具有一定程度的危险性, 因为数据在因特网上面是完全没有受到保护的明文传输方式!
VSFTP是一个基于GPL发布的类Unix 系统上使用的FTP服务器软件,它的全称是Very Secure FTP,从名称定义上基本可以看出,这是为了解决ftp传输安全性问题的。
安全特性
vsftp连接类型
vsftp工作模式
VSFTP 传输模式
VSFTP 软件信息
登录验证方式
虚拟(virtual)用户验证:
三种登陆模式
客户端----->匿名用户登录---->匿名账号:ftp或者是anonymous 密码是空密码
默认的家目录:/var/ftp/目录下
客户端----->本地用户登录---->本地登录涉及到:普通用户和普通用户的家目录
/etc/passwd
/etc/shadow文件
客户端----->虚拟用户登录---->这个是最复杂的;
需要人为创建,生成数据库文件;
找一个系统用户作为虚拟用户的映射用户,借助系统用户的家目录作为默认的登陆点,/home下的其中一个用户名
每一个虚拟用户的权限都可以单独指定的
匿名用户的权限控制
anonymous_enable=YES #启用匿名访问
anon_umask=022 #匿名用户所上传文件的权限掩码
anon_root=/var/ftp #匿名用户的 FTP 根目录
anon_upload_enable=YES #允许上传文件
anon_mkdir_write_enable=YES #允许创建目录
anon_other_write_enable=YES #开放其他写入权(删除、覆盖、重命名)
anon_max_rate=0 #限制最大传输速率(0 为不限速,单位:bytes/秒)
实验要求
注意:在客户端登录后,默认情况下是可以下载的,但不能上传
实现可以上传:
实现创建目录和文件其他操作
用户进入某个文件夹时,弹出相应的说明
实现上传的文件可下载
整个实验的过程:
#首先,所有的实验都必须要关闭selinux和firewalld
[root@node0 ~]# systemctl stop firewalld
[root@node0 ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@node0 ~]# setenforce 0
#首先安装以下vsftpd服务-->lftp和ftp都是用于连接vsftpd的
[root@node0 ~]# yum -y install vsftpd ftp lftp
#设置开机自启动
[root@node0 ~]# systemctl start vsftpd
[root@node0 ~]# systemctl enable vsftpd
#尝试匿名用户登录--->用到另外一台服务器来登陆验证
[root@Node1 ~]# ftp 192.168.75.130
Connected to 192.168.75.130 (192.168.75.130).
220 (vsFTPd 3.0.2)
Name (192.168.75.130:root): ftp #用户名:ftp
331 Please specify the password.
Password: #这里直接回车-->空密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
#登陆好了,可以直接查看有什么命令可以使用
ftp> ?-------------->#这里直接输入文豪回车,就能够看到所有的命令
#查看一下是否能够-->目录
ftp> ls
227 Entering Passive Mode (192,168,75,130,224,69).
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 6 Oct 30 2018 pub
226 Directory send OK.
#这里匿名用户默认的家目录就是/var/ftp/目录下
ftp> pwd
257 "/"
#回到服务器创建一下文件验证家目录的位置
[root@node0 ftp]# mkdir upload
[root@node0 ftp]# ls
pub upload
#客户端查看也能看到upload目录
ftp> ls
227 Entering Passive Mode (192,168,75,130,195,24).
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 6 Oct 30 2018 pub
drwxr-xr-x 2 0 0 6 Nov 08 10:34 upload
226 Directory send OK.
#用客户端直接尝试下载看看是否成功--->这里明显发现出现了550的报错信息
ftp> get upload
local: upload remote: upload
227 Entering Passive Mode (192,168,75,130,59,121).
550 Failed to open file.
#再次使用客户端上传文件看看--->发现也是失败的;
local: /root/client.txt remote: /root/client.txt
/root/client.txt: not a plain file.
ftp>
#如果需要实现-->服务器端则要配置相对应的配置文件
[root@node0 ftp]# vim /etc/vsftpd/vsftpd.conf
#这几行都是新增添加的
anon_upload_enable=YES #允许匿名用户上传
anon_mkdir_write_enable=YES #允许匿名用户创建
anon_other_write_enable=YES #允许匿名用户删除、修改、覆盖文件
#这里重启一下服务
[root@node0 ftp]# systemctl restart vsftpd
#匿名用户的上传、修改、删除除了受到vsftpd的制约,还得收到文件本身的权限制约
#因此匿名用户如果想要上传下载的时候,建议是单独给到一个目录;不要把默认的/var/ftp目录权限放的很大
[root@node0 ftp]# ls -ld . upload/
drwxr-xr-x 4 root root 31 11月 8 18:34 .
drwxr-xr-x 2 root root 6 11月 8 18:34 upload/
[root@node0 ftp]# ls -ld . upload/
drwxr-xr-x 4 root root 31 11月 8 18:34 .
drwxrwxrwx 2 root root 6 11月 8 18:34 upload/
#用客户端再次验证;
[root@Node1 ~]# ftp 192.168.75.130
#进入到目录
ftp> cd upload
250 Directory successfully changed.
ftp> get haha.txt ---->#这里可以成功下载
local: haha.txt remote: haha.txt
227 Entering Passive Mode (192,168,75,130,139,67).
150 Opening BINARY mode data connection for haha.txt (0 bytes).
226 Transfer complete.
#尝试一下改名
ftp> rename haha.txt hh.txt
350 Ready for RNTO.
250 Rename successful.
ftp> ls
227 Entering Passive Mode (192,168,75,130,141,1).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Nov 08 10:51 hh.txt
226 Directory send OK.
#如果想要进入到一个文件夹的时候,有提示信息
1)在默认的目录下创建.message文件,编写内容
2)vsftpd配置文件需要打开此功能dirmessage_enable=YES
3)同一次的登陆只会显示一次的效果
#服务器配置
#首先编写一下欢迎信息
[root@node0 upload]# vim /var/ftp/upload/.message
LiangJiaWei is a goodboy
#修改一下配置文件
[root@node0 upload]# vim /etc/vsftpd/vsftpd.conf
............
dirmessage_enable=YES
#最后客户验证
[root@Node1 ~]# ftp 192.168.75.130
Connected to 192.168.75.130 (192.168.75.130).
220 (vsFTPd 3.0.2)
Name (192.168.75.130:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd upload
250-LiangJiaWei is a goodboy
250 Directory successfully changed.
本地用户权限控制:
local_enable=YES #是否启用本地系统用户
local_umask=022 #本地用户所上传文件的权限掩码
local_root=/var/ftp #设置本地用户的 FTP 根目录
chroot_local_user=YES #是否将用户禁锢在主目录
local_max_rate=0 #限制最大传输速率
ftpd_banner=Welcome to blah FTP service #用户登录时显示的欢迎信息
userlist_enable=YES & userlist_deny=YES
#禁止/etc/vsftpd/user_list 文件中出现的用户名登录 FTP
userlist_enable=YES & userlist_deny=NO
#仅允许/etc/vsftpd/user_list 文件中出现的用户名登录 FTP
配置文件:ftpusers
#禁止/etc/vsftpd/ftpusers 文件中出现的用户名登录 FTP,权限比 user_list 更高,即时生效
实验需求与流程:
实验过程:
#创建一个用于vsftpd的本地账户
[root@node0 ~]# useradd -s /sbin/nologin zhangsan
[root@node0 ~]# echo 1 | passwd --stdin zhangsan
更改用户 zhangsan 的密码 。
passwd:所有的身份验证令牌已经成功更新。
#这样子尝试登陆-->本地用户登录--->这里发现直接被拒绝登陆
[root@Node1 ~]# ftp 192.168.75.130
Connected to 192.168.75.130 (192.168.75.130).
220 (vsFTPd 3.0.2)
Name (192.168.75.130:root): zhangsan
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.
#排错:--->具体的原因不明白;但是这么做能够实现本地用户登录
#然后修改一下/etc/pam.d/vsftpd这个文件的选项
[root@node0 ~]# vim /etc/pam.d/vsftpd
#%PAM-1.0
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
#auth required pam_shells.so #注释掉这一行
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth
#普通用户登录后-->发现权限过大,可以随意切换目录
ftp> cd /etc/
250 Directory successfully changed.
ftp> ls
#这里就有一些限制的措施
1)把用户紧固在自己的家目录下;chroot_local_user=YES
2)可以分权,限制部分用户限制在自己的家目录;chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list #这个文件需要自己创建;
3)/etc/vsftpd/ftpusers这个文件下的用户都不能登录的
4)修改一下被动模式传输使用的端口
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=35000
#修改一下配置文件
[root@node0 ~]# vim /etc/vsftpd/vsftpd.conf
.............
local_enable=YES
chroot_loacal_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES
.................
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=35000
#这里要创建一个chroot_list的文件并且写入内容-->不然会报错,导致无法启动
[root@node0 ~]# touch /etc/vsftpd/chroot_list
[root@node0 ~]# chown ftp. /etc/vsftpd/chroot_list
[root@node0 ~]# vim /etc/vsftpd/chroot_list
zhangsan
#重启服务查看
[root@node0 ~]# systemctl restart vsftpd
#为了区别功能,我们再次创建一个lisi的账户
[root@node0 ~]# useradd lisi
[root@node0 ~]# echo 1 | passwd --stdin lisi
更改用户 lisi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
#使用客户端--->查看
#登陆李四用户-->发现无法查看除了自己家目录的信息
[root@Node1 ~]# ftp 192.168.75.130
Connected to 192.168.75.130 (192.168.75.130).
220 (vsFTPd 3.0.2)
Name (192.168.75.130:root): lisi
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,75,130,118,181).
150 Here comes the directory listing.
226 Directory send OK.
ftp> cd /etc/
550 Failed to change directory.
#登陆张三查看--------->这里已经证明了张三是随意切换的
[root@Node1 ~]# ftp 192.168.75.130
Connected to 192.168.75.130 (192.168.75.130).
220 (vsFTPd 3.0.2)
Name (192.168.75.130:root): zhangsan
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd /etc/
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,75,130,128,85).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 5090 Oct 30 2018 DIR_COLORS
-rw-r--r-- 1 0 0 5725 Oct 30 2018 DIR_COLORS.256co
#查看一下端口-->
[root@node0 ~]# netstat -antlup
........
tcp6 0 0 192.168.75.130:21 192.168.75.131:35990 ESTABLISHED 7519/vsftpd
4、虚拟用户实验
虚拟用户的对比图:
FTP_client--->FTP_server
/etc/pam.d/vsftpd
匿名用户:/etc/passwd
本地用户:/etc/passwd和/etc/shadow
/etc/pam.d/vsftpd.pam
虚拟的用户
执行创建
用户、密码文件
#使用模板生成自己的认证配置文件,方便一会调用
cp –a /etc/pam.d/vsftpd /etc/pam.d/vsftpd.pam
#编辑新生成的文件 vsftpd.pam (清空原来内容,添加下列两行)
auth required pam_userdb.so db=/etc/vsftpd/vsftpd
account required pam_userdb.so db=/etc/vsftpd/vsftpd
#在 vsftpd.conf 文件中添加支持配置 修改:
pam_service_name=vsftpd.pam
#添加:
guest_enable=YES
guest_username=virtual
user_config_dir=/etc/vsftpd/dir
#用户可以上传:
anon_upload_enable=YES #允许上传文件
#用户可以创建目录或文件:
anon_mkdir_write_enable=YES #允许创建目录
#用户可以修改文件名:
anon_upload_enable=YES #允许上传文件(为了覆盖开启的)
anon_other_write_enable=YES #允许重名和删除文件、覆盖
#注:给映射用户的家目录 设置 o+r 让虚拟用户有读权限。
实验过程
#首先,建立虚拟用户的数据库文件
#这里需要注意:奇数行是名字,偶数行是密码
[root@node0 ~]# vim /etc/vsftpd/vsftpd.user
liangjiawei01
123456
liangjiawei02
123456
liangjiawei03
123456
#然后把用户的数据库文件转化成db文件,并且hash加密
[root@node0 ~]# db_load -T -t hash -f /etc/vsftpd/vsftpd.user /etc/vsftpd/vsftpd.db
#一定要把这个文件的权限改成600
[root@node0 ~]# chmod 600 /etc/vsftpd/vsftpd.db
#创建虚拟用户登录的家目录-->这个也是虚拟用户的映射用户
[root@node0 ~]# useradd -s /sbin/nologin virtual
#让虚拟用户的家目录有读权限
[root@node0 ~]# chmod o+r /home/virtual/
[root@node0 ~]#
#建立一份虚拟用户的pam认证文件;
[root@node0 ~]# cp -a /etc/pam.d/vsftpd /etc/pam.d/vsftpd.pam
#然后修改一下pam认证文件的内容
[root@node0 ~]# vim /etc/pam.d/vsftpd.pam
#%PAM-1.
auth required pam_userdb.so db=/etc/vsftpd/vsftpd
account required pam_userdb.so db=/etc/vsftpd/vsftpd
#去到配置文件conf中添加支持的配置
[root@node0 ~]# vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.pam #这一行要修改
guest_enable=YES #下面这些直接添加新得字段
guest_username=virtual
user_config_dir=/etc/vsftpd/dir
..........
#创建指定的虚拟用户的配置文件
[root@node0 ~]# mkdir /etc/vsftpd/dir
#注:做虚拟用户配置文件设置时,将主配置文件中自定义的匿名用户相关设置注释掉。
#指定01可以上传文件
[root@node0 ~]# vim /etc/vsftpd/dir/liangjiawei0.conf
anon_upload_enable=YES
#指定02可以创建
[root@node0 ~]# vim /etc/vsftpd/dir/liangjiawei02.conf
anon_mkdir_write_enable=YES
#指定03可以上传和下载
[root@node0 ~]# vim /etc/vsftpd/dir/liangjiawei03.conf
anon_upload_enable=YES
anon_other_write_enable=YES
#重启验证
[root@node0 ~]# systemctl restart vsftpd
[root@node0 ~]#
#客户端用虚拟用户登录
[root@Node1 ~]# ftp 192.168.75.130
Connected to 192.168.75.130 (192.168.75.130).
220 (vsFTPd 3.0.2)
Name (192.168.75.130:root): liangjiawei01
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
#到这里实验就成功了
实验的思路:
拓展:使用tcpdump 工具进行指定端口抓包,抓取ftp登录过程中的数据包
#格式:
tcpdump -i eth0 -nn -X -vv tcp port 21 and ip host 来源ip
#参数解析:
-i #interface:指定tcpdump需要监听的接口
-n #对地址以数字方式显式,否则显式为主机名
-nn #除了-n的作用外,还把端口显示为数值,否则显示端口服务名
-X #输出包的头部数据,会以16进制和ASCII两种方式同时输出
-vv #产生更详细的输出
例子说明问题:
#首先安装一下tcpdump工具
[root@node0 ~]# yum -y install tcpdump
#验证一下做包工具-->这里可以明显看出,咋们的密码和用户名都是能够被抓取的
[root@node0 ~]# tcpdump -i ens32 -nn -X -vv tcp port 21 and ip host 192.168.75.31
tcpdump: listening on ens32, link-type EN10MB (Ethernet), capture size 262144 bytes
#然后使用客户端登陆
[root@Node1 ~]# ftp 192.168.75.130
Connected to 192.168.75.130 (192.168.75.130).
220 (vsFTPd 3.0.2)
Name (192.168.75.130:root): liangjiawei01
331 Please specify the password.
Password:
#建立服务器私钥,生成 RSA 密钥
openssl genrsa -out vsftpd.key 1024
#需要依次输入国家,地区,城市,组织,组织单位,Email 等信息。最重要的是有一个 common name,
#可以写你的名字或者域名。如果为了 https 申请,这个必须和域名吻合,否则会引发浏览器警报。
#生成的 csr 文件交给 CA 签名后形成服务端自己的证书
openssl req -new -key vsftpd.key -out vsftpd.csr
#使用 CA 服务器签发证书,设置证书的有效期等信息
#注意 1:生成完秘钥和证书文件后,将本目录{/etc/ssl/certs/}的权限修改为 500.
#注意 2:在实验环境中可以用命令生成测试,在生产环境中必须要在 https 证书厂商注册(否则浏览器不识别)
openssl x509 -req -days 365 -sha256 -in vsftpd.csr -signkey vsftpd.key -out vsftpd.crt
ssl_enable=YES
#启用 ssl 认证
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
#开启 tlsv1、sslv2、sslv3 都支持
allow_anon_ssl=YES
#允许匿名用户{虚拟用户}
force_anon_logins_ssl=YES
force_anon_data_ssl=YES
#匿名登录和传输时强制使用 ssl
force_local_logins_ssl=YES
force_local_data_ssl=YES
#本地登录和传输时强制使用 ssl
rsa_cert_file=/etc/ssl/certs/vsftpd.crt
#rsa格式的证书
rsa_private_key_file=/etc/ssl/certs/vsftpd.key
#rsa格式的密钥
注:密钥文件要在配置文件中单独声明(写入配置文件时,注释要单独一行,否则会报错)
实验过程:
#查看一下是否安装了openssl
[root@node0 ~]# rpm -q openssl
openssl-1.0.2k-16.el7.x86_64
#再查看vsftpd是否支持openssl
[root@node0 ~]# ldd /usr/sbin/vsftpd | grep libssl
libssl.so.10 => /lib64/libssl.so.10 (0x00007fdde32cc000)
#去到生成的加密信息的密钥和证书文件
[root@node0 certs]# chmod 500 /etc/ssl/certs/
[root@node0 ~]# cd /etc/ssl/certs/
[root@node0 certs]#
#生成服务器私钥、生成RSA密钥
[root@node0 certs]# openssl genrsa -out vsftpd.key 1024
Generating RSA private key, 1024 bit long modulus
.........................................................................++++++
....++++++
e is 65537 (0x10001)
#然后在生成证书文件
需要依次输入
国家,
地区,
城市,
组织,
组织单位,
Email 等信息
最重要的是有一个 common name,
可以写你的名字或者域名。如果为了 https 申请,这个必须和域名吻合,否则会引发浏览器警报。生成的 csr 文件交给 CA 签名后形成服务端自己的证书
[root@node0 certs]# openssl genrsa -out vsftpd.key 1024
Generating RSA private key, 1024 bit long modulus
.........................................................................++++++
....++++++
e is 65537 (0x10001)
[root@node0 certs]# openssl req -new -key vsftpd.key -out vsftpd.csr
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]:GZ
Organization Name (eg, company) [Default Company Ltd]:NS
Organizational Unit Name (eg, section) []:YK
Common Name (eg, your name or your server's hostname) []:YKKJ
Email Address []:123456@qq.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
#最后使用CA服务器签发证书
[root@node0 certs]# openssl x509 -req -days 365 -sha256 -in vsftpd.csr -signkey vsftpd.key -out vsftpd.crt
Signature ok
subject=/C=CN/ST=GD/L=GZ/O=NS/OU=YK/CN=YKKJ/emailAddress=123456@qq.com
Getting Private key
#这里要注意两个问题
注意 1:生成完秘钥和证书文件后,将本目录{/etc/ssl/certs/}的权限修改为 500.
注意 2:在实验环境中可以用命令生成测试,在生产环境中必须要在 https 证书厂商注册(否则浏览器不识别)
#这里准备好了之后可以修改配置文件
[root@node0 certs]# vim /etc/vsftpd/vsftpd.conf
............
#添加一下几个内容
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
allow_anon_ssl=YES
force_anon_logins_ssl=YES
force_anon_data_ssl=YES
rsa_cert_file=/etc/ssl/certs/vsftpd.crt
rsa_private_key_file=/etc/ssl/certs/vsftpd.key
#重启服务验证即可
[root@node0 certs]# systemctl restart vsftpd
[root@node0 certs]#
#到这里实验就结束了;