平台上的程序,名为vsftpd(ver secure ftp daemon,⾮常安全的FTP守护进程)。

【准备工作】

1、安装vsftpd工具

[root@junwu_server ~]# yum install -y vsftpd

2、关闭防火墙规则

[root@junwu_server ~]# iptables -F

3、安装ftp命令行

[root@junwu_server ~]# yum install ftp -y

【一、匿名用户模式】

1、修改/etc/vsftpd/vsftpd.conf 配置文件如下

[root@junwu_server ~]# grep '^anon' /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

vsftp 自动创建的文件的权限 docker vsftp搭建_配置文件

 2、启动服务并设置开机自启

[root@junwu_server ~]# systemctl restart vsftpd
[root@junwu_server ~]# systemctl enable vsftpd

3、另一台主机client按照准备工作操作后就可以使用ftp命令连接到10.0.0.10的ftp服务器(默认目录/var/ftp/)

[root@junwu_server ~]# cd /var/ftp
[root@junwu_server ftp]# ls
pub

4、使用ftp客户端连接(默认账号anonymous,密码为空)

[root@junwu_client ~]# ftp 10.0.0.10
Connected to 10.0.0.10 (10.0.0.10).
220 (vsFTPd 3.0.2)
Name (10.0.0.10:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.

ftp> ls
227 Entering Passive Mode (10,0,0,10,152,45).
150 Here comes the directory listing.
drwxr-xr-x 4 14 50 32 Nov 22 17:01 pub
226 Directory send OK.
ftp> cd pub    #切换工作目录
250 Directory successfully changed.

ftp> mkdir jkhf #发现在这⾥创建⽂件夹报错了

550 Create directory operation failed. 

注意:使用匿名用户登录ftp,默认访问的是/var/ftp文件夹,而默认此文件夹是属于root主、组,因此ftp无法写入内容,需要修改文件夹的user、group

[root@junwu_server ftp]# ll
total 0
drwxr-xr-x. 5 root root 45 Nov 22 12:06 pub

[root@junwu_server ftp]# chown -Rf ftp.ftp /var/ftp/pub/   ##R递归执行、f强制修改

[root@junwu_server ftp]# ll
total 0
drwxr-xr-x. 5 ftp ftp 45 Nov 22 12:06 pub

vsftp 自动创建的文件的权限 docker vsftp搭建_虚拟用户_02

 5、ftp服务器上检查文件是否写入

[root@junwu_server pub]# ls
fsjkf ghdsf jkfjk jkhkshhsjfhkjf

【本地用户模式】

 1、修改配置文件/etc/vsftpd/vsftpd.conf

anonymous_enable=NO #关闭匿名⽤户模式

local_enable=YES #开启本地⽤户模式

write_enable=YES #设置可写权限

local_umask=022 #⽂件umask值

userlist_enable=YES #启⽤【禁⽌登录的⽤户名单】⽂件名是,ftpusers

userlist_deny=YES #开启禁⽌登录名单

2、重启vsftpd服务,加载配置

systemctl restart vsftpd

systemctl enable vsftpd

3、在当前服务器上创建一个本地用户 junwu

[root@junwu_server ~]# grep 'junwu' /etc/passwd
junwu:x:1000:1000::/home/junwu:/bin/bash

4、客户端使用此用户连接ftp,默认访问该用户的家目录也就是/home/junwu文件夹中的内容

[root@junwu_client ~]# ftp 10.0.0.10
Connected to 10.0.0.10 (10.0.0.10).
220 (vsFTPd 3.0.2)
Name (10.0.0.10:root): junwu
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.

ftp> mkdir 到此一游
257 "/home/junwu/到此一游" created

5、查看服务器

[root@junwu_server junwu]# ls
到此一游

**补充:ftpusers文件是vsftpd禁止登录的用户名单

[root@junwu_server vsftpd]# cat ftpusers
# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
virtual_luo

【虚拟用户模式】

虚拟用户模式相比较匿名用户、本地用户而言,是更为安全的。

1、安装Berkeley DB工具

yum install db4 db4-utils -y 

2、创建用于进行FTP认证的用户数据库,奇数行账户名、偶数行密码

[root@junwu_server ~]# cat /etc/vsftpd/ftp_user.txt
peng
123456
zhiqiang
123456

3、很显然,这样的账户密码以明文存储很不安全,更重要的是vsftpd无法加载该格式的数据,因此得用到刚开始安装的Berkeley DB工具,使用db_load命令对ftp_user.txt文件进行加密,且设置权限使得普通用户无权限查阅

[root@junwu_server ~]# db_load -T -t hash -f /etc/vsftpd/ftp_user.txt /etc/vsftpd/ftp_user.db
[root@junwu_server ~]# file /etc/vsftpd/ftp_user.db
/etc/vsftpd/ftp_user.db: Berkeley DB (Hash, version 9, native byte-order)

4、降低文件权限

[root@junwu_server vsftpd]# ll ftp_user.db
-rw-r--r-- 1 root root 12288 Nov 23 00:46 ftp_user.db
[root@junwu_server vsftpd]# chmod 600 ftp_user.db
[root@junwu_server vsftpd]# ll ftp_user.db
-rw------- 1 root root 12288 Nov 23 00:46 ftp_user.db

5、创建当虚拟用户登录后默认访问的文件夹路径/var/ftpdirs/,且和本地用户做一个映射关系,防止虚拟用户登录后,创建了文件夹,但是系统没有此用户权限报错问题

[root@junwu_server vsftpd]# useradd -d /var/ftpdirs/ -s /sbin/nologin virtual_junwu

#检查ftpdirs的权限

[root@junwu_server var]# ll -d /var/ftpdirs/
drwx------ 2 virtual_junwu virtual_junwu 62 Nov 23 00:51 /var/ftpdirs/

#更改权限

[root@junwu_server var]# chmod -Rf 755 /var/ftpdirs/
[root@junwu_server var]# ll -d /var/ftpdirs/
drwxr-xr-x 2 virtual_junwu virtual_junwu 62 Nov 23 00:51 /var/ftpdirs

6、此时需要创建支持虚拟用户的PAM文件,PAM是一组安全机制的模块,编辑认证文件/etc/pam.d/vsftpd,指定db_load生成的文件路径,添加如下两行:(注意:一定要将其它行注释掉,否则客户端登录用户名会报错)

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

[root@junwu_server ~]# cat /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
auth required pam_userdb.so db=/etc/vsftpd/ftp_user
account required pam_userdb.so db=/etc/vsftpd/ftp_user

7、最后修改vsftpd配置文件

[root@junwu_server ~]# grep -Ev '^$|^#' /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
anon_other_write_enable=YES
guest_enable=YES
guest_username=virtual_junwu
allow_writeable_chroot=YES
user_config_dir=/etc/vsftpd/virtual_user_dir

vsftp 自动创建的文件的权限 docker vsftp搭建_配置文件_03

8、针对不通的,配置不通的权限

[root@junwu_server virtual_user_dir]# cat peng
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@junwu_server virtual_user_dir]# cat zhiqiang
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

