centos 安装 vsftpd 并配置虚拟用户

vsftpd 是常用的ftp软件, 用在服务端,通常安装在 类UNIX系统中,最大的特点就是安全。接触这个软件时间不短了,一直对vsftpd的虚拟用户管理不是很理解,这才花点时间,配置了一遍。现在整理如下。


具体的配置可以查看 vsftpd虚拟用的配置

vsftpd 的安装

整个安装过程比较简单,软件很小。安装也很快

yum -y install vsftpd

vsftpd 虚拟用的配置

所谓虚拟用户,就是不是真正的用户。这里说的真正的用户是系统用户,或者叫做本地用户。比如root , 使用 useradd 创建的用户。虚拟用户要是能访问或者修改文件,必须对应一个系统用户。真正对文件的操作,都是有这个系统用户来完成。

本次的配置,就是多个虚拟用户对应了同一个系统用户 vftpuser, 所以配置的时候有两个地方比较重要。

# 虚拟用户对应的系统用户是 vftpuser
guest_username=vftpuser

虚拟用的和宿主用户有同样的权限
virtual_use_local_privs=YES

除去虚拟用户系统用户的处理问题上,还有个重要的问题,就是虚拟用户的认证问题。 这里通过 pam 方式,可以通过 db_load 创建虚拟用户文件,然后在 vsftpd 配置文件通过 pam 验证。下面给出相关的配置

# file /etc/vsftpd.conf 使用 pam 验证
pam_service_name=vsftpd

# 文件 /etc/vsftpd/vftpuser,就是通过 db_load 生成的虚拟用文件,包含用户和密码
cat /etc/pam.d/vsftpd
auth required pam_userdb.so db=/etc/vsftpd/vftpuser
account required pam_userdb.so db=/etc/vsftpd/vftpuser

最后一个文件就是vsftpd的使用文件,包括一些权限的设置。 通过一个脚本文件来详细 说明一下。

#!/bin/bash 

# ftp 服务器搭建
# 安装ftp
yum -y install vsftpd

# 创建主用户 vftpuser
FTPUSER=/home/vftpuser

useradd -d $FTPUSER  -s /usr/sbin/nologin vftpuser
chmod 500 $FTPUSER

### 创建测试用户的宿主目录
mkdir -p /home/vftpuser/shelljiaoben/webroot
chmod 500 /home/vftpuser/shelljiaoben
chown -R vftpuser:vftpuser /home/vftpuser

# 禁止匿名用户登陆,匿名用户的用户名  anonymous 
# 修改配置文件

sed -i  '/^anonymous_enable/s/YES/NO/' /etc/vsftpd/vsftpd.conf
sed -i  '/^write_enable/s/YES/NO/' /etc/vsftpd/vsftpd.conf
sed -i '/^#chroot_local_user/achroot_local_user=YES'  /etc/vsftpd/vsftpd.conf
sed -i '/^#chroot_list_enable/achroot_list_enable=NO'  /etc/vsftpd/vsftpd.conf
sed -i '/chroot_list_file/s/#//'  /etc/vsftpd/vsftpd.conf
sed -i '/pam_service_name/d' /etc/vsftpd/vsftpd.conf
sed -i '/userlist_enable/d' /etc/vsftpd/vsftpd.conf
sed -i '$auserlist_enable=NO' /etc/vsftpd/vsftpd.conf
sed -i '$a#userlist_deny=NO' /etc/vsftpd/vsftpd.conf
sed -i '$auser_config_dir=/etc/vsftpd/vsftpd_user_conf' /etc/vsftpd/vsftpd.conf
sed -i '$a# 启用虚拟用户' /etc/vsftpd/vsftpd.conf
sed -i '$aguest_enable=YES' /etc/vsftpd/vsftpd.conf
sed -i '$apam_service_name=vsftpd' /etc/vsftpd/vsftpd.conf
sed -i '$aguest_username=vftpuser' /etc/vsftpd/vsftpd.conf
sed -i '$a# 虚拟用的和宿主用户有同样的权限' /etc/vsftpd/vsftpd.conf
sed -i '$avirtual_use_local_privs=YES' /etc/vsftpd/vsftpd.conf
sed -i '$a# -doc begin -' /etc/vsftpd/vsftpd.conf
sed -i '$a# 当userlist_enable = NO, ftpusers 文件中的用户禁止访问 ftp 服务器' /etc/vsftpd/vsftpd.conf
sed -i '$a# 当userlist_enable = YES , userlist_deny = NO, 仅仅允许  user_list中的用户访问' /etc/vsftpd/vsftpd.conf
sed -i '$a# 当userlist_enable = YES, userlist_deny = YES , ftpuser, user_list 都不能访问ftp 服务器' /etc/vsftpd/vsftpd.conf
sed -i '$a# chroot_local_user = YES && chroot_local_user = YES 出去文件chroot_list 都限制' /etc/vsftpd/vsftpd.conf
sed -i '$a# chroot_local_user = YES && chroot_local_user = NO  全部被限制' /etc/vsftpd/vsftpd.conf
sed -i '$a# chroot_local_user = NO && chroot_local_user = YES  仅仅限制 chroot_list' /etc/vsftpd/vsftpd.conf
sed -i '$a# chroot_local_user = NO && chroot_local_user = NO   全部不限制' /etc/vsftpd/vsftpd.conf
sed -i '$a# -- doc  end --' /etc/vsftpd/vsftpd.conf

