文件服务ftp和vsftpd

三种存储方式

DAS (Direct-attached Storage) 直连存储

这种设备直接连接到计算机主板总线上,计算机将其识别为一个块设备

常见设备(协议)有:SATA,ASA,IDE,SCSI,USB

NAS (Network Attached Storage) 网络附加存储

它一般是将本地的存储空间共享给其他主机使用,一般通过 C/S 架构实现通信。它实现的是文件级别的共享,计算机通常将共享的设别识别为一个文件系统,其文件服务器会管理锁以实现并发访问。接口不是block接口,而是文件接口,只有block接口才能被分区格式化,NAS不能被分区格式化,只能直接挂载使用。

常见设备(协议):CIFS(samba)、NFS(Network File System)

SAN (Storage Area Network) 存储区域网

它将传输网络模拟成 SCSI 总线来使用,每一个主机的网卡相当于 SCSI 总线中的 initiator,服务器相当于一个或多个 target,它需要借助客户端和服务端的 SCSI 驱动,通过 FC 或 TCP/IP 协议封装 SCSI 报文。它实现的是块级别的共享,通常被识别为一个块设备,但是需要借助专门的锁管理软件才能实现多主机并发访问。

常见设备(协议):ISCSI(IP-SAN)、FCSAN、FCoE

FTP

FTP,File transfer Protocl即文件传输协议,客户端需要使用专门的 ftp 客户端与服务器端进行通信,以完成文件的上传和下载,FTP 协议工作在应用层。它使用两个连接与客户端通信:

  • 命令连接:用于传输文件管理类命令,此连接在客户端连接后会始终在线,监听在tcp/21端口
  • 数据连接:用于传输文件数据,此连接会按序创建

FTP 服务器会监听 TCP 21 号端口用于命令连接,而数据连接有两种模式:

主动模式:在主动模式下,FTP客户端从任意端口5000(端口号>1023)发起一个FTP请求,并携带自己监听的端口号5001(发送的端口号+1=监听端口号);随后服务器返回确认,然后从服务器本地的20端口主动发起连接请求到客户端的监听端口5001,最后客户端返回确认。
这种模式缺点在于服务器带客户端的FTP连接很容易被传输过程中的路由器、防火墙所影响或拦截。

被动模式:为了主动模式所面临的服务器到客户端的连接会被拦截阻塞的问题,FTP发展出了被动模式。在被动模式中,命令连接和数据连接都由客户端来发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙拦截的问题。

被动模式也会存在防火墙的问题,客户端与服务端传输数据时,在服务端也会有防火墙,但在服务端的防火墙有连接追踪的功能,解决了防火墙的问题。因此,一般使用被动模式比较多。

FTP的用户认证

FTP支持系统用户,匿名用户,和虚拟用户三种用户认证。

  • 匿名用户:登陆用户名是anonymous,没有密码

  • 系统用户:是FTP服务器端的本地用户和对应的密码,默认访问的是用户家目录

  • 虚拟用户:仅用于访问服务器中特定的资源,常见的虚拟用户认证的方式有使用文件认证或使用数据库进行认证。最终也会将这些虚拟用户同一映射为一个系统用户,访问的默认目录就是这个系统用户的家目录。

常见的实现FTP协议的工具

服务端:
Linux端:wu-ftpd,pureftp,vsftpd(Centos 6上默认提供的)
windows端:ServU,FileZilla-Server

客户端工具:
Linux操作系统:ftp,lftp,lftpget,wget,cul,gftp等
windows操作系统:FileZilla

vsftpd

vsftpd服务即 " Very secure file transfer protocol ",是一款结合多种认证手段的ftp开源软件。
基于URL被访问:SCHEME://username:passwd@HOST:PORT/path/to/file

vsftpd以ftp用户的身份运行进程,默认用户纪即为ftp用户

主程序:/usr/sbin/vsftpd
用户认证配置文件:/etc/pam.d/vsftpd
服务脚本:/etc/rc.d/init.d/vsftpd
配置文件目录:/etc/vsftpd
主配置文件:vsftpd.conf
匿名用户(映射为ftp用户)共享资源位置:/var/ftp
系统用户通过ftp访问的资源的位置:用户自己的家目录
虚拟用户通过ftp访问的资源的位置:给虚拟用户指定的映射成为的系统用户的家目录

注意:一个用户通过文件共享服务访问文件系统上的文件的生效权限为此二者的交集,vsftpd服务对根目录(/var/ftp/)要求其他用户不能有写权限,且属主属组(root)不能更改,想创建一个目录,允许其他人上传,可以在该目录下新建一个子目录,修改其权限

常见的的vsftpd的参数设置

