前言
FTP 是File Transfer Protocol(文件传输协议),
用户通过一个支持FTP协议的客户机程序,连接到在远程主机上的FTP服务器程序。
用户通过客户机程序向服务器程序发出命令,服务器程序执行用户所发出的命令,
并将执行的结果返回到客户机。例如,用户发出一条命令,要求服务器向用户
传送某一个文件的一份拷贝,服务器会响应这条命令,将指定文件送至用户的机
器上。客户机程序代表用户接收到这个文件,将其存放在用户目录中。

FTP一般应用于上传和下载
下载文件就是从远程主机拷贝文件至自己的计算机上;
上传文件就是将文件从自己的计算机中拷贝至远程主机上

vsftpd # 服务端软件
lftp # 客户端软件,提供登陆环境

1.部署ftp服务的服务端
[root@localhost Desktop]# yum install -y vsftpd
[root@localhost Desktop]# yum install -y lftp
[root@localhost Desktop]# systemctl start vsftpd
[root@localhost Desktop]# systemctl enable vsftpd
[root@localhost Desktop]# netstat -antlp | grep vsftpd # 查看到端口说明服务开启成功
ftp 服务的部署-LMLPHP

[root@localhost Desktop]# firewall-cmd --permanent --add-service=ftp
success
[root@localhost Desktop]# firewall-cmd --reload
success
[root@localhost Desktop]# firewall-cmd --list-all
ftp 服务的部署-LMLPHP

[root@localhost Desktop]# vim /etc/sysconfig/selinux
7 SELINUX=disabled
[root@localhost Desktop]# getenforce # 查看到更改不生效,必须重启
Enforcing # 开启内核加强型火墙
[root@localhost Desktop]# reboot
[root@localhost Desktop]# getenforce # 重启之后再次查看
Disabled # 禁止服务

2.ftp服务的参数配置
ftp服务的基本信息:

vsftpd # 服务端软件安装包
/var/ftp # 默认发布目录
21/tcp # 协议接口
/etc/vsftpd/vsftpd.conf # 服务配置文件

[root@localhost Desktop]# rpm -qc vsftpd # 查看ftp服务的配置文件
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf
[root@localhost Desktop]# cd /var/ftp/ # 这是ftp服务的默认发布目录
[root@localhost ftp]# ls
pub

在客户端测试
[root@foundation78 Desktop]# yum install -y lftp # 如果客户端没有这个软件,就下载一个

(1)匿名用户访问(默认允许)

[root@foundation78 Desktop]# lftp 172.25.254.138 # 这是服务端IP
lftp 172.25.254.138:~> ls # 查看到pub目录说明成功登陆
drwxr-xr-x 2 0 0 6 Aug 03 2015 pub
ftp 服务的部署-LMLPHP

注:匿名用户登陆进去查看到的是默认发布目录里的内容,而且ftp服务对匿名用户的所有权限都禁止,除了可登陆权限和可读权限

(2)本地用户的访问

# 服务端(先建立本机用户)

[root@localhost Desktop]# useradd westos
[root@localhost Desktop]# passwd westos
[root@localhost Desktop]# useradd linux
[root@localhost Desktop]# passwd linux

