CentOS 7.0 使用Vsftpd服务传输文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CentOS 7.0 使用Vsftpd服务传输文件相关的知识,希望对你有一定的参考价值。

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=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_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
已加载插件:fastestmirror
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
base                                                                        | 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 k
Downloading packages:
ftp-0.17-67.el7.x86_64.rpm                                                  |  61 kB  00:00:00    
Running transaction check
Running transaction test
Transaction test succeeded
Running 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.203
Connected to 192.168.9.203 (192.168.9.203).
220 (vsFTPd 3.0.2)
Name (192.168.9.203:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir files
550 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.203
Connected to 192.168.9.203 (192.168.9.203).
220 (vsFTPd 3.0.2)
Name (192.168.9.203:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir files
550 Permission denied.
ftp> mkdir 1
550 Permission denied.
ftp>

思考:

为什么还是不行?想想可能是没有赋予匿名写的权限。

到主配置文件添加一条匿名可写的权限:write_enable=YES,并重启服务。

[[email protected] ~]# vim /etc/vsftpd/vsftpd.conf

anonymous_enable=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
write_enable=YES

[root@Vsftpd ~]# systemctl restart vsftpd

到FTP服务器上再测试:

[[email protected] ~]# ftp 192.168.9.203
Connected to 192.168.9.203 (192.168.9.203).
220 (vsFTPd 3.0.2)
Name (192.168.9.203:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir files
257 "/pub/files" created
ftp> mkdir 1
257 "/pub/1" created
ftp>

成功

:如果SELinux没关闭怎么办? 
VSFTP服务器上SELinux没有关闭

[root@Vsftpd ~]# getenforce 
Enforcing

FTP客户端上测试创建文件夹

[[email protected] ~]# ftp 192.168.9.203
Connected to 192.168.9.203 (192.168.9.203).
220 (vsFTPd 3.0.2)
Name (192.168.9.203:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir 2
550 Create directory operation failed.
ftp>

# 失败

想想pub的所有者已经为ftp了,配置文件也已经给了匿名可写的权限了,可是为什么还是报创建操作失败呢?这时就要想到selinux了。

查看VSFTP的SELinux状态

[[email protected] ~]# getsebool -a |grep ftp
ftp_home_dir --> off
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off


设置SELinux服务对ftp服务的访问规则策略为允许。

[[email protected] ~]# setsebool -P ftpd_full_access=on

[[email protected] ~]# getsebool -a |grep ftp
ftp_home_dir --> off
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> on
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off


此时再来创建文件或目录就没有问题了:

[[email protected] ~]# ftp 192.168.9.203
Connected to 192.168.9.203 (192.168.9.203).
220 (vsFTPd 3.0.2)
Name (192.168.9.203:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir tj
257 "/pub/tj" created
ftp>

本地用户模式:

声明:既然要使用本地用户模式,而本地用户模式确实要比匿名访问模式更加的安全,所以本实验中会关闭匿名访问模式。

第一步: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_dir
local_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 vsftpd
Created 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 ftp
ftp_home_dir --> off
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off

第六步:设置SELinux服务对ftp服务的访问规则策略为允许。

[[email protected] ~]# setsebool -P ftpd_full_access=on
[[email protected] ~]# getsebool -a |grep ftp
ftp_home_dir --> off
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> on
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off

第七步:在客户端尝试登入FTP服务:

[[email protected] ~]# ftp 192.168.9.203
Connected to 192.168.9.203 (192.168.9.203).
220 (vsFTPd 3.0.2)
Name (192.168.9.203:root): tj
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir tj
257 "/home/tj/tj" created
ftp>


成功

虚拟用户模式:

声明:因为虚拟用户模式的帐号口令都不是真实系统中存在的,所以只要配置妥当虚拟用户模式会比本地用户模式更加安全,但是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

tj
123456
yy
123456

第二步:使用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/vuser
account 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=YES
125 pam_service_name=vsftpd.vu
128 guest_enable=YES
129 guest_username=virtual
130 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=YES
anon_mkdir_write_enable=YES
anon_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 ftp
ftp_home_dir --> off
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> on
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off
[[email protected] vuser.dir]#

第十一步:到FTP客户端测试

用yy来创建文件或目录

[[email protected] ~]# ftp 192.168.9.203
Connected to 192.168.9.203 (192.168.9.203).
220 (vsFTPd 3.0.2)
Name (192.168.9.203:root): yy
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir yy1
257 "/yy1" created
ftp> rename yy1 database
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir database
250 Remove directory operation successful.
ftp> exit
221 Goodbye.
[[email protected] ~]#


用tj来创建文件或目录(肯定会报错):

[[email protected] ~]# ftp 192.168.9.203
Connected to 192.168.9.203 (192.168.9.203).
220 (vsFTPd 3.0.2)
Name (192.168.9.203:root): tj
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir tj
550 Permission denied.
ftp>


以上是关于CentOS 7.0 使用Vsftpd服务传输文件的主要内容,如果未能解决你的问题,请参考以下文章

FTP简述之CentOS平台vsftpd参数讲解

centos 7安装FTP服务

Centos 7使用vsftpd搭建FTP服务器

基于CentOS7.3构建企业级Vsftpd文件服务器

Centos 7 搭建FTP详细配置步骤方法

centos 6.4 搭建 FTP 服务器(策略管控)