用户类别

  • 匿名用户:anonymous --> ftp,/var/ftp
  • 系统用户:至少禁止系统用户访问ftp服务,/etc/vsftpd/ftpusers,PAM(/etc/pam.d/vsftpd)
  • 虚拟用户:非系统用户,用户账号非为可登录操作系统的用户账号(非/etc/passwd)
主配置文件:/etc/vsftpd/vsftpd.conf

格式: 指令=值(不能有空格,顶格写)

匿名用户指令
anon_enable=YES 允许匿名用户登录
anon_upload_enable=YES 允许匿名用户上传文件
anon_mkdir_write_enable=YES 允许匿名用户创建目录
anon_other_write_enable=YES 允许其他的写权限(删除目录,文件)
anon_umask=022 匿名用户上传文件的权限码

系统用户指令
local_enable=YES 允许本地用户访问(/etc/passwd中的用户)
write_enable=YES 允许写入权限,包括修改,删除
local_umask=022 系统用户上传的文件权限掩码

chroot_local_user=YES 禁锢所有本地用户于其家目录;需事先去除用户对家目录的写权限;禁锢完后,连接后,使用pwd将显示为当前目录为根目录
chroot_list_enable=YES 禁锢某些用户于家目录中(而后使用下面指令,指出用户列表保存位置)
chroot_list_file=/etc/vsftpd/chroot_list 禁锢列表中文件存在的用户于其家目录中;需事先去除用户对其家目录的写权限

控制可登录vsftpd服务的用户列表
userlist_enable=YES 启用/etc/vsftpd/user_list文件来控制可登陆用户
userlist_deny=NO NO意味着只允许/etc/vsftpd/user_list文件里面的用户访问FTP(白名单),YES(黑名单)

传输日志
xferlog_enable=YES 打开传输日志
xferlog_std_format=YES 是否使用标准格式
xferlog_file=/var/log/xferlog 日志文件路径

守护进程的类型
standalone:独立守护进程,由服务进程自行监听套接字,并接受用户访问请求
translent:瞬时守护进程,由受托管方代为监听套接字,服务进程没有访问请求时不启动,当托管方收到访问请求时,才启动服务进程
CentOS6:xinted独立守护进程,/etc/xinted.d/
CentOS7:由systemd代为监听

传输速率
anon_max_rate: 匿名用户的最大传输速率,单位是“字节/秒”,0表示无限制
local_max_rate: 本地用户的最大传输速率,单位是“字节/秒”,0表示无限制

连接限制
max_clients: 最大并发连接数
max_per_ip: 每个IP可同时发起的并发请求数

除了上述参数之外,若还想使用更多的参数可以通过man vsftpd.conf来获取更多的参数信息。

辅助配置文件:/etc/vsftpd/ftpusers
该文件中保存了一个系统用户的列表,在该列表中的所有系统用户,都禁止登录ftp服务;ftp协议在传输时是明文的,使用tcpdump工具抓包能看到登录用户的账号和密码

用户认证

linux系统登录的时候,登录提示符是由/bin/login程序提供,程序自身没有认证功能,它调用了pam组件完成的。
pam:Plugable Authentication Modulepam,高度模块化的认证框架

/etc/pam.d/目录下为每一个调用了该库的应用程序都提供了配置文件

[root@localhost ~]# cat /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服务器
vsftp服务默认就开启了匿名用户登录,只需要修改匿名用户的FTP共享权限及对应访问目录的权限

编辑/etc/vsftpd/vsftpd.conf

