CentOS 7.0 使用Vsftpd服务传输文件
文件传输协议
文件传输协议(FTP,File Transfer Protocol),即能够让用户在互联网中上传、下载文件的文件协议,而FTP服务器就是支持FTP传输协议的主机,要想完成文件传输则需要FTP服务端和FTP客户端的配合才行。
通常用户使用FTP客户端软件向FTP服务器发起连接并发送FTP指令,服务器收到用户指令后将执行结果返回客户端。
FTP协议占用两个端口号:
21端口:命令控制,用于接收客户端执行的FTP命令。
20端口:数据传输,用于上传、下载文件数据。
FTP数据传输的类型:
主动模式:FTP服务端主动向FTP客户端发起连接请求。
被动模式:FTP服务端等待FTP客户端的连接请求。**
声明:
Vsftpd即“Very Secure FTP Daemon”是一款运行在类Unix操作系统的FTP服务端程序,Vsftpd主打的是安全性、完全开源及免费、速率高、支持IPv6、虚拟用户功能等等其他FTP服务端软件不具备的功能。
vsftpd程序配置文件参数的作用:
参数 | 作用 |
---|---|
listen=[YES/NO] | 是否以独立运行的方式监听服务。 |
listen_address=IP地址 | 设置要监听的IP地址。 |
listen_port=21 | 设置FTP服务的监听端口 |
download_enable=[YES/NO] | 是否允许下载文件 |
userlist_enable=[YES/NO];userlist_deny=[YES/NO] | 是否启用“禁止登陆用户名单”。 |
max_clients=0 | 最大客户端连接数,0为不限制 |
max_per_ip=0 | 同一IP地址最大连接数,0位不限制 |
anonymous_enable=[YES/NO] | 是否允许匿名用户访问 |
anon_upload_enable=[YES/NO] | 是否允许匿名用户上传文件 |
anon_umask=022 | 匿名用户上传文件的umask值 |
anon_root=/var/ftp | 匿名用户的FTP根目录 |
anon_mkdir_write_enable=[YES/NO] | 是否允许匿名用户创建目录 |
anon_other_write_enable=[YES/NO] | 是否开放匿名用户其他写入权限。 |
anon_max_rate=0 | 匿名用户最大传输速率(字节),0为不限制 |
local_enable=[YES/NO] | 是否允许本地用户登陆FTP |
local_umask=022 | 本地用户上传文件的umask值 |
local_root=/var/ftp | 本地用户的FTP根目录 |
chroot_local_user=[YES/NO] | 是否将用户权限禁锢在FTP目录,更加的安全 |
local_max_rate=0 | 本地用户最大传输速率(字节),0为不限制 |
Vsftpd的验证方式
匿名访问:任何人无需验证口令即可登入FTP服务端,顾名思义匿名访问就是所有人均可随意登入FTP服务,这样自然会产生安全问题,一般用于存放公开的数据。
本地用户:使用FTP服务器中的用户、密码信息,所以本地用户则需要用户提供帐号及口令后才能登入FTP服务,更加的安全,而虚拟用户则是最安全的。
虚拟用户:创建独立的FTP帐号资料,所以虚拟用户则需要用户提供帐号及口令后才能登入FTP服务,更加的安全,所以虚拟用户是最安全的。
实验环境:
主机名称 | 操作系统 | IP地址 |
---|---|---|
FTP服务端 | CentOS 7.0操作系统 | 192.168.9.203 |
FTP客户端 | CentOS 7.0操作系统 | 192.168.9.204 |
匿名访问模式
声明:FTP匿名访问模式是比较不安全的服务模式,尤其在真实的工作环境中千万不要存放敏感的数据,以免泄露。
关闭VSFTPD防火墙和SELinux
[root@Vsftpd ~]# systemctl stop firewalld
[[email protected] ~]# vim /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.# SELINUX= can take one of these three values:# enforcing - SELinux security policy is enforced.# permissive - SELinux prints warnings instead of enforcing.# disabled - No SELinux policy is loaded.SELINUX=disabled# SELINUXTYPE= can take one of three two values:# targeted - Targeted processes are protected,# minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection.SELINUXTYPE=targeted
[root@Vsftpd ~]# getenforce Disabled
第一步:vsftpd程序默认已经允许匿名访问模式,我们要做的就是开启匿名用户的上传和写入权限
[[email protected] ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YESanon_umask=022anon_upload_enable=YESanon_mkdir_write_enable=YESanon_other_write_enable=YES
第二步:启动服务
[root@Vsftpd ~]# systemctl restart vsftpd[root@Vsftpd ~]# systemctl enable vsftpd
如果重启vsftpd服务程序时没有报错,此时便可以使用FTP客户机(192.168.10.20)尝试登入FTP服务了。
第三步:到客户端,因为CentOS7.0系统中ftp命令默认没有安装,请执行”yum install ftp -y”即可安装完毕。
[[email protected] ~]# yum install -y ftp已加载插件:fastestmirrorRepodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fastbase | 3.6 kB 00:00:00 extras | 3.4 kB 00:00:00 updates | 3.4 kB 00:00:00 Determining fastest mirrors * base: mirrors.zju.edu.cn * extras: mirrors.zju.edu.cn * updates: mirrors.zju.edu.cn正在解决依赖关系--> 正在检查事务---> 软件包 ftp.x86_64.0.0.17-67.el7 将被 安装--> 解决依赖关系完成
依赖关系解决
=================================================================================================== Package 架构 版本 源 大小===================================================================================================正在安装: ftp x86_64 0.17-67.el7 base 61 k
事务概要===================================================================================================安装 1 软件包
总下载量:61 k安装大小:96 kDownloading packages:ftp-0.17-67.el7.x86_64.rpm | 61 kB 00:00:00 Running transaction checkRunning transaction testTransaction test succeededRunning transaction 正在安装 : ftp-0.17-67.el7.x86_64 1/1 验证中 : ftp-0.17-67.el7.x86_64 1/1
已安装: ftp.x86_64 0:0.17-67.el7
完毕!
注:如果访问时出现没有到主机的路由就可能是vsftp服务器的防火墙没关闭。
第四步:在客户端尝试登入FTP服务:
[[email protected] ~]# ftp 192.168.9.203Connected to 192.168.9.203 (192.168.9.203).220 (vsFTPd 3.0.2)Name (192.168.9.203:root): anonymous331 Please specify the password.Password:230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp> cd pub250 Directory successfully changed.ftp> mkdir files550 Permission denied.ftp>
思考:
在上面操作中已经将防火墙规则清空,在vsftpd.conf文件中也已经允许匿名用户创建目录与写入权限,那怎么会被拒绝了呢?
回想前面的参数细节,匿名访问模式的FTP根目录为/var/ftp:
[[email protected] ~]# ls -ld /var/ftp/pub/drwxr-xr-x 2 root root 6 11月 6 2016 /var/ftp/pub/
原来匿名用户的FTP根目录所有者/组都是root,所以匿名用户没有写入权限,那我们将所有者修改为ftp试试
[root@Vsftpd ~]# chown ftp /var/ftp/pub/
此时再用ftp命令尝试登入FTP服务并创建文件:
[[email protected] ~]# ftp 192.168.9.203Connected to 192.168.9.203 (192.168.9.203).220 (vsFTPd 3.0.2)Name (192.168.9.203:root): anonymous331 Please specify the password.Password:230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp> cd pub250 Directory successfully changed.ftp> mkdir files550 Permission denied.ftp> mkdir 1550 Permission denied.ftp>
思考:
为什么还是不行?想想可能是没有赋予匿名写的权限。
到主配置文件添加一条匿名可写的权限:write_enable=YES,并重启服务。
[[email protected] ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YESanon_umask=022anon_upload_enable=YESanon_mkdir_write_enable=YESanon_other_write_enable=YESwrite_enable=YES
[root@Vsftpd ~]# systemctl restart vsftpd
到FTP服务器上再测试:
[[email protected] ~]# ftp 192.168.9.203Connected to 192.168.9.203 (192.168.9.203).220 (vsFTPd 3.0.2)Name (192.168.9.203:root): anonymous331 Please specify the password.Password:230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp> cd pub250 Directory successfully changed.ftp> mkdir files257 "/pub/files" createdftp> mkdir 1257 "/pub/1" createdftp>
成功
注:如果SELinux没关闭怎么办?
VSFTP服务器上SELinux没有关闭
[root@Vsftpd ~]# getenforce Enforcing
FTP客户端上测试创建文件夹
[[email protected] ~]# ftp 192.168.9.203Connected to 192.168.9.203 (192.168.9.203).220 (vsFTPd 3.0.2)Name (192.168.9.203:root): anonymous331 Please specify the password.Password:230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp> cd pub250 Directory successfully changed.ftp> mkdir 2550 Create directory operation failed.ftp>
# 失败
想想pub的所有者已经为ftp了,配置文件也已经给了匿名可写的权限了,可是为什么还是报创建操作失败呢?这时就要想到selinux了。
查看VSFTP的SELinux状态
[[email protected] ~]# getsebool -a |grep ftpftp_home_dir --> offftpd_anon_write --> offftpd_connect_all_unreserved --> offftpd_connect_db --> offftpd_full_access --> offftpd_use_cifs --> offftpd_use_fusefs --> offftpd_use_nfs --> offftpd_use_passive_mode --> offhttpd_can_connect_ftp --> offhttpd_enable_ftp_server --> offsftpd_anon_write --> offsftpd_enable_homedirs --> offsftpd_full_access --> offsftpd_write_ssh_home --> offtftp_anon_write --> offtftp_home_dir --> off
设置SELinux服务对ftp服务的访问规则策略为允许。
[[email protected] ~]# setsebool -P ftpd_full_access=on
[[email protected] ~]# getsebool -a |grep ftpftp_home_dir --> offftpd_anon_write --> offftpd_connect_all_unreserved --> offftpd_connect_db --> offftpd_full_access --> onftpd_use_cifs --> offftpd_use_fusefs --> offftpd_use_nfs --> offftpd_use_passive_mode --> offhttpd_can_connect_ftp --> offhttpd_enable_ftp_server --> offsftpd_anon_write --> offsftpd_enable_homedirs --> offsftpd_full_access --> offsftpd_write_ssh_home --> offtftp_anon_write --> offtftp_home_dir --> off
此时再来创建文件或目录就没有问题了:
[[email protected] ~]# ftp 192.168.9.203Connected to 192.168.9.203 (192.168.9.203).220 (vsFTPd 3.0.2)Name (192.168.9.203:root): anonymous331 Please specify the password.Password:230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp> cd pub250 Directory successfully changed.ftp> mkdir tj257 "/pub/tj" createdftp>
本地用户模式:
声明:既然要使用本地用户模式,而本地用户模式确实要比匿名访问模式更加的安全,所以本实验中会关闭匿名访问模式。
第一步:vsftpd服务程序默认已经允许本地用户模式,我们要做的是添加设置本地用户模式权限的参数
[[email protected] ~]# vim /etc/vsftpd/vsftpd.conf
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).anonymous_enable=NO## Uncomment this to allow local users to log in.# When SELinux is enforcing check for SE bool ftp_home_dirlocal_enable=YES## Uncomment this to enable any form of FTP write command.write_enable=YES## Default umask for local users is 077. You may wish to change this to 022,# if your users expect that (022 is used by most other ftpd's)local_umask=022
第二步:启动服务
[[email protected] ~]# systemctl restart vsftpd[[email protected] ~]# systemctl enable vsftpdCreated symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
在测试之前先查看下ftpusers或user_list文件中禁止登陆用户名单:
[root@Vsftpd ~]# cd /etc/vsftpd/[root@Vsftpd vsftpd]# vim user_list
第四步:vsftpd服务为了让FTP服务更加的安全,默认禁止以root身份登入,那么创建个普通用户并为tj用户设置密码:
[root@Vsftpd ~]# useradd tj[root@Vsftpd ~]# passwd tj更改用户 tj 的密码 。新的 密码:无效的密码: 密码少于 8 个字符重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。
第五部:查看所有与ftp相关的SELinux规则:
[[email protected] ~]# getsebool -a |grep ftpftp_home_dir --> offftpd_anon_write --> offftpd_connect_all_unreserved --> offftpd_connect_db --> offftpd_full_access --> offftpd_use_cifs --> offftpd_use_fusefs --> offftpd_use_nfs --> offftpd_use_passive_mode --> offhttpd_can_connect_ftp --> offhttpd_enable_ftp_server --> offsftpd_anon_write --> offsftpd_enable_homedirs --> offsftpd_full_access --> offsftpd_write_ssh_home --> offtftp_anon_write --> offtftp_home_dir --> off
第六步:设置SELinux服务对ftp服务的访问规则策略为允许。
[[email protected] ~]# setsebool -P ftpd_full_access=on[[email protected] ~]# getsebool -a |grep ftpftp_home_dir --> offftpd_anon_write --> offftpd_connect_all_unreserved --> offftpd_connect_db --> offftpd_full_access --> onftpd_use_cifs --> offftpd_use_fusefs --> offftpd_use_nfs --> offftpd_use_passive_mode --> offhttpd_can_connect_ftp --> offhttpd_enable_ftp_server --> offsftpd_anon_write --> offsftpd_enable_homedirs --> offsftpd_full_access --> offsftpd_write_ssh_home --> offtftp_anon_write --> offtftp_home_dir --> off
第七步:在客户端尝试登入FTP服务:
[[email protected] ~]# ftp 192.168.9.203Connected to 192.168.9.203 (192.168.9.203).220 (vsFTPd 3.0.2)Name (192.168.9.203:root): tj331 Please specify the password.Password:230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp> mkdir tj257 "/home/tj/tj" createdftp>
成功
虚拟用户模式:
声明:因为虚拟用户模式的帐号口令都不是真实系统中存在的,所以只要配置妥当虚拟用户模式会比本地用户模式更加安全,但是Vsftpd服务配置虚拟用户模式的操作步骤相对复杂一些,具体流程如下:
第1步:建立虚拟FTP用户数据库文件。
第2步:创建FTP根目录及虚拟用户映射的系统用户。
第3步:建立支持虚拟用户的PAM认证文件。
第4步:在vsftpd.conf文件中添加支持配置。
第5步:为虚拟用户设置不同的权限。
第6步:重启vsftpd服务,验证实验效果。
第1步:建立虚拟FTP用户数据库文件
创建用于生成FTP用户数据库的原始帐号和密码文件:
[root@Vsftpd ~]# cd /etc/vsftpd/[root@Vsftpd vsftpd]# vim vuser.list
tj123456yy123456
第二步:使用db_load命令用HASH算法生成FTP用户数据库文件vuser.db
[[email protected] vsftpd]# db_load -T -t hash -f vuser.list vuser.db
第三步:查看数据库文件的类型
[[email protected] vsftpd]# file vuser.db vuser.db: Berkeley DB (Hash, version 9, native byte-order)
第四步:赋予权限,因为FTP用户数据库内容很敏感,所以权限应给小一些
[root@Vsftpd vsftpd]# chmod 600 vuser.db
第五步:删除原始的帐号和密码文件
[root@Vsftpd vsftpd]# rm -f vuser.list
第六步:创建FTP根目录及虚拟用户映射的系统用户
创建用户virtual并设置为不允许登陆系统并定义该用户的家目录:
[root@Vsftpd ~]# useradd -d /var/ftproot -s /sbin/nologin virtual
查看该用户的家目录权限:
[[email protected] ~]# ls -ld /var/ftproot/drwx------. 2 virtual virtual 59 5月 18 00:10 /var/ftproot/
为保证其他用户可以访问,给予rwxr-xr-x权限:
[root@Vsftpd ~]# chmod -Rf 755 /var/ftproot/
第七步:建立支持虚拟用户的PAM认证文件
[[email protected] ~]# vim /etc/pam.d/vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vuseraccount required pam_userdb.so db=/etc/vsftpd/vuser
第八步:在vsftpd.conf文件中添加支持配置。
既然要使用虚拟用户模式,而虚拟用户模式确实要比匿名访问模式更加的安全,配置的同时也关闭匿名开放模式。
[[email protected] ~]# vim /etc/vsftpd/vsftpd.conf
12 anonymous_enable=NO 16 local_enable=YES 19 write_enable=YES125 pam_service_name=vsftpd.vu128 guest_enable=YES129 guest_username=virtual130 allow_writeable_chroot=YES
# 其他不动
第九步:为虚拟用户设置不同的权限
现在不论是tj还是yy帐户,他们的权限都是相同的——默认不能上传、创建、修改文件,如果希望用户blackshield能够完全的管理FTP内的资料,就需要让FTP程序支持独立的用户权限配置文件了:
指定用户独立的权限配置文件存放的目录:
[root@Vsftpd ~]# vim /etc/vsftpd/vsftpd.conf
添加一条以下的语句:user_config_dir=/etc/vsftpd/vuser.dir
创建用户独立的权限配置文件存放的目录:
[root@Vsftpd ~]# mkdir /etc/vsftpd/vuser.dir
创建空白的tj的配置文件:
[root@Vsftpd ~]# cd /etc/vsftpd/vuser.dir/[root@Vsftpd vuser.dir]# touch tj
指定yy用户的具体权限:
[[email protected] vuser.dir]# vim yy
anon_upload_enable=YESanon_mkdir_write_enable=YESanon_other_write_enable=YES
解释:
anon_upload_enable=NO #如果设为 YES, 匿名用户在某些情况下允许上载文件. 这需要将 write_enable 选项激活, 并且匿名用户应当对应目录有写权限. anon_mkdir_write_enable=NO #如果设为 YES, 匿名用户将允许在某些情况下创建目录. 这需要激活 write_enable 选项, 并且匿名 ftp 用户需要对父目录有写权限.anon_other_write_enable=NO #如果设为YES,匿名登入者会被允许下载可阅读的档案。默认值为YES。
第十步:重启vsftpd服务,验证实验效果
确认填写正确后保存并退出vsftpd.conf文件,重启vsftpd程序并设置为开机后自动启用:
[root@Vsftpd vuser.dir]# systemctl restart vsftpd[root@Vsftpd vuser.dir]# systemctl enable vsftpd
如果重启vsftpd并没有看到报错,此时可使用FTP客户机(192.168.10.20)尝试登入FTP服务了(设置SELinux对FTP服务的规则为允许):
[[email protected] vuser.dir]# getsebool -a |grep ftpftp_home_dir --> offftpd_anon_write --> offftpd_connect_all_unreserved --> offftpd_connect_db --> offftpd_full_access --> onftpd_use_cifs --> offftpd_use_fusefs --> offftpd_use_nfs --> offftpd_use_passive_mode --> offhttpd_can_connect_ftp --> offhttpd_enable_ftp_server --> offsftpd_anon_write --> offsftpd_enable_homedirs --> offsftpd_full_access --> offsftpd_write_ssh_home --> offtftp_anon_write --> offtftp_home_dir --> off[[email protected] vuser.dir]#
第十一步:到FTP客户端测试
用yy来创建文件或目录
[[email protected] ~]# ftp 192.168.9.203Connected to 192.168.9.203 (192.168.9.203).220 (vsFTPd 3.0.2)Name (192.168.9.203:root): yy331 Please specify the password.Password:230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp> mkdir yy1257 "/yy1" createdftp> rename yy1 database350 Ready for RNTO.250 Rename successful.ftp> rmdir database250 Remove directory operation successful.ftp> exit221 Goodbye.[[email protected] ~]#
用tj来创建文件或目录(肯定会报错):
[[email protected] ~]# ftp 192.168.9.203Connected to 192.168.9.203 (192.168.9.203).220 (vsFTPd 3.0.2)Name (192.168.9.203:root): tj331 Please specify the password.Password:230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp> mkdir tj550 Permission denied.ftp>