使用pam_mysql和VSFTPD实现ftp虚拟帐号

1、vsftpd特色                                                 

vsftpd是在Linux一个较安全的ftp服务,在使用中,发现具备如下特色:mysql

l        支持chrootlinux

l        ftp帐号和local user帐号映射机制sql

l        与客户链接的子进程使用低权限帐号运行shell

l        有最大用户量限制、每用户链接数限制,匿名帐号速率控制数据库

 

在安装测试中发现一些vsftpd独特的运行机制和概念,在此列举解释:安全

一、配置文件,默认的vsftpd配置文件是/etc/vsftpd.conf。若是须要指定另外的路径,那么须要在启动vsftpd时以参数形式指定,如:bash

#/usr/local/sbin/vsftpd /etc/my_vsftpd.conf服务器

 

二、ftp帐号session

1)        anonymous user,登录名为anonymousftp。匿名帐号在登录到vsftpd后,vsftpd将匿名帐号映射成一个local user,默认是ftp,可在配置文件中指定。async

2)        Local user,即linux本机帐号,出于安全考虑,默认的配置文件中,是不容许local user登录的。

3)        Virtual user,虚拟帐号,虚拟帐号和匿名帐号相似,启用虚拟帐号机制后,用户使用非匿名帐号都被视为虚拟帐号,虚拟帐号登录后,vsftpd将他们映射成一个local user,默认也是ftp,能够在配置文件中指定。

4)        链接子进程帐号,vsftpd为了防止意外攻击攻破后,黑客获得高权限的帐号,因此全部的链接子进程都是用一个低权限的帐号运行。默认是nobody,能够经过配置文件修改。

三、帐号映射

帐号映射的目的在于便于管理,由于svftpd自己是没有帐号管理机制的。它借助linux系统自身的帐号管理、权限系统。

匿名用户、虚拟用户登录vsftpd后,其用户的文件访问权限被映射到相应的linux帐号(local user)上。

则使用独立的、低权限的local user实现映射有助于安全。

四、Chroot

l        Anonymous uservirtual userlocal user登录后,vsftpd会使用chroot把这些用户锁在特定的目录里面,防止他们访问其余目录。

l        Anonymous user默认状况下映射到local user后,会chroot到该local userhome目录下。在配置文件中能够经过anon_root参数再chroot到该参数指定的目录。

l        local user登录后,会进入该帐号的home目录,但若是不经过配置文件强制chroot的话,该帐号能够转到其余目录(父目录)chroot_local_user=YES能够实现强制chroot

l        virtual user须要vsftpd启动local user支持,并指定guest_enable参数。当启用virtual user后,全部非anonymous user登录都被视为virtual user。对virtual user帐号的管理,vsftpd经常使用的方式是pam_db或者pam_mysql


 

2、vsftpd安装                                                 

这次安装方案采用vsftpd+pam_mysql进行virtual user验证,在redhat enterprise 4下测试。如下是一些配置定义:

 

 1 vsftpd用户

用户

说明

vsftpd子进程用户

vsftpd(默认是nobody,因为使用nobody的进程太多,因此独立使用另外的用户)

Anonymous user所映射的local user

anoftp

Virtual user 所映射的local user

ftp

 

 2 路径定义

路径定义

说明

/opt/vsftpd/users

Virtual user (ftp)home目录

/opt/vsftpd/empty

vsftpd用户的home目录

/opt/vsftpd/users/pub

Anonymous user (anoftp)home目录

/etc/vsftpd.conf

vsftpd配置文件

/etc/pam.d/ftp.vsftpd

Pam认证配置文件

/var/log/vsftpd.log

vsftpd日志文件

 

 

 

 3 vsftpd数据库定义

定义

说明

Mysql主机地址

127.0.0.1

Mysql主机端口

3306

vsftpd认证数据库名称

vsftpd

vsftpd数据库链接帐号

vsftpd

vsftpd数据库链接密码

vsftpd

认证信息表

users(name,passwd,stat)

认证log

LoginLog

 

2.1 vsftpd安装                                                                  

1.        路径准备

[root@rac1 opt]# mkdir  -p /opt/vsftpd/users

[root@rac1 opt]# mkdir  -p /opt/vsftpd/users/pub

[root@rac1 opt]# mkdir  -p /opt/vsftpd/empty

 

