需求

搭建一个上传下载文件服务
1.A公司分配三个用户,B公司分配3个用户
2.A、B公司文件隔离,不能相互影响
3.每一个用户都有上传下载权限

解决方案:

1、搭建vsftp服务

yum install vsftpd -y

2、创建虚拟账户

2.1、创建用户名单文件vsftpd_virtualuser.txt

vim /etc/vsftpd/vsftpd_virtualuser.txt

新增:

a-1
123456
a-2
123456
a-3
123456
b-1
123456
b-2
123456
b-3
123456

2.2、加密用户名密码,不加密ftp服务是读取不到的


db_load -T -t hash -f /etc/vsftpd/vsftpd_virtualuser.txt /etc/vsftpd/vsftpd_virtualuser.db

解释:-T:转化 -t:转换方式为hash

2.3、修改数据库文件权限

chmod 600 /etc/vsftpd/vsftpd_virtualuser.db

2.4、修改 vsftpd 对应的 PAM 配置文件/etc/pam.d/vsftpd,将默认配置使用“#”全部注释,添加刚才生成好的数据库文件

auth       required     pam_userdb.so   db=/etc/vsftpd/vsftpd_virtualuser
account    required     pam_userdb.so   db=/etc/vsftpd/vsftpd_virtualuser

2.5、创建系统账号,这里的系统账号下面会与虚拟账号关联起来

mkdir /ftp/company
useradd -d /ftp/company/a company-a
chmod -R 700 /ftp/company/a

useradd -d /ftp/company/b company-b
chmod -R 700 /ftp/company/b

3、配置服务

3.1修改服务全局配置文件,由于vsftp参数很多,简单说明

vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO                               #关闭匿名用户功能
local_enable=NO	                                  #关闭本地登录功能
listen_port=10021                                 #新增字段。修改默认端口号为10021
xferlog_std_format=YES
use_localtime=YES                                #时间与本地同步
xferlog_file=/var/log/xferlog
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log              #开启日志
pam_service_name=vsftpd                    
userlist_enable=YES                     
tcp_wrappers=YES
pasv_enable=yes                                  # 开启被动模式,默认打开
pasv_max_port=10090                              # 数据连接使用的最大端口
pasv_min_port=10080                              # 数据连接使用的最小端口
user_config_dir=/etc/vsftpd/vuserconfig          # 设置虚拟帐号的主目录为vuserconfig

我的全部有效配置:

[root@otrs-server ~]# cat /etc/vsftpd/vsftpd.conf |grep ^[^#]
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
xferlog_std_format=YES
xferlog_file=/var/log/xferlog
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
listen_port=10021
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
pasv_enable=yes
pasv_max_port=10090
pasv_min_port=10080
user_config_dir=/etc/vsftpd/vuserconfig

3.2、修改服务虚拟账户配置文件

在 user_config_dir 指定路径下,建立与虚拟帐号同名的配置文件并添加相应的配置字段,必须与全局配置文件位置一致。

mkdir /etc/vsftpd/vuserconfig

这里的ftp名称需要与虚拟账户名称一致,也就是/etc/vsftpd/vsftpd_virtualuser.txt文件中的名称一致

举例a公司虚拟账户配置文件:

vim /etc/vsftpd/vuserconfig/a-1
# 开启虚拟帐号登录
guest_enable=yes
# 设置 ftp 对应的系统帐号为ftpuser,虚拟账户将具有ftpuser系统用户的权限
guest_username=company-a
# 允许在文件系统写入权限
write_enable=yes
# 允许创建文件夹
anon_mkdir_write_enable=yes
# 限定传输速率为 50KB/s
anon_max_rate=50000
# 如果设置了可写权限,要加上配置项
allow_writeable_chroot=yes
# 默认家目录,可以修改
local_root=/ftp/company/a
# 下载文件和目录权限
anon_world_readable_only=NO
# 创建文件和目录权限
anon_upload_enable=YES
# 上传覆盖文件和目录权限
anon_other_write_enable=YES

以此类推,b公司虚拟账户配置文件

vim /etc/vsftpd/vuserconfig/b-1
# 开启虚拟帐号登录
guest_enable=yes
# 设置 ftp 对应的系统帐号为ftpuser,虚拟账户将具有ftpuser系统用户的权限
guest_username=company-b
# 允许在文件系统写入权限
write_enable=yes
# 允许创建文件夹
anon_mkdir_write_enable=yes
# 限定传输速率为 50KB/s
anon_max_rate=50000
# 如果设置了可写权限,要加上配置项
allow_writeable_chroot=yes
# 默认家目录,可以修改
local_root=/ftp/company/b
# 下载文件和目录权限
anon_world_readable_only=NO
# 创建文件和目录权限
anon_upload_enable=YES
# 上传覆盖文件和目录权限
anon_other_write_enable=YES

附上ftp报错码解释
500 #文件系统权限过大
530 #用户认证失败
550 #服务本身功能未开放,服务本身的错误
553 #本地文件系统权限过小

