FTP 是 File Transfer Protocol (文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:”下载”(Download)和”上传”(Upload)。”下载”文件就是从远程主机拷贝文件至自己的计算机上;”上传”文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。
服务端
编辑/etc/sysconfig/selinux,打开selinux,否则将会限制ftp服务 [root@server ~]# vim /etc/sysconfig/selinux
内容如下:
......(省略前几行)......
6 # disabled - No SELinux policy is loaded.
7 SELINUX=disabled #将第七行改为: SELINUX=disabled 禁用selinux
编辑后后重启机器reboot(不重启机器不会生效)
重启后执行:
[root@server ~]# getenforce
若显示Disabled,则表示修改成功
执行如下:
编辑/etc/sysconfig/selinux
的第七行,禁用selinux
重启后执行getenforce
,验证是否成功关闭selinux
[root@server ~]# yum install vsftpd.x86_64
......(此处省略安装过程)......
Installed:
vsftpd.x86_64 0:3.0.2-9.el7
Complete!
安装成功后,启动vsftpd服务,并使其开机自启:
[root@server ~]# systemctl start vsftpd #启动vsftp
[root@server ~]# systemctl enable vsftpd #开机自启vsftp
开启防火墙,并让防火墙允许ftp服务:
[root@server ~]# systemctl start firewalld #开启防火墙
[root@server ~]# firewall-cmd --list-all #列出在防火墙中添加或启用的所有内容。
[root@server ~]# firewall-cmd --permanent --add-service=ftp #让防火墙永久允许ftp服务运行
[root@server ~]# firewall-cmd --reload #重新加载防火墙
执行如下:
列出在防火墙中添加或启用的所有内容。
让防火墙永久允许ftp服务运行
在服务端建立文件
[root@server ~]# touch /var/ftp/test
在客户端
[root@client ~]# yum install lftp.x86_64 -y
......(略去安装过程)......
Installed:
lftp.x86_64 0:4.4.8-3.el7
Complete!
[root@client ~]# lftp 172.25.254.239 #连接服务端主机
lftp 172.25.151.150:~> ls
软件安装包:vsftpd
默认发布目录: /var/ftp
协议接口: 21/tcp
服务配置文件: /etc/vsftpd/vstpd.conf
报错id的解析:
500 ##文件系统权限过大
530 ##用户认证失败
550 ##服务本身功能未开放
553 ##本地文件系统权限过小
编辑vsftpd.conf配置文件,配置vsftpd服务的详细权限 #(编辑完配置文件后必须重启服务)
所谓本地用户就是以本地已存在的用户的身份进行lftp连接
编辑 /etc/vsftpd/vsftpd.conf 进行对本地用户的管理
注:
本地用户在不加限定的情况才可以通过lftp访问服务器的/目录。且执行lftp命令后进入的目录为本地用户对应的家目录
[root@server ~]# vim /etc/vsftpd/vsftpd.conf #编辑配置文件
内容如下(第16行,第19行):
14 # Uncomment this to allow local users to log in.
15 # When SELinux is enforcing check for SE bool ftp_home_dir
16 local_enable=YES #YES表示允许本地用户登录
17 #
18 # Uncomment this to enable any form of FTP write command.
19 write_enable=YES #YES表示允许本地用户执行写
执行完成后,可在客户端进行验证
[root@server student]# touch /home/student/studentfile
[root@client ~]# lftp 172.25.151.150 -u student #以student身份登录lftp服务
lftp student@172.25.151.150:~> ls #执行 ls 验证是否为student家目录
lftp student@172.25.151.150:~> rm studentfile #执行rm验证本地用户是否可写
具体执行如下:
[root@server student]# vim /etc/vsftpd/vsftpd.conf #编辑配置文件
内容如下(第100行左右):
100 chroot_local_user=YES #YES表示对本地用户活动范围进行限制
[root@server student]# systemctl restart vsftpd.service #重启服务
[root@server student]# chmod u-w /home/* #修改用户对于用户家目录的权限,否则权限过大,无法通过lftp连接
#修改后本地用户无法进行上传
具体执行如下:
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
内容如(100行左右)下:
100 chroot_local_user=YES #YES 表示用户浏览白名单
101 chroot_list_enable=YES
102 # (default follows)
103 chroot_list_file=/etc/vsftpd/chroot_list #编辑/etc/vsftpd/chroot_list规定白名单用户
[root@server student]# systemctl restart vsftpd.service #重启服务
[root@server ~]# vim /etc/vsftpd/chroot_list
内容如下:
student #输入用户名
~
执行如下:
编辑/etc/vsftpd/vsftpd.conf
编辑白名单,将用户student加入白名单
在客户端进行验证
白名单内的student用户可以访问服务端"/"
目录
非白名单用户,如用户linux,则只能访问linux用户家目录
<注:
还可以编辑 /etc/vsftpd/vsftpd.conf 规定本地用户通过lftp登录的家目录>
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
内容如下:
20 local_root=/pub #设定本地用户登录后的目录为/pub
[root@server ~]# systemctl restart vsftpd.service
执行如下:
编辑 /etc/vsftpd/vsftpd.conf :
重启服务后,在 /pub/ 新建文件,然后在客户端验证
建立用来测试的文件
在客户端,分别用本地用户linux和student进行测试
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
100 chroot_local_user=NO #NO表示用用户黑名单
101 chroot_list_enable=YES
102 # (default follows)
103 chroot_list_file=/etc/vsftpd/chroot_list #编辑/etc/vsftpd/chroot_list 规定黑名单用户
[root@server student]# systemctl restart vsftpd.service #重启服务
[root@server ~]# vim /etc/vsftpd/chroot_list
内容如下:
student #输入用户名拉入限制黑名单
执行如下:
编辑/etc/vsftpd/vsftpd.conf
编辑黑名单,将用户student加入黑名单
在客户端进行验证
黑名单内的student用户仅能访问sutudent用户家目录
非黑名单用户,如linux用户可以访问服务端 "/"
目录
限制本地用户通过lftp连接主机
- vsftpd服务的黑名单有两个
/etc/vsftp/ftpusers
/etc/vsftpd/suer_list
以上两者默认都为限制用户登陆的黑名单,/etc/vsftpd/ftpusers
优先级别最高
通过 /etc/vsftpd/ftpusers 添加黑名单:
[root@server ~]# vim /etc/vsftpd/ftpusers
1 # Users that are not allowed to login via ftp
# 不允许通过ftp登录的用户。
2 root
......(我是用来省略的)......
15 nobody
16 student #将用户student加入黑名单
~
通过 /etc/vsftpd/user_list 添加黑名单
编辑user_list前,先编辑/etc/vsftpd/vssftpd.conf
在127行左右添加如下内容
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
内容如下:
127 userlist_deny=YES #YES表示 /etc/vsftpd/user_list 为黑名单
[root@server ~]# systemctl restart vsftpd.service #重启服务
再编辑/etc/vsftpd/user_list
[root@server ~]# vim /etc/vsftpd/user_list
1 # vsftpd userlist
2 # If userlist_deny=NO, only allow users in this file
# 如果userlist_deny=NO,则只允许此文件中的用户。
3 # If userlist_deny=YES (default), never allow users in this file,
# 如果userlist_deny=YES(默认),则不允许此文件中的用户
......(我是用来省略的)......
20 nobody
21 student #将student用户加入黑名单
具体执行如下(以 user_list 为例):
编辑 /etc/vsftpd/user_list :
编辑 /etc/vsftpd/user_list 进行黑名单添加
在客户端进行验证
黑名单内的student用户不能通过lftp访问
非黑名单用户,如linux用户可以访问
用户登陆白名单设定( /ect/vsftpd/user_list )
编辑user_list前,先编辑/etc/vsftpd/vssftpd.conf
在127行左右添加如下内容
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
内容如下:
127 userlist_deny=NO #NO表示 /etc/vsftpd/user_list 为白名单
[root@server ~]# systemctl restart vsftpd.service #重启服务
再编辑 /etc/vsftpd/user_list
[root@server ~]# vim /etc/vsftpd/user_list
1 # vsftpd userlist
2 # If userlist_deny=NO, only allow users in this file
# 如果userlist_deny=NO,则只允许此文件中的用户。
3 # If userlist_deny=YES (default), never allow users in this file,
# 如果userlist_deny=YES(默认),则不允许此文件中的用户
......(我是用来省略的)......
20 nobody
21 student #将student用户加入白名单
注:
当user_list作为白名单,且用户同时出现再user_list和ftpusers中时,ftpusers生效执行如下:
编辑 /etc/vsftpd/user_list :
编辑 /etc/vsftpd/user_list 进行白名单添加
在客户端进行验证
白名单内的用户student,可以通过lftp访问
非白名单用户,如linux用户则不可以访问
<注:
本地用户是否可以登录,取决于 /etc/vsftpd/vsftpd.conf 中的第16行>
编辑/etc/vsftpd/vsftpd.conf
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
编辑第16行
16 local_enable=NO #NO表示本地用户不可以登陆,若是YES则表示本地用户可以登录
[root@server ~]# systemctl restart vsftpd.service #重启服务
执行如下:
编辑 /etc/vsftpd/vsftpd.conf 进行本地用户限制
重启服务后在客户端进行测试
本地用户通过lftp登录后,对登录后的目录进行可进行上传,下载,删除等操作,我们可以通过编辑 /etc/vsftpd/vsftpd.conf 对这些权限进行限制
编辑 /etc/vsftpd/vsftpd.conf
[root@server ~]# systemctl restart vsftpd.service
对第19行进行编辑:
19 write_enable=NO #NO表示用户不可写,YES表示用户可写
[root@server ~]# systemctl restart vsftpd.service #重启服务
注:本地用户如果可写,就可以对登录后的目录进行:上传,下载,删除等操作,如果不可写,则只可以下载
执行如下:
*编辑/etc/vsftpd/vsftpd.conf 让本地用户不可写*
重启服务后,在客户端进行验证(不可上传,不可删除,可以下载)
除了上面介绍的本地用户外,匿名用户也可以通过lftp访问服务端
通过编辑 /etc/vsftpd/vsftpd.conf 来进行对匿名用户登录的限制
编辑/etc/vsftpd/vsftpd.conf
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
编辑第12行
12 anonymous_enable=NO #NO表示不允许匿名用户登录,YES表示允许
[root@server ~]# systemctl restart vsftpd.service #重启服务
执行如下:
编辑配置文件,不允许匿名用户登录,并重启服务
在客户端进行验证
<匿名用户也同本地用户相同,可以进行用户访问家目录规定>
编辑/etc/vsftpd/vsftpd.conf
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
编辑内内容如下:
21 anon_root=/pub #匿名用户访问目录修改为/pub
[root@server ~]# systemctl restart vsftpd.service #重启服务
执行如下:
编辑配置文件,指定匿名用户访问目录,并重启服务
在客户端进行验证
通过编辑 /etc/vsftpd/vsftpd.conf 来进行对匿名用户上传权限进行限制
注:
匿名用户上传的另一前提是匿名用户访问的目录,对你名用户来说有写的权限
编辑/etc/vsftpd/vsftpd.conf
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
编辑内内容如下:
19 write_enable=YES ##匿名用户上传的前提是本地用户可写
......(我是用来省略的)......
30 anon_upload_enable=YES #YES表示允许匿名用户上传
[root@server ~]# systemctl restart vsftpd.service #重启服务
[root@server ~]# chmod o+w /var/ftp/pub/ #修改目录权限,保证匿名用户可写
执行如下:
编辑配置文件,设定匿名用户可以上传,并重启服务
修改目录权限
在客户端进行验证
匿名用户默认情况下是不可以对自己无法读的文件进行下载,建立目录,删除等操作
通过编辑 /etc/vsftpd/vsftpd.conf 来进行对匿名用户下载等权限进行限制
编辑/etc/vsftpd/vsftpd.conf
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
编辑内内容如下:
31 anon_other_write_enable=YES #匿名用户可以对文件进行删除
32 anon_world_readable_only=NO #设定参数位NO表示匿名用户可以下载
33 anon_mkdir_write_enable=YES #匿名用户可以进行创建目录
[root@server ~]# systemctl restart vsftpd.service #重启服务
<注:
匿名用户进行删除,建立目录等操作的前提是:对当前目录可写>
编辑配置文件,设定匿名用户可进行下载等操作,并重启服务
在客户端进行验证
匿名用户登录后,默认情况下,进入服务端 /var/ftp/目录下进行操作,因为匿名用户对该目录没有写的权限,所以无法进行删除test的操作,切换到 pub 目录,因为前面修改了pub 目录对于其他用户的权限,匿名用户对该目录可写,故可以进行删除 passwd 的操作,下载操作亦能进行。
)
通过编辑 /etc/vsftpd/vsftpd.conf 来进行对匿名用户上传(下载)速率进行限制
编辑/etc/vsftpd/vsftpd.conf
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
编辑内内容如下:
35 anon_max_rate=102400 #限制匿名用户下载上传速率,单位为字节(此处限制为100k)
[root@server ~]# systemctl restart vsftpd.service #重启服务
编辑配置文件,限制匿名用户下载(上传)速度,并重启服务
在客户端进行验证
先从内存中截取一大块文件进行限速的材料。
限速前:速度大约(213.54M/s)
限速后:
通过编辑 /etc/vsftpd/vsftpd.conf 来进行对匿名用户和本地用户上传后的默认权限进行设定
编辑/etc/vsftpd/vsftpd.conf
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
编辑内内容如下:
24 local_umask=022 #本地用户上传后文件的默认权限保留值
25 anon_umask=077 #匿名用户上传后文件的默认权限保留值
[root@server ~]# systemctl restart vsftpd.service #重启服务
执行如下:
编辑配置文件,进行对匿名用户和本地用户上传后的默认权限进行设定,并重启服务
在客户端进行验证
虚拟用户预留权限umask=077
本地用户预留权限umask=022
在linux之下,使用vsftp服务时,默认使用ftp访问的时候,如果想多个用户同时访问某一个目录,同时对同一目录下有着不同的权限,比如部分用户只能看,不修改,或者有的用户只能下载不能上传这些权限,这些设定只能通过vsftp中的虚拟用户来进行设定,本地用户用户无法达到这样的效果。
- PAM主要是由一组共享库文件(也就是后缀名为.so文件)和一些配置文件组成的用于系统服务授权的一套东西,其中,PAM 就是 Pluggable Authentication Modules 这几个英文单词的缩写。当你在请求服务的时候,具有PAM认证功能的应用程序将与这些.so文件进行交互,以便得知是否可以授权给发起请求的用户来使用服务,比如su, vsftp, httpd,等。如果认证成功了,那么这个用户便可以使用服务或完成命令,如果认证失败了,那么这个用户将不能使用服务,同时,PAM将向指定的log文件写入警告信息。我们可以将PAM看作是一个中间裁判,它不依赖于任何应用或服务。你完全可以升级这些应用或服务而不必管PAM的共享库的更新或升级,反之亦然。所以它非常的灵活。
在/etc/vsftpd/下建立文文件用来放置虚拟用于的账户密码,用于后面的用户认证
[root@server ~]# vim /etc/vsftpd/virt-user #文件名自拟,用来放置虚拟用户的账
#户密码,用于后面的用户认证
#编辑内容如下:
1 user1 #虚拟用户的用户名
2 123 #密码
3 user2 #虚拟用户的用户名
4 123 #密码
5 user3 #虚拟用户的用户名
6 123 #密码
[root@server ~]# db_load -T -t hash -f /etc/vsftpd/virt-user /etc/vsftpd/virt-user.db
-T:允许应用程序能够将文本文件转译载入进数据库。 -t hash:使用hash码加密 -f:指定包含用户名和密码文本文件。此文件格式要示:奇数行用户名、偶数行密码
执行如下:
对/etc/vsftpd/virt-user进行加密
查看加密后生成的密文(为乱码,保证系统安全性)
[root@server ~]# vim /etc/pam.d/ftpuser
编辑内容如下:
1 account required pam_userdb.so db=/etc/vsftpd/virt-user
2 auth required pam_userdb.so db=/etc/vsftpd/virt-user
#required:表示本模块必须返回成功才能通过认证
#pam_userdb.so:pam插件,是PAM模块对db数据库进行身份验证
#db=目录:规定要认证的数据路径
编辑 /etc/vsftpd/vsftpd.conf 修改pam服务名称,让系统识别虚拟用户
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
内容如下:
132 pam_service_name=ftpuser #pam服务名称(上面新建的/etc/pam.d/ftpuser)
133 guest_enable=YES #虚拟账户是否可以登陆
134 guest_username=ftp #虚拟用户指定一个用户身份
[root@server ~]# systemctl restart vsftpd.service #重启服务
注:
修改了 pam_service_name 以后本地用户是无法再登录lftp的
执行如下:
编辑 /etc/vsftpd/vsftpd.conf
重启服务后,在客户端进行验证
普通用户linux,student,都不能进行登录,虚拟用户user1可以
[root@server ~]# mkdir /virt-users
[root@server ~]# mkdir /virt-users/user{1..3} #user{1..3}必须与所建虚拟用户名称相对应
修改配置文件(/etc/vsftpd/vsftpd.conf)
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
编辑内容如下:
138 local_root=/virt-users/$USER #指定虚拟用户家目录
#$USER 为shell 下的变量
139 user_sub_token=$USER #调用参数
#这个选项是与虚拟用户结合使用的。它是用于自动为每个文件生成一个主目录。
[root@server ~]# systemctl restart vsftpd.service #重启服务
执行如下:
建立用户家目录
每个虚拟用户家目录下建立文件,用来验证
编辑 /etc/vsftpd/vsftpd.conf
重启服务,并在客户端验证
虚拟用户的权限上传下载,读写,等权限,在主配置文件中的规定,与匿名用户相同,故为了规定各个匿名用户不同的权限,可以创建各个虚拟用户对应的配置文件继续权限管理
先为每个虚拟用户,在其家目录下创建pub目录,并修改其权限让每个用户对该目录可写
[root@server ~]# mkdir /virt-users/user{1..3}/pub
[root@server ~]# chgrp ftp /virt-users/user{1..3}/pub #修改目录所属组,与赋予虚拟用户的身份组相同
[root@server ~]# chmod 775 /virt-users/user{1..3}/pub #修改组权限,保证虚拟用户可写
[root@server ~]# mkdir /etc/vsftpd/conf_dir #创建虚拟用户配置文件存放目录并编辑主配置文件/etc/vsftpd/vsftpd.conf
[root@server ~]# vim /etc/vsftpd/vsftpd.conf #编辑配置文件
第140行左右:user_config_dir=/etc/vsftpd/conf_dir #将每个虚拟用户的配置文件分开
在/etc/vsftpd/conf_dir下建立每个虚拟用户对应的子配置文件
[root@server ~]# vim /etc/vsftpd/conf_dir/user1 #建立并编辑虚拟用户user1的vsftpd配置文件
#在其中对各个虚拟用户的权限进行配置(虚拟用户对应权限与匿名用户相同)
如编辑以下内容:
1 anon_upload_enable=YES #YES表示允许虚拟用户上传
2 anon_other_write_enable=YES #匿名用户可以对文件进行删除
3 anon_world_readable_only=NO #设定参数位NO表示匿名用户可以下载
4 anon_mkdir_write_enable=YES #匿名用户可以进行创建目录
[root@server ~]# systemctl restart vsftpd.service #重启服务
注:
虚拟用户对应权限与匿名用户相同运行如下:
修改目录信息
创建虚拟用户配置文件存放目录后编辑主配置文件
编辑虚拟用户user1的vsftpd配置文件
重启服务后在客户端进行验证
未编辑user2的配置文件所以无法进行上传操作
user1的配置文件编辑完整,故可进行相应操作
我们可以通过编辑 /etc/vsftpd/vsftpd.conf 来实现对 lftp 登录用户个数的限制
编辑配置文件:
[root@server ~]# vim /etc/vsftpd/vsftpd.conf
内容如下:
132 max_clients=2 #最大可连接客户端数量为2
[root@server ~]# systemctl restart vsftpd.service #重启服务
执行如下:
编辑/etc/vsftpd/vsftpd.conf 限制 lftp 登录用户个数为 2
在客户端进行验证
客户端1 以 user1 进行连接,连接数为1,可连接
客户端2 以 user2 进行连接,连接数为2,可连接
客户端3以 user3 进行连接,连接数为3,超出用户数限制,user3不可连接