系统环境和预计目标
- CentOS 7.4
- ftp 根目录 :
/data/ftp
- ftp 配置文件目录:
/etc/vsftpd
- ftp 虚拟用户权限配置文件目录:
/etc/vsftpd/vuser_config
操作步骤
安装vsftpd和db_load加密工具
#修改配置文件 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config #临时关闭 setenforce 0 #关闭防火墙 systemctl stop firewalld.service yum install vsftpd -y
创建本地用户用于映射虚拟用户
# 创建ftp用户目录 mkdir -p /data/ftp # 创建用户 useradd -d /data/ftp vuser -s /sbin/nologin # 更改权限和主组权限 chmod 755 /data/ftp chown vuser.root /data/ftp
创建虚拟用户文件
vim /etc/vsftpd/vuser-list
用户名一行,密码一行
li
123123123
li1
123123123
4. 加密用户密码文件生成数据库文件
```bash
cd /etc/vsftpd
db_load -T -t hash -f ./vuser-list ./vuser-list.db
chmod 600 vuser-list.db
- 创建PAM认证文件
vim /etc/pam.d/vuser.vu
PAM认证模块
#注意64位系统写/lib64这个路径,32位系统要写成/lib
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser-list
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser-list
6. 修改配置文件
```bash
# 先备份
mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf-bak
vim /etc/vsftpd/vsftpd.conf
#是否开启匿名登陆
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
#登陆日志地址
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
listen=YES
listen_ipv6=NO
#修改ftp默认目录到/data/ftp下面
chroot_local_user=YES
#使用户不能离开主目录
chroot_list_enable=YES
#设定支持ASCII
ascii_upload_enable=YES
ascii_download_enable=YES
local_root=/data/ftp
anon_root=/data/ftp
#pam认证文件
pam_service_name=vuser.vu
#虚拟用户权限配置目录
user_config_dir=/etc/vsftpd/vuser_config
userlist_enable=YES
tcp_wrappers=YES
allow_writeable_chroot=YES
one_process_model=NO
#开启虚拟用户
guest_enable=YES
guest_username=vuser
- 创建虚拟用户权限的配置文件
mkdir /etc/vsftpd/vuser_config cd /etc/vsftpd/vuser_config
mkdir -p /data/ftp/li
mkdir -p /data/ftp/li1
chmod 777 /data/ftp/li
chmod 777 /data/ftp/li1
vim li
[有所有权限]
#设置登录后禁锢的目录
local_root=/data/ftp/li
#开放写权限
write_enable=yes
#开放下载权限
anon_world_readable_only=no
#开放上传权限
anon_upload_enable=yes
#开放创建目录的权限
anon_mkdir_write_enable=yes
#开放删除和重命名的权限
anon_other_write_enable=yes
vim li1
[只有上传下载的权限]
local_root=/data/ftp/li1
anon_upload_enable=yes
anon_world_readable_only=no
8. 更改虚拟用户目录权限,目的是不让匿名用户进行访问
```bash
chmod 700 li
chmod 700 li1
设置ftp自启动
systemctl enable vsftpd
,打开ftp服务systemctl start vsftpd
,为了验证是否启动,使用systemctl status vsftpd.service
查看是否已开启。使用xftp或ftp命令进行测试,使用li时可以进行任何操作,包括新建文件夹;使用li1时只能上传和下载,不能新建文件夹,测试有问题则对6和7进行排错。
遇到的问题
- useradd可能会出现
useradd: warning: the home directory already exists.
,是因为默认配置home目录在/home
,导致冲突。第二是因为没有skel目录。没有太大的关系,用户已经成功创建。如果十分纠结这点可以对其建自己的home目录,手动拷贝skel相关文件到home目录下。 550 OOPS: Permission Denied
上传失败或创建文件夹失败,可能是selinux的问题。
- 关闭selinux:修改
/etc/selinux/config
文件中的SELINUX=""
为disabled
,使用setenforce 0
重启,使用getenforce
查看是否成功disable掉。值得注意的是需要关闭ftp窗口,重新链接才能生效。 - 不关闭selinux:修改selinux配置,详见参考文档2。
226 Transfer done (but failed to open directory)
,selinux和防火墙的问题,重新配置一下第一步。500 OOPS vsftpd: refusing to run with writable root inside chroot()
,配置文件中加入allow_writeable_chroot=YES
,创建相应文件touch /etc/vsftpd/chroot_list chmod 644 /etc/vsftpd/chroot_list
- 在操作过程中遇到
No such file or directory
,表示不存在目录,可使用mkdir -p
进行创建。 - 遇到该问题时候,查看6修改配置处是否有错误,拼写错误也可能导致该错误。
[root@localhost vsftpd]# systemctl status vsftpd.service ● vsftpd.service - Vsftpd ftp daemon Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor preset: disabled) Active: failed (Result: exit-code) since Mon 2018-01-08 16:22:04 CST; 3min 24s ago Process: 1202 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=2)
Jan 08 16:22:04 localhost.localdomain systemd[1]: Starting Vsftpd ftp daemon…
Jan 08 16:22:04 localhost.localdomain systemd[1]: vsftpd.service: control process exited, code=exited status=2
Jan 08 16:22:04 localhost.localdomain systemd[1]: Failed to start Vsftpd ftp daemon.
Jan 08 16:22:04 localhost.localdomain systemd[1]: Unit vsftpd.service entered failed state.
Jan 08 16:22:04 localhost.localdomain systemd[1]: vsftpd.service failed.
```
7. 出现pam验证通过,但是不能连接的可能是因为配置第七点有一个大坑,是每一行包括文件末尾不能有空格,命令行下会报 500 OOPS: bad bool value in config file for: anon_world_readable_only
8. 550 Create directory operation failed.
:目录权限没给写权限,使用 chmod 777 /data/ftp/li
即可
注意
- ftp最好使用命令行,这样返回错误码和错误信息容易排错。
- 多看日志判断信息。包括
tail -f /var/log/secure
和systemctl status vsftpd