# 客户端测试
[kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u westos # 指定本机用户登陆,默认的增删改查的功能都开启
Password:
lftp [email protected]:~> ls
lftp [email protected]:~> mkdir file
mkdir ok, `file' created
lftp [email protected]:~> ls
drwxr-xr-x 2 1001 1001 6 Oct 28 06:39 file
lftp [email protected]:~> rm -fr file/
rm ok, `file/' removed
lftp [email protected]:~> ls

注:ftp服务对本地用户所有权限都开启,而且本地用户登陆进去的都是自己的本地家目录
3.对所有用户的权限进行管理
报错id的解析:
500 # 文件系统权限过大
530 # 用户认证失败
550 # 服务本身功能未开放
553 # 本地文件系统权限过小

(1)匿名用户

anonymous_enable=YES|NO # 匿名用户是否可以登陆
anon_upload_enable=YES|NO # 匿名用户是否可以上传
anon_world_readable_only=YES|NO # 匿名用户是否可以下载
anon_other_write_enable=YES|NO # 匿名用户是否可以删除
anon_umask=022 # 匿名用户上传的文件的权限
anon_max_rate=102400 # 限制匿名用户下载的速度100k/s
anon_root=/directory # 匿名用户家目录的修改
max_clients=1 # 匿名用户最大连接数
chown_uploads=YES # 指定上传文件的所属用户
chown_username=westos

对于anon_world_readable_only的具体使用可以看此处详细解释
上传文件
# 在客户端用匿名用户登录
[kiosk@foundation78 Desktop]$ lftp 172.25.254.138
lftp 172.25.254.138:/> cd pub/
lftp 172.25.254.138:/pub> put /etc/passwd # 默认对匿名用户不可上传
put: Access failed: 550 Permission denied. (passwd)

# 在服务端
[root@localhost Desktop]# cd /var/ftp
[root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
29 anon_upload_enable=YES # 打开上传权限
[root@localhost ftp]# systemctl restart vsftpd.service

# 在客户端
lftp 172.25.254.138:/pub> put /etc/passwd # 再次上传,发现还是不能上传,报553错误
put: Access failed: 553 Could not create file. (passwd)

# 在服务端
[root@localhost ftp]# ls -l /var/ftp/ # 发现默认发布目录的只有对root用户可写
total 0
drwxr-xr-x. 2 root root 6 Aug 3 2015 pub
[root@localhost ftp]# chgrp ftp /var/ftp/pub/ # 把默认发布目录的组改为ftp组,匿名用户依赖的是ftp组
[root@localhost ftp]# chmod g+w /var/ftp/pub/ # 给ftp服务加可写权限
[root@localhost ftp]# ll -d /var/ftp/pub/
drwxrwxr-x. 2 root ftp 6 Aug 3 2015 /var/ftp/pub/
ftp 服务的部署-LMLPHP

# 在客户端
lftp 172.25.254.138:/pub> put /etc/passwd
2281 bytes transferred
lftp 172.25.254.138:/pub> ls
-rw------- 1 14 50 2281 Oct 29 11:48 passwd
ftp 服务的部署-LMLPHP

可以发现上传的文件默认权限位600
更改上传文件权限
# 在服务端
[root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf # 更改上传文件的默认权限
30 anon_umask=022
[root@localhost ftp]# systemctl restart vsftpd.service

# 在客户端
lftp 172.25.254.138:/pub> put /etc/group
970 bytes transferred
lftp 172.25.254.138:/pub> ls
-rw-r--r-- 1 14 50 970 Oct 29 11:56 group
-rw------- 1 14 50 2281 Oct 29 11:48 passwd
ftp 服务的部署-LMLPHP

开启匿名用户的下载权限

# 在服务端

[root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
31 anon_world_readable_only=YES
[root@localhost ftp]# systemctl restart vsftpd.service

# 在客户端

lftp 172.25.254.138:/pub> get group # 下载成功
970 bytes transferred
ftp 服务的部署-LMLPHP

开启匿名用户的删除权限

# 在服务端
[root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
32 anon_other_write_enable=YES
[root@localhost ftp]# systemctl restart vsftpd.service

# 在客户端
lftp 172.25.254.138:/pub> ls
-rw-r--r-- 1 14 50 970 Oct 29 11:56 group
-rw------- 1 14 50 2281 Oct 29 11:48 passwd
lftp 172.25.254.138:/pub> rm -fr passwd
rm ok, `passwd' removed
lftp 172.25.254.138:/pub> ls
-rw-r--r-- 1 14 50 970 Oct 29 11:56 group
ftp 服务的部署-LMLPHP

限制上传文件的最大速度

# 在服务端
[root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
34 anon_max_rate=102400
[root@localhost ftp]# systemctl restart vsftpd.service

# 在客户端
lftp 172.25.254.138:/pub> put /tmp/file
464519168 bytes transferred in 9 seconds (48.38M/s) # 没限速之前
ftp 服务的部署-LMLPHP

家目录的修改

# 在服务端
[root@localhost ftp]# mkdir /westos
[root@localhost ftp]# touch /westos/westosfile{1..5} # 建立文件是为了测试
[root@localhost ftp]# ll /westos/
total 0-
rw-r--r-- 1 root root 0 Oct 30 13:04 westosfile1
-rw-r--r-- 1 root root 0 Oct 30 13:04 westosfile2
-rw-r--r-- 1 root root 0 Oct 30 13:04 westosfile3
-rw-r--r-- 1 root root 0 Oct 30 13:04 westosfile4
-rw-r--r-- 1 root root 0 Oct 30 13:04 westosfile5
[root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
33 anon_root=/westos
[root@localhost ftp]# systemctl restart vsftpd.service

# 在客户端
[root@foundation78 Desktop]# lftp 172.25.254.138
lftp 172.25.254.138:~> ls
-rw-r--r-- 1 0 0 0 Jul 22 12:21 westosfile1
-rw-r--r-- 1 0 0 0 Jul 22 12:21 westosfile2
-rw-r--r-- 1 0 0 0 Jul 22 12:21 westosfile3
-rw-r--r-- 1 0 0 0 Jul 22 12:21 westosfile4
-rw-r--r-- 1 0 0 0 Jul 22 12:32 westosfile5
ftp 服务的部署-LMLPHP

(2)本地用户

write_enable=YES|NO # 是否对登陆用户可写
local_enable=YES|NO # 本地用户是否可以登陆
chroot_local_user=YES # 限制本地用户浏览(所有用户被锁定到自己的家目录之中)
local_umask=077 # 本地用户上传文件权限
local_root=/directory # 本地用户家目录修改

限制本地用户登陆
# 在服务端
[root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
16 local_enable=NO
[root@localhost ftp]# systemctl restart vsftpd

# 在客户端
[kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u westos
Password:
lftp [email protected]:~> ls # 没有权限查看,说明没有登陆成功
ls: Login failed: 530 This FTP server is anonymous only.

关闭本地用户的可写权限
# 在服务端
[root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
19 write_enable=NO
[root@localhost ftp]#systemctl restart vsftpd.service

# 在客户端
[kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u westos
Password:
lftp [email protected]:~> ls
lftp [email protected]:~> mkdir file
mkdir: Access failed: 550 Permission denied. (file)
ftp 服务的部署-LMLPHP

更改本地用户上传文件权限

# 在服务端
[root@localhost ftp]#vim /etc/vsftpd/vsftpd.conf # 先要打开可写权限
23 local_umask=077 # 把默认权限改为600
[root@localhost ftp]# systemctl restart vsftpd.service

# 在客户端
lftp [email protected]:~> put /etc/passwd
2281 bytes transferred
lftp [email protected]:~> ls # 可以看到默认权限为644
-rw-r--r-- 1 1001 1001 2281 Oct 30 11:52 passwd
lftp [email protected]:~> put /etc/group
970 bytes transferred
lftp [email protected]:~> ls # 修改完之后,再次查看权限已经改变
-rw------- 1 1001 1001 970 Oct 30 11:54 group
-rw-r--r-- 1 1001 1001 2281 Oct 30 11:52 passwd
ftp 服务的部署-LMLPHP

本地用户家目录修改

# 在服务端
[root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
17 local_root=/westos
[root@localhost ftp]# systemctl restart vsftpd
[root@localhost ftp]# ls /westos/
westosfile1 westosfile2 westosfile3 westosfile4 westosfile5

# 在客户端
[kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u westos
Password:
lftp [email protected]:~> ls
-rw-r--r-- 1 0 0 0 Oct 30 05:04 westosfile1
-rw-r--r-- 1 0 0 0 Oct 30 05:04 westosfile2
-rw-r--r-- 1 0 0 0 Oct 30 05:04 westosfile3
-rw-r--r-- 1 0 0 0 Oct 30 05:04 westosfile4
-rw-r--r-- 1 0 0 0 Oct 30 05:04 westosfile5
ftp 服务的部署-LMLPHP

4.黑白名单
ftpusers # 永久黑名单,优先级最高,一旦加入,任何操作都不能洗白
user_list # 临时黑名单,可修改配置文件,变为白名单

当用户同时出现在user_list白名单和ftpuser黑名单中时,此时用户被认为是黑名单中的,因为ftpuser黑名单的级别最高

[root@localhost ftp]#cd /etc/vsftpd/
[root@localhost vsftpd]# ll
total 28
-rw------- 1 root root 125 Aug 3 2015 ftpusers
-rw------- 1 root root 361 Aug 3 2015 user_list
-rw------- 1 root root 5182 Oct 28 05:15 vsftpd.conf
-rwxr--r-- 1 root root 338 Aug 3 2015 vsftpd_conf_migrate.sh
-rw------- 1 root root 5046 Oct 28 03:22 vsftpd.conf.rpmsave
ftp 服务的部署-LMLPHP

[root@localhost vsftpd]# vim user_list # 把westos用户加入临时黑名单
21 westos

# 在客户端测试

[kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u westos
Password:
lftp [email protected]:~> ls
ls: Login failed: 530 Permission denied.
ftp 服务的部署-LMLPHP

# 在服务端

[root@localhost vsftpd]# /etc/vsftpd/vsftpd.conf # 设置user_list为白名单
133 userlist_deny=NO #默认所有用户加入黑名单,白名单用户可登陆
[root@localhost vsftpd]# systemctl restart vsftpd

注:
userlist_enable和userlist_deny两个选项联合起来针对的是:本地全体用户(除去ftpusers中的用户)和出现在user_list文件中的用户以及不在在user_list文件中的用户这三类用户集合进行的设置。

当且仅当userlist_enable=YES时:userlist_deny项的配置才有效,user_list文件才会被使用;当其为NO时,无论userlist_deny项为何值都是无效的,本地全体用户(除去ftpusers中的用户)都可以登入FTP

当userlist_enable=YES时,userlist_deny=YES时:user_list是一个黑名单,即:所有出现在名单中的用户都会被拒绝登入;

当userlist_enable=YES时,userlist_deny=NO时:user_list是一个白名单,即:只有出现在名单中的用户才会被准许登入(user_list之外的用户都被拒绝登入);

另外需要特别提醒的是:使用白名单后,匿名用户将无法登入!除非显式在user_list中加入一行:anonymous

# 在客户端测试

[kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u westos # 刚才在user_list名单里的westos就成了白名单用户,即可以登录
Password:
lftp [email protected]:~> ls
-rw------- 1 1001 1001 970 Oct 30 11:54 group
-rw-r--r-- 1 1001 1001 2281 Oct 30 11:52 passwd
ftp 服务的部署-LMLPHP

5.虚拟用户的管理
(1)虚拟用户登录配置
[root@localhost Desktop]# cd /etc/vsftpd/
[root@localhost vsftpd]# vim vsftpd.conf
anon_upload_enable=NO # 设定不允许匿名用户上传
anon_world_readable_only=NO # 设定不允许匿名用户的下载
anon_other_write_enable=NO # 设定不允许匿名用户删除
[root@localhost vsftpd]# systemctl restart vsftpd
[root@localhost vsftpd]# vim loginuser # 创建虚拟帐号身份
user1
111
user2
222
user3
333
ftp 服务的部署-LMLPHP

[root@localhost vsftpd]# db_load -T -t hash -f loginuser loginuser.db # 给虚拟帐号进行哈希加密,-T表示转换,-t表示加密,-f表示重命名
[root@localhost vsftpd]# file loginuser.db # 查看文件类型
ftp 服务的部署-LMLPHP

[root@localhost vsftpd]# cd /etc/pam.d/
[root@localhost pam.d]# vim ftpauth # 设定认证插件
account required pam_userdb.so db=/etc/vsftpd/loginuser
auth required pam_userdb.so db=/etc/vsftpd/loginuser
ftp 服务的部署-LMLPHP

[root@localhost pam.d]# vim /etc/vsftpd/vsftpd.conf
130 pam_service_name=ftpauth # 指定认定插件
131 guest_enable=YES # 虚拟用户认证开启
[root@localhost pam.d]# systemctl restart vsftpd

# 在客户端用虚拟用户身份登陆
[kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u user1
Password:
lftp [email protected]:~> ls # 虚拟用户登陆的是ftp的默认发布目录
drwxrwxr-x 2 0 50 42 Oct 30 05:30 pub
lftp [email protected]:/> cd pub/
lftp [email protected]:/pub> ls
-rw------- 1 14 50 2592672 Oct 29 12:13 file
-rw-r--r-- 1 14 50 970 Oct 29 11:56 group
-rw------- 1 1001 50 2281 Oct 30 05:30 passwd
lftp [email protected]:/pub> exit
[kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u user2
Password: lftp [email protected]:~> ls
drwxrwxr-x 2 0 50 42 Oct 30 05:30 pub
lftp [email protected]:/> cd /pub/
lftp [email protected]:/pub> ls
-rw------- 1 14 50 2592672 Oct 29 12:13 file
-rw-r--r-- 1 14 50 970 Oct 29 11:56 group
-rw------- 1 1001 50 2281 Oct 30 05:30 passwd
lftp [email protected]:/pub> exit
[kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u user3
Password:
lftp [email protected]:~> ls
drwxrwxr-x 2 0 50 42 Oct 30 05:30 pub
lftp [email protected]:/> cd pub/
lftp [email protected]:/pub> ls
-rw------- 1 14 50 2592672 Oct 29 12:13 file
-rw-r--r-- 1 14 50 970 Oct 29 11:56 group
-rw------- 1 1001 50 2281 Oct 30 05:30 passwd
ftp 服务的部署-LMLPHP

(2)虚拟用户的默认发布目录的修改
[root@localhost pam.d]# id westos # 查看服务端存在的用户
uid=1001(westos) gid=1001(westos) groups=1001(westos)
[root@localhost pam.d]# ll /home/westos/ # 可以看到westos用户的默认目录里的文件
total 8
-rw------- 1 westos westos 970 Oct 30 19:54 group
-rw-r--r-- 1 westos westos 2281 Oct 30 19:52 passwd
[root@localhost pam.d]# vim /etc/vsftpd/vsftpd.conf
132 guest_username=westos # westos必须存在

# 在客户端尝试登录
[kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u user1
Password: lftp [email protected]:~> ls # 登陆失败
ls: Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()

# 在服务端排错
[root@localhost pam.d]# ll /home

ftp 服务的部署-LMLPHP

[root@localhost pam.d]# chmod 555 /home/westos/ # 改权限

# 再次回到客户端查看
lftp [email protected]:~> ls # 查看到westos用户家目录里的文件
-rw------- 1 1001 1001 970 Oct 30 11:54 group
-rw-r--r-- 1 1001 1001 2281 Oct 30 11:52 passwd
ftp 服务的部署-LMLPHP

(3)虚拟帐号的独立配置(使得虚拟用户登陆看到的是自己家目录的东西)
[root@localhost vsftpd]# pwd
/etc/vsftpd
[root@localhost vsftpd]# mkdir -p /ftphome/user{1..3}
[root@localhost vsftpd]# mkdir /ftphome/user1/user1data
[root@localhost vsftpd]# mkdir /ftphome/user2/user2data
[root@localhost vsftpd]# mkdir /ftphome/user3/user3data
[root@localhost vsftpd]# vim vsftpd.conf
135 local_root=/ftphome/$USER # 指定虚拟用户的家目录
136 user_sub_token=$USER # 把shell中$USER的使用方法告诉ftp
[root@localhost vsftpd]# systemctl restart vsftpd

# 在客户端测试

[kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u user1
Password: lftp [email protected]:~> ls
drwxr-xr-x 2 0 0 6 Nov 03 13:22 user1date
lftp [email protected]:/> exit
[kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u user2
Password: lftp [email protected]:~> ls
drwxr-xr-x 2 0 0 6 Nov 03 13:22 user2datel
ftp [email protected]:/> exit
[kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u user3
Password: lftp [email protected]:~> ls
drwxr-xr-x 2 0 0 6 Nov 03 13:22 user3date
ftp 服务的部署-LMLPHP

那么问题来了,虚拟用户的权限全部由/etc/vsftpd/vsftp.conf文件控制,也就是说所有虚拟用户的权限都是一样的,而且同步改变,但是我们需要区分这些用户,让不同的用户管理不同的任务

(4)虚拟用户的独立权限配置

[root@localhost vsftpd]# mkdir /etc/vsftpd/user_conf
[root@localhost vsftpd]# vim vsftpd.conf
137 user_config_dir=/etc/vsftpd/user_conf
[root@localhost vsftpd]# systemctl restart vsftpd
[root@localhost vsftpd]# vim user_conf/user1
1 anon_upload_enable=YES
[root@localhost vsftpd]# chmod 777 /ftphome/user*/*

# 在客户端测试
[kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u user1
Password:
lftp [email protected]:~> cd user1date
/lftp [email protected]:/user1date> ls
lftp [email protected]:/user1date> put /etc/passwd
2281 bytes transferred
lftp [email protected]:/user1date> ls-
rw------- 1 14 50 2281 Nov 03 14:34 passwd
lftp [email protected]:/user1date> exit
[kiosk@foundation78 Desktop]$ lftp 172.25.254.138 -u user2
Password: lftp [email protected]:~> cd user2date/
lftp [email protected]:/user2date> put /etc/passwd
put: Access failed: 550 Permission denied. (passwd)
ftp 服务的部署-LMLPHP

注:做完实验后,记得还原实验环境

(1)删除在/etc/vsftpd/vsftpd.conf文件做的所有更改
(2)或者
[root@localhost vsftpd]# rm -fr vsftpd.conf # 删除配置文件
[root@localhost vsftpd]# yum reinstall -y vsftpd # 重新下载vsftpd软件来重新生成vsftpd.conf文件
[root@localhost vsftpd]# systemctl restart vsftpd

05-21 18:26