2.        检查帐号

使用finger命令检查帐号vsftpdftpanoftp是否存在,如果存在,能够考虑使用另外的名称替换他们,或者使用usermod命令对这些帐号的homeshell进行修改。

 

3.        创建、修改帐号

# groupadd vsftpd

# useradd vsftpd -d /opt/vsftpd/empty -s /sbin/nologin -g vsftpd

# usermod  -d /opt/vsftpd/users ftp

# groupadd anoftp

# useradd anoftp -d /opt/vsftpd/users/pub -s /sbin/nologin -g anoftp

# touch  /opt/vsftpd/users/pub/hello_anonymous.txt

 

4.        下载编译vsftpd

http://vsftpd.beasts.org/下载最新的vsftpd源码包。

 

# tar xzf vsftpd-2.1.0.tar.gz

# cd vsftpd-2.1.0

# make && make install

# cp vsftpd.conf /etc/

# echo "ftp_username=anoftp" >>/etc/vsftpd.conf

 

vsftpd 将会被安装到/user/local/sbin/vsftpd,默认只容许anonymous用户登录。


 

5.        测试vsftpd

直接在终端上执行vsftpd命令

再到另外一个终端上使用ftp访问

2.2 pam_mysql安装                                                          

pam_mysql使用源码编译形式,须要系统安装有pam-develmysql

1.        检查、安装pam-devel

2.        下载编译pam_mysql

http://pam-mysql.sourceforge.net/下载最新的pam-mysql

注意:如果系统安装有cyrus-sasl-devel,彷佛当前版本(pam-mysql 0.7RC1)在使用MD5加密时会有问题,即便指定了—with-openssl参数

 

2.3 pam_mysql vsftpd联调                                         

1.        以管理员身份登录mysql,执行如下sql脚本

create database vsftpd;

use vsftpd;

grant select,insert on vsftpd.* to vsftpd@127.0.0.1 IDENTIFIED BY 'vsftpd';

 

