Centos7 安装vsftpd 配置虚拟用户登陆

一、FTP简介

1.1 FTP主动和被动工作模式

1)port方式:主动模式

port(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器从20端口向客户端的空闲端口发送连接请求,建立一条数据链路来传送数据。

 

2)pasv方式:被动模式

pasv(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端向服务器的空闲端口发送连接请求,建立一条数据链路来传送数据

 

1.2 vsftp用户类型

1)匿名登录:在登录FTP时使用默认的用户名,一般是ftp或anonymous。

2)本地用户登录:使用系统用户登录,在/etc/passwd中。

3)虚拟用户登录:这是FTP专有用户,有两种方式实现虚拟用户,本地数据文件和数据库服务器(MySQL)。

FTP虚拟用户是FTP服务器的专有用户,使用虚拟用户账号可以提供集中管理的FTP根目录,方便了管理员的管理,同时将用于FTP登录的用户名、密码与系统用户账号区别开,进一步增强了FTP服务器的安全性。某种意义上来说,匿名用户也是系统用户,只是系统用户的一个映射。公开的FTP都不会使用系统用户作为FTP帐号,而更多的采用了虚拟用户,这样能保证系统的安全性。使用虚拟用户登录FTP服务器,可以避免使用操作系统帐号作为FTP用户带来的一些安全问题,也便于通过数据库或其它程序来进行管理。虚拟用户的特点是只能访问服务器为其提供的FTP服务,而不能访问系统的其它资源。所以,如果想让用户对FTP服务器站内具有写权限,但又不允许访问系统其它资源,可以使用虚拟用户来提高系统的安全性。在VSFTP中,认证这些虚拟用户使用的是单独的口令库文件(pam_userdb),由可插入认证模块(PAM)认证。使用这种方式更加安全,并且配置更加灵活。

 

基本流程:FTP用户访问->PAM配置文件(由vsftpd.conf中pam_service_name指定)->PAM论证->区别用户读取配置文件(由vsftpd.conf中user_config_dir指定配置文件路径,文件名即用户名)

 

二、安装vsftpd

yum install -y vsftpd

三、配置vsftpd

3.1备份配置文件

mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak

3.2直接粘贴以下内容到配置文件

cat /etc/vsftpd/vsftpd.conf | grep -v "^#"

anonymous_enable=NO              ##不允许匿名账号登录

local_enable=YES         ##本地用户可以访问(采用虚拟用户访问时,这个参数也要开启(虚拟账号要寄宿本地账号),虽然开启但是本地账号是不可以登录的)

write_enable=YES           ##可写可上传。这个参数是全局配置,否则上传和下载都会报错550

local_umask=022

dirmessage_enable=YES

xferlog_enable=YES

connect_from_port_20=YES  ##通过20端口传输数据

listen_port=2021            ##监听端口

pasv_min_port=40001           ##分配给ftp账号的最小端口,被动模式下的配置

pasv_max_port=40100           ##分配给ftp账号的最大端口,1账号1端口,即最大允许100个账号连接

max_clients=150                    ##客户端的最大连接数

accept_timeout=5

connect_timeout=1

max_per_ip=5                       ##每个IP最大连接数

xferlog_file=/var/log/xferlog

xferlog_std_format=YES

ascii_upload_enable=YES

ascii_download_enable=YES

ftpd_banner=Welcome to signalway@com.cn FTP service.           ##登录FTP时显示的欢迎信息

chroot_local_user=NO                ##限制所有的本地用户在自家目录,即用户登录系统后锁定在自家目录。虚拟主机配置下,在下面两个chroot配置后,这个参数必须为NO,否则登录FTP后还可以访问其他目录!

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd/chroot_list       ##指定不能离开家目录的用户列表文件,一行一个用户,使用此方法时必须chroot_local_user=NO,说明这个列表里面的用户登录ftp后都只能访问其主目录,其它目录都不能访问!

listen=YES

listen_ipv6=NO                   ##关闭IPv6,否则启动ftp时会报错

 

pam_service_name=vsftpd         ##指定PAM配置文件,即下面的/etc/pam.d/vsftpd文件要和这里指定一致

userlist_enable=YES

tcp_wrappers=YES

virtual_use_local_privs=YES        ##虚拟用户和本地用户有相同的权限,否则ftp连上之后不能上传。报错500权限拒绝

guest_enable=YES                      ##启用虚拟用户

guest_username=ftpuser            #将虚拟用户映射为本地的ftpuser用户(前提是local_enable=YES)

user_config_dir=/etc/vsftpd/vuser_conf                   ##指定不同虚拟用户配置文件的存放路径

allow_writeable_chroot=YES              ##从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。所以要加上该参数。否则报错500 OOPS: vsftpd: refusing to run with writable root inside chroot ()

vi /etc/vsftpd/vsftpd.conf

粘贴上边的内容(注释不用粘上)

四、开启防火墙端口

