FTP 是 File Transfer Protocol(文件传输协议)的英文简称,用于 Internet上的文件的双向传输。使用 FTP 来传输时,是具有一定程度的危险性, 因为数据在因特网上面是完全没有受到保护的明文传输方式!
VSFTP是一个基于 GPL发布的类 Unix系统上使用的 FTP服务器软件,它的全称是 Very Secure FTP,从名称定义上基本可以看出,这是为了解决 ftp传输安全性问题的。
- vsftp程序的运行者一般是普通用户,降低了相对应进程的权限,提高了安全性
- 任何需要执行较高权限的指令都需要上层程序许可
- ftp所需要使用的绝大多数命令都被整合到了 vsftp中,基本不需要系统额外提供命令
- 拥有 chroot功能,可以改变用户的根目录,限制用户只能在自己的家目录
控制连接(持续连接)→ TCP 21(命令信道)→ 用户收发FTP命令
数据连接(按需连接)→ TCP 20(数据信道)→ 用于上传下载数据
FTP 客户端首先和服务器的 TCP 21端口建立连接,用来发送命令,客户端需要接收数据的时候在这个通道上发送 PORT命令。PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的 TCP 20端口连接至客户端的指定端口发送数据。FTP server必须和客户端建立一个新的连接用来传送数据。
FTP 客户端首先和服务器的 TCP 21 端口建立连接,用来建立控制通道发送命令,但建立连接后客户端发送 Pasv命令。服务器收到 Pasv命令后,打开一个临时端口(端口大于 1023小于 65535)并且通知客户端在这个端口上传送数据的请求,客户端连接 FTP服务器的临时端口,然后 FTP服务器将通过这个端口传输数据。
- Binary模式:不对数据进行任何处理,适合进行可执行文件、压缩文件、图片等
- ASCII模式:进行文本传输时,自动适应目标操作系统的结束符,如回车符等
Linux的红帽发行版中VSFTP默认采用的是Binary模式,这样能保证绝大多数文件传输后能正常使用
切换方式:在ftp>提示符下输入ascii即转换到ACSII方式,输入bin,即转换到Binary方式。
[root@localhost ftp]# ftp 192.168.43.20
Connected to 192.168.43.20 (192.168.43.20).
220 (vsFTPd 3.0.2)
Name (192.168.43.20:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
- 服务端软件名:vsftpd
- 客户端软件名:ftp
- 服务名:vsftpd
- 端口号:20、21、指定范围内随机端口
- 配置文件:/etc/vsftpd/vsftpd.conf
匿名用户验证:
用户账号名称:ftp或anonymous
用户账号密码:无密码
工作目录:/var/ftp
默认权限:默认可下载不可上传,上传权限由两部分组成(主配置文件和文件系统)本地用户验证:
用户账号名称:本地用户(/etc/passwd)
用户账号密码:用户密码(/etc/shadow)
工作目录:登录用户的宿主目录
权限:最大权限(drwx------)虚拟(virtual)用户验证:
1. 创建虚拟用户用来代替本地用户,减少本地用户曝光率
2. 使用本地用户作为虚拟用户的映射用户,为虚拟用户提供工作目录和权限控制
3. 能够设置严格的权限(为每一个用户生成单独的配置文件)
注:先关闭服务器和客户机上的防火墙和 SELinux
匿名权限控制:
anonymous_enable=YES #启用匿名访问
anon_umask=022 #匿名用户所上传文件的权限掩码(匿名用户上传的文件是否能下载,默认不能)
anon_root=/var/ftp #匿名用户的 FTP 根目录
anon_upload_enable=YES #允许上传文件(目录需要有w权限)
anon_mkdir_write_enable=YES #允许创建目录
anon_other_write_enable=YES #开放其他写入权(删除、覆盖、重命名)
anon_max_rate=0 #限制最大传输速率(0 为不限速,单位:bytes/秒)
anonymous
英 [əˈnɒnɪməs] 美 [əˈnɑːnɪməs]
adj. 不知姓名的;名字不公开的;匿名的;不具名的;没有特色的
派生词: anonymously adv.
记忆技巧:an 无 + onym 名称,名字 + ous …的 → 没有名称的 → 匿名的
实验需求与流程:
注意:在客户端登录后,默认情况下是可以下载的,但不能上传
1. 实现可以上传
a. anon_upload_enable=YES
b. 在/var/ftp/下创建上传目录
c. 修改上传目录的权限或所有者,让匿名用户有写入权限(chmod o+w Xxx/)2. 实现创建目录和文件其他操作
anon_mkdir_write_enable=YES #允许创建目录
anon_other_write_enable=YES #删除文件、文件改名、文件覆盖3. 用户进入某个文件夹时,弹出相应的说明
a. 在对应目录下创建 .message 文件,并写入相应内容
b. 确认dirmessage_enable=YES是否启用
c. 尝试却换目录查看效果(同一次登录仅提示一次)4. 实现上传的文件可下载
默认情况下开放上传权限后,上传的文件是无法被下载的,因为文件的其他人位置没有r权限
设置anon_umask=022,可以让上传的文件其他人位置拥有r权限,然后才能被其他人下载
本地用户权限控制:
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 更高,即时生效
banner
英 [ˈbænə(r)] 美 [ˈbænər]
n.横幅
rate
英 [reɪt] 美 [reɪt]
n. 速度;进度;比率;率;价格;费用
v. 评估;评价;估价;认为…是好的;看好;划分等级;分等
实验需求与流程:
1. 服务端需要创建用户并设置密码(所创建的用户,不需要登录操作系统,仅用来登录VSFTP)
useradd -s /sbin/nologin username(passwd username)
2. 将所有用户禁锢在自己的家目录下
注:默认没有禁锢用户时,客户端登录后可以随意切换目录,查看文件所在位置和文件名
chroot_local_user=YES #开启用户家目录限制,限制所有用户不能随便切换目录
3. 将部分用户禁锢在自己的家目录下
chroot_list_enable=YES #开启白名单功能,允许白名单中的用户随意切换目录
chroot_list_file=/etc/vsftpd/chroot_list #白名单文件所在位置(需自己创建)
4. 配置文件:/etc/vsftpd/ftpusers
所有写入此文件内的用户名都不允许登录ftp,立刻生效。
5. 修改被动模式数据传输使用端口
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=35000
本地用户默认是可以任意切换目录的,只要是这个文件的其他用户有r权限,这个时候这个文件就是可以下载的,这是不安全的行为
Linux文件权限的基本介绍:https://blog.csdn.net/qq_40794973/article/details/86508772
//被动模式测试
//服务端
[root@localhost upload]# pwd
/var/ftp/upload
//在服务端创建一个大文件,后面客户端下载
[root@localhost upload]# dd if=/dev/zero of=./atbug.txt bs=1M count=1000
[root@localhost upload]# ll
-rw-r--r-- 1 root root 1048576000 Sep 3 08:02 atbug.txt
//查看端口(刚开始只有21端口,传输大文件的时候再来查看就能看到其他的)
netstat -antp
//客户端
ftp> ls
-rw-r--r-- 1 0 0 1048576000 Sep 03 12:02 atbug.txt
226 Directory send OK.
//再此查看服务器端口就能找到设置端口范围内的端口了(pasv_min_port, pasv_max_port)
ftp> get atbug.txt
1. 建立 FTP的虚拟用户的用户数据库文件(在/etc/vsftpd)
vim vsftpd.user
注:该文件名可以随便定义,文件内容格式:奇数行用户,偶数行密码
db_load -T -t hash -f vsftpd.user vsftpd.db #将用户密码的存放文本转化为数据库类型,并使用 hash加密
chmod 600 vsftpd.db #修改文件权限为 600,保证其安全性2. 创建 FTP虚拟用户的映射用户,并制定其用户家目录
useradd -d /var/ftproot -s /sbin/nologin virtual #创建 virtual 用户作为 ftp的虚拟用户的映射用户3. 建立支持虚拟用户的 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 #匿名用户的配置文件的目录(dir手动创建的)4. 为虚拟用户建立独立的配置文件,启动服务并测试
注:做虚拟用户配置文件设置时,将主配置文件中自定义的匿名用户相关设置注释掉。
用户可以上传:( /etc/vsftpd/dir/a1 a1是我在前面vsftpd.user配置文件里面添加的用户)
anon_upload_enable=YES #允许上传文件
用户可以创建目录或文件: ( /etc/vsftpd/dir/a2)
anon_mkdir_write_enable=YES #允许创建目录
用户可以修改文件名: (/etc/vsftpd/dir/a3)
anon_upload_enable=YES #允许上传文件(为了覆盖开启的)
anon_other_write_enable=YES #允许重名和删除文件、覆盖
注:给映射用户的家目录 设置 o+r 让虚拟用户有读权限。
[root@localhost vsftpd]# pwd
/etc/vsftpd
//查看我添加的用户
[root@localhost vsftpd]# cat vsftpd.user
a1
123456
a2
123456
a3
123456
// 前面我们配置的这几个自定义的匿名用户相关设置要注释掉
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_upload_enable=YES
//目的
虚拟用户默认所使用的选项参数用的是匿名用户的选项参数,虚拟用户和匿名用户公用同一种参数
如果在主配置文件里面开放了,那么子配置文件就不生效了
所以要把主配置文件关掉,子配置文件才生效
[root@localhost dir]# ls -ld /var/ftproot/
drwx------ 2 virtual virtual 59 Sep 3 08:52 /var/ftproot/
//给映射用户的家目录 设置 o+r 让虚拟用户有读权限。
[root@localhost dir]# chmod o+r /var/ftproot/
[root@localhost dir]# ls -ld /var/ftproot/
drwx---r-- 2 virtual virtual 59 Sep 3 08:52 /var/ftproot/
//服务端重启
[root@localhost vsftpd]# systemctl restart vsftpd.service
//客户端测试
[root@localhost ~]# ftp 172.17.211.41
//测试a1(用户可以上传)
Name (172.17.211.41:root): a1
331 Please specify the password.
Password:
//查看a1登陆的目录
ftp> ls -a
227 Entering Passive Mode (172,17,211,41,125,5).
150 Here comes the directory listing.
dr-x---r-- 2 1002 1002 59 Sep 03 12:52 .
dr-x---r-- 2 1002 1002 59 Sep 03 12:52 ..
-rw-r--r-- 1 1002 1002 18 Nov 20 2015 .bash_logout
-rw-r--r-- 1 1002 1002 193 Nov 20 2015 .bash_profile
-rw-r--r-- 1 1002 1002 231 Nov 20 2015 .bashrc
226 Directory send OK.
拓展:使用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 #产生更详细的输出1. 查看是否安装了 openssl
rpm -q openssl
2. 查看 vsftpd 是否支持 openssl
ldd /usr/sbin/vsftpd | grep libssl
3. 生成加密信息的秘钥和证书文件
位置:/etc/ssl/certs/
a. openssl genrsa -out vsftpd.key 1024
#建立服务器私钥,生成 RSA密钥
b. openssl req -new -key vsftpd.key -out vsftpd.csr
#需要依次输入国家,地区,城市,组织,组织单位,Email等信息。最重要的是有一个 common name,
可以写你的名字或者域名。如果为了 https申请,这个必须和域名吻合,否则会引发浏览器警报。
生成的 csr文件交给 CA签名后形成服务端自己的证书
c. openssl x509 -req -days 365 -sha256 -in vsftpd.csr -signkey vsftpd.key -out vsftpd.crt
#使用 CA服务器签发证书,设置证书的有效期等信息注意 1:生成完秘钥和证书文件后,将本目录{/etc/ssl/certs/}的权限修改为 500.
注意 2:在实验环境中可以用命令生成测试,在生产环境中必须要在 https证书厂商注册(否则浏览器不识别)4. 修改主配置文件/etc/vsftpd/vsftpd.conf
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格式的密钥
注:密钥文件要在配置文件中单独声明(写入配置文件时,注释要单独一行,否则会报错)5. 重启服务
service vsftpd restart
6. 测试(使用第三方客户端连接)
FileZilla-FTP(第三方客户端工具)
连接测试时选择:
服务器类型:显式 TLS/SSL
登录类型: 一般或匿名
//服务端
yum -y install vsftpd
//客户端
yum -y install ftp
//设置开机自启
chkconfig vsftpd on
systemctl enable vsftpd.service
//检查是否开机自启
chkconfig --list vsftpd
//启动
service vsftpd start
systemctl start vsftpd.service
//检查是否启动
netstat -antp
systemctl status vsftpd.service
//匿名账户默认目录
[root@localhost ftp]# pwd
/var/ftp
[root@localhost ftp]# touch test.txt
[root@localhost ftp]# ls
pub test.txt
//测试
[root@localhost ftp]# ftp 192.168.0.106
//匿名账号
Name (192.168.43.20:root): ftp
//直接回车
Password:
// 查看有哪些命令
ftp> ?
Commands may be abbreviated. Commands are:
! debug mdir sendport site
$ dir mget put size
account disconnect mkdir pwd status
append exit mls quit struct
ascii form mode quote system
bell get modtime recv sunique
binary glob mput reget tenex
bye hash newer rstatus tick
case help nmap rhelp trace
cd idle nlist rename type
cdup image ntrans reset user
chmod lcd open restart umask
close ls prompt rmdir verbose
cr macdef passive runique ?
delete mdelete proxy send
//下载(前面创建了这个文件的)
ftp> get test.txt
local: test.txt remote: test.txt
227 Entering Passive Mode (192,168,0,106,134,113).
150 Opening BINARY mode data connection for test.txt (0 bytes).
226 Transfer complete.
// 上传文件
//1.配置文件是否开启 /etc/vsftpd/vsftpd.conf
# Uncomment this to allow the anonymous FTP user to upload files. This only
# has an effect if the above global write enable is activated. Also, you will
# obviously need to create a directory writable by the FTP user.
# When SELinux is enforcing check for SE bool allow_ftpd_anon_write, allow_ftpd_full_access
#anon_upload_enable=YES
//2.登陆ftp的用户是否有写权限
[root@localhost ~]# ls -ld /var/ftp/
drwxr-xr-x. 3 root root 31 Sep 2 00:38 /var/ftp/
!ser
//创建本地用户zhangsan(创建出来的用户不能登陆操作系统)
useradd -s /sbin/nologin zhangsan
//设置密码
passwd zhangsan
[root@localhost ~]# ftp 192.168.0.106
//输入本地用户密码
Password:
//默认登陆目录就是本地用户的家目录
ftp> ls -a
227 Entering Passive Mode (192,168,0,106,178,124).
150 Here comes the directory listing.
drwx------ 2 1000 1000 59 Sep 02 13:03 .
drwxr-xr-x 3 0 0 21 Sep 02 13:03 ..
-rw-r--r-- 1 1000 1000 18 Nov 20 2015 .bash_logout
-rw-r--r-- 1 1000 1000 193 Nov 20 2015 .bash_profile
-rw-r--r-- 1 1000 1000 231 Nov 20 2015 .bashrc
226 Directory send OK.
匿名用户开启下载权限后下载还是失败
开启用户家目录限制,后登陆vsftp报错
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection这个问题发生在最新的这是由于下面的更新造成的:
- Add stronger checks for the configuration error of running with a writeable root directory inside a chroot(). This may bite people who carelessly turned on chroot_local_user but such is life.
从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。
要修复这个错误,可以用命令chmod a-w /home/user去除用户主目录的写权限,注意把目录替换成你自己的。或者你可以在vsftpd的配置文件中增加下列两项中的一项:
allow_writeable_chroot=YES