CREATE TABLE `loginLog` (                                                         

            `id` int(10) unsigned NOT NULL auto_increment,                                 

            `userName` varchar(50) default NULL COMMENT '用户登录名',                 

            `message` varchar(100) default NULL COMMENT '登录pam认证信息',           

            `pid` int(10) unsigned default NULL COMMENT '使用pam认证的进程id',      

            `host` varchar(20) default NULL,                                               

            `rhost` varchar(20) default NULL,                                               

            `logtime` timestamp NOT NULL COMMENT '记录时间', 

            UNIQUE KEY `id` (`id`)                                                         

          ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

 

CREATE TABLE `users` (                

          `name` varchar(50) default NULL,   

          `passwd` varchar(64) default NULL, 

          `stat` smallint(6) default '0'     

        ) ENGINE=MyISAM DEFAULT CHARSET=utf8  ;

 

insert into users values ('vftp',password('vftp'),0);

 


 

2.        创建pam控制文件

使用mysqlpassword()函数进行密码加密。更多pam_mysql参数请查看pam_mysql源码包中的README文件。

cat >/etc/pam.d/ftp.vsftpd <<EOF

auth       required      /usr/lib/security/pam_mysql.so   user=vsftpd passwd=vsftpd  host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=passwd statcolumn=stat crypt=mysql sqllog=true logtable=loginLog logmsgcolumn=message logusercolumn=userName logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=logtime verbose=1

 

account    required      /usr/lib/security/pam_mysql.so   user=vsftpd passwd=vsftpd  host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=passwd statcolumn=stat crypt=mysql sqllog=true logtable=loginLog logmsgcolumn=message logusercolumn=userName logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=logtime verbose=1

 

EOF

 

3.        编辑/etc/vsftpd.conf配置文件

vsftpd源码包中有个EXAMPLE目录,里面提供了不少配置的例子,很值得参考。

使用vsftp本身的日记记录器,若是开启syslog_enable,则使用syslog

dual_log_enable=YES

# syslog_enable=YES

 

用户链接到vsftpd后,会建立独立的进程,nopriv_user指定进程的运行者

选择一个独立、低权限的帐号有助于安全

nopriv_user=vsftpd

 

使用pam作用户认证,配置文件在/etc/pam.d/ftp.vsftpd

pam_service_name=ftp.vsftpd

 

对于local user,登录后强制chrootlocal_root指定的目录,注意单独指定local_root 仍是不够的

# local_root只能让用户登录后进入这个目录,可是用户仍是能够切换到其余目录,致使不安全

chroot_local_user=YES

local_root=/opt/vsftpd/users

ftpd_banner=Welcome to toybox FTP service.

 

容许匿名用户访问,匿名用户会被映射成一个local user

ftp_username参数指定,默认是帐号是ftp

ftp_username=anoftp

anonymous_enable=YES

 

对于匿名用户,登录后强制chrootanon_root指定的目录

anon_root=/opt/vsftpd/users/pub

# anon_mkdir_write_enable=YES

# anon_other_write_enable=YES

# anon_upload_enable=YES

anon_world_readable_only=YES

 

容许使用local user帐号登录(使用virtual user模式必须启用)

local_enable=YES

 

将全部的非匿名用户都映射到guest user(使用virtual user模式必须启用)

注意guest user是一个local user, 由参数guest_username 指定

guest_enable=YES

guest_username=ftp

 

容许写操做,但匿名用户的权限还得由另外其余参数具体指定

# virtual_use_local_privs 参数指定virtual user是否具备local user的权限

write_enable=YES

virtual_use_local_privs=YES

 

 

其余设置

async_abor_enable=YES

 

# Performance

max_clients=20

max_per_ip=4

 

每一个链接单进程模式,若是vsftp须要处理大量的用户,可使用这个模式

可是这会下降安全,由于默认状况下每一个链接使用两个进程处理

# one_process_model=YES

 

用户在idle_session_timeout内没有输入ftp命令,则进入空闲超时

idle_session_timeout=120

若是在data_connection_timeout内没有数据传输,则进入超时

data_connection_timeout=300

 

使用被动模式(PASV)时,等待用户链接的时间

accept_timeout=60

使用主动模式(PORT)时,服务器链接等待时间

connect_timeout=60

匿名用户最大传送速率

# anon_max_rate=50000

 

4.        测试vsftpd

直接在终端上执行vsftpd命令

再到另外一个终端上使用ftp访问

5.        关于调试

Syslog的日志会打在/var/log/message

vsftpd专属日志会打在/var/log/vsftpd.log

注意pam_mysqlvsftpd都有日志选项,尤为是pam_mysql,启用日志选项后能够看到更多详细的信息,方便调试。如下是监控日志的一种方法:

#tail –f /var/log/message /var/log/vsftpd.log

 

3、vsftpd服务自启动脚本                           

#!/bin/bash

#

#       /etc/rc.d/init.d/vsftpd

#

# Starts the vsftpd daemon

#

# chkconfig: 345 95 5

# description: Runs commands scheduled by the vsftpd command vsftpd the time /

#    specified when vsftpd was run, and runs batch commands when the load /

#    average is low enough.

# processname: vsftpd

 

RETVAL=0

prog=/usr/local/sbin/vsftpd

lockfile=/var/lock/subsys/vsftpd

 

test -x $prog || exit 0

# source function library

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

 

start() {

    # Start daemons.

    if [ -n "`/sbin/pidof $prog`" ]; then

            echo -n $"$prog :already running"

            success

            echo

            return 0

    fi

    echo

    echo -n $"Starting $prog: "

 

    $prog &

    RETVAL=$?

    [ "$RETVAL" = 0 ] && success || failure

    [ "$RETVAL" = 0 ] && touch $lockfile

    echo

}

 

stop() {

 

    if [ -n "`/sbin/pidof $prog`" ] ; then

        echo -n "Shutting down $prog"

        killproc "$prog"

        RETVAL=$?

        [ "$RETVAL" = 0 ] && rm -f $lockfile

        [ "$RETVAL" = 0 ] && success

        echo

       else

           echo $"$prog no running!"

       fi

    echo

 

}

 

check_status() {

        echo -n "Checking Daemon "

        status $prog

              RETVAL=$?

        echo

}

restart() {

       stop

       start

}

 

# See how we were called.

case "$1" in

  start)

       start

       ;;

  stop)

       stop

       ;;

  status)

       check_status

       ;;

  restart|reload)

       restart

       ;;

  *)

       echo "Usage: $0 {start|stop|status|restart|reload}"

       exit 1

esac

exit $RETVAL

相关文章
相关标签/搜索