基于虚拟用户的方式使用vsftp

一、主动和被动模式简介
1、Port模式(主动模式):
当客户端C向服务端S连接后,使用的是Port模式,那么客户端C会发送一条命令告诉服务端S(客户端C在本地打开了一个端口N在等着你进行数据连接),当服务端S收到这个Port命令后 就会向客户端打开的那个端口N进行连接,这种数据连接就生成了。
2、Pasv模式(被动模式):
当客户端C向服务端S连接后,服务端S会发信息给客户端C,这个信息是(服务端S在本地打开了一个端口M,你现在去连接我吧),当客户端C收到这个信息后,就可以向服务端S的M端口进行连接,连接成功后,数据连接也建立了。
二、安装vsftpd
1、yum安装vsftp
#yum ‐y install vsftpd
2、启动服务
#systemctl start vsftpd.service
3、配置文件路径
/etc/vsftpd
三、配置vsftpd用匿名用户方式登录
1、首先我们在企业中ftp服务器,一般情况下都会有个共享服务器,允许员工下载一些公司的软件或者常用的软件包(方便,不用再去外网去下载,也省带宽)
2、vsftp提供了匿名登录,默认anonymous_enable=YES的情况下,就启用了匿名访问,这种情况下你只能把需要给用户的文件,存放到/var/ftp/pub下(默认路径),如果想更改的话需要添加anon_root= /data/pub,后面的路径就是匿名登录后实际访问的目录。如果匿名用户也需要上传的功能的话。
anonymous_enable=YES # 允许匿名访问
anon_root= /data/pub # 匿名访问的本地实际目录
local_enable=YES
anon_upload_enable=YES # 允许匿名用户上传文件(须将全局的write_enable=YES,默认YES)
anon_mkdir_write_enable=YES # 允许匿名用户创建目录
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
vsftpd.conf
3、我们设置了匿名访问的目录是/data/pub里面,还是上传不了文件,有人说直接改成777就可以,但是改成777就无法访问了,这是由于vsftpd的安全性设置,我们需要在pub里面再创建一个子文件夹,然后给这个子文件夹777的权限就OK了,这样就可以在这个子文件夹中进行操作了。
四、配置虚拟用户登录方式
【虚拟用户必须关闭虚拟用户anonymous_enable=NO】
1、配置文件内容
anonymous_enable=NO
write_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
use_localtime=YES
local_enable=YES
allow_writeable_chroot=YES
xferlog_enable=YES
local_umask=022
pam_service_name=vsftpd
use_localtime=YES
listen_port=21
chroot_local_user=YES
idle_session_timeout=120
data_connection_timeout=120
guest_enable=YES
guest_username=ftpuser
user_config_dir=/etc/vsftpd/vuser_conf
virtual_use_local_privs=YES
pasv_min_port=10060
pasv_max_port=10090
accept_timeout=5
connect_timeout=1
2、创建宿主用户
创建用户 ftpuser 指定 `/home/vsftpd` 目录
useradd ‐g root ‐M ‐d /home/vsftpd ‐s /sbin/nologin ftpuser
设置用户 ftpuser 的密码
passwd ftpuser
把 /home/vsftpd 的所有权给ftpuser.root
chown ‐R ftpuser.root /home/vsftpd
3、建立虚拟用户文件
touch /etc/vsftpd/vuser_passwd
# 编辑虚拟用户名单文件:(# 第一行账号,第二行密码,注意:不能使用root做用户名,系统保留)
vi /etc/vsftpd/vuser_passwd
编辑内容,下面是 vuser_passwd 内容
ftp1
12345678
ftp2
12345678
4、生成虚拟用户数据文件
db_load ‐T ‐t hash ‐f /etc/vsftpd/vuser_passwd /etc/vsftpd/vuser_passwd.db
chmod 600 /etc/vsftpd/vuser_passwd.db
5、创建用户配置
mkdir /etc/vsftpd/vuser_conf # 建立虚拟用户个人vsftp的配置文件
cd /etc/vsftpd/vuser_conf # 进入目录
touch ftp1 ftp2
(ftp1和ftp2写入如下内容,local_root=/home/vsftpd/ftp1#这里写入这个用户的实际存储路劲)。
ftp1文件中内容如下
vim ftp1
local_root=/home/vsftpd/ftp1
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
vim ftp2
local_root=/home/vsftpd/ftp2
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
6、创建用户目录
# mkdir ‐p /home/vsftpd/ftp1
# mkdir ‐p /home/vsftpd/ftp2
7、服务运维
systemctl restart vsftpd.service      # 重启服务
systemctl start vsftpd.service         # 启动服务
systemctl status vsftpd.service      # 服务状态查看
8、生成虚拟用户的PAM文件
# cd /etc/pam.d/
备份vsftpd文件
# cp vsftpd vsftpd.bak
修改vsftpd文件内容(加入第二和第三行,下面的都全部注释,注意下面是64位操作系统,如果是32位的话lib64需要改成lib)
#%PAM‐1.0
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd
#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
9、新增加用户
新增用户的话,需要在/etc/vsftpd/vsuser.passwd里面追加用户(删除就是删除用户),记得使用db_load重新生成vsuser.passwd文件即可,vuser_confi里面新建一个新建账户的权限文件,宿主目录记得新建存储文件。
五、处理报错
1、上面每个配置文件中的内容最好是手动键入。
2、客户端windows打开cmd到后台进行连接,网页和资源管理器里面都会有缓存也看不到报错。
3、用windows的cmd链接ftp会报错,信息是:chroot没有读到/etc/vsftpd/chroot_list这个文件,解决方法就是直接新建这个文件就行,记得重启服务。
4、虚拟用户登录到自己的宿主目录后,不能上传文件,这是因为vsftpd为了安全,不能让匿名用户在自己的家目录下直接创建文件,解决方式就是在每个虚拟用户的宿主目录里面再新建一个文件夹,给这文件夹777权限,就可以了。
 六、实战,模拟学生资料系统。只有学生自己和任课老师能看到学生本人文件,别人不可以。老师可以看到所教学生的文件。
 1、准备name.txt,name.txt中的第一列为学生名、第二列为本人的任课老师,一会需要遍历此文件新建账号。
[root@localhost ~]# cat name.txt
lishuai         jiacai 
yuanhongbin     jiacai 
liduo           gongshengsheng
liuqi           lirongxia
nixueging       lirongxia
congshuanjian   lixi
liuxuesheng     gongshengsheng
yubaiyan        jiacai 
shenxiaojiao    lixi
xujianggao      shaozuguang
sunguangshuai   gongshengsheng
xiaoshuyue      congshen
cuijingwen      congshen
lixinju         jina
jinpengyuan     jina
caoqishao       xiaoyang
lienbo          xiaoyang
sunyuqing       jina
gianshunsheng   congshen
yangguangming   xiaoyang
fengxueying     congshen
liuyanshao      shaozuguang
xuhuasheng      lirongxia
lihongwei       jiacai 
licong          lixi
gaoxingjia      gongshengsheng
lishen          lixi
huangyu         shaozuguang
lixihan         lirongxia
shengzimo       shaozuguang
liujiaxin       shaozuguang
2、利用shell脚本,安装配置vsftpd,以及新建用户设置密码等操作。shell脚本如下:
#!bin/bash
yum install -y vsftpd                                                       ##安装vsftpd
systemctl start vsftpd                                                     ##启动vsftpd
mkdir -pv /home/vsftpd                                                  ##创建vsftpd的家目录
read -p "请输入用户名(用户名必须是:ftpuser):" uname
if useradd -g root -M -d /home/vsftpd -s /sbin/nologin $uname &>/dev/null;then    ##创建用户
echo "$uname" | passwd --stdin $uname &>/dev/null                                             ##设置密码
echo "创建用户 "$uname" 成功,密码和用户名相同"
else
echo "创建用户 "$uname" 失败 "$uname"已存在并被删除,请从新执行脚本"
userdel $uname                                                                                                      ##删除用户
exit 6
fi

chown -R $uname.root /home/vsftpd                      ##把/home/vsftpd的所有权给ftpuser.root    
while read line                                                        ##输入重定向
do
    stu=`echo $line | awk '{print $1}'`                        ## 定义变量 stu
    tea=`echo $line | awk '{print $2}'`                        ##定义变量 tea

    if [ -e $tea ];then                                                 ##如果tea存在
            echo "$tea 存在"
            mkdir -pv /bishe/0301/$tea/$stu/upload     ##创建/$tea/$stu/upload 
    else
            echo "$tea 不存在" 
            mkdir -pv /bishe/0301/$tea/{$stu/upload,upload}    ##创建/$tea/{$stu/upload,upload} 
    fi
    chmod 777 /bishe/0301/$tea/upload                   ##给/$tea/upload权限
    chmod 777 /bishe/0301/$tea/$stu                       ##给/$tea/$stu权限  
    chmod 777 /bishe/0301/$tea/$stu/upload           ##给/$tea/$stu/upload权限

    mkdir -pv /etc/vsftpd/vuser_conf        ##创建虚拟用户个人vsftp的配置
    cd /etc/vsftpd/vuser_conf                   ##进入目录

    echo "local_root=/bishe/0301/$tea/$stu" >$stu
    echo "write_enable=YES" >>$stu
    echo "anon_world_readable_only=NO" >>$stu
    echo "anon_upload_enable=YES" >>$stu
    echo "anon_mkdir_write_enable=YES" >>$stu
    echo "anon_other_write_enable=YES" >>$stu

    echo "local_root=/bishe/0301/$tea" >$tea
    echo "write_enable=YES" >>$tea
    echo "anon_world_readable_only=NO" >>$tea
    echo "anon_upload_enable=YES" >>$tea
    echo "anon_mkdir_write_enable=YES" >>$tea
    echo "anon_other_write_enable=YES" >>$tea

    mkdir -pv /etc/vsftpd/chroot_list                                           ##创建文件夹

    Pwd=`openssl rand -hex 8 | cksum | cut -c1-6`                   
    echo "$stu">>/etc/vsftpd/vuser_passwd                              ##追加学生姓名到/etc/vsftpd/vuser_passwd
    echo "$Pwd">>/etc/vsftpd/vuser_passwd                            ##追加密码到 /etc/vsftpd/vuser_passwd
    echo | awk '{print $2}' /root/new1.txt | sort | uniq >tea.txt     ##把老师名字统计到tea.txt
done<./name.txt

while read line     ###给老师创建密码
do
                 tea1=`echo $line | awk '{print $1}'`
                 Pwd=`openssl rand -hex 8 | cksum | cut -c1-8`
                 echo "$tea1">>/etc/vsftpd/vuser_passwd
                 echo "$Pwd">>/etc/vsftpd/vuser_passwd
done<./tea.txt
db_load -T -t hash -f /etc/vsftpd/vuser_passwd /etc/vsftpd/vuser_passwd.db 
chmod 600 /etc/vsftpd/vuser_passwd.db 

echo "anonymous_enable=NO
write_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
use_localtime=YES
local_enable=YES
allow_writeable_chroot=YES
xferlog_enable=YES
local_umask=022
pam_service_name=vsftpd

use_localtime=YES
listen_port=21
chroot_local_user=YES
idle_session_timeout=120

data_connection_timeout=120
guest_enable=YES
guest_username=ftpuser

user_config_dir=/etc/vsftpd/vuser_conf
virtual_use_local_privs=YES

pasv_min_port=10060
pasv_max_port=10090

accept_timeout=5
connect_timeout=1 " >/etc/vsftpd/vsftpd.conf
cd /etc/pam.d/
echo  "#%PAM-1.0 
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd 
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd 
#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 " > vsftpd
systemctl restart vsftpd              ##重启服务
3、设置定时任务、完成数据的定时备份
crontab -l
5 7-21 * * * /usr/bin/rsync -az /bishe/ /bak-bishe/ &>/dev/null
30 23 * * *  /bin/bash /bin/backup.sh &>/dev/null

博主小白,欢迎各位指出不足和改进意见,感谢观看。
这个世界上根本没有正确的选择,我们只不过是要努力奋斗,使当初的选择变得正确!  
上一篇:LeetCode开心刷题二十六天——49.Group Anagrams


下一篇:reduce _ 高阶函数 之 聚合运算