vsftp 自动创建的文件的权限 docker vsftp搭建_UNIX_04

9、重启vsftpd服务,注意配置文件不要有空格或者书写错误,否则重启会报错

[root@junwu_server ~]# systemctl restart vsftpd

10、客户端登录用户peng、zhiqiang

##登录peng用户

[root@junwu_client ~]# ftp 10.0.0.10
Connected to 10.0.0.10 (10.0.0.10).
220 (vsFTPd 3.0.2)
Name (10.0.0.10:root): peng
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (10,0,0,10,43,25).
150 Here comes the directory listing.
226 Directory send OK.
ftp> mkdir 啦啦啦我是卖报的小行家
257 "/啦啦啦我是卖报的小行家" created

##登录zhiqiang用户创建文件显示权限不够,这是什么原因呢?

[root@junwu_client ~]# ftp 10.0.0.10
Connected to 10.0.0.10 (10.0.0.10).
220 (vsFTPd 3.0.2)
Name (10.0.0.10:root): zhiqiang
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir 学习使我快乐
550 Permission denied.

vsftp 自动创建的文件的权限 docker vsftp搭建_虚拟用户_05

##因为虚拟用户zhiqiang的的权限文件夹中设置禁止写入

[root@junwu_server virtual_user_dir]# cat zhiqiang
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

##到服务器指定虚拟用户的家目录查看刚刚创建的文件

[root@junwu_server ftpdirs]# cd /var/ftpdirs/
[root@junwu_server ftpdirs]# ls
啦啦啦我是卖报的小行家

只有经历过生活的苦难 才会更加努力去生活 自己梦想的一切 更加需要自己脚踏实地的去践行 结果未必尽如人意 但是路途中的努力 一定比结果更加美丽 ----by ljw