一、相关文档:
1.官方文档:http://vsftpd.beasts.org/vsftpd_conf.html
2.参考文章:https://blog.51cto.com/viong/261291
2.参考视频:https://www.bilibili.com/video/BV1Vt411M7Pz?p=10
[root@localhost vsftpd]# yum -y install ftp vsftpd # ftp客户端、vsftp服务端
[root@localhost yum.repos.d]# setenforce 0 [root@localhost yum.repos.d]# getenforce Permissive [root@localhost yum.repos.d]# systemctl stop firewalld.service [root@localhost yum.repos.d]# systemctl disable firewalld.service Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
#!/bin/bash cd /etc/yum.repos.d/ wget http://mirrors.163.com/centos/7/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm wget http://mirrors.163.com/centos/7/os/x86_64/Packages/yum-3.4.3-163.el7.centos.noarch.rpm wget http://mirrors.163.com/centos/7/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.31-52.el7.noarch.rpm wget http://mirrors.163.com/centos/7/os/x86_64/Packages/python-iniparse-0.4-9.el7.noarch.rpm wget http://mirrors.163.com/centos/7/os/x86_64/Packages/python-urlgrabber-3.10-9.el7.noarch.rpm rpm -ivh yum-metadata-parser-1.1.4-10.el7.x86_64.rpm rpm -ivh python-iniparse-0.4-9.el7.noarch.rpm rpm -ivh python-urlgrabber-3.10-9.el7.noarch.rpm rpm -ivh yum-3.4.3-163.el7.centos.noarch.rpm yum-plugin-fastestmirror-1.1.31-52.el7.noarch.rpm
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo vim CentOS7-Base-163.repo :1,$s/$releasever/7 yum clean all yum makecache
[root@localhost svt]# systemctl start vsftpd [root@localhost svt]# systemctl enable vsftpd Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
下面用匿名账号anonymous或ftp登陆,小试牛刀~
[root@localhost vsftpd]# pwd /etc/vsftpd #登录前的目录,为客户端 [root@localhost vsftpd]# ftp 127.0.0.1 #登陆回环地址 Connected to 127.0.0.1 (127.0.0.1). 220 (vsFTPd 3.0.2) Name (127.0.0.1:root): anonymous #匿名用户,登录账号为anonymous或者ftp,密码为空 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> pwd 257 "/" #登录后的目录,为服务端。引号""表示/的实际位置不确定,匿名用户的根目录,默认在/var/ftp ftp> get pub.sh #匿名用户,默认拥有下载权限 local: pub.sh remote: pub.sh 227 Entering Passive Mode (127,0,0,1,153,174). 150 Opening BINARY mode data connection for pub.sh (29 bytes). 226 Transfer complete. 29 bytes received in 9e-05 secs (322.22 Kbytes/sec) ftp> put vsf.jpg #匿名用户,默认没有上传权限。连上传都不允许,更不用说删除、复制、更名等权限了。所以说,匿名用户在默认情况下权限很低! local: vsf.jpg remote: vsf.jpg 227 Entering Passive Mode (127,0,0,1,231,236). 550 Permission denied.
3.FTP原理
21端口用于连接,20端口用于传输数据。默认采用明文传输 进行FTP文件传输中,客户端首先连接到FTP服务器的21端口,进行用户的认证,认证成功后,要传输文件时,服务器会开20端口来进行传输数据文件。 也就是说,端口20才是真正传输所用到的端口,端口21只用于版FTP的登陆认证。我们平常下载文件时,会遇到下载到99%时,文件不完成,不能成功的下载。
其实是因为文件下载完毕后,还要在21端口再行进行用户认证,而下载文件的时间如果过长,客户机与服务器的21端口的连接会被服务器认为是超时连接而中断掉,就是这个原因。解决方法就是设置21端口的响应时间。
为什么使用2个端口呢?
因为数据传输会长时间占用端口,如果只用1个端口,其他用户可能会登陆不上~所以21端口一直处于listen监听状态,20端口在传输数据时才活跃。这就是控制连接和数据连接分离。
4.VSFTP简介
vsftpd 是“ very secure FTP daemon ”的缩写,安全性是它的一个最大的特点,但是并没有加密传输,只是改善了权限验证功能~.~。 可以结合SSL配合使用~它是一个服务器软件
vsftpd是一个UNIX类操作系统上运行的服务器的名字,它可以运行在诸如 Linux 、 BSD 、 Solaris 、HP UNIX 等系统上面,是一个完全免费的、开放源代码的 ftp 服务器软件,支持很多其他的FTP 服务器所不支持的特征。
服务端软件名:vsftpd
客户端软件名:ftp
服务名:vsftp
端口号:20、21、指定范围内随机端口
配置文件:/etc/vsftpd/vsftpd.conf
登陆方式:匿名用户登录、本地用户登录、虚拟用户登陆
匿名用户验证: 用户账号:ftp或anonymous 用户密码:空 工作目录:/var/ftp 默认权限:只可下载(连上传都不行);上传权限由两部分组成(主配置文件和文件系统w); 本地用户验证: 用户账号:本地用户(/etc/passwd) 用户密码:用户密码(/etc/shadow) 工作目录:用户的家目录 权限:最大权限700(drex)
5.两种模式
PORT模式(主动方式)
控制链路 数据链路
服务端: 21端口 发起方20端口
客户端: 发起方 PORT命令告知
PASV模式(被动方式)
控制链路 数据链路
服务端: 21端口 PASV命令告知
客户端: 发起方 发起方
Pasv模式:ftp server:tcp 21 <-----client:dynamic ftp server:tcp dynamic <----client:dynamic
6.VSFTP传输模式
(1)Binary模式:不对数据进行任何处理,适合可执行文件(脚本)、压缩文件、图片等
(2)ASCII模式:进行文本传输时,自适应目标操作系统的结束符,如回车符等
Linux的RedHat发行版中,VSFTP默认采用Binary模式。
7.VSFTP的内置命令
ftp> ? Commands may be abbreviated. Commands are:
二、匿名用户登录
1.默认配置:匿名用户默认只支持下载权限
anonymous_enable=YES local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=NO pam_service_name=vsftpd userlist_deny=YES tcp_wrappers=YES
配置文件:/etc/vsftp/vsftpd.conf
2.相关参数:匿名用户增加上传、创建目录文件的权限(比如开启后,大家可以上传文件进行知识分享-.-)
anon_upload_enable=YES #上传权限 anon_mkdir_write_enable=YES #创建目录权限
3.相关参数:匿名用户增加写权限,如删除、更名、复制的权限(一般不开启!!你希望自己的东西被恶意删除吗?)
anon_other_write_enable=YES #删除、更名、覆盖权限,需要配合anon_upload_enbale=YES一起使用~ If set to YES, anonymous users will be permitted to perform write operations other than upload and create directory, such as deletion and renaming.
This is generally not recommended but included for completeness. Default: NO
anno_root=/var/ftp #匿名用户的FTP根目录,其下有个pub目录 anno_max_rate=0 #限制最大传输速录(0表示不限速,byte/s)
4.最后将/etc/vsftp/vsftpd.conf备份后,清空内容并复制下述配置。带#的为注释行,便于以后查看和修改参数。
[root@localhost vsftpd]# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.backup
[root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES local_enable=YES write_enable=YES local_umask=022 #anon_upload_enable=YES #anon_mkdir_write_enable=YES dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES #chown_uploads=YES #chown_username=whoever #xferlog_file=/var/log/vsftpd.log xferlog_std_format=YES #idle_session_timeout=600 #data_connection_timeout=120 #nopriv_user=ftpsecure #async_abor_enable=YES #ascii_upload_enable=YES #ascii_download_enable=YES #ftpd_banner=Welcome to blah FTP service. #deny_email_enable=YES #banned_email_file=/etc/vsftpd/banned_emails #chroot_list_enable=YES #chroot_list_file=/etc/vsftpd/chroot_list #ls_recurse_enable=YES listen=YES #listen_ipv6=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES
这是初始配置参数,记得自己检查一遍,不要在每行最后留有空格、复制时首字母有可能漏。
匿名用户只有下载权限。
三、本地用户登录
1.关闭匿名用户登录
[root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO #关闭匿名用户登录,anon开头的参数也都注释掉。
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
[root@localhost vsftpd]# systemctl restart vsftpd #重启vsftpd服务,并重新登录,使配置生效。
[root@localhost nDPI]# ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1). 220 (vsFTPd 3.0.2) Name (127.0.0.1:root): ftp #ftp和anonymous都是匿名用户哦!一样的。 331 Please specify the password. Password: 530 Login incorrect. Login failed.
按Ctrl+z退出
在私人ftp场合下,匿名登录不安全。所以取消匿名登录,采用本地用户登录。
2.创建本地用户登录
[root@localhost ~]# useradd -s /sbin/nologin -d /tmp/temporary new_account # -s表示用户的类型,-d表示用户的家目录位置(如不指认,则默认在/home下),new_account代表用户名 [root@localhost vsftpd]# passwd new_account #为刚刚创建的用户增加密码 Changing password for user new_account. New password: 123 BAD PASSWORD: The password is shorter than 8 characters Retype new password: 123 passwd: all authentication tokens updated successfully. [root@localhost vsftpd]# ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1). 220 (vsFTPd 3.0.2) Name (127.0.0.1:root): new_account 331 Please specify the password. Password:123 230 Login successful.
(1)创建nologin型账号new_account,本地用户目录默认在家目录/home,无法使用bash或其他shell来登陆系统
(2)/sbin/nologin:虽然用户无法使用bash或其他shell来登陆系统,但是可以使用一些系统资源。举例来说,各个系统账号中,打印作业有lp这个账号管理,web服务器有apache这个账号管理,他们都可以进行系统程序的工作, 但就是无法登陆主机而已。假如有账号试图连接我的主机取得shell,我们就可以拒绝。 (3)如果想要让/sbin/nologin类型的用户知道,他们不能登陆主机的提示语。可以新建/etc/nologin.txt这个文件,在文件内面写上不能登陆的原因,当用户登录失败时,屏幕上就会出现这个文件里面的内容。
[root@localhost vsftpd]# echo cannot login for security > /etc/nologin.txt [root@localhost vsftpd]# cat /etc/nologin.txt cannot login for security [root@localhost vsftpd]# su new_account cannot login for security
[root@localhost vsftpd]# ll -rw-r--r-- 1 root root 21 Apr 13 17:09 vsf.jpg #客户端 /etc/vsftpd/ 文件为vsf.jpg 登陆前的所在路径 [root@localhost vsftpd]# ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1). 220 (vsFTPd 3.0.2) Name (127.0.0.1:root): mm 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> pwd #服务端 /tmp/temporary 文件为jiamylu.txt 家目录在useradd创建用户时用-d选项改变了,默认情况在/home下哦! 257 "/tmp/temporary" ftp> put vsf.jpg #从客户端上传文件 local: vsf.jpg remote: vsf.jpg 227 Entering Passive Mode (127,0,0,1,104,134). 150 Ok to send data. 226 Transfer complete. 21 bytes sent in 0.0001 secs (210.00 Kbytes/sec) ftp> get jiamylu.txt #从服务端下载文件 local: jiamylu.txt remote: jiamylu.txt 227 Entering Passive Mode (127,0,0,1,101,118). 150 Opening BINARY mode data connection for jiamylu.txt (47 bytes). 226 Transfer complete. 47 bytes received in 0.000394 secs (119.29 Kbytes/sec) ftp> ls #查看服务端有哪些文件 227 Entering Passive Mode (127,0,0,1,220,62). 150 Here comes the directory listing. -rw-r--r-- 1 1008 1009 47 Apr 13 10:04 jiamylu.txt -rw-r--r-- 1 1008 1009 21 Apr 13 10:03 vsf.jpg 226 Directory send OK. ftp> mkdir mulu #创建文件夹 257 "/tmp/temporary/mulu" created ftp> rmdir mulu #删除文件夹 250 Remove directory operation successful. ftp> delete vsf.jpg #删除文件 250 Delete operation successful. ftp> rename rename jiamulu.txt jia.txt #重命名 350 Ready for RNTO. 250 Rename successful. . ftp> cd /home/new_account #不能访问其他用户的家目录,如/home/new_account 550 Failed to change directory.
ftp> cd /tmp/ #可以访问/tmp目录 250 Directory successfully changed.
本地用户的默认权限:上传文件、下载文件、创建和删除文件夹及文件、重命名
不能访问其他用户的家目录,但是可以访问其他普通目录
发现并不安全。我们需要安全设置!
Attention:文件的chown可能影响权限~如果遇到不能上传或下载,记得在客户端处,更改chown哦~
四、本地用户安全设置
1.限制本地用户锁定在家目录
[root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf
chroot_list_enable=YES #将下面3行加入配置文件中
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES
由于chroot_list文件默认不存在,需要创建,并导入本地用户。(把本地用户加入黑名单呗,防止黑客窜用root,限制本地用户在家目录内)
[root@localhost vsftpd]# touch /etc/vsftpd/chroot_list [root@localhost vsftpd]# cut -d: -f1 /etc/passwd >> /etc/vsftpd/chroot_list
chroot_list这个文件里的用户只能访问家目录 "/"
chroot_list_enable是开关:YES表示list里的系统用户与默认策略互斥
chroot_local_user是默认策略:YES表示用户被限制,NO表示用户不被限制。默认值为NO不受限制。
所以,chroot_list_enable=YES,chroot_local_user=NO意思是,本地用户不被家目录限制,但是list里的用户除外。开启黑名单~
[root@localhost vsftpd]# !sys
systemctl restart vsftpd #改完配置文件,一定要重启服务啊~
[root@localhost vsftpd]# !ftp ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1). 220 (vsFTPd 3.0.2) Name (127.0.0.1:root): mm 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> cd /tmp/ 550 Failed to change directory. ftp> cd /home/new_account 550 Failed to change directory.
anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 #anon_upload_enable=YES #anon_mkdir_write_enable=YES dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES #chown_uploads=YES #chown_username=whoever #xferlog_file=/var/log/vsftpd.log xferlog_std_format=YES #idle_session_timeout=600 #data_connection_timeout=120 #nopriv_user=ftpsecure #async_abor_enable=YES #ascii_upload_enable=YES #ascii_download_enable=YES #ftpd_banner=Welcome to blah FTP service. #deny_email_enable=YES #banned_email_file=/etc/vsftpd/banned_emails chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list allow_writeable_chroot=YES #ls_recurse_enable=YES listen=YES #listen_ipv6=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES
2.限制重要本地用户不能登录ftp权限
[root@localhost vsftpd]# echo new_account >> /etc/vsftpd/ftpusers
ftpusers里的用户会被限制登录。没啥好讲的,就是登陆黑名单。下面讲登陆白名单~
3.利用ftp用户策略允许登录ftp的本地用户
[root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list
userlist_enable在最开始时已经设置为YES了。
userlist_enable是开关:YES表示list里的系统用户与默认策略互斥
userlist_deny是默认策略:YES表示系统用户默认能登陆ftp,NO系统用户默认不能登陆ftp。默认值为YES能登陆。
所以,userlist_enable=YES、userlist_deny=NO意思是:本地用户默认不能登陆ftp,但是list里的用户例外。开启白名单呗~
[root@localhost vsftpd]# !sys
systemctl restart vsftpd #改完配置文件,一定要重启服务啊~
write_enable=YES local_umask=022 #anon_upload_enable=YES #anon_mkdir_write_enable=YES dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES #chown_uploads=YES #chown_username=whoever #xferlog_file=/var/log/vsftpd.log xferlog_std_format=YES #idle_session_timeout=600 #data_connection_timeout=120 #nopriv_user=ftpsecure #async_abor_enable=YES #ascii_upload_enable=YES #ascii_download_enable=YES #ftpd_banner=Welcome to blah FTP service. #deny_email_enable=YES #banned_email_file=/etc/vsftpd/banned_emails chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list allow_writeable_chroot=YES #ls_recurse_enable=YES listen=YES #listen_ipv6=YES pam_service_name=vsftpd userlist_enable=YES #黑名单是默认开启的,添加下面2行是启用白名单功能。其逻辑参看防火墙策略~.~搞懂的后面学习其他很顺~ userlist_deny=NO userlist_file=/etc/vsftpd/user_list tcp_wrappers=YES
root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody #这是user_list的默认参数,因为本来它是登陆黑名单的。我们现在讲的是登陆白名单,应该把它全删了,只加入自己创建的本地用户。
[root@localhost vsftpd]# cat -n user_list > user_list cat: user_list: input file is output file [root@localhost vsftpd]# echo mm >> user_list [root@localhost vsftpd]# cat user_list mm #此时user_list里面只有我们的账号mm [root@localhost vsftpd]# !ftp ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1). 220 (vsFTPd 3.0.2) Name (127.0.0.1:root): mm 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. #发现可以登陆,白名单有用~接下来我们把账号mm从白名单删掉,看能不能登陆?
[root@localhost vsftpd]# cat -n user_list > user_list cat: user_list: input file is output file
[root@localhost vsftpd]# !sys
systemctl restart vsftpd #改完配置文件,一定要重启服务啊~
[root@localhost vsftpd]# !ftp ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1). 220 (vsFTPd 3.0.2) Name (127.0.0.1:root): mm 530 Permission denied. Login failed. #cat那条命令是清空文件,然后这时白名单内容为空,账号mm不能登陆!嘻嘻~
4.设置登录ftp目标的ip地址(没啥必要,看看就会了)
https://blog.51cto.com/viong/261342
五、虚拟用户登陆
虚拟用户:人为创建,生成数据库文件,找一个本地用户作为虚拟用户的映射用户,借助本地用户的家目录作为默认登陆点。每一个虚拟用户的权限都可以单独定制。
1.建立FTP虚拟用户的用户数据库文件(在/etc/vsftp目录下)
[root@localhost vsftpd]# vim vsftpd.virtualuser #创建虚拟用户账号和密码。奇数行账号,偶数行密码 [root@localhost vsftpd]# db_load -T -t hash -f vsftpd.virtualuser vsftpd.db #将上述文本转为数据库类型。-T生成db文件,-t选择加密方式,-f选择加密文件。生成文件名任意指定,db后缀不能改。 [root@localhost vsftpd]# chmod 600 vsftpd.db #赋予数据库文件600权限,只有root可以读写。保证安全性,否则会报错。
2.创建FTP虚拟用户的映射用户,并制定用户家目录(映射用户不用设置密码)
3.建立支持虚拟用户的PAM认证文件,添加虚拟用户支持(让主配置文件来找它)
[root@localhost vsftpd]# vim vsftpd.virtualuser #创建虚拟用户账号和密码。奇数行账号,偶数行密码 [root@localhost vsftpd]# db_load -T -t hash -f vsftpd.virtualuser vsftpd.db #创建数据库,将上虚拟用户账号和密码进行加密。-T生成db文件,-t选择加密方式,-f选择加密文件。生成文件名任意指定,db后缀不能改。 [root@localhost vsftpd]# chmod 600 vsftpd.db #赋予数据库文件600权限,只有root可以读写。保证安全性,否则会报错。 [root@localhost vsftpd]# useradd -s /sbin/nologin -d /var/ftp/root virtual #创建一个本地用户作为虚拟用户的映射,用于虚拟用户登陆位置。这个本地用户不用设置密码~
[root@localhost dir]# chmod o+r /var/ftp/root/ #other组即针对虚拟用户,使得虚拟用户对家目录具有读权限。否则虚拟用户登陆进去啥也看不到
[root@localhost dir]# cp -a /etc/pam.d/vsftpd /etc/pam.d/vsftpd.pam #更改复制后的文件,之后将这个文件作为/etc/vsftpd.conf里的pam_service_name参数路径就行。让主配置文件来找它~ [root@localhost dir]# cat /etc/pam.d/vsftpd.pam > /etc/pam.d/vsftpd.pam #清空里面文件,并将下面两行复制进去 [root@localhost dir]# vim /etc/pam.d/vsftpd.pam auth required pam_userdb.so db=/etc/vsftpd/vsftpd account required pam_userdb.so db=/etc/vsftpd/vsftpd
[root@localhost vsftpd]# vim vsftpd.conf #打开匿名登录anony_enable=YES【虚拟账户和匿名账户同配置】,并将其他anon开头的参数都注释掉【之后单独为虚拟用户建立子配置文件,防止主配置文件对子配置文件进行覆盖】。
pam_service_name=vsftpd.pam #更改pam认证路径; 打开虚拟用户登录; 指定虚拟用户的映射用户; 指定虚拟用户的配置目录. 如果想换回本地用户登陆,记得把这个路径改回去,否则本地用户登录不了~
guest_enable=YES
guest_username=virtual
user_config_dir=/etc/vsftpd/dir
4.为虚拟用户建立独立的子配置文件,重启服务进行测试(匿名用户默认只有下载权限)
[root@localhost vsftpd]# mkdir /etc/vsftpd/dir [root@localhost vsftpd]# cd dir [root@localhost dir]# touch a{1..3} [root@localhost dir]# vim a1 anon_upload_enable=YES #允许上传文件 [root@localhost dir]# vim a2 anon_mkdir_write_enable=YES #允许创建目录 [root@localhost dir]# vim a3 anon_upload_enable=YES anon_other_write_enable=YES #允许重命名、删除、覆盖文件
[root@localhost dir]# chmod o+r /var/ftp/root/ #再次确认,如果虚拟用户(other型),对其映射用户virtual的家目录/var/ftp/root(自己设置的)没有读(r)权限,则FTP登陆进去啥也看不见~
[root@localhost dir]# !sys systemctl restart vsftpd
[root@localhost dir]# !ftp ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1). 220 (vsFTPd 3.0.2) Name (127.0.0.1:root): a1 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> put dir.txt local: dir.txt remote: dir.txt 227 Entering Passive Mode (127,0,0,1,72,135). 150 Ok to send data. 226 Transfer complete. 56 bytes sent in 0.000115 secs (486.96 Kbytes/sec) ftp> put dir.txt local: dir.txt remote: dir.txt 227 Entering Passive Mode (127,0,0,1,140,132). 553 Could not create file. ftp> mkdir abc 550 Permission denied.
[root@localhost dir]# !ftp ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1). 220 (vsFTPd 3.0.2) Name (127.0.0.1:root): a2 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> put dir.txt local: dir.txt remote: dir.txt 227 Entering Passive Mode (127,0,0,1,51,67). 550 Permission denied. ftp> mkdir ss 257 "/ss" created
[root@localhost dir]# !f ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1). 220 (vsFTPd 3.0.2) Name (127.0.0.1:root): a3 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> put dir.txt local: dir.txt remote: dir.txt 227 Entering Passive Mode (127,0,0,1,209,205). 150 Ok to send data. 226 Transfer complete. 56 bytes sent in 9e-05 secs (622.22 Kbytes/sec) ftp> delete dir.txt 250 Delete operation successful.
六、SSL+vsftp加密验证
1.使用tcpdump工具进行制定端口抓包,抓取ftp登陆过程中的数据包
[root@localhost vsftpd]# tcpdump -i ens33 -nn -X -vv port 21 and ip host 10.0.0.10
说明:
(1)-i #interface
(2)-nn 对地址显示为数字方式,否则显示为主机名;还把端口显示为数值,否则显示端口服务名
(3)-X 输出包的头部数据,会以16进制和ASCII两周方式同时输出
(4)-vv 产生更详细的输出
(5)10.0.0.10是客户端地址,使用WinSCP来访问~
[root@localhost vsftpd]# tcpdump -i ens33 -nn -X -vv port 21 and ip host 10.0.0.10 tcpdump: listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
****************************************************************************************************************************************
15:54:11.469507 IP (tos 0x0, ttl 64, id 10147, offset 0, flags [DF], proto TCP (6), length 49)
10.0.0.10.49433 > 10.0.0.100.21: Flags [P.], cksum 0xda82 (correct), seq 1:10, ack 21, win 16420, length 9: FTP, length: 9
USER mm
0x0000: 4500 0031 27a3 4000 4006 feb6 0a00 000a E..1'.@.@.......
0x0010: 0a00 0064 c119 0015 1bfd e64a d360 b7b7 ...d.......J.`..
0x0020: 5018 4024 da82 0000 5553 4552 206d 6d0d P.@$....USER.mm.
0x0030: 0a .
15:54:11.469615 IP (tos 0x0, ttl 64, id 756, offset 0, flags [DF], proto TCP (6), length 40)
10.0.0.100.21 > 10.0.0.10.49433: Flags [.], cksum 0x1488 (incorrect -> 0x4bea), seq 21, ack 10, win 229, length 0
0x0000: 4500 0028 02f4 4000 4006 236f 0a00 0064 E..(..@.@.#o...d
0x0010: 0a00 000a 0015 c119 d360 b7b7 1bfd e653 .........`.....S
0x0020: 5010 00e5 1488 0000 P.......
15:54:11.471684 IP (tos 0x0, ttl 64, id 757, offset 0, flags [DF], proto TCP (6), length 74)
10.0.0.100.21 > 10.0.0.10.49433: Flags [P.], cksum 0x14aa (incorrect -> 0x049f), seq 21:55, ack 10, win 229, length 34: FTP, length: 34
331 Please specify the password.
0x0000: 4500 004a 02f5 4000 4006 234c 0a00 0064 E..J..@.@.#L...d
0x0010: 0a00 000a 0015 c119 d360 b7b7 1bfd e653 .........`.....S
0x0020: 5018 00e5 14aa 0000 3333 3120 506c 6561 P.......331.Plea
0x0030: 7365 2073 7065 6369 6679 2074 6865 2070 se.specify.the.p
0x0040: 6173 7377 6f72 642e 0d0a assword...
15:54:11.472322 IP (tos 0x0, ttl 64, id 10148, offset 0, flags [DF], proto TCP (6), length 48)
10.0.0.10.49433 > 10.0.0.100.21: Flags [P.], cksum 0x3bc3 (correct), seq 10:18, ack 55, win 16411, length 8: FTP, length: 8
PASS
0x0000: 4500 0030 27a4 4000 4006 feb6 0a00 000a E..0'.@.@.......
0x0010: 0a00 0064 c119 0015 1bfd e653 d360 b7d9 ...d.......S.`..
0x0020: 5018 401b 3bc3 0000 5041 5353 2020 0d0a P.@.;...PASS....
15:54:11.513422 IP (tos 0x0, ttl 64, id 758, offset 0, flags [DF], proto TCP (6), length 40)
10.0.0.100.21 > 10.0.0.10.49433: Flags [.], cksum 0x1488 (incorrect -> 0x4bc0), seq 55, ack 18, win 229, length 0
0x0000: 4500 0028 02f6 4000 4006 236d 0a00 0064 E..(..@.@.#m...d
0x0010: 0a00 000a 0015 c119 d360 b7d9 1bfd e65b .........`.....[
0x0020: 5010 00e5 1488 0000 P.......
15:54:11.591459 IP (tos 0x0, ttl 64, id 759, offset 0, flags [DF], proto TCP (6), length 63)
10.0.0.100.21 > 10.0.0.10.49433: Flags [P.], cksum 0x149f (incorrect -> 0x6a28), seq 55:78, ack 18, win 229, length 23: FTP, length: 23
230 Login successful.
0x0000: 4500 003f 02f7 4000 4006 2355 0a00 0064 E..?..@.@.#U...d
0x0010: 0a00 000a 0015 c119 d360 b7d9 1bfd e65b .........`.....[
0x0020: 5018 00e5 149f 0000 3233 3020 4c6f 6769 P.......230.Logi
0x0030: 6e20 7375 6363 6573 7366 756c 2e0d 0a n.successful...
***************************************************************明文传输账号密码,不安全********************************************************
2.CA证书服务器
(1)秘钥:私钥,解密数据包
(2)证书:公钥,加密数据包(加密类型,加密长度)
(3)签字后的正数:有一定有效期、有加密类型、有加密长度
(4)生产环境中的CA服务需要花钱买,个人可以找点免费的使用,比如OpenSSL
3.采用SSL加密传输
1.查看是否安装了openssl(免费的CA服务器)
[root@localhost ~]# rpm -qa | grep openssl openssl-libs-1.0.2k-12.el7.x86_64 xmlsec1-openssl-1.2.20-7.el7_4.x86_64 openssl-1.0.2k-12.el7.x86_64
2.查看vsftpd是否支持openssl
[root@localhost ~]# which vsftpd [root@localhost ~]# ldd /usr/sbin/vsftpd | grep ssl libssl.so.10 => /lib64/libssl.so.10 (0x00007f209d7d5000)
3.生成加密信息的密钥对(秘钥和证书文件应在:/etc/ssl/certs/)
[root@localhost ~]# cd /etc/ssl/certs/ [root@localhost certs]# openssl genrsa -out vsftpd.key 1024 #建立秘钥,加密类型为rsa,长度1024 [root@localhost certs]# openssl req -new -key vsftpd.key -out vsftpd.csr #建立证书文件,输入相关信息。如果为了https申请,必须和域名吻合! [root@localhost certs]# openssl x509 -req -days 365 -sha256 -in vsftpd.csr -signkey vsftpd.key -out vsftpd.crt #设置签字证书颁发格式、有效期、加密类型、加密长度、指定使用的秘钥和证书文件~
***************************************************************注意/etc/ssl/certs的权限应该为500********************************************************
4.修改主配置文件(/etc/vsftpd/vsftpd.conf)
[root@localhost ~]# cd /etc/vsftpd/ [root@localhost vsftpd]# vim vsftpd.conf anonymous_enable=YES local_enable=YES write_enable=YES local_umask=022 #anon_upload_enable=YES #anon_mkdir_write_enable=YES dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES #chown_uploads=YES #chown_username=whoever #xferlog_file=/var/log/vsftpd.log xferlog_std_format=YES #idle_session_timeout=600 #data_connection_timeout=120 #nopriv_user=ftpsecure #async_abor_enable=YES #ascii_upload_enable=YES #ascii_download_enable=YES #ftpd_banner=Welcome to blah FTP service. #deny_email_enable=YES #banned_email_file=/etc/vsftpd/banned_emails chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list allow_writeable_chroot=YES #ls_recurse_enable=YES listen=YES #listen_ipv6=YES pam_service_name=vsftpd guest_enable=YES guest_username=virtual user_config_dir=/etc/vsftpd/dir userlist_enable=YES #userlist_deny=NO #userlist_file=/etc/vsftpd/user_list tcp_wrappers=YES ssl_enable=YES #启用ssl认证 ssl_tlsv1=YES #指定ssl的3个版本 ssl_sslv2=YES ssl_sslv3=YES allow_anon_ssl=YES #强制匿名用户/虚拟用户、本地用户,在登录和数据传输时,使用ssl force_anon_logins_ssl=YES force_anon_data_ssl=YES force_local_logins_ssl=YES force_local_data_ssl=YES rsa_cert_file=/etc/ssl/certs/vsftpd.crt #指定签字证书的路径 rsa_private_key_file=/etc/ssl/certs/vsftpd.key #指定秘钥的路径
5.重启vsftpd服务,使得配置生效,并开启监听
[root@localhost vsftpd]# !sys systemctl restart vsftpd [root@localhost vsftpd]# tcpdump -i ens33 -nn -X -vv port 21 and ip host 10.0.0.10
现在全是加密信息了,不信你把信息重定向到文本,用grep来找找看~~
七、报错总结
1./etc/vsftpd.conf里的配置参数,最后面有空格
2./etc/vsftpd.conf里的配置参数,ipv6=YES
3.FTP服务21端口被占用
4.防火墙和SELinux没有关
5./etc/vsftpd.conf的名字不正确,少个字母d变成/etc/vsftp
6./etc/vsftpd.conf的权限不正确,不属于root,或者没有读写权限
、
*****************