标签为 Vsftp 的文章

分享一个用于管理Vsftp的虚拟用户的脚本[原创实践]

由于公司的一台服务器上使用FTP的用户越来越多,为了方便管理和安全考虑,我们将这些用户账号从之前的操作系统用户迁移到了虚拟用户。
但也因此无法像以前对系统用户那样很方便的对虚拟用户进行添加,删除,禁用以及修改密码等操作了,为了解决这个问题,我自己编写了一个Shell脚本,用它可以实现对虚拟用户的的创建,删除,禁用,激活以及修改密码的操作,用起来感觉不错,再次特分享给大家。

首先,关于Vsftp的虚拟用户方式的安装与配置,可以参考:http://heylinux.com/archives/726.html

在以虚拟用户方式配置好Vsftp以后,就可以通过以下方式使用脚本了:
创建用户:./user.vsftpd.sh create jack
删除用户:./user.vsftpd.sh delete jack
禁用用户:./user.vsftpd.sh disable jack
激活用户:./user.vsftpd.sh enable jack
修改密码:./user.vsftpd.sh passwd jack

创建脚本,输入以下内容:
# vim user.vsftpd.sh
# chmod +x user.vsftpd.sh

#!/bin/bash
#The script can create,deactivate,activate and delete virtual users of vsftpd.
#Author: Dong Guo
#Date: December 12 2011

USERFILE=/etc/vsftpd/virtusers
USERDB=/etc/vsftpd/virtusers.db
CONFBASE=/etc/vsftpd/vconf
TMPCONF=/etc/vsftpd/vconf/vconf.tmp
FTPBASE=/ftphome
FTPHOST=ftphost
USERNAME=$2

if [ $# != 2 ];then
        echo "Usage: $0 {create|disable|enable|passwd|delete} {username}" >&2
        exit 1
fi

function check_username_exist() {
                #Check if virtual user already exist
                USERCOUNT=$(sed -n 'p;n' $USERFILE | grep -w $USERNAME | wc -l)
                if [ $USERCOUNT -ne 0 ];then
                echo "User $USERNAME ALREADY exist!" && exit
                fi
}

check_username_notexist() {
                #Check if virtual user not exist
                USERCOUNT=$(sed -n 'p;n' $USERFILE | grep -w $USERNAME | wc -l)
                if [ $USERCOUNT -eq 0 ];then
                echo "User $USERNAME NOT exist!" && exit
                fi
}

get_password() {
                #Get the password
                echo -n "Input password: "
                read password
                #Check if password is empty
                if [ -z "$password" ];then
                echo "Empty password!!" && exit
                fi
}

update_userdb() {
                #Delete the virtual user db
                rm -f $USERDB
                #Generate the virtual user db
                db42_load -T -t hash -f $USERFILE $USERDB
}

case "$1" in
        'create' )
                check_username_exist
                get_password
                #Write the username and password to $USERFILE
                echo $USERNAME >> $USERFILE
                echo $password >> $USERFILE
                update_userdb
                #Create the configure file of virtual user
                cp $TMPCONF $CONFBASE/$USERNAME
                #Replace the home directory name of virtual user
                sed -i "s/virtuser/$USERNAME/g" $CONFBASE/$USERNAME
                #Create the home directory of virtual user
                mkdir $FTPBASE/$USERNAME
                #Change the owner of home directory to OS user $FTPHOST
                chown -R $FTPHOST:$FTPHOST $FTPBASE/$USERNAME
                ;;

        'disable' )
                check_username_notexist
                #Change the owner of home directory from $FTPHOST to root
                chown root:root $FTPBASE/$USERNAME
                #Change the permissions of home directory to read-only for root
                chmod 700 $FTPBASE/$USERNAME
                ;;

        'enable' )
                check_username_notexist
                #Change the owner of home directory from root to $FTPHOST to root
                chown $FTPHOST:$FTPHOST $FTPBASE/$USERNAME
                #Change the permissions of home directory to 775 for $FTPHOST
                chmod 775 $FTPBASE/$USERNAME
                ;;

        'delete' )
                check_username_notexist
                #Get the row numbers of username and password of virtual user
                ROWNUMBER=$(cat -n $USERFILE | sed -n 'p;n' | grep -w $USERNAME | awk '{print $1}' | head -n 1)
                #Delete the username and password of virtual user from $USERFILE
                sed -i "${ROWNUMBER}d" $USERFILE
                sed -i "${ROWNUMBER}d" $USERFILE
                update_userdb
                #Delete the configure file of virtual user
                rm -f $CONFBASE/$USERNAME
                #Rename the home directory name of virtual user
                mv $FTPBASE/$USERNAME $FTPBASE/$USERNAME.deleted
                ;;

        'passwd' )
                check_username_notexist
                get_password
                #Get the row numbers of username and password of virtual user
                ROWNUMBER=$(cat -n $USERFILE | sed -n 'p;n' | grep -w $USERNAME | awk '{print $1}' | head -n 1)
                PASSWORDNUMBER=$(expr $ROWNUMBER + 1)
                sed -i "${PASSWORDNUMBER}d" $USERFILE
                sed -i "${ROWNUMBER}a $password" $USERFILE
                update_userdb
                ;;
        *)
                echo "Usage: $0 {create|disable|enable|passwd|delete} {username}" >&2
                exit 1
                ;;
