ftp本来的只有匿名用户和普通用户,但是他们的权限都一样,不能做分开的权限控制,比如用户1 可以上传用户2 可以下载等等的。
1、所有的用户访问的位置是 /CCC/XXXXX
2、使用者划分权限等级
有的用户可以上传、下载、删除、重命名、创建目录等
有的用户只可以下载
3、如果有需要,可以随时修改用户的访问位置
4、考虑公司的带宽压力,限速最大是100k/s
5、为了避免用户使用下载工具,约束一个IP最多只能建立3个
6、最大并发数限制为100个用户同时在线
7、尽可能保证数据完整性
匿名用户
系统普通用户
权限是一样的
用户的访问路径:
匿名用户 /var/ftp
普通用户 家目录
这时就要用到虚拟用户:
虚拟用户不存在于系统中但是可以用于ftp的访问,他保存在数据库中。
可以用2个数据库来实现:
【1】Berkeley DB
【2】MySQL
衍生:虚拟用户的生成方式
先有个1普通用户普通用户
通过这个普通用户衍生所有的虚拟用户,虚拟用户的权限默认与普通用户是一致的
针对每个虚拟用户构建权限配置文件
【1】Berkeley DB方式做ftp的虚拟用户。
先安装epel源,然后安装vsftp和berkeleydb数据库。
[root@vsftp ~]# yum install vsftpd libdb4 libdb4-utils -y
1、普通用户,用于衍生。
[root@vsftp ~]# useradd -s /sbin/nologin ghostuser
2、修改配置文件。
[root@vsftp ~]# vim /etc/vsftpd/vsftpd.conf
#pam_service_name=vsftpd //这个是原来的pam验证配置文件,也就是用普通用户和匿名用户的那个。把它注释掉
pam_service_name=vsftpd.gu //制定新的pam验证配置文件
anonymous_enable=NO //不允许匿名用户登录
user_config_dir=/etc/vsftpd/ghostuser_dir //指定虚拟用户的权限控制目录
guest_enable=YES //允许虚拟用户
guest_username=ghostuser //衍生虚拟用户的普通用户名
max_clients=100 //最大客户端数量
max_per_ip=3 //每个IP最多连接数
anon_max_rate=100000 //最大的带宽,单位是比特,byte/s
安装完vsftpd后会生成一个pam验证文件:
[root@vsftp ~]# vim /etc/pam.d/vsftpd
这个东西:
#%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
这里写了一些访问ftp时要的东西。比如匿名用户等等,但是有虚拟用户了,这个就不用了,配置文件中注释掉的就是这个。
3、准备虚拟用户的列表:
[root@vsftp ~]# cd/etc/vsftpd
[root@vsftp vsftpd]# vim guser.txt
u1
123456
u2
123456
用户名 密码。
把这个转变成数据文件格式:
[root@vsftp vsftpd]# db_load -T -t hash -f guser.txt guser.db
管控虚拟用户的权限:
上边配置文件中的虚拟用户权限管控目录:
[root@vsftp vsftpd]# mkdir /etc/vsftpd/ghostuser_dir
[root@vsftp ghostuser_dir]# vim u1 //这个要和虚拟用户的名字相同
local_root=/home/ghostuser //访问目录
allow_writeable_chroot=YES //允许在根目录下执行写操作
anon_world_readable_only=NO //允许下载浏览
write_enable=YES //写开关
anon_upload_enable=YES //允许上传
anon_other_write_enable=YES //允许删除
anon_mkdir_write_enable=YES //允许创建目录
[root@vsftp ghostuser_dir]# cp u1 u2
//直接拷贝出一个权限文件
4、编写pam验证文件:
[root@vsftp ghostuser_dir]# cd /etc/pam.d/
[root@vsftp pam.d]# vim vsftpd.gu
auth required /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/guser
account required /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/guser
5、启动服务测试:
[root@vsftp pam.d]# systemctl restart vsftpd
[root@vsftp pam.d]# systemctl enable vsftpd
另一台机器,访问测试:
[root@localhost pam.d]# ftp 172.16.12.97
Connected to 172.16.12.97 (172.16.12.97).
220 (vsFTPd 3.0.2)
Name (172.16.12.97:root): u1 <------虚拟用户的名字
331 Please specify the password.
Password: <-------虚拟用户的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
//创建目录
ftp> mkdir u1_dir
257 "/u1_dir" created
ftp> ls
227 Entering Passive Mode (172,16,12,97,106,108).
150 Here comes the directory listing.
drwx------ 2 1000 1000 6 Dec 17 17:56 u1_dir
226 Directory send OK.
//上传文件
ftp> lcd /etc
ftp> put passwd
798 bytes sent in 9.1e-05 secs (8769.23 Kbytes/sec)
ftp> ls
-rw------- 1 1000 1000 798 Dec 17 17:59 passwd
drwx------ 2 1000 1000 6 Dec 17 17:56 u1_dir
//改名,下载
ftp> rename passwd
(to-name) fi
350 Ready for RNTO.
250 Rename successful.
ftp> get fi
local: f1 remote: fi
[root@localhost ~]# ls
anaconda-ks.cfg fi
//删除文件
ftp> ls
-rw------- 1 1000 1000 798 Dec 17 17:59 fi
drwx------ 2 1000 1000 20 Dec 17 18:01 u1_dir
ftp> delete fi
ftp> ls
drwx------ 2 1000 1000 20 Dec 17 18:01 u1_dir
//删除目录
ftp> mkdir uu1_dir
ftp> ls
drwx------ 2 1000 1000 20 Dec 17 18:01 u1_dir
drwx------ 2 1000 1000 6 Dec 17 18:05 uu1_dir
ftp> rmdir uu1_dir
ftp> ls
drwx------ 2 1000 1000 20 Dec 17 18:01 u1_dir
增加用户:
1、直接在哪个文件后边加上
[root@vsftp vsftpd]# vim guser.txt
u1
123456
u2
123456
u3
1234567
u4
1234567
2、然后重新生成db文件并准备权限文件
[root@vsftp vsftpd]# db_load -T -t hash -f guser.txt guser.db
[root@vsftp ghostuser_dir]# cp u1 u3
[root@vsftp ghostuser_dir]# cp u1 u4
3、重启服务:
[root@vsftp ghostuser_dir]# systemctl restart vsftpd
登录测试:
[root@localhost ~]# ftp 172.16.12.97
Name (172.16.12.97:root): u3 <------虚拟用户名
331 Please specify the password.
Password: <------密码
230 Login successful. //登录上来了。
ftp> ls
drwx------ 2 1000 1000 20 Dec 17 18:01 u1_dir
并且之前的用户也能用。
【2】MySQL方式做ftp的虚拟用户。
安装mysql 和vsftpd
[root@vsftpd_mysql ~]# yum install mariadb mariadb-server mariadb-devel vsftpd -y
同上:
1、创建普通用户:
[root@vsftpd_mysql ~]# useradd -s /sbin/nologin viruser
2、修改配置文件
[root@vsftpd_mysql ~]# vim /etc/vsftpd/vsftpd.conf
#pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
pam_service_name=vsftpd.vu
anonymous_enable=NO
user_config_dir=/etc/vsftpd/viruser_dir
guest_enable=YES
guest_username=viruser
max_clients=100
max_per_ip=3
anon_max_rate=100000
同上,就是改了下用户和目录的名字
3、准备虚拟用户列表
[root@vsftpd_mysql vsftpd]# systemctl restart mariadb
[root@vsftpd_mysql vsftpd]# systemctl enable mariadb
[root@vsftpd_mysql vsftpd]# mysql
MariaDB [(none)]> create database vsftpd;
MariaDB [(none)]> grant all on vsftpd.* to ftpuser@'localhost' identified by '000000';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> use vsftpd
MariaDB [vsftpd]> create table userlist(name varchar(20) , passwd varchar(20));
MariaDB [vsftpd]> insert into userlist values("tom" ,"000000");
MariaDB [vsftpd]> insert into userlist values("cat" ,"000000");
MariaDB [vsftpd]> select * from userlist;
+------+--------+
| name | passwd |
+------+--------+
| tom | 000000 |
| cat | 000000 |
+------+--------+
准备权限控制目录
[root@vsftpd_mysql vsftpd]# mkdir viruser_dir
[root@vsftpd_mysql viruser_dir]# vim tom
local_root=/home/viruser
allow_writeable_chroot=YES
anon_world_readable_only=NO
write_enable=YES
anon_upload_enable=YES
anon_other_write_enable=YES
anon_mkdir_write_enable=YES
[root@vsftpd_mysql viruser_dir]# cp tom cat
4、安装pam_mysql
vsftpd连接MySQL的工具。
安装编译器等等:
[root@vsftpd_mysql ~]# yum install -y gcc gcc-c++ pam-devel
[root@vsftpd_mysql ~]# wget http://www.huzs.net/soft/vsftpd/pam_mysql-0.7RC1.tar.gz
[root@vsftpd_mysql ~]# tar xf pam_mysql-0.7RC1.tar.gz
[root@vsftpd_mysql ~]# cd pam_mysql-0.7RC1/
[root@vsftpd_mysql pam_mysql-0.7RC1]# ./configure --with-pam=/usr --with-mysql=/usr --with-pam-mods-dir=/usr/lib64/security/
[root@vsftpd_mysql pam_mysql-0.7RC1]# make
[root@vsftpd_mysql pam_mysql-0.7RC1]# make install
[root@vsftpd_mysql pam_mysql-0.7RC1]# ls /usr/lib64/security/pam_mysql.so
要有这个文件。
5、编辑pam配置文件
[root@vsftpd_mysql pam.d]# vim vsftpd.vu
auth required /usr/lib64/security/pam_mysql.so user=ftpuser passwd=000000 host=localhost db=vsftpd table=userlist usercolumn=name passwdcolumn=passwd crypt=0
account required /usr/lib64/security/pam_mysql.so user=ftpuser passwd=000000 host=localhost db=vsftpd table=userlist usercolumn=name passwdcolumn=passwd crypt=0
6、重启服务
[root@vsftpd_mysql ~]# systemctl restart vsftpd
[root@vsftpd_mysql ~]# systemctl enable vsftpd
7、访问测试:
[root@localhost ~]# ftp 172.16.12.98
Connected to 172.16.12.98 (172.16.12.98).
220 (vsFTPd 3.0.2)
Name (172.16.12.98:root): tom
331 Please specify the password.
Password:
230 Login successful.
//其实看到230就是登陆成功了。
添加用户:
mysql这个添加用户就简单得多了,数据库添加一条,然后添加一下权限文件。就能用了。
MariaDB [vsftpd]> insert into userlist values("dog","000000");
MariaDB [vsftpd]> select * from userlist;
+------+--------+
| name | passwd |
+------+--------+
| tom | 000000 |
| cat | 000000 |
| dog | 000000 |
+------+--------+
3 rows in set (0.00 sec)
[root@vsftpd_mysql viruser_dir]# cp tom dog
然后直接测试:
[root@localhost ~]# ftp 172.16.12.98
Connected to 172.16.12.98 (172.16.12.98).
220 (vsFTPd 3.0.2)
Name (172.16.12.98:root): dog
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.