日志解释

Mon Mar 29 23:18:08 2021 1 ::ffff:192.168.84.1 15 /a/123.txt a _ o g a-2 ftp 0 * c
Mon Mar 29 23:18:08 2021    时间
15                 大小 (b字节)
/a/123.txt         路径
a                  a以ASCII方式传输;b以二进制(binary)方式传输
_                  特俗字符,不做任何标准
o                  "i"上传;"o"下载
g                  用户访问模式:"a"匿名用户;"g"访客模式;"r"系统中用户
a-2                登录用户名
ftp                服务名称,一般都是ftp
0                  认证方式:"0"无;"1"RFC931认证;
*                  认证用户id,"*"表示无法获取id
c                  完成状态:"i"传输未完成;"c"传输已完成;


参考:http://blog.dothinkings.com/wp/?p=1014




进阶配置

1、FTP服务信息

IP地址 端口号
172.16.100.7 10021

1.1连接方式

xftp6等

1.2功能模块

1、支持热更新账户信息

2、针对指定用户限制访问目录、上传和下载

3、针对指定用户限制上传速率

4、登录点相互隔离

1.3方案

根据VSFTP服务,虚拟账户绑定系统用户原理,只要控制系统用户权限即可,初步划分如下表

系统用户名称 目录 系统用户组 系统用户权限 虚拟账户名称
FTPcompany /company FTPcompany、FTPcompanyA、FTPcompanyB、FTPcompanyC 770 company
FTPcompanyA /ftp/company/A FTPcompanyA 770 companyA
FTPcompanyB /ftp/company/B FTPcompanyB 770 companyB
FTPcompanyC /ftp/company/C FTPcompanyC 770 companyC

1.4目录结构

主目录:/company

A公司分配目录为/ftp/company/A,分配虚拟账户companyA绑定系统用户FTPcompanyA,设置系统用户FTPcompanyA为目录/ftp/company/A所属主,设置系统用户FTPcompany为目录/ftp/company/A所属组,其他用户无权访问,并各公司文件目录相互隔离,不能进入其他公司目录。其他公司设置以此类推。

2、测试结果

当虚拟用户company登录FTP服务时,可看到所有公司文件,拥有A、B、C公司文件目录所有权(上传、下载、修改);

当虚拟用户-companyA登录FTP服务时,不能看到其他公司文件,只拥有A公司文件目录所有权(上传、下载、修改);

当虚拟用户companyB登录FTP服务时,不能看到其他公司文件,只拥有B公司文件目录所有权(上传、下载、修改);

当虚拟用户companyC登录FTP服务时,不能看到其他公司文件,只拥有C公司文件目录所有权(上传、下载、修改)。

3、管理员操作

3.1手动新增公司

例如新增D公司,配置虚拟账户FTP-companyD,新增系统用户companyD与之关联

3.1.1编辑虚拟用户名单

vim /etc/vsftpd/vsftpd_virtualuser.txt
追加:
companyD
123456

注释:格式不可更改,用户名:companyD,密码:123456

新增用户信息

3.1.2转换文件

db_load -T -t hash -f /etc/vsftpd/vsftpd_virtualuser.txt /etc/vsftpd/vsftpd_virtualuser.db

3.1.3修改权限

chmod 600 /etc/vsftpd/vsftpd_virtualuser.db

3.1.4新增系统用户

useradd -d /ftp/ftp/company/D FTPcompanyD

解释:新增系统用户companyD,指定家目录为/ftp/company/D

3.1.5赋予权限

chmod 770 /ftp/ftp/company/D -R

3.1.6添加所属组

gpasswd -a FTPcompany FTPcompanyD

注释:把用户FTPcompany新增组FTPcompanyD

3.1.7配置虚拟账户信息

vim /etc/vsftpd/vuserconfig/companyD
# 开启虚拟帐号登录
guest_enable=yes
# 设置 ftp 对应的系统帐号FTPcompanyD,虚拟账户将具有FTPcompanyD系统用户的权限
guest_username=FTPcompanyD
# 允许在文件系统写入权限
write_enable=yes
# 允许创建文件夹
anon_mkdir_write_enable=yes
# 限定传输速率为 50KB/s
anon_max_rate=50000
# 如果设置了可写权限,要加上配置项
allow_writeable_chroot=yes
# 默认家目录,可以修改
local_root=/ftp/ftp/company/D
# 下载文件和目录权限
anon_world_readable_only=NO
# 创建文件和目录权限
anon_upload_enable=YES
# 上传覆盖文件和目录权限
anon_other_write_enable=YES

3.2删除公司

例如,删除D公司

3.2.1编辑虚拟用户名单

vim /etc/vsftpd/vsftpd_virtualuser.txt
删除:
companyD
123456

注释:格式不可更改,用户名:FTP-companyD,密码:123456

3.2.2转换文件

db_load -T -t hash -f /etc/vsftpd/vsftpd_virtualuser.txt /etc/vsftpd/vsftpd_virtualuser.db