esac

,

2 Comments

工作笔记—基于虚拟用户方式的Vsftp高级设置

如果仅仅是需要简单的上传下载一些文件的话,不建议安装FTP服务器,通过SSH的sftp通道既方便又安全,客户端推荐 FileZilla FTP Client 。
但如果是针对多个用户使用,且对权限等方面有较高的要求,则推荐采用支持虚拟用户的Vsftp服务器。以下是我总结的安装与配置步骤,希望能对大家有所帮助。

1.安装所需软件包
(以下软件包均可从光盘或yum源中获取。)
安装vsftpd软件包
rpm -ivh vsftpd-*

安装pam软件包
rpm -ivh pam-*
rpm -ivh pam-devel-*

安装DB4软件包
rpm -ivh db4-*
rpm -ivh db4-devel-*

2.系统帐户
2.1.建立虚拟宿主用户
useradd -d /ftphome -m ftphost

2.2 修改配置文件:
2.2.1 备份vsftpd.conf
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak

2.2.2 编辑vsftpd.conf
vi /etc/vsftpd/vsftpd.conf
阅读全文 »

2 Comments

Vsftp服务器配置详解

注:Vsftp作为RHEL的默认FTP服务器,我们有必要对其安装与配置进行更深入的了解,在网络上搜索的资料大多比较零散,但下面这篇文章讲解比较全面,且内容实用。
原文出处:http://www.5ilinux.com

另外,在前段时间我对SUSE的默认FTP服务器 pureftp 进行了一些了解,发现它在功能上更加强大和易用,因此建议大家尝试采用pureftp来作为专业的FTP服务器,我也将对pureftp进行更深一步的学习,并将学习成果分享给大家。

===========================================================
目录

1 Vsftp服务器的安装
1.1 匿名服务器的连接(独立的服务器)
1.2 开启匿名FTP服务器上传权限
1.3 开启匿名服务器下传的权限
1.4 普通用户FTP服务器的连接(独立服务器)
1.5 用户登陆限制进其它的目录,只能进它的主目录
1.6 限制本地用户访问FTP
1.7 安全选项
1.8 查看谁登陆了FTP,并杀死它的进程
2 Vsftp服务器的配置
2.1 配置本地组访问的FTP
2.2 配置独立FTP的服务器的非端口标准模式进行数据连接
2.3 配置单独的虚拟FTP,使用虚拟FTP用户,并使建立的四个帐户中有不同的权限
2.3.1 配置网卡
2.3.2 写入/etc/sysconfig中(为了重起后IP地址不会丢失)
2.3.3 进入vsftpd.conf所在的文件夹
2.3.4 建立logins.txt
2.3.5 建立访问者的口令库文件,然后修改其权限
2.3.6 进如/etc/pam.d/中创建ftp.vu
2.3.7 在/var/ftp/创建目录并改变其属性和它的属主
2.3.8 进入vsftpd2.conf修改其中的信息
2.3.9 在vsftpd.comf所在的目录中创建virtaul文件目录并在文件目录中创建以你用户名命名的配置文件
2.3.10 修改vsftpd2.conf
2.4 vsftpd.conf中的所有配置信息
3 Vsftp服务器的维护
4 Vsftp使用的一些补充
4.1 补充一:如何有选择的把用户限制在家目录中呢?
4.2 补充二:打开vsFTP服务器的日志功能
4.3 补充三:如何让绑定IP到vsFTP?
4.4 补充四:如何让vsFTP服务器限制链接数,以及每个IP最大的链接数??
4.5 补充五:如何限制下载的速度?
4.6 补充六:我的硬盘空间有限,怎么办?
4.7 补充七:如何定制欢迎信息
4.8 补充八:如何实现虚拟路径?
4.9 补充九:如何上匿名访问、上传,并支持下载和执行?
4.10 补充十:通过pam认证方式,添加虚拟用户
4.11 补充十一:如何把系统默认用standalone启动改为用xinetd启动?
阅读全文 »

,

No Comments

工作笔记 -- 基于本地用户方式的Vsftp高级设置

创建一个专用的FTP数据存储目录:
# mkdir /ftpserver
# vi /etc/vsftpd/vsftpd.conf

设置vsftpd为standalone工作模式
listen=YES
tcp_wrappers=YES

启用本地用户:
local_enable=YES

禁用匿名用户:
anonymous_enable=NO
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES

更改FTP默认监听端口21:
添加
##Set the listen_port
Listen_port=5200

设置FTP的PASV模式传输端口,以配合防火墙通过PASV模式传输数据:
添加
##set the pasv ports
port_enable=NO
pasv_enable=YES
pasv_min_port=10021
pasv_max_port=10025

设置FTP服务器最大的并发连接数,默认值为0,表示不限最大连接数。
添加
max_clients=1000

设置每个IP地址最大的并发连接数目,默认值为0,表示不限制。
添加
max_per_ip=10