firewall-cmd --add-port=2021/tcp --permanent

firewall-cmd --add-port=40001-40100/tcp --permanent

firewall-cmd --add-service=ftp --permanent

firewall-cmd --reload

五、设置登录FTP的虚拟用户

5.1创建虚拟用户账号文件

vi /etc/vsftpd/vuser_passwd.txt

signalkkk

signalkkk@888

(格式依次是:第一行是账户名,次行是该账号的密码;即奇数行是账户名,偶数行是对应上一行的账户密码)

 

5.2生成虚拟用户口令认证的db文件

db_load -T -t hash -f /etc/vsftpd/vuser_passwd.txt /etc/vsftpd/vuser_passwd.db

chmod 600 /etc/vsftpd/vuser_passwd.db

5.3设置锁定在主目录的用户

vi /etc/vsftpd/chroot_list

ftpuser

5.4创建虚拟用户配置文件(文件名和虚拟用户名相同)

mkdir -p /etc/vsftpd/vuser_conf

vi /etc/vsftpd/vuser_conf/signalway

local_root=/opt/signalway                 ##指定虚拟账号登录后的主目录(可自定义)

write_enable=YES                              ##写权限

anon_umask=022

anon_world_readable_only=NO        ##下载权限(当其他3项为NO时,则此账号登录ftp后只有可读和下载权限)

anon_upload_enable=YES                 ##上传权限

anon_mkdir_write_enable=YES          ##创建目录权限

anon_other_write_enable=YES           ##删除和重命名权限

六、配置PAM认证

ll /lib64/security/pam_userdb.so

vi /etc/pam.d/vsftpd            (注释掉原文件中的所有内容,添加以下两行内容)

auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd                    ##这个vuser_passwd根据的是vuser_passwd.db

account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd        ##这里是64bit系统,必须使用sufficient,否则上面vuser_conf目录下的虚拟主机配置文件无效

七、设置虚拟账号signalway指定的主目录的权限为nobody,这样就可以映射到宿主账号nobody

mkdir -p /opt/ftpuser/

useradd -d /opt/ftpuser/ -s /sbin/nologin ftpuser

chown -R ftpuser.ftpuser /opt/ftpuser

chmod -R 700 /opt/ftpuser

八、启动vsftpd

systemctl start vsftpd

 

 

 

anonymous_enable=NO                    ##不允许匿名账号登录

local_enable=YES                       ##本地用户可以访问(采用虚拟用户访问时,这个参数也要开启(虚拟账号要寄宿本地账号),虽然开启但是本地账号是不可以登录的)

write_enable=YES                       ##可写可上传。这个参数是全局配置,否则上传和下载都会报错550

local_umask=022

dirmessage_enable=YES

xferlog_enable=YES

connect_from_port_20=YES     ##通过20端口传输数据

listen_port=2021                     ##监听端口

pasv_min_port=40001                       ##分配给ftp账号的最小端口,被动模式下的配置

pasv_max_port=40100                       ##分配给ftp账号的最大端口,1账号1端口,即最大允许100个账号连接

max_clients=150                                ##客户端的最大连接数

accept_timeout=5

connect_timeout=1

max_per_ip=5                                   ##每个IP最大连接数

xferlog_file=/var/log/xferlog

xferlog_std_format=YES

ascii_upload_enable=YES

ascii_download_enable=YES

ftpd_banner=Welcome to signalway@com.cn FTP service.           ##登录FTP时显示的欢迎信息

chroot_local_user=NO                ##限制所有的本地用户在自家目录,即用户登录系统后锁定在自家目录。虚拟主机配置下,在下面两个chroot配置后,这个参数必须为NO,否则登录FTP后还可以访问其他目录!

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd/chroot_list       ##指定不能离开家目录的用户列表文件,一行一个用户,使用此方法时必须chroot_local_user=NO,说明这个列表里面的用户登录ftp后都只能访问其主目录,其它目录都不能访问!

listen=YES

listen_ipv6=NO                   ##关闭IPv6,否则启动ftp时会报错

 

pam_service_name=vsftpd         ##指定PAM配置文件,即下面的/etc/pam.d/vsftpd文件要和这里指定一致

userlist_enable=YES

tcp_wrappers=YES

virtual_use_local_privs=YES        ##虚拟用户和本地用户有相同的权限,否则ftp连上之后不能上传。报错500权限拒绝

guest_enable=YES                      ##启用虚拟用户

guest_username=nobody          #将虚拟用户映射为本地的nobody用户(前提是local_enable=YES)

user_config_dir=/etc/vsftpd/vuser_conf     ##指定不同虚拟用户配置文件的存放路径

allow_writeable_chroot=YES ##从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。所以要加上该参数。否则报错500 OOPS: vsftpd: refusing to run with writable root inside chroot ()

 

附上一一键安装脚本

# cat  Centos7_install_vsftp

#!/bin/bash

#author: other