[root@ftp ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_umask=022

保存退出后启动vsftpd服务

[root@ftp ~]# systemctl start vsftpd
[root@ftp ~]# systemctl enable vsftpd
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/

在另一台主机上登录ftp服务

[root@test ~]# yum install -y lftp  #首先安装lftp程序,用于连接ftp服务
[root@test ~]# lftp 192.168.0.188 
lftp 192.168.0.188:~> ls              
drwxr-xr-x    2 0        0               6 Aug 03  2017 pub
lftp 192.168.0.188:/> cd pub/
lftp 192.168.0.188:/pub> mkdir anon_test
mkdir: Access failed: 550 Create directory operation failed. (anon_test)

此时发现无法创建anon_test目录,但是我们已经在vsftpd.conf文件中配置了匿名用户可创建目录的参数了,这是因为ftp服务的根目录我们还没有对其进行修改。匿名用户的默认路径即为ftp用户的家目录/var/ftp,而vsftp用户的真正权限是vsftpd.conf定义的共享权限与访问目录的权限的交集。所以此时我们需要去修改/var/ftp/pub目录的文件权限:

[root@ftp ~]# ll -d /var/ftp/pub/  
drwxr-xr-x. 2 root root 6 8月   3 2017 /var/ftp/pub/  #默认情况/var/ftp/pub目录的属主和属组均为root,其他组并没有写权限
[root@ftp ~]# chown ftp:ftp /var/ftp/pub/  #更改/var/ftp/pub目录的属主和属组为ftp

重新在ftp客户端上匿名登录测试

[root@test ~]# lftp 192.168.0.188 
lftp 192.168.0.188:~> cd pub
cd ok, cwd=/pub
lftp 192.168.0.188:/pub> mkdir anon_test
mkdir ok, `anon_test' created  #test目录顺利创建完成
lftp 192.168.0.188:/pub> lcd /etc/
lcd ok, local cwd=/etc
lftp 192.168.0.188:/pub> put fstab   #测试文件上传也成功
465 bytes transferred
lftp 192.168.0.188:/pub> ls
drwx------    2 14       50              6 Apr 23 17:08 anon_test
-rw-------    1 14       50            465 Apr 23 17:09 fstab
lftp 192.168.0.188:/pub> rm fstab #删除文件也可以
rm ok, `fstab' removed
lftp 192.168.0.188:/pub> rmdir anon_test/  #删除目录页ok
rmdir ok, `anon_test/' removed
本地用户认证

本地用户认证是指使用FTP服务器中的用户账号密码进行登录,Linux系统中是指/etc/passwd中的本地用户,vsftp服务默认也是允许了本地用户认证,我们需要对本地用户认证后的权限进行设置

[root@ftp ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO  #先取消匿名登录,以免影响测试
local_enable=YES
write_enable=YES
local_umask=022
userlist_enable=YES
userlist_deny=NO

编辑/etc/vsftpd/user_list用户文件

[root@ftp ~]# vim /etc/vsftpd/user_list# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
charlie  #删除原有的系统用户,新增登录本地用户

重启vsftpd服务

[root@ftp ~]# systemctl restart vsftpd

在ftp客户端测试登录

[root@test ~]# lftp 192.168.0.188 -u charlie
Password: 
lftp charlie@192.168.0.188:~>    
lftp charlie@192.168.0.188:~> pwd
ftp://charlie@192.168.0.188  #此时位于charlie的家目录中
lftp charlie@192.168.0.188:~> lcd /etc
lcd ok, local cwd=/etc
lftp charlie@192.168.0.188:~> put fstab  #测试上传文件成功
465 bytes transferred
lftp charlie@192.168.0.188:~> mkdir local_test  #测试创建目录成功
mkdir ok, `local_test' created
lftp charlie@192.168.0.188:~> rm fstab  #测试删除文件成功
rm ok, `fstab' removed
lftp charlie@192.168.0.188:~> rmdir local_test  #测试删除目录成功
rmdir ok, `local_test' removed
lftp charlie@192.168.0.188:~> cd /etc/
cd ok, cwd=/etc                   
lftp charlie@192.168.0.188:/etc> get passwd  #测试下载文件成功
1553 bytes transferred

通过测试发现,本地用户能切换到/etc目录,并且能够下载passwd文件,这存在一定安全风险,vsftp服务可以让我们把本地用户的访问路径限制在其对应的家目录:

[root@ftp ~]# vim /etc/vsftpd/vsftpd.conf
chroot_local_user=YES  #找到对应的参数并取消注释
allow_writeable_chroot=YES  #允许禁锢的FTP根目录可写而不拒绝用户的登录请求
#chroot_list_file=/etc/vsftpd/chroot_list 也可以通过用户文件来指定禁锢的用户范围

2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报错误put: Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()。但是取消了主目录的写权限后,用户自己本身也不能对主目录进行修改了,如果还想能在对主目录拥有写权限,可以使用allow_writeable_chroot=YES参数。

在FTP客户端测试

[root@test ~]# lftp 192.168.0.188 -u charlie
Password: 
lftp charlie@192.168.0.188:~>         
lftp charlie@192.168.0.188:~> cd /etc\
> 
lftp charlie@192.168.0.188:/> cd /etc
cd: Access failed: 550 Failed to change directory. (/etc)
lftp charlie@192.168.0.188:/> lcd /etc
lcd ok, local cwd=/etc
lftp charlie@192.168.0.188:/> put fstab 
465 bytes transferred
lftp charlie@192.168.0.188:/> mkdir test
mkdir ok, `test' created
lftp charlie@192.168.0.188:/> rm fstab 
rm ok, `fstab' removed
lftp charlie@192.168.0.188:/> rmdir test
rmdir ok, `test' removed
lftp charlie@192.168.0.188:/> lcd /root/
lcd ok, local cwd=/root
lftp charlie@192.168.0.188:/> get hello 

此时除了无法切换到其他目录之外,其上传下载,新增删除文件或目录都能正常进行

虚拟用户认证(基于MySQL)

虚拟用户认证是指使用vsftp服务独立维护的FTP账号密码进行登录访问,虚拟用户认证所使用的账号和密码都不是系统中真实存在的,所以其安全性比本地用户更好。由于ftp服务使用明文传,如果使用本地用户认证,会导致其他用户在客户端访问FTP服务器的路径之间进行抓包,就能获取相应的系统本地用户信息。

安装所需要程序

安装mysql和pam_mysql

[root@ftp ~]# yum -y install vsftpd mysql-server mysql-devel pam_mysql

注意:pam_mysql由epel源提供

由于系统自带的pam认证默认不支持mysql认证,因此需要自己编译安装:

[root@vsftpd ~]# wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz --no-check-certificate  #获取pam_mysql源码包
100%[================================================================================================================>] 335,240     18.6KB/s 用时 18s    

2018-04-25 00:39:57 (18.6 KB/s) - 已保存 “pam_mysql-0.7RC1.tar.gz” [335240/335240])
[root@vsftpd ~]# yum groupinstall -y "development tools"  #安装开发环境组
#此处事先需安装mariadb-devel和pam-devel包提供相应的头文件和链接库给pam_mysql编译使用
#否则会出现类似报错:configure: error: Cannot locate mysql client library.和configure: error: Cannot find pam headers
[root@vsftpd pam_mysql-0.7RC1]# yum install -y mariadb-devel pam-devel  openssl-devel 
[root@vsftpd ~]# tar xf pam_mysql-0.7RC1.tar.gz
[root@vsftpd ~]# cd pam_mysql-0.7RC1
[root@vsftpd ~]# ./configure --with-mysql=/usr --with-openssl=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/security  #编译pam_mysql
[root@vsftpd ~]# make && make install
[root@vsftpd ~]# ll /lib64/security/ | grep mysql
-rwxr-xr-x. 1 root root    882 4月  25 02:06 pam_mysql.la
-rwxr-xr-x. 1 root root 141673 4月  25 02:06 pam_mysql.so
创建虚拟用户账号

创建vsftpd数据库

mysql> create database vsftpd;
 
mysql> grant select on vsftpd.* to vsftpd@'%' identified by 'vsftpd';
mysql> flush privileges;
 
mysql> use vsftpd;
mysql> create table users (
    -> id int AUTO_INCREMENT NOT NULL,
    -> name char(20) binary NOT NULL,
    -> password char(48) binary NOT NULL,
    -> primary key(id)
    -> );

添加测试的虚拟用户

mysql> insert into users(name,password) values('tom',password('tom'));
mysql> insert into users(name,password) values('jerry',password('tom'));
建立pam认证所需文件
[root@ftp ~]# vim /etc/pam.d/vsftpd.mysql
auth required /lib/security/pam_mysql.so user=vsftpd passwd=www.magedu.com host=localhost
db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required /lib/security/pam_mysql.so user=vsftpd passwd=www.magedu.com host=localh
ost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

注意:由于mysql的安装方式不同,pam_mysql.so基于unix sock连接mysql服务器时可能会出问题,
此时,建议授权一个可远程连接的mysql并访问vsftpd数据库的用户。

创建FTP根目录及虚拟用户映射的系统用户
[root@ftp ~]# useradd -s /sbin/nologin -d /var/ftproot vuser  
[root@ftp ~]# chmod go+rx /var/ftproot 
在vsftpd.conf中添加支持配置
[root@ftp ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES  #允许匿名登录
local_enable=YES  #允许本地用户模式,由于映射的系统用户为本地用户,因此此项必须开启
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
guest_enable=YES  #开启虚拟用户模式
guest_username=vuser  #指定虚拟用户账号
chroot_local_user=YES  #禁锢用户在其家目录
pam_service_name=vsftpd.mysql  #指定pam文件
user_config_dir=/etc/vsftpd/vusers_config  #配置vsftpd为虚拟用户使用配置文件目录
启动vsftpd服务
[root@ftp ~]# service vsftpd start
[root@ftp ~]# chkconfig vsftpd on
为虚拟用户设置不同的权限
[root@ftp ~]# mkdir /etc/vsftpd/vusers_config/
[root@ftp ~]# cd /etc/vsftpd/vusers_config/
[root@ftp ~]# touch tom jerry

虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。比如,如果需要让tom用
户具有上传文件的权限,可以修改/etc/vsftpd/vusers_config/tom文件,在里面添加如下选项即可

anon_upload_enable={YES|NO}
anon_mkdir_write_enable={YES|NO}
anon_other_write_enable={YES|NO}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容