3.2.3修改权限

chmod 600 /etc/vsftpd/vsftpd_virtualuser.db

3.2.4删除虚拟用户

rm -rf /etc/vsftpd/vuserconfig/companyD

3.2.5删除系统用户所属组

gpasswd -d FTPcompany FTPcompanyD

3.2.6删除系统用户

(1)系统用户与家目录一起删除

userdel -r FTPcompanyD

(2)只删除系统用户

userdel FTPcompanyD

4、开发规划

第一阶段:编写脚本,提供使用者输入用户名密码即可创建用户、删除用户

#!/bin/bash
echo "----------------------------------"
echo -e "\033[35m FTP用户管理\033[0m"
echo "(1) 新增用户"
echo "(0) 删除用户"
echo "----------------------------------"
read -p "请输入序列号:" input
case $input in

1)
read  -p "请输入用户名称:" addftpuser
sleep 1
grep $addftpuser /etc/vsftpd/vsftpd_virtualuser.txt  >> /dev/null
if [ $? -eq 0 ]; then
echo "用户已存在" && exit
fi

echo $addftpuser >> /etc/vsftpd/vsftpd_virtualuser.txt
read  -p "请输入密码:" addftpuserpasswd
echo $addftpuserpasswd >> /etc/vsftpd/vsftpd_virtualuser.txt

echo "----------------------------------"

echo "(1) 确认"
echo "(0) 退出程序"
echo "----------------------------------"
read -p "请输入序列号:" input1
#-------------------------------
case  $input1 in
1)
db_load -T -t hash -f /etc/vsftpd/vsftpd_virtualuser.txt /etc/vsftpd/vsftpd_virtualuser.db
chmod 600 /etc/vsftpd/vsftpd_virtualuser.db
useradd -d /ftp/company/$addftpuser FTP$addftpuser -s /sbin/nologin 
chmod 770 /ftp/company/$addftpuser -R
gpasswd -a FTPcompany FTP$addftpuser >> /dev/null
cat>/etc/vsftpd/vuserconfig/$addftpuser<<EOF
# 开启虚拟帐号登录
guest_enable=yes
# 设置 ftp 对应的系统帐号companyD,虚拟账户将具有companyD系统用户的权限
guest_username=FTP$addftpuser
# 允许在文件系统写入权限
write_enable=yes
# 允许创建文件夹
anon_mkdir_write_enable=yes
# 限定传输速率为 50KB/s
anon_max_rate=50000
# 如果设置了可写权限,要加上配置项
allow_writeable_chroot=yes
# 默认家目录,可以修改
local_root=/ftp/company/$addftpuser
# 下载文件和目录权限
anon_world_readable_only=NO
# 创建文件和目录权限
anon_upload_enable=YES
# 上传覆盖文件和目录权限
anon_other_write_enable=YES
EOF

echo "$addftpuser ftp用户已创建成功"
;;
0)
sed -i '$d' /etc/vsftpd/vsftpd_virtualuser.txt
sed -i '$d' /etc/vsftpd/vsftpd_virtualuser.txt
exit
;;
esac
;;
0)
read -p "请输入要删除的用户:" delftpuser

grep $delftpuser /etc/vsftpd/vsftpd_virtualuser.txt >> /dev/null
if [ $? -ne 0 ]; then
echo "用户不存在" && exit
fi
echo "(1) 只删除用户,保留用户上传数据"
echo "(2) 彻底删除用户所有信息 "
read -p "请选择:" delftpuser1
case $delftpuser1 in
2)
sed -i "/$delftpuser/,+1d" /etc/vsftpd/vsftpd_virtualuser.txt
db_load -T -t hash -f /etc/vsftpd/vsftpd_virtualuser.txt /etc/vsftpd/vsftpd_virtualuser.db
chmod 600 /etc/vsftpd/vsftpd_virtualuser.db
rm -rf /etc/vsftpd/vuserconfig/$delftpuser
gpasswd -d FTPcompany FTP$delftpuser >> /dev/null
userdel -r FTP$delftpuser
echo "已删除用户$delftpuser"
;;
1)
sed -i "/$delftpuser/,+1d" /etc/vsftpd/vsftpd_virtualuser.txt
db_load -T -t hash -f /etc/vsftpd/vsftpd_virtualuser.txt /etc/vsftpd/vsftpd_virtualuser.db
chmod 600 /etc/vsftpd/vsftpd_virtualuser.db
rm -rf /etc/vsftpd/vuserconfig/$delftpuser
gpasswd -d FTPcompany FTP$delftpuser >> /dev/null
userdel FTP$delftpuser
chmod 000 /ftp/company/$delftpuser
echo "已删除用户$delftpuser,保留用户数据"
;;
esac

;;
esac

第二阶段:集成web界面网页配置用户,记录增删公司数据、统计数据上传数据库

第三阶段:高可用性,不间断传输数据

VSFTP搭建文档javascript:void(0)