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

浙公网安备 33010602011771号