# 创建虚拟用户文本文件
cat >> /etc/vsftpd/vftpuser.txt <<EOT
shelljiaoben
123456
EOT


# 生成数据库文件
db_load -T -t hash -f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vftpuser.db

# 修改pam配置文件

mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak.`date "+%Y-%m-%d"`

cat >> /etc/pam.d/vsftpd <<EOT
#auth required /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/vftpuser
#account required /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/vftpuser
auth required pam_userdb.so db=/etc/vsftpd/vftpuser
account required pam_userdb.so db=/etc/vsftpd/vftpuser
EOT


# 填写虚拟用户的权限

mkdir -p /etc/vsftpd/vsftpd_user_conf

cat >> /etc/vsftpd/vsftpd_user_conf/shelljiaoben <<EOT
#虚拟用户的根目录,需要预先建立并赋予相应权限
local_root=/home/vftpuser/shelljiaoben
#开放虚拟用户的写权限
write_enable=YES
#开放虚拟用户的下载权限
anon_world_readable_only=YES
#开放虚拟用户的上传权限
anon_upload_enable=YES
#开放虚拟用户创建目录的权限
anon_mkdir_write_enable=YES
#禁止虚拟用户删除、重命名目录和文件
anon_other_write_enable=NO
EOT

service vsftpd start

创建用户的脚本

#!/bin/bash
# 
# 脚本需要两个参数
#
# 第一个是 用户名, 
# 第二个参数是用户的密码,用户的密码是可选的
#
#set -x

# 检查 mkpasswd  命令是否存在
type mkpasswd &> /dev/null ||  yum -y install expect

# 保证有且仅有只有一个参数
if [ $# -eq 0 ]; then
    echo "必须加上用户名字, 用户第一个必须是字母和数字组成,第一个字符不能是数字,长度不能超过20个字符";
    exit -2;
fi

# U 用户名
U=$1

# P password
P=$2

# 用户必须有数字和字幕组成,第一个必须是字幕
echo $U | grep -E "^[a-zA-Z][a-zA-Z0-9]{1,19}" &> /dev/null
if [ 0 -ne $? ]; then
    echo "用户第一必须是字母,长度不能超过20";
    exit -1;
fi

P='' # 禁止用户自定义密码,随机生成更安全

# 密码 如果创建的时候, 没有指定密码,就生成一个密码
if [ -z "$P" ]; then
    # 密码的长度是 12, 保证至少两个数字,两个小写字母,两个大写字母, 两个特殊符号
    P=`mkpasswd -l 12 -d 2 -c 2 -C 2 -s 2`
fi

# 添加 用户名和密码
echo $U >>  /etc/vsftpd/vftpuser.txt
echo $P >>  /etc/vsftpd/vftpuser.txt 
# 生成数据文件
db_load -T -t hash -f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vftpuser.db

# 生成用户的工作目录
BASEDIR=`cat /etc/passwd  | grep vftpuser | awk -F ":" '{print $(NF-1)}'`

mkdir -p  $BASEDIR/$U/webroot
mkdir -p  $BASEDIR/$U/backup
mkdir -p  $BASEDIR/$U/myfolder

chown -R  vftpuser:vftpuser  $BASEDIR/$U
chmod 500 $BASEDIR/$U

cat >> $BASEDIR/$U/info.txt << EOT
创建的日期是: `date "+%Y-%m-%d %H:%M:%S"`
用户名: $U
密  码: $P
EOT

# 创建信息,虚拟用户不可读
chmod 600 $BASEDIR/$U/info.txt


# 默认的用户权限
cat >> /etc/vsftpd/vsftpd_user_conf/$U <<EOT
#虚拟用户的根目录,需要预先建立并赋予相应权限
local_root=/home/vftpuser/$U
#开放虚拟用户的写权限
write_enable=YES
#开放虚拟用户的下载权限
anon_world_readable_only=YES
#开放虚拟用户的上传权限
anon_upload_enable=YES
#开放虚拟用户创建目录的权限
anon_mkdir_write_enable=YES
#禁止虚拟用户删除、重命名目录和文件
anon_other_write_enable=NO
EOT

## 显示用的创建的信息

IP=`ifconfig | grep inet | grep -v "inet 127" | grep -v "inet 10\." | awk '{ print $2}'`

echo "############# ftp 信息 ################"
echo "IP地址: $IP"
echo "用户名: $U"
echo "密 码: $P"
echo "#######################################"

# 关闭调试
#set +x
return 0

发表评论

电子邮件地址不会被公开。 必填项已用*标注