ftp:file transfer proto
互联中最老牌的文件传输协议
服务名称:
vsftpd.service
配置目录:
/etc/vsftpd
主配置文件:
/etc/vsftpd/vsftpd.conf
默认发布目录:
/var/ftp
使用ftp服务时常见的四种报错信息
报错代码 | 意义 |
---|---|
550 | 程序本身拒绝 |
553 | 文件系统权限限制 |
500 | 权限过大 |
530 | 认证失败 |
需要有服务端主机和测试端(客户端)主机,这里也可以用westosa主机当服务端,同时也在westosa测试或可以在真机测试
对于服务端主机来说,有以下步骤:
1、安装vsftpd
dnf install vsftpd -y #前提是配置好软件仓库
2、关闭selinux
vim /etc/sysconfig/selinux
#修改SELINUX=disabled
reboot
重启后
getenforce
查到selinux状态为disabled
开启ftp服务并让火墙允许ftp
systemctl enable --now vsftpd
firewall-cmd --permanent --add-service=ftp
firewall-cmd --reload
对于测试端主机来说:
dnf install lftp -y
测试:
lftp 172.25.254.100 -u westos
#用ls能查看到文件说明成功,quit退出
也可以在web上 ftp://172.25.254.100/
输入用户密码查看文件 ,作用也就等同于非匿名登陆查看
lftp 172.25.254.72 ##当访问ftp服务时没有加入用户认证为匿名访问
lftp 172.25.254.72 -u westos ##本地用户访问
vim anonymous_enable=YES|NO
#修改为YES,就是允许匿名用户登录
systemctl restart vsftpd
匿名登录时默认是ftp用户
登录lftp默认家目录是 /var/ftp/
修改匿名登陆位置
vim /etc/vsftpd/vsftpd.conf
#在anonymous_enable=YES下添加一行:
#13 anon_root=/westos
systemctl restart vsftpd
mkdir /westos
touch /westos/westosfile{1..3}
#在该目录下创建三个文件用于测试时观察
vim /etc/vsftpd/vsftpd.conf
#修改anon_upload_enable=YES
systemctl restart ftpd
我们用 ll -d命令查看pub目录的权限是755,没有w权限也会导致上传失败
我们可以chmod 777来改pub权限,但是这样给的权限过大也不好
或者我们可以把pub更改目录的组为ftp 修改权限为775
测试:登录lftp,在pub目录上传/etc/passwd文件
vim /etc/vsftpd/vsftpd.conf
#anon_upload_enable=YES 表示可以建立目录
systemctl restart vsftpd
刚才前两个命令修改完之后,我们可以上传文件和创建目录,但是我们并不能将上传的文件或创建的目录删除
vim /etc/vsftpd/vsftpd.conf
#在anon_mkdir_write_enable=YES下方添加一行:
anon_other_write_enable=YES
systemctl restart vsftpd
测试:登录lftp,删除之前在pub下上传的文件passwd和创建的目录test
让匿名用户可以下载不能读的文件,文件被下载到我们登录lftp前所在的位置
vim /etc/vsftpd/vsftpd.conf
#接着文件里删除命令这一行再添加一行:
anon_world_readable_only=NO
systemctl restart vsftpd
测试:在root家目录登录lftp,在pub目录上传passwd文件,用get命令下载passwd文件,退出lftp,用ls命令查看到在家目录里有passwd
vim /etc/vsftpd/vsftpd.conf
#在文件local_umask=022这一行下方添加一行:
anon_umask=022
#匿名用户上传的文件被设定为644权限
systemctl restart vsftpd
测试:登录lftp,在pub目录下上传/etc/group文件,并查看文件权限
实验我们用westos这样用户身份上传文件,注意它的id为1000
vim /etc/vsftpd/vsftpd.conf
#chown_uploads=YES
#chown_username=westos
systemctl restart vsftpd
登录lftp在pub目录下上传/etc/inittab文件,可以看到上传文件的用户身份为westos,但是我们刚刚修改的匿名用户上传文件的权限失效了。
因为我们这时已经用了westos的用户身份上传的文件,所以设定的匿名用户上传文件权限在这里不起作用,现在我们设定用westos用户上传文件的权限:
vim /etc/vsftpd/vsftpd.conf
#在刚才设定上传文件的用户身份的命令下添加一行:
chown_upload_mode=0644
systemctl restart vsftpd
删掉pub目录之前的inittab文件 重新上传查看文件权限
为防止服务器过于繁忙,可设定客户端最大数量
vim /etc/vsftpd/vsftpd.conf
#添加一行:max_clients=2 当第三个客户端登陆lftp时,服务需要等待
systemctl restart vsftpd
测试:开启三个shell都登录lftp,前两个客户端能正常使用,到第三个客户端lftp繁忙
我们选择一个较大的文件来实验,用scp将主机里镜像源挂载文件里的install.img文件复制到westosa的/mnt目录
登录lftp,在pub目录上传install.img文件可以看到上传的很快
为了节约服务器资源,我们对匿名用户上传文件限制速度
vim /etc/vsftpd/vsftpd.conf
#添加一行:anon_max_rate=204800 (以字节为单位,200kb/s左右)
systemctl restart vsftpd
将之前lftp上传的install.img文件删除 重新上传看它的上传速率
vim /etc/vsftpd/vsftpd.conf
#local_enable=NO|YES
默认就是YES,当改为NO时,重启服务,本地用户无法登陆使用lftp
设置家目录和匿名用户的家目录设置差不多
vim /etc/vsftpd/vsftpd.conf
#local_root=/westos
systemctl restart vsftpd
vim /etc/vsftpd/vsftpd.conf
#local_umask=077
重启服务
开启lftp put的文件权限就为077
实验后vim改回022
/etc/vsftpd/ftpusers ##永久黑名单文件
/etc/vsftpd/user_list ##默认黑,临时黑白名单文件
a)对于ftpusers文件
它区别之前讲过的黑白名单,这里的永久黑名单文件优先级更高,永黑名单上的用户必定无法登陆使用lfpd
vim /etc/vsftpd/ftpusers
#把lee用户写入
b)对于临时黑白文件user_list
vim /etc/vsftpd/vsftpd.conf
#userlist_enable=YES #开启user_list
#userlist_deny=YES|NO #yes时为黑名单,no时为白名单
systemctl restart vsftpd
user_list为黑名单时,在其中写入westos,westos被禁止登录使用
user_list为白名单时,westos在文件中,这是westos是被允许登录使用,其他没有在文件中的用户无法登录使用
注:把westos再写入永久黑名单ftpusers,即使它在白名单里,也无法正常登录使用,这里的永久黑名单>白名单
用lee用户登陆lftp
cd /
ls可以看到根下所有文件,权限过大。因此考虑把用户锁定在自己的家目录中,不能跳出自己的家目录。
vim /etc/vsftpd/vsftpd.conf
#chroot_local_user=YES
systemctl restart vsftpd
chmod u-w /home/* #取消用户的写的命令
在开启锁定用户的家目录时即“chroot_local_user=YES",所有用户都被锁定
vim /etc/vsftpd/vsftpd.conf
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd/chroot_list
开启这两行,意味着开启白名单
重启服务
cd /etc/vsftpd/
vim /etc/vsftpd/chroot_list
#文件中写入westos
当没有开启锁定用户到自己的家目录 “chroot_local_user=NO",所有用户都可以跳出家目录
vim /etc/vsftpd/vsftpd.conf
#chroot_local_user=NO
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd/chroot_list
#开启这两行意味着开启黑名单
重启服务
此时chroot_list文件中出现的用户westos将被锁定到自己的家目录无法跳出
步骤:
a)建立认证文件模板
vim /etc/vsftpd/users
#创建三个虚拟用户user1、2、3,密码都是123
db_load -T -t hash -f users users.db
# -T 转换 -t type -f 指定
转换后生成了加密的认证文件users.db
c)编写认证策略文件authfile(自己命名)
在/etc/vsftpd/vsftpd.conf文件中:“pam_service_name=vsftpd"为默认认证策略文件
可以用rpm -qc vsftpd查到文件是/etc/pam.d/vsftpd
我们模仿这个文件自己写一个authfile文件用于指定认证策略
vim /etc/pam.d/authfile
account required pam_userdb.so db=/etc/vsftpd/users
auth required pam_userdb.so db=/etc/vsftpd/users
##这里默认是db格式文件,所以其实是user.db省略了db
d)修改认证策略文件
vim /etc/vsftpd/vsftpd.conf
#修改pam_service_name=authfile
#添加guest_enable=YES
#添加guest_username=ftp #虚拟用户默认使用ftp用户
systemctl restart vsftpd
用虚拟用户user1、2、3登陆lftp服务ok了
单用本地用户登陆lftp服务无法正常使用,因为已经修改了认证策略文件
虚拟用户登录后默认家目录都是ftp的家目录
现在为三个虚拟用户分别设定各自的家目录: /ftphome/user1或2或3
mkdir -p /ftphome/user{1..3}
mkdir -p /ftphome/user{1..3}/pub
为了区分三个家目录:
touch /ftphome/user1/user1file
touch /ftphome/user2/user2file
touch /ftphome/user3/user3file
设定虚拟用户家目录独立
vim /etc/vsftpd/vsftpd.conf
local_root=/ftphome/$USER
#在shell里输入 $USER 得到的输出为当前用户名
user_sub_token=$USER
#告诉系统$USER不是普通字符串
systemctl restart vsftpd
先将 /etc/vsftpd/vsftpd.conf 中匿名用户上传文件的权限关闭,三个虚拟用户现在就不能上传文件了
把三个虚拟用户家目录里的pub目录更改组为grp 修改目录权限
chgrp ftp /ftphome/user{1..3}/pub
chmod 775 /ftphome/user{1..3}/pub
ls -ld /ftphome/user{1..3}/pub
vim /etc/vsftpd/vsftpd.conf
#在认证策略文件几行下面添加:
user_config_dir=/etc/vsftpd/userconf #独立配置文件应该所在的目录
#userconf这个目录原本没有
mkdir /etc/vsftpd/userconf
cd /etc/vsftpd/userconf/
vim user1 #以用户名来命名独立配置文件
#anon_upload_enable=YES