FTP:file transfer protocol,文件传输协议
它是互联网中最早的文件传输协议。
端口:21(用于连接)、20(用于传输文件)。
vsftpd的安装
详细过程参考Linux之软件管理中的"搭建共享软件仓库"一节。
1. 在含有软件资源(镜像/第三方软件)的主机中安装ftp软件
命令:
yum install vsftpd -y
systemctl start vsftpd
systemctl enable vsftpd
2. 关闭selinux和firewalld
关闭selinux
-
查询selinux状态
命令:getenforce
-
编辑配置文件
配置文件位置:/etc/sysconfig/selinux
3. 重启系统
命令:reboot
4. 关闭firewalld
命令:
systemctl stop firewalld
systemctl disable firewalld
5. 测试访问该机的ftp目录
共两种方法测试:
- 在浏览器中输入:
ftp://ftp服务器的ip
,返回ftp的资源列表说明成功。 - 执行命令
lftp ftp服务器的ip
(注意:lftp软件需下载)
下载lftp的过程
[root@linux7_clone yum.repos.d]# yum whatprovides */lftp ##找到提供lftp软件的目录
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
localsoftware | 2.9 kB 00:00:00
rhel7 | 4.3 kB 00:00:00
software | 2.9 kB 00:00:00
zjrhel7 | 4.3 kB 00:00:00
(1/6): localsoftware/primary_db | 1.1 kB 00:00:00
(2/6): zjrhel7/primary_db | 4.2 MB 00:00:00
(3/6): rhel7/primary_db | 4.2 MB 00:00:00
(4/6): rhel7/group_gz | 146 kB 00:00:00
(5/6): zjrhel7/group_gz | 146 kB 00:00:00
(6/6): software/primary_db | 1.1 kB 00:00:00
localsoftware/filelists_db | 586 B 00:00:00
rhel7/filelists_db | 3.4 MB 00:00:00
software/filelists_db | 586 B 00:00:00
zjrhel7/filelists_db | 3.4 MB 00:00:00
lftp-4.4.8-11.el7.i686 : A sophisticated file transfer program
Repo : rhel7
Matched from:
Filename : /usr/bin/lftp
Filename : /usr/lib/lftp
lftp-4.4.8-11.el7.i686 : A sophisticated file transfer program
Repo : zjrhel7
Matched from:
Filename : /usr/bin/lftp
Filename : /usr/lib/lftp
lftp-4.4.8-11.el7.x86_64 : A sophisticated file transfer program
Repo : rhel7
Matched from:
Filename : /usr/bin/lftp
Filename : /usr/lib64/lftp
lftp-4.4.8-11.el7.x86_64 : A sophisticated file transfer program ##对应本机系统的lft软件的版本
Repo : zjrhel7
Matched from:
Filename : /usr/bin/lftp
Filename : /usr/lib64/lftp
[root@linux7_clone yum.repos.d]# yum install lftp-4.4.8-11.el7.x86_64 -y ##安装lftp
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
Resolving Dependencies
--> Running transaction check
---> Package lftp.x86_64 0:4.4.8-11.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=======================================================================================
Package Arch Version Repository Size
=======================================================================================
Installing:
lftp x86_64 4.4.8-11.el7 rhel7 752 k
Transaction Summary
=======================================================================================
Install 1 Package
Total download size: 752 k
Installed size: 2.4 M
Downloading packages:
lftp-4.4.8-11.el7.x86_64.rpm | 752 kB 00:00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : lftp-4.4.8-11.el7.x86_64 1/1
rhel7/productid | 1.6 kB 00:00:00
Verifying : lftp-4.4.8-11.el7.x86_64 1/1
Installed:
lftp.x86_64 0:4.4.8-11.el7
Complete!
访问ftp服务器
命令:
匿名访问:lftp ip地址
普通用户访问:lfto ip地址 -u 用户名
此时,成功配置好ftp服务
vsftpd的基本信息
- 服务名称:
vsftpd.service
- 配置文件目录:
/etc/vsftpd
- 主配置文件:
/etc/vsftpd/vsftpd.conf
- 默认发布目录:
var/ftp
- 报错信息:
报错代码 | 含义 |
---|---|
550 | 程序本身拒绝此命令 |
553 | 文件系统权限被限制,权限过小 |
500 | 权限过大 |
503 | 认证失败(密码错误) |
匿名用户的访问控制
- 匿名访问:
命令:lftp ftp服务器ip
- 本地用户访问:
命令:lftp ftp服务器ip -u 用户名
若要配置ftp服务器的访问,可修改主配置文件:/etc/vsftpd/vsftpd.conf
。
修改后需重启ftp服务:systemctl restart vsftpd
登陆控制
控制主配置文件中的语句:anonymous_enable=YES|NO
- 允许匿名登录
anonymous_enable=YES
默认情况下,匿名登陆的位置是ftp服务器的/var/ftp
目录 - 不允许匿名登陆
anonymous_enable=NO
家目录控制
在主配置文件中增加语句:anon_root=登陆后的位置
若不加此语句,默认登陆位置为:/var/ftp
目录
上传控制
控制主配置文件中的语句:anon_upload_enable=YES|NO
默认情况下不开启上传功能,anon_upload_enable=YES
被注释。
- 默认情况下上传文件
- 配置
anon_upload_enable=YES
后上传文件
- 查看ftp服务器中
/var/ftp
的权限
- 修改权限后上传文件
[root@rhel7 software]# chmod 777 /var/ftp/
- 仅修改
/var/ftp/pub
的权限后上传文件
[root@rhel7 software]# chmod 755 /var/ftp/
[root@rhel7 software]# chmod 777 /var/pft/pub/
[root@rhel7 software]# ls -ld /var/ftp/pub
drwxrwxrwx. 2 root root 6 Jun 21 2018 /var/ftp/pub
下载控制
默认通过FTP仅能下载可读文件,下载路径为当前路径。
在FTP中下载命令为get
。
要需要下载其它类型的文件,可在主配置文件中增加语句:anon_world_readable_only=NO
建立两个权限不同的文件测试下载功能:
修改配置文件后方可下载不可读文件。
目录建立控制
在主配置文件中增加语句:anon_world_readable_only=YES|NO
默认情况下该语句被注释,即默认情况下不能在ftp服务器新建目录。
删除或重命名文件/目录控制
在主配置文件中增加语句:anon_other_write_enable=YES|NO
登陆数量控制
默认可登录的用户数为2000个
在主配置文件中增加语句:max_clients=数目
上传速率控制
在主配置文件中增加语句:anon_max_rate=自定义速率
本地用户的访问控制
登陆控制
- 创建新用户:
useradd alice
useradd bob
- 给新用户设置密码:
echo "alice" | passwd --stdin alice
echo "bob" | passwd --stdin bob
- 登陆ftp服务器的目录:
lftp ftp服务器ip -u 用户名
在ftp服务器的主配置文件/etc/vsftpd/vsftpd.conf
中,语句local_enable=YES|NO
控制本地用户的登陆。默认情况下local_enable=YES
,若设置为NO,则:
家目录控制
命令:local_root=登陆后的位置
若令本地用户登陆的页面为/software
目录:
写权限控制
命令:write_enable=YES|NO
本地用户默认情况下可以写入文件,即默认write_enable=YES
。
上传文件权限控制
命令:local_umask=077
用户登陆控制
永久黑名单
-配置文件:/etc/vsftpd/ftpusers
特点:即改即用,无需重启服务。
默认黑名单
- 配置文件:
etc/vsftpd/user_list
特点:默认黑名单,可修改为白名单。
用户登录白名单
在主配置文件中增加语句:userlist_deny=NO
此时,配置文件etc/vsftpd/user_list
中变为白名单,文件中不包含的所有用户均不可登录。
锁定用户到自己的家目录中
chmod u-w /home/*
chroot_local_user=YES
锁定用户到自己的家目录中的白名单
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
锁定用户到自己的家目录中的黑名单
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
虚拟用户访问
虚拟用户是ftp目录中本不存在,专门为了远程访问ftp服务器中的文件而建立的用户。这些用户不属于ftp服务器上的本地用户。
建立虚拟过程
1. 建立认证文件模板
编写配置文件/etc/vsftpd/ftp_auth_file
[root@RHTL8_clone vsftpd]# vim ftp_auth_file
认证文件模板与认证策略相对应。
2. 加密认证文件
[root@RHTL8_clone vsftpd]# db_load -T -t hash -f ftp_auth_file ftp_auth_file.db
注意:ftp_auth_file
和ftp_auth_file.db
两个文件所处的路径为:/etc/vsftpd
目录(我上条命令执行时的当前目录正好就是/etc/vsftpd
,所以没有使用绝对路径)。
3. 编写新的认证策略
[root@RHTL8_clone vsftpd]# cd /etc/pam.d ##进入系统配置文件目录
[root@RHTL8_clone pam.d]# ls ##该目录下为所有的系统配置文件
atd gdm-launch-environment postlogin sudo
chfn gdm-password remote sudo-i
chsh gdm-pin rhn_register su-l
cockpit gdm-smartcard runuser system-auth
config-util liveinst runuser-l systemd-user
crond login smartcard-auth vlock
cups other sshd vmtoolsd
fingerprint-auth passwd sssd-shadowutils vsftpd
gdm-autologin password-auth su xserver
gdm-fingerprint polkit-1 subscription-manager
[root@RHTL8_clone pam.d]# vim ftp-virtual-user ##文件名称中不能有大写
[root@RHTL8_clone pam.d]# vim /etc/vsftpd/vsftpd.conf
4. 编辑主配置文件/etc/vsftpd/vsftpd.conf
- 指定认证策略文件
pam_service_name=ftp-virtual-user
- 指定虚拟用户功能开启
guest_enable=YES
- 指定虚拟用户在ftp服务器上的用户身份为ftp
guest_username=ftp
5. 重启ftp服务
[root@RHTL8_clone pam.d]# systemctl restart vsftpd
6. 虚拟用户访问ftp服务器
bob能够访问ftp服务器,却不是ftp服务器的本地用户,它是专门服务于ftp软件的虚拟用户。
虚拟用户家目录的独立设定
1. 准备工作
[root@RHTL8_clone pam.d]# mkdir /ftpuserdir ##创建虚拟用户目录
[root@RHTL8_clone user2]# cd /ftpuserdir
[root@RHTL8_clone ftpuserdir]# mkdir bob ##创建和虚拟用户bob名称相同的目录
[root@RHTL8_clone ftpuserdir]# mkdir frank ##创建和虚拟用户frank名称相同的目录
[root@RHTL8_clone ftpuserdir]# cd bob
[root@RHTL8_clone bob]# touch bob_file ##在bob目录下创建新文件
[root@RHTL8_clone bob]# cd ..
[root@RHTL8_clone ftpuserdir]# cd frank
[root@RHTL8_clone frank]# touch frank_file ##在frank目录下创建新文件
[root@RHTL8_clone frank]# cd ..
[root@RHTL8_clone ftpuserdir]# ls -l
total 0
drwxr-xr-x 2 root root 22 Feb 21 20:24 bob
drwxr-xr-x 2 root root 24 Feb 21 20:24 frank
2. 编辑主配置文件
[root@RHTL8_clone pam.d]# vim /etc/vsftpd/vsftpd.conf
在主配置文件中增加以下两个语句:
local_root=/ftpuserdir/$USER
用本地用户的登陆页面参数ocal_root
设置虚拟用户的登陆页面,将登陆页面设置为ftpuserdir
目录下当前用户目录中的内容。
$USER
指系统当前用户。
user_sub_token=$USER
说明$USER
的含义与系统中该字符的含义相同,表示当前用户。
3. 重启ftp服务
[root@RHTL8_clone pam.d]# systemctl restart vsftpd
4. 测试登陆至虚拟用户的家目录
不同的用户登陆后看到了页面不同,实现了虚拟用户家目录的独立。
虚拟用户配置的独立
1. 环境搭建
给虚拟用户创建目录:
[root@RHTL8_clone ftpuserdir]# ls
bob frank
[root@RHTL8_clone ftpuserdir]# cd bob
[root@RHTL8_clone bob]# mkdir pub ##为用户bob创建新目录pub
[root@RHTL8_clone bob]# cd ..
[root@RHTL8_clone ftpuserdir]# cd frank
[root@RHTL8_clone frank]# mkdir pub ##为用户frank创建新目录pub
[root@RHTL8_clone frank]# cd
[root@RHTL8_clone ~]# chmod 775 /ftpuserdir/bob/pub ##修改用户bob中pub目录的权限
[root@RHTL8_clone ~]# chmod 775 /ftpuserdir/frank/pub ##修改用户frank中pub目录的权限
[root@RHTL8_clone ~]# cd /ftpuserdir
[root@RHTL8_clone ftpuserdir]# ls
bob frank
[root@RHTL8_clone ftpuserdir]# ls -l
total 0
drwxr-xr-x 3 root root 33 Feb 21 20:40 bob
drwxr-xr-x 3 root root 35 Feb 21 20:41 frank
[root@RHTL8_clone ftpuserdir]# chgrp ftp /ftpuserdir/bob/pub ##修改用户bob中pub目录的所属组
[root@RHTL8_clone ftpuserdir]# chgrp ftp /ftpuserdir/frank/pub ##修改用户frank中pub目录的所属组
[root@RHTL8_clone ftpuserdir]# ls -ld /ftpuserdir/bob/pub
drwxrwxr-x 2 root ftp 6 Feb 21 20:40 /ftpuserdir/bob/pub
[root@RHTL8_clone ftpuserdir]# ls -ld /ftpuserdir/frank/pub
drwxrwxr-x 2 root ftp 6 Feb 21 20:41 /ftpuserdir/frank/pub
此时,两个虚拟用户中均有与之对应的文件和目录。
2. 配置虚拟用户的特殊权限
默认所有用户不能上传文件,可通过在主配置文件中将对应参数修改为:anon_upload_enable=YES
即可上传文件。但此种改法赋予了所有用户上传文件的权限。
若要求仅令虚拟用户bob拥有上传文件的权限
[root@RHTL8_clone ftpuserdir]# cd /etc/vsftpd
[root@RHTL8_clone vsftpd]# ls
ftp_auth_file ftp_auth_file.db ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh
[root@RHTL8_clone vsftpd]# mkdir user_config ##创建配置目录
[root@RHTL8_clone vsftpd]# cd user_config/
[root@RHTL8_clone user_config]# touch bob ##创建虚拟用户bob的配置文件
[root@RHTL8_clone user_config]# vim bob
在配置文件中增加语句:
anon_upload_enable=YES
3. 修改主配置文件
增加语句:
user_config_dir=/etc/vsftpd/user_config
4. 重启ftp服务
[root@RHTL8_clone user_config]# systemctl restart vsftpd
5. 虚拟用户上传文件至ftp服务器
553说明bob可上传文件,但不知哪里权限有问题,之后再排查。
之前错误的原因是直接将文件上传至bob用户的桌面,而bob桌面的权限为:
若将/ftpuserdir/bob
目录的权限修改为777,ftp服务器拒绝。它的最大权限只能是775。
查看之前给与/ftpuserdir/bob/pub
目录的权限:
尝试在pub目录中上传文件:
上传成功!!
注意:同一个文件上传一次就可以了,如果向ftp服务器上传已存在的文件,也会报553错误。