启用锁定主目录用户名单功能:
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
# touch /etc/vsftpd.chroot_list

启用特定用户独立配置文件功能:
添加
##set the user's private config
user_config_dir=/etc/vsftpd/user_config/
# mkdir /etc/vsftpd/user_config/

创建一个FTP用户,将该用户的主目录指向到/ftpserver,并使其不能登陆shell:
# useradd jacky -d /ftpserver/jacky -s /sbin/nologin
# passwd jacky

锁定jacky用户的主目录
# vi /etc/vsftpd.chroot_list
添加
jacky

创建jacky用户的独立配置文件:
# cd /etc/vsftpd/user_config/
# vi jacky
##Allow this user download?
#download_enable=YES
##Uncomment this to enable any form of FTP write command,such as "STOR,DELE,RNFR,RNTO,MKD,RMD,APPE,SITE ..."
#write_enable=YES
##If you set the "write_enable=YES",but don't want to allow "rename or delete ..."
##You can open "cmds_allowed",and remove the command which you don't allow.
##"delete" = "DELE,RMD" ; "rename" = "RNFR,RNTO" ; "mkdir" = "MKD"
#cmds_allowed=ABOR,ACCT,ALLO,APPE,CDUP,CWD,DELE,EPRT,EPSV,FEAT,
HELP,LIST,MDTM,MKD,MODE,NLST,NOOP,OPTS,PASS,PASV,PORT,PWD,
QUIT,REIN,REST,RETR,RMD,RNFR,RNTO,SITE,SIZE,SMNT,STAT,
STOR,STOU,STRU,SYST,TYPE,USER,XCUP,XCWD,XMKD,XPWD,XRMD,BYE
##Set the max rate for this user,"Bytes/s".
#local_max_rate=204800
##Set the root directory for this user.
#local_root=

使jacky用户仅具有下载、上传和创建目录的权限,而没有删除和重命名的权限:
download_enable=YES
write_enable=YES
cmds_allowed=ABOR,ACCT,ALLO,APPE,CDUP,CWD,EPRT,EPSV,FEAT,
HELP,LIST,MDTM,MKD,MODE,NLST,NOOP,OPTS,PASS,PASV,PORT,PWD,
QUIT,REIN,REST,RETR,SITE,SIZE,SMNT,STAT,
STOR,STOU,STRU,SYST,TYPE,USER,XCUP,XCWD,XMKD,XPWD,XRMD,BYE

限制jacky用户的最大下载速度为200KB左右
local_max_rate=204800

重启vsftpd以使配置生效:
# /etc/init.d/vsftpd restart

修改防火墙以使FTP通过:
# vi /etc/sysconfig/iptables
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 5200 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10021 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10023 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10024 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10025 -j ACCEPT

重启防火墙以使策略生效:
# /etc/init.d/iptables restart

OK! The end.

PS(根据实际需要):
开放root用户的FTP权限:
# vi /etc/vsftpd.ftpusers
#root
# vi /etc/vsftpd.user_list
#root

禁止jacky用户的FTP权限
# vi /etc/vsftpd.ftpusers
添加
jacky
# vi /etc/vsftpd.user_list
添加
jacky

No Comments

如何在端口过滤后通过pasv模式连接FTP服务器

了解下FTP协议原理,对我们深入理解和排查问题都是有好处的。

维基百科的链接:http://zh.wikipedia.org/wiki/FTP%E5%AE%A2%E6%88%B6%E7%AB%AF

 

为了保障服务器的安全,一般都会对服务器进行端口过滤;
windows服务器一般采用通过TCP/IP筛选,而Linux则通过iptables防火墙。

因为FTP服务器默认都会使用pasv模式进行数据传输,在连接时,服务器端会根据连接过来的IP计算出一个特定的端口来传输数据,这样可以实现每个IP地址连接过来之后都通过一个不同的端口进行数据的传输;
如果这个端口不能打开,将无法连接到该服务器传输数据(即使在ftp登陆信息中看到已经成功登陆)。

一些优秀的FTP传输工具在此时会自动切换到port模式进行传输,以达到使用监听端口(如默认的数据流端口20)来传输数据的目的。
但这样会造成一些麻烦,比如我们直接使用IE的FTP功能,或很简单的一些FTP客户端,都无法正常连接上来;即使通过FlashFXP和CuteFTP这样的工具,也仍然不是很顺利。

所以,在进行了端口的过滤之后,我们一般采用固定设置几个端口作为pasv的数据传输端口(一般设置5个以上),并开放这几个端口。

Windows下使用Serv-U搭建FTP服务器,然后在“设置”中有一项可以设置数据传输端口,保存后再到TCP/IP筛选中添加允许这些端口即可。
而Linux下常用的VSFTP服务器,需要在配置文件/etc/vsftpd.conf中添加以下几行配置,然后在iptables中开放这些端口即可。
port_enable=NO
pasv_enable=YES
pasv_min_port=10021
pasv_max_port=10025

这样,就可以在进行了端口过滤后通过pasv模式连接FTP服务器了。

No Comments