1 ftp简介
- 网络文件共享服务主流的主要有三种,分别是ftp、nfs、samba。
- FTP是File Transfer Protocol(文件传输协议)的简称,用于internet上的控制文件的双向传输。
- FTP也是一个应用程序,基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。
- 在FTP的使用当中,用户经常遇到两种概念:下载和上传
- 下载(Download) 上传(Upload)
从远程主机拷贝文件至自己的计算机上 将文件从自己的计算机上拷贝至远程主机上
2 vsftpd安装
[root@wuliyong ~]# yum -y install vsftpd
...
...
Total download size: 169 k
Installed size: 348 k
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : vsftpd-3.0.2-22.el7.x86_64 1/1
Verifying : vsftpd-3.0.2-22.el7.x86_64 1/1
Installed:
vsftpd.x86_64 0:3.0.2-22.el7
Complete!
3 vsftpd配置
-
/etc/pam.d/vsftpd //vsftpd用户认证配置文件
-
/etc/vsftpd/ //配置文件目录
-
/etc/vsftpd/vsftpd.conf //主配置文件
-
匿名用户(映射为ftp用户)的共享资源位置是/var/ftp
-
系统用户通过ftp访问的资源位置为用户的家目录
-
虚拟用户通过ftp访问的资源位置为给虚拟用户指定的映射成为的系统用户的家目录
4配置匿名用户ftp
服务基础环境准备,关闭防火墙和selinux
主机名 | ip地址 |
---|---|
@localhost客户端 | 192.168.168.105 |
@client服务端 | 192.168.168.34 |
[root@localhost~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.4 (Maipo)
[root@localhostr~]# systemctl stop firewalld.service
[root@localhost ~]# setenforce 0 #关闭selinux
[root@localhost ~]# hostnamectl set-hostname ftp-client
[root@localhost ~]# bash
客户端
[root@client ~]# systemctl stop firewalld
[root@client ~]# setenforce 0
setenforce: SELinux is disabled
- 服务端进行操作
安装vsftpd
[root@localhost~ ~]# yum -y install vsftpd
- 启动ftp服务并加入开机自启
[root@localhost ~]# systemctl enable vsftpd
[root@localhost ~]# systemctl start vsftpd
- 修改vsftpd主配置文件
[root@localhost~]# vim /etc/vsftpd/vsftpd.conf
*启动匿名用户、允许上传和创建文件权限
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
- 修改默认ftp共享⽬目录站点权限,最后重新加载vsftpd服务
[root@localhost~]# chmod -R 777 /var/ftp/
[root@localhost~]# systemctl restart vsftpd
- Linux下使⽤用lftp客户端⼯工具访问vsftpd服务验证,安装此⼯工具
[root@localhost~]# yum install lftp -y
- 使用匿匿名用户登录vsftpd
[root@client ~]# lftp 192.168.168.105
lftp 192.168.168.105:~> ls
ls: 登录失败: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
-
遇见问题:登录失败!创建文件失败!上传文件失败!删除文件失败!的解决方法
原因及解决方法 -
当我们限定了用户不能跳出其主目录之后,使用该用户登录FTP时往往会遇到这个错误:
500 OOPS: vsftpd: refusing to run with writable root inside chroot ()
- 这是由于下面的更新造成的:
Add stronger checks for the configuration error of running with a writeable root directory inside a chroot(). This may bite people who carelessly turned on chroot_local_user but such is life.
- 从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。
要修复这个错误,可以用命令chmod a-w /var/ftp/去除用户主目录的写权限
[root@localhost~]# chmod a-w /var/ftp/
[root@localhost~]# systemctl restart vsftpd
- 再次检测
[root@client ~]# lftp 192.168.168.105
lftp 192.168.168.105:~> ls
drwxrwxrwx 2 0 0 6 Aug 03 2017 pub
- 可以看到服务端/var/ftp里面的内容了
新建文件夹试试
lftp 192.168.168.105:/> mkdir lala
mkdir: Access failed: 550 Create directory operation failed. (lala)
- 可以看到无法新建lala这个目录,是不是由于权限不够,我们试着给文件写的权限
[root@localhost~ ~]# chmod o+w /var/ftp
- 再次新建lala
lftp 192.168.168.105:/> mkdir lala
mkdir 成功, 建立 `lala'
#成功
lftp 192.168.168.105:/> lcd /etc
lcd 成功, 本地目录=/etc
传文件能不能成功
lftp 192.168.168.105:/> put inittab
put: Access failed: 553 Could not create file. (inittab)
#不能上传文件,可能是selinux的问题
[root@localhost~ ~]# getsebool -a |grep ftp
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
tftp_anon_write --> off
tftp_home_dir --> off
- 可以看到,允许匿名用户上传的给关闭的了。
#现在我们设置布尔值
[root@localhost ~]# setsebool -P allow_ftpd_anon_write=1
[root@localhost ~]# getsebool -a |grep allow_ftpd_anon
[root@localhost ~]# getsebool -a |grep ftp
ftpd_anon_write --> on
##OK,允许匿名用户的上传就给打开了。
#但是还有一点,/var/ftp/pub的context值是不正确的,
#现在我们必须调整这个/var/ftp/pub目录的context值。
[root@localhost ~]# ls -ldZ /var/ftp/pub/
drwxrwxrwx. root root system_u:object_r:public_content_t:s0 /var/ftp/pub/
[root@localhost~]# chcon -R -t public_content_rw_t /var/ftp/pub/
[root@localhost~]# ls -ldZ /var/ftp/pub/
drwxrwxrwx. root root system_u:object_r:public_content_rw_t:s0 /var/ftp/pub/
#Selinux的问题就解决了,现在我们再来上传文件
lftp 192.168.168.105:/> ls
drwx------ 2 14 50 6 Sep 12 14:28 lala
drwxrwxrwx 2 0 0 6 Aug 03 2017 pub
lftp 192.168.168.105:/> cd pub/
lftp 192.168.168.105:/pub> ls inittab
lftp 192.168.118.100:/pub> put /etc/inittab
491 bytes transferred
lftp 192.168.168.105:/pub> ls
-rw-------
匿名用户就可以上传文件了。
- 总结,开放匿名用户的上传文件的权限的解决方法
1,开启目录自身的权限
2,开启服务控制的权限
#3,解决selinux的问题
lftp 192.168.168.105:/pub> rm inittab
rm: Access failed: 550 Permission denied. (inittab)
#没有删除文件的权限
-
用户访问
-
本地用户访问ftp服务,新建用户ftp_test
[root@localhost~]# useradd ftp_test
[root@localhost~]# echo "123"|passwd --stdin ftp_test
#更改用户 ftp_test 的密码 。
passwd:所有的身份验证令×××已经成功更新。
#客户端验证
[root@client ~]# lftp 192.168.168.105
lftp 192.168.118.100:~> login ftp_test 123
lftp ftp_test@192.168.118.100:~> mkdir ftp
mkdir 成功, 建立 `ftp'
- 服务端查看
[root@localhost ~]# ls /home/ftp_test/
ftp
*锁定所有本地用户只能在自己的家目录操作
chroot_local_user=YES #在配置文件里面加入此条
5.虚拟用户配置如下:
#创建文本格式的用户名,密码列表,例添加两个用户tom,jerry,密码为123,456
[root@ftp-server ~]# touch /etc/vsftpd/vu.list
[root@ftp-server ~]# echo 'tom' >> /etc/vsftpd/vu.list
[root@ftp-server ~]# echo '123' >> /etc/vsftpd/vu.list
[root@ftp-server ~]# echo 'jerry' >> /etc/vsftpd/vu.list
[root@ftp-server ~]# echo '456' >> /etc/vsftpd/vu.list
[root@ftp-server ~]# cat /etc/vsftpd/vu.list
tom
123
jerry
456
#用户名和密码一一对应,前面是账号,后面跟密码
- 安装db4工具
[root@ftp-server ~]# yum -y install db4*
#将刚创建的文本格式的用户名,密码文件使用db4工具转换为数据库文件
[root@ftp-server ~]# db_load -T -t hash -f /etc/vsftpd/vu.list /etc/vsftpd/vu.db
#为提高虚拟用户账号文件的安全性,应将文件权限设置为600,以避免数据外泄
[root@localhost ~]# chmod 600 /etc/vsftpd/vu.*
[root@localhost ~]# ll /etc/vsftpd/vu.*
-rw-------. 1 root root 12288 9月 13 02:38 /etc/vsftpd/vu.db
-rw-------. 1 root root 18 9月 13 02:37 /etc/vsftpd/vu.list
- 添加虚拟用户的映射账号,创建ftp目录,例如要将使用的ftp根目录设置为/var/ftproot,映射账号的名称为vftp,可以执行以下操作
[root@localhost ~]# useradd -d /var/ftproot -s /sbin/nologin vftp
[root@localhost ~]# chmod 755 /var/ftproot/
[root@localhost ~]# ll -d /var/ftproot/
drwxr-xr-x. 3 vftp vftp 78 9月 13 02:39 /var/ftproot/
- 为虚拟用户建立PAM认证
[root@localhost ~]# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
[root@localhost ~]# vim /etc/pam.d/vsftpd
- 将配置文件内容全部删除,只留3行内容
#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/vu
account required pam_userdb.so db=/etc/vsftpd/vu
- 修改vsftpd配置文件,添加虚拟用户支持
[root@localhost ~]# echo 'guest_enable=YES' >> /etc/vsftpd/vsftpd.conf
[root@localhost ~]# echo 'guest_username=vftp' >> /etc/vsftpd/vsftpd.conf
- 为不同的虚拟用户建立独立的配置文件
[root@localhost ~]# echo 'user_config_dir=/etc/vsftpd/vusers_dir' >> /etc/vsftpd//vsftpd.conf
[root@localhost ~]# echo 'allow_writeable_chroot=YES' >> /etc/vsftpd/vsftpd.conf
#有了这些配置之后,就可以在/etc/vsftpd/vusers_dir目录中为没个虚拟用户分别建立配置文件了
- 设置tom用户能够上传文件,创建目录
[root@localhost ~]# mkdir /etc/vsftpd/vusers_dir
[root@localhost~]# ll /etc/vsftpd/
总用量 40
-rw-------. 1 root root 125 8月 3 2017 ftpusers
-rw-------. 1 root root 361 8月 3 2017 user_list
-rw-r--r--. 1 root root 27 9月 13 02:41 vsftpd.
-rw-------. 1 root root 5133 9月 13 02:42 vsftpd.conf
-rwxr--r--. 1 root root 338 8月 3 2017 vsftpd_conf_migrate.sh
-rw-------. 1 root root 12288 9月 13 02:38 vu.db
-rw-------. 1 root root 18 9月 13 02:37 vu.list
drwxr-xr-x. 2 root root 6 9月 13 02:42 vusers_dir
[root@ftp-server ~]# echo 'anon_upload_enable=YES' >> /etc/vsftpd/vusers_dir/tom
[root@ftp-server ~]# echo 'anon_mkdir_write_enable=YES' >> /etc/vsftpd/vusers_dir/tom
#重启服务
[root@localhost ~]# systemctl restart vsftpd
1
- 客户端验证tom权限
[root@localhost ~]# lftp 192.168.118.128
lftp 192.168.118.128:~> login tom 123 #登录到tom用户
lftp tom@192.168.118.100:/> mkdir aa #创建文件aa成功
mkdir 成功, 建立 `aa'
lftp tom@192.168.118.100:/> ls
drwx------ 2 1001 1001 6 Sep 13 03:04 aa
lftp tom@192.168.118.100:/> rm aa #不能删除文件aa,没有删除权限
rm: Access failed: 550 Permission denied. (aa)
lftp tom@192.168.118.100:/> put /etc/inittab #上传文件inittab成功
491 bytes transferred
lftp tom@192.168.118.100:/> ls
drwx------ 2 1001 1001 6 Sep 13 03:04 aa
-rw------- 1 1001 1001 491 Sep 13 03:11 inittab
lftp tom@192.168.118.100:/> get TeamViewer_Setup-13.1.3629.0.exe
20367104 bytes transferred #下载文件成功
#设置jerry用户的默认下载权限,创建jerry的空文件
[root@ftp-server ~]# touch /etc/vsftpd/vusers_dir/jerry
- 客户端验证
[root@ftp-client ~]# lftp -u jerry,456 192.168.118.100 #登录虚拟用户jerry
lftp jerry@192.168.118.100:~> ls
-rw-r--r-- 1 0 0 20367104 Aug 30 13:02 TeamViewer_Setup-13.1.3629.0.exe
drwx------ 2 1001 1001 6 Sep 13 03:04 aa
-rw------- 1 1001 1001 491 Sep 13 03:11 inittab
lftp jerry@192.168.118.100:/> mkdir haha #没有创建文件的权限,创建失败
mkdir: Access failed: 550 Permission denied. (haha)
lftp jerry@192.168.118.100:/> get TeamViewer_Setup-13.1.3629.0.exe
20367104 bytes transferred #下载文件成功