[TOC]
### **制定目标**
1、两个虚拟用户:ftpadmin、ftpguest;ftpadmin有读写(上传、下载、删除、重命名)的权限,ftpguest账号只有读(下载)的权限。
2、两个用户登录后都定位到目录`/data/ftp`下。
说明,FTP的用户有三种类型:
* 匿名用户:在登录FTP时使用默认的用户名,一般是ftp或anonymous。
* 本地用户:即主机上的用户,在`/etc/passwd`中。
* 虚拟用户:不是主机用户,但是可以用来登录FTP的用户。
### **操作步骤**
**1、安装vsftpd**
vsftpd的全称是 “very safe ftp daemon”,是linux上一种常用的ftp服务器软件。
```
$ sudo yum -y install vsftpd
```
在虚拟用户的鉴权中,需要用到下面这一系列软件
```
$ sudo yum -y install pam*
```
然后确认下`/lib64/security/pam_userdb.so`文件已存在,由于我的主机操作系统是64位的,所以是`/lib64`目录,32位系统用`/lib`。
**2、创建FTP根目录**
创建目录`/data/ftp`,作为FTP服务器的根目录,并且将目录的拥有者设置为主机的某个用户(假设我们把它设置给`peng`用户与`peng`用户组,注意该主机用户与用户组要存在,且该用户最好能ssh到主机上)
```
$ sudo mkdir -p /data/ftp
$ sudo chown peng:peng /data/ftp
```
这里要注意:
第一,我们把该目录的拥有者设置为了主机用户`peng`,那么在后面配置`/etc/vsftpd/vsftpd.conf`文件时,一定要把虚拟用户映射到主机用户`peng`。这是因为,虚拟用户登录上FTP后,对目录`/data/ftp/`下的操作,相当于是主机用户`peng`对它们的操作,所以要想让虚拟用户有权限操作(比如增删改查)这个目录,那么主机用户`peng`必须要有权限操作这个目录。
第二,上面我们推荐用户`peng`最好能ssh到主机上,这是因为,有时候我们需要ssh到ftp主机上,然后从另一台linux主机上scp一个文件到ftp目录下,如果使用其他主机用户(比如root)拷贝到`/data/ftp`目录下,那么主机用户`peng`对这个文件是没有写权限的(也有可能没有读权限),那么虚拟用户登录上FTP后,对这个文件也可能没法读(下载)和写。
**3、设置登录ftp的虚拟用户文件**
创建文件`/etc/vsftpd/virtual_user`,内容如下:
```
ftpadmin
Admin@123
ftpguest
Guest@123
```
格式依次是:第一行是账户名,次行是该账号的密码;即奇数行是账户名,偶数行是对应上一行的账户密码)。
这个虚拟账号是不需要手动创建的,它不是真实存在于主机操作系统中的,即`/etc/passwd`文件里没有的,它是借助于宿主账号peng
**4、生成虚拟用户口令认证的db文件**
生成虚拟用户口令认证的db文件
```
$ sudo db_load -T -t hash -f /etc/vsftpd/virtual_user /etc/vsftpd/virtual_user.db
```
**5、设置虚拟用户权限**
接下来设置虚拟用户的权限,创建目录`/etc/vsftpd/vuser_conf`
```
$ sudo mkdir /etc/vsftpd/vuser_conf
```
然后在该目录下创建文件`ftpadmin`与`ftpguest`(虚拟用户的用户名),文件内容分别如下:
* ftpadmin
```
# 虚拟用户登录后的根目录
local_root=/data/ftp/
# 允许虚拟用户有写权限,这个只有设置为YES,后面的upload、mkdir、delete、rename才会有效
write_enable=YES
# 允许虚拟用户上传
anon_upload_enable=YES
# 允许虚拟用户新建目录的写权限
anon_mkdir_write_enable=YES
# 允许虚拟用户其他的写权限(删除、重命名)
anon_other_write_enable=YES
# 只读权限无法浏览目录,所以要设置为NO
anon_world_readable_only=NO
# 上传与创建目录的掩码
anon_umask=022
```
* ftpguest
```
# 虚拟用户登录后的根目录
local_root=/data/ftp/
# 禁止虚拟用户的写权限
write_enable=NO
# 只读权限无法浏览目录,所以要设置为NO
anon_world_readable_only=NO
```
**6、配置pam文件**
编辑文件`/etc/pam.d/vsftpd`,没有则新建,用下面内容覆盖
```
# 这个virtual_user根据的是virtual_user.db
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtual_user
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtual_user
```
**7、修改配置文件`/etc/vsftpd/vsftpd.conf`**
直接用下面的内容覆盖配置文件
```
### ------------global------------------------
# 允许本地用户访问,允许虚拟用户访问也必须打开此开关
local_enable=YES
# 可写可上传。这个参数是全局配置,否则上传和下载都会报错550!
write_enable=YES
# 只监听IPv4地址
listen=YES
# 同时监听IPv4与IPv6
listen_ipv6=NO
# 监听的端口(命令端口),默认21
listen_port=21
# 允许开放数据端口
connect_from_port_20=YES
# 数据端口
ftp_data_port=20
# 被动模式下的最大端口与最小端口,只允许100个连接
pasv_min_port=10000
pasv_max_port=10099
# 鉴权所使用的文件:/etc/pam.d/vsftpd
pam_service_name=vsftpd
# 其他配置
dirmessage_enable=YES
xferlog_enable=YES
xferlog_std_format=YES
ascii_upload_enable=YES
ascii_download_enable=YES
tcp_wrappers=YES
### ---------------virtual user-----------------------
# 启用虚拟用户
guest_enable=YES
# 虚拟用户映射到本地用户的peng
guest_username=peng
# 虚拟用户的权限配置目录
user_config_dir=/etc/vsftpd/vuser_conf
# 虚拟用户使用本地用户的权限
virtual_use_local_privs=YES
### ---------------anonymous user---------------------
# 禁止匿名用户访问
anonymous_enable=NO
### --------------local user-------------------------
```
**8、启动**
```
$ sudo systemctl start vsftpd && sudo systemctl enable vsftpd
```
### **Reference**
* https://www.cnblogs.com/kevingrace/p/5587140.html
* https://blog.51cto.com/liwenjia/2140382
* https://blog.51cto.com/spv999/800503
- 常用命令
- 用户与用户组
- 创建用户与用户组
- 快速脚本
- umask
- Yum源
- 基础Yum源
- Epel源
- 制作Yum源
- 同步Yum源
- 为Yum源配置代理
- 下载RPM及依赖
- 系统与内核
- 获取内核的rpm包
- 升级内核
- Iptables
- 基本语法
- 匹配条件
- 基础匹配条件
- 扩展匹配条件
- Addrtype
- Set
- TCP
- Mark
- Multiport
- 目标
- 基本目标
- 扩展目标
- DNAT
- LOG
- CT
- NOTRACK
- MARK
- IP set
- 连接追踪
- 初识连接追踪
- 连接追踪详解
- NAT
- 思路与参考汇总
- 数据结构
- FAQ
- Keepalived
- 单网卡多VIP
- 安装Keepalived
- 双网卡绑VIP
- 别名VIP和辅助VIP
- LVS
- 安装LVS
- Ipvsadm命令
- 磁盘与分区
- 基础知识
- 创建分区
- 格式化与挂载
- Fstab
- LVM
- LVM扩容
- Swap分区
- Tmpfs
- 网络相关
- 重命名网卡
- resolv.conf
- Tcpdump
- nslookup与dig
- ifcg-xxx
- 主机名
- 软件安装
- NFS
- Squid
- Redsocks
- Shadowsocks
- 时钟同步
- Chrony
- FTP
- 文件句柄
- 简介
- 设置文件句柄
- 其他
- SSH密钥登录
- 进程组-会话-终端
- X11转发
- 环境变量
- 常见问题
- 系统进程数
- 系统调用
- 系统调用FAQ
- 用户程序如何进行系统调用