#OS: Centos7+

#filename: Centos7_install_vsftp.sh

 

#一,使用方式

#  1,安装vsftp

#sh Centos7_install_vsftp.sh install

#  2,新建ftp用户 

#sh Centos7_install_vsftp.sh useradd ftp 12345678

##

users=/etc/vsftpd/vftpuser.txt   #账号配置文件

login=/etc/vsftpd/vftpuser.db    #账号数据库文件

generate_db="db_load -T -t hash -f $users $login"

virtual_user_config=/etc/vsftpd/vuser_conf

virtual_user_home=/data/wwwroot    #ftp根目录位置

guest_username=www    #指定ftp权限账号

 

#Source function library

. /etc/rc.d/init.d/functions

 

install_vsftpd(){

setenforce 0

yum -y install db4-utils

yum -y install vsftpd

systemctl enable vsftpd

 

useradd -s /sbin/nologin ${guest_username}

mkdir -p $virtual_user_home/ 

mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak

cat >/etc/vsftpd/vsftpd.conf<<EOF

anonymous_enable=NO

local_enable=YES

write_enable=YES

local_umask=022

dirmessage_enable=YES

xferlog_enable=YES

connect_from_port_20=YES

listen_port=21

pasv_min_port=40001

pasv_max_port=40100

max_clients=1000

accept_timeout=5

connect_timeout=1

max_per_ip=5

xferlog_file=/var/log/xferlog

xferlog_std_format=YES

ascii_upload_enable=YES

ascii_download_enable=YES

ftpd_banner=Welcome to FTP service.

chroot_local_user=YES

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd/chroot_list

listen=YES

listen_ipv6=NO

pam_service_name=vsftpd

userlist_enable=YES

tcp_wrappers=YES

virtual_use_local_privs=YES

guest_enable=YES

guest_username=${guest_username}

user_config_dir=/etc/vsftpd/vuser_conf

allow_writeable_chroot=YES

EOF

 

mkdir /etc/vsftpd/vuser_conf

touch /etc/vsftpd/chroot_list

 

 

#i386 32位系统打开下列两行

#echo 'auth required pam_userdb.so db=/etc/vsftpd/vftpuser' > /etc/pam.d/vsftpd

#echo 'account required pam_userdb.so db=/etc/vsftpd/vftpuser' >> /etc/pam.d/vsftpd

 

#X64 64位系统打开下列两行

echo 'auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vftpuser' > /etc/pam.d/vsftpd

echo 'account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vftpuser' >> /etc/pam.d/vsftpd

 

touch /etc/vsftpd/vftpuser.txt

 

systemctl restart vsftpd

[ $? -eq 0  ]&&action $"Install vsftp:" /bin/true||action $"Install vsftp:" /bin/false

#开启防火墙,21连接端口,60000-61000为被动模式数据传输端口

systemctl stop firewalld 2>/dev/null

systemctl disable firewalld 2>/dev/null

iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT

iptables -A INPUT -p tcp --dport 40001:40100 -j ACCEPT

iptables-save >/etc/sysconfig/iptables

systemctl status  vsftpd &>/dev/nul

if [ $? -eq 0 ];then

   echo -e "\n\e[1;36m The default download directory: /data/wwwroot \e[0m"

fi

}

 

add_user(){

not_enough_parameter=56

retval=0

if [ "$#" -ne 2 ]; then

    echo "usage:`basename $0` <useradd> <user_name> <password>."

    exit $not_enough_parameter

fi

 

if grep -q "$1" "$users"; then

   passwd=$(sed -n "/$1/{n;p;}" "$users")

   if [ "$passwd" = "$2" ]; then

       echo "the user $1 already exists."

       exit $retval

   else

       echo "updating $1's password ... "

       sed -i "/$1/{n;s/$passwd/$2/;}" "$users"

       eval "$generate_db"

       exit $retval

   fi

fi

 

for i in "$1" "$2"

do

    echo "$i" >> "$users"

done

 

eval "$generate_db"

 

cat >> "$virtual_user_config"/"$1" <<EOF

local_root=$virtual_user_home/$1

write_enable=YES

download_enable=YES

anon_world_readable_only=NO

anon_upload_enable=YES

anon_mkdir_write_enable=YES

anon_other_write_enable=YES

local_umask=022

EOF

 

mkdir -p "$virtual_user_home"/"$1"

chown -R $guest_username "$virtual_user_home"/"$1"

 

echo "==========$users============"

cat $users

}

 

case "$1" in

    'install')

      install_vsftpd

        ;;

    'useradd')

      add_user $2 $3

        ;;

    *)

    echo -e "\033[31mUsage:

1.Install vsftp

bash $0 install

2.Create a new ftp user

bash $0 useradd ftp password \033[0m"

    exit 1

        ;;

esac

posted @ 2020-12-14 14:00  溪水西流~军  阅读(1008)  评论(0)    收藏  举报