1.搭建ftp服务器
1.1 安装准备
#关闭防火墙
systemctl stop firewalld
#关闭selinux
setenforce 0
1.2 安装启动
#安装vsftpd服务
yum install vsftpd -y
#安装ftp客户端
yum install ftp
#查看以安装ftp服务
[root@bubble01 ~]# rpm -qa|grep ftp
ftp-0.17-67.el7.x86_64
vsftpd-3.0.2-28.el7.x86_64
#启动服务
systemctl restart vsftpd
#查看服务
ps -ef|grep vsftpd
1.3 匿名用户登录
#默认开启匿名用户登录,可以使用anonymous或者ftp用户,密码为空,默认登录进去目录为/var/ftp;
## anonymoys用户登录
[root@bubble01 ~]# ftp 192.168.153.141
ftp 192.168.153.141
Connected to 192.168.153.141 (192.168.153.141).
220 (vsFTPd 3.0.2)
Name (192.168.153.141:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> ls
227 Entering Passive Mode (192,168,153,141,188,110).
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 6 Oct 13 16:10 pub
226 Directory send OK.
## ftp用户登录
[root@bubble01 ~]# ftp 192.168.153.141
Connected to 192.168.153.141 (192.168.153.141).
220 (vsFTPd 3.0.2)
Name (192.168.153.141:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> ls
227 Entering Passive Mode (192,168,153,141,208,238).
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 6 Oct 13 16:10 pub
226 Directory send OK.
1.4 匿名用户上传下载
#默认匿名用户登录可以可以下载,不能上传,需要开启相应的权限,
##开启上传权限
anon_upload_enable=YES
##开启创建文件权限
anon_mkdir_write_enable=YES
##开启重命名,删除权限
anon_other_write_enable=YES
anon_umask=022
#给/var/ftp/pub目录赋权
chmod o+w /var/ftp/pub
#此时可以在/var/ftp/pub目录上传下载删除重命名
1.5 本地用户访问
1.5.1 新建本地用户
本地用户访问需要ftp服务器上存在该用户,默认登录到其家目录,可以切换到根目录,风险较大
#创建本地用户lottery
useradd lottery -s /bin/bash
echo "lottery"|passwd --stdin lottery
#本地用户登录
[root@bubble01 ~]# ftp 192.168.153.141
Connected to 192.168.153.141 (192.168.153.141).
220 (vsFTPd 3.0.2)
Name (192.168.153.141:root): lottery
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/lottery"
ftp> cd /
250 Directory successfully changed.
ftp> pwd
257 "/"
1.5.2 限制系统用户越狱
chroot_local_user=YES
chroot_list_enable=NO
#如果将某个用户限制在其家目录,必须开启如下权限或者取消其家目录的写权限,否则会报如下错误
#500 OOPS: vsftpd: refusing to run with writable root inside chroot()
allow_writeable_chroot=YES
# chroot_local_user: 是否将所有用户限制在主目录,YES为启用,NO禁用.(该项默认值是NO)
# chroot_list_enable: 是否启动限制用户(特例)的名单 YES为启用,NO禁用(包括注释掉也为禁用)
1.6 限制本地用户或者匿名用户登录
#不允许匿名用户登录
anonymous_enable=NO
#允许匿名用户登录
anonymous_enable=YES
#不允许本地用户登录
local_enable=NO
#允许本地用户登录
local_enable=YES
2.虚拟用户配置
2.1 创建虚拟用户映射的本地用户
#创建系统用户,用于虚拟用户映射
useradd -s /sbin/nologin -d /var/tmp/virftp virftp
#给家目录赋予500权限
chmod 500 /var/tmp/virftp
#创建虚拟用户目录(足球队,篮球队)
mkdir /var/tmp/virftp/football
mkdir /var/tmp/virftp/basketball
#给虚拟用户目录赋予700权限,属组赋给映射的本地用户
chmod 700 /var/tmp/virftp/football
chmod 700 /var/tmp/virftp/basketball
chown -R virftp. /var/tmp/virftp/football
chown -R virftp. /var/tmp/virftp/basketball
2.2 配置文件开启虚拟用户功能
#编辑vsftpd.conf
#开启虚拟用户登录功能
guest_enable=YES
#将虚拟用户映射为本地用户virftp
guest_username=virftp
#虚拟用户是否使用本地用户权限,YES:是;NO:否
virtual_use_local_privs=NO
#虚拟用户配置文件
user_config_dir=/etc/vsftpd/vconf.d/
#重启vsftpd服务
systemctl restart vsftpd
2.3 建立虚拟用户验证数据库
#创建虚拟用户密码文件,奇数行用户,偶数行密码
[root@bubble01 vsftpd]# cat /etc/vsftpd/vuser
ft01
111111
ft02
222222
bt01
111111
bt02
222222
#使用db_load工具加密用户密码文件,并赋予文件600权限(600权限是规范,不是必须)
[root@bubble01 vsftpd]# db_load -T -t hash -f /etc/vsftpd/vuser /etc/vsftpd/vuser.db
[root@bubble01 vsftpd]# chmod 600 /etc/vsftpd/vuser /etc/vsftpd/vuser.db
2.4 开启pam认证
#修改/etc/pam.d/vsftpd文件,行首处添加:
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser
#添加完如下:
[root@bubble01 vsftpd]# cat /etc/pam.d/vsftpd
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/viruser
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/viruser
#%PAM-1.0
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth
2.5 设置不同用户不同权限
#创建权限配置文件存放目录
mkdir /etc/vsftpd/vconf.d
#创建权限配置文件,文件名同用户名
touch /etc/vsftpd/vconf.d/ft01
touch /etc/vsftpd/vconf.d/ft02
touch /etc/vsftpd/vconf.d/bt01
touch /etc/vsftpd/vconf.d/bt02
#权限模板1(可以上传下载删除重命名)
##指定家目录
local_root=/var/tmp/virftp/xxx
##允许新建文件或目录权限
anon_umask=077
##开放下载权限
anon_world_readable_only=NO
##开放上传权限
anon_upload_enable=YES
##开放创建目录权限
anon_mkdir_write_enable=YES
##开放删除和重命名目录的权限
anon_other_write_enable=YES
#权限模板2(只能下载)
##指定家目录
local_root=/var/tmp/virftp/xxx
##开放下载权限
anon_world_readable_only=NO
#给ftp01赋予可以上传下载删除重命名权限
[root@bubble01 vsftpd]# cat vconf.d/ft01
##指定家目录
local_root=/var/tmp/virftp/football
##允许新建文件或目录权限
anon_umask=077
##开放下载权限
anon_world_readable_only=NO
##开放上传权限
anon_upload_enable=YES
##开放创建目录权限
anon_mkdir_write_enable=YES
##开放删除和重命名目录的权限
anon_other_write_enable=YES
#给ftp02赋予只能下载权限
[root@bubble01 vsftpd]# cat vconf.d/ft02
##指定家目录
local_root=/var/tmp/virftp/football
##开放下载权限
anon_world_readable_only=NO
2.6 虚拟用户登录报错解决
#登录报错
[root@bubble01 vconf.d]# ftp 192.168.153.141
Connected to 192.168.153.141 (192.168.153.141).
220 (vsFTPd 3.0.2)
Name (192.168.153.141:root): ft01
331 Please specify the password.
Password:
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection
ftp> by
#vsftpd.conf配置文件添加allow_writeable_chroot=YES,重启服务解决
权限测试
ft01用户登录,可以上传、下载、重命名、创建目录、删除
ft02只能下载