关于vsftpd用户认证

好久前就想学习一下vsftpd的用户认证了,尤其是在pam这块。觉得很强大,但是也比较复杂,网上没有找到很好的资料。

自己研究又静不下心来。

今天突然看到方君的博客里有他做的笔记,拿来看了一下,真是受益匪浅,成功地做了db4和mysql的vsftpd用

户认证实验。中间也出了不少错,主要是自己键盘搞打出错。方君的笔记做得太认真了。这里直接把他的笔记

帖过来,供自己以后方便看,也可以给别人一些提示。

撰写者信息
Alin Fang (Fang Yunlin)
Blog: http://www.alinblog.cn/
修改日期
2 Dec, 2008
第1次修改
版权
GNU
声明
本人实验笔记,非权威文档。如有错误请告知。十分感谢!
实验环境
Red Hat Enterprise Linux 5 update 2
域名: dhcp-0-145
网络: 10.66.0.145/23
实验步骤
安装db4以及相关工具
[root@dhcp-0-145 ~]# rpm -q db4
db4-4.3.29-9.fc6
[root@dhcp-0-145 ~]# rpm -q db4-utils
package db4-utils is not installed
[root@dhcp-0-145 ~]# cd /misc/cd/Server
[root@dhcp-0-145 Server]# rpm -ivh db4-utils-4.3.29-9.fc6.i386.rpm
warning: db4-utils-4.3.29-9.fc6.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing... ########################################### [100%]
1:db4-utils ########################################### [100%]
[root@dhcp-0-145 Server]#
安装vsftpd
[root@dhcp-0-145 Server]# rpm -q vsftpd
package vsftpd is not installed
[root@dhcp-0-145 Server]# rpm -ivh vsftpd-2.0.5-12.el5.i386.rpm
warning: vsftpd-2.0.5-12.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186
Preparing... ########################################### [100%]
1:vsftpd ########################################### [100%]
[root@dhcp-0-145 Server]#
添加ftp用户列表并生成数据库文件
[root@dhcp-0-145 Server]# cd /etc/vsftpd/
[root@dhcp-0-145 vsftpd]# vim ftplogin
配置如下
user1
redhat
user2
redhat
user3
redhat
单行为帐号,双行为密码。
增强用户数据库安全性,并生成数据库文件
[root@dhcp-0-145 vsftpd]# chmod 700 ftplogin
[root@dhcp-0-145 vsftpd]# db_load -T -t hash -f ftplogin ftplogin.db
[root@dhcp-0-145 vsftpd]# ls
ftplogin ftplogin.db ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh
[root@dhcp-0-145 vsftpd]# cat ftplogin.db
#a##2�#�9���
###эh^#######redhat#user3#redhat#user1#####2�#�9���
##эh^###redhat#user2[root@dhcp-0-145
vsftpd]#
看到一堆乱码,说明数据库文件生成好了。
配置pam,指定由 ftplogin.db来验证用户。
我们在/etc/pam.d里面新建一个pam验证规则,名为 virtualftpuser
[root@dhcp-0-145 vsftpd]# cd /etc/pam.d/
[root@dhcp-0-145 pam.d]# ls
atd pm-hibernate system-auth
authconfig pm-powersave system-auth-ac
authconfig-gtk pm-suspend system-cdinstall-helper
authconfig-tui pm-suspend-hybrid system-config-authentication
chfn poweroff system-config-date
chsh ppp system-config-display
config-util pup system-config-kdump
crond reboot system-config-keyboard
cups remote system-config-language
dateconfig rhn_register system-config-lvm
eject run_init system-config-netboot
ekshell runuser system-config-network
gssftp runuser-l system-config-network-cmd
halt sabayon system-config-printer
kbdrate setup system-config-rootpassword
kshell smtp system-config-securitylevel
login smtp.sendmail system-config-soundcard
neat sshd system-config-time
newrole su system-config-users
other sudo system-install-packages
passwd sudo-i vsftpd
pirut su-l
[root@dhcp-0-145 pam.d]# vim virtualftpuser
里面内容为
auth required pam_userdb.so db=/etc/vsftpd/ftplogin
account required pam_userdb.so db=/etc/vsftpd/ftplogin
指定验证数据库
新建虚拟用户到实际用户的映射,修改映射用户的文件夹的访问权限
建立虚拟用户个人配置文件夹
[root@dhcp-0-145 pam.d]# useradd virtualftpuser
[root@dhcp-0-145 pam.d]# chmod 755 ~virtualftpuser
[root@dhcp-0-145 pam.d]# mkdir /etc/vsftpd/userconf
[root@dhcp-0-145 pam.d]#
然后修改/etc/vsftpd/vsftpd.conf文件
指定由这个pam来验证用户。
[root@dhcp-0-145 pam.d]# cd /etc/vsftpd/
[root@dhcp-0-145 vsftpd]# vim vsftpd.conf
修改为
#========= modify by Yunlin Fang =========#
anonymous_enable=NO
#========= modify line end =========#
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
#========= modify by Yunlin Fang =========#
pam_service_name=virtualftpuser
guest_enable=YES
guest_username=virtualftpuser
user_config_dir=/etc/vsftpd/userconf
#========= modify line end =========#
userlist_enable=YES
tcp_wrappers=YES
启动vsftpd
[root@dhcp-0-145 ~]# service vsftpd restart
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
[root@dhcp-0-145 ~]# chkconfig --level 35 vsftpd on
[root@dhcp-0-145 ~]#
测试ftp服务
[root@dhcp-0-145 vsftpd]# touch /home/virtualftpuser/file1
[root@dhcp-0-145 vsftpd]# ftp dhcp-0-145
Connected to dhcp-0-145.pek.redhat.com.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (dhcp-0-145:root): user1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (10,66,0,145,240,191)
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Dec 02 08:26 file1
226 Directory send OK.
ftp> quit
221 Goodbye.
[root@dhcp-0-145 vsftpd]#
成功。
分析
通过db4数据库来验证vsftpd用户,每次对用户列表做改动,都得需要修改用户列表的文本文件,并且重新
db_load,我觉得这样的管理方式,还不如用默认的基于/etc/passwd的用户验证方式便于管理。
解决方式个人推荐:
• 改用mysql作为验证数据库
• 自行写脚本优化用户修改过程
下面有一个我自己写的自动添加用户和删除用户的脚本
#!/bin/bash
VAL=0
if [ -z "${1}" -o "${1}" = "(null)" ]; then
echo "Usage:"
echo "\t`basename ${0}` add"
echo "\t`basename ${0}` del USERNAME"
fi
case ${1} in
del)
if [ -z "${2}" -o "${2}" = "(null)" ]; then
echo "Usage: `basename ${0}` add USERNAME"
VAL=1
exit ${VAL}
fi
line=$(egrep -n ^${2}$ /etc/vsftpd/ftplogin | cut -d : -f 1)
if [ -z "${line}" -o "${line}" = "(null)" ]; then
echo "No such user: ${2}"
VAL=1
exit ${VAL}
fi
sed -i -e "$line,$(($line+1))d" /etc/vsftpd/ftplogin
;;
add)
echo "Username: "
read username
line=$(egrep -n ^${username}$ /etc/vsftpd/ftplogin)
if [ ${?} -eq 0 ]; then
echo "User has exist: ${username}"
VAL=1
exit ${VAL}
fi
echo "password: "
read password
echo $username >> /etc/vsftpd/ftplogin
echo $password >> /etc/vsftpd/ftplogin
;;
esac
db_load -T -t hash -f /etc/vsftpd/ftplogin /etc/vsftpd/ftplogin.db
exit ${VAL}



用pam_mysql做vsftp身份认证
声明
author: Fang Yunlin
Site: http://www.afang.org/
本人实验文档,非权威指南,仅供参考。
提倡良好的学术氛围,转载请注明原出处。
15 Apr, 2009
第2次修改
环境
OS: Red Hat Enterprise Linux 5 update 3
Network: 192.168.122.101 / 24
步骤
首先要说下,pam_mysql在fedora上直接yum下来就可以了。
但是目前还没有加入RHEL5.3,需要自行编译。
这里是官方网站。
http://pam-mysql.sourceforge.net/
准备编译环境并编译pam_mysql.so
wget http://prdownloads.sourceforge.net/pammysql/
pam_mysql0.7RC1.
tar.gz
yum install mysqldevel
pamdevel
gcc gccc++
tar zxvf pam_mysql0.7RC1.
tar.gz
cd pam_mysql0.7RC1
ln s
/usr/include/openssl/md5.h /usr/include/
如果不做这个软链接,则configure的时候找不到md5.h头文件。
./configure –withopenssl
如果不加—with-openssl参数,则不能正常支持md5密码校验方式。
编译完的pam_mysql.so放在 /usr/lib/security下。
ln s
/usr/lib/security/pam_mysql.so /lib/security/
/lib/security才是pam的默认路径。
创建数据库信息
[root@localhost pam_mysql0.7RC1]#
mysql u
root p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.0.45 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> CREATE DATABASE vsftp;
Query OK, 1 row affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON vsftp.* TO vsftp@"%" IDENTIFIED BY 'redhat';
Query OK, 0 rows affected (0.00 sec)
mysql> use vsftp;
Database changed
mysql> CREATE TABLE account (
>
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
>
`user` VARCHAR(128) NOT NULL UNIQUE,
>
`passwd` VARCHAR(128) NOT NULL
>
);
Query OK, 0 rows affected (0.02 sec)
上面命令创建帐号表。
mysql> CREATE TABLE log (
>
`msg` VARCHAR(128),
>
`user` VARCHAR(128),
>
`pid` INT,
>
`host` VARCHAR(128),
>
`rhost` VARCHAR(128),
>
`time` TIMESTAMP
>
);
Query OK, 0 rows affected (0.00 sec)
上面命令创建记录表,记录用户访问记录。
mysql> CREATE TRIGGER trigger_format_passwd
>
BEFORE INSERT
>
ON account
>
FOR EACH ROW
>
SET NEW.passwd = md5(NEW.passwd);
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TRIGGER trigger_format_passwd_update
>
BEFORE UPDATE
>
ON account
>
FOR EACH ROW
>
SET NEW.passwd = md5(NEW.passwd);
Query OK, 0 rows affected (0.00 sec)
上面两条命令创建触发器,自动把更新的密码用md5加密方式加密。
mysql> quit
Bye
[root@localhost pam_mysql0.7RC1]#
创建pam认证规则
内容如下
[root@localhost pam_mysql0.7RC1]#
cat /etc/pam.d/vsftpd_mysql
auth required pam_mysql.so user=vsftp passwd=redhat host=192.168.122.101
db=vsftp table=account usercolumn=user passwdcolumn=passwd crypt=md5 sqllog=true
logtable=log logmsgcolumn=msg logusercolumn=user logpidcolumn=pid
loghostcolumn=host logrhostcolumn=rhost logtimecolumn=time
account required pam_mysql.so user=vsftp passwd=redhat host=192.168.122.101
db=vsftp table=account usercolumn=user passwdcolumn=passwd crypt=md5 sqllog=true
logtable=log logmsgcolumn=msg logusercolumn=user logpidcolumn=pid
loghostcolumn=host logrhostcolumn=rhost logtimecolumn=time
[root@localhost pam_mysql0.7RC1]#
user
连接mysql的用户
passwd
连接mysql的用户密码
host
mysql服务器地址,格式可以是
ip
ip:port
unix socket,比如/tmp/mysql.sock
db
存放vsftp验证信息的数据库
table
用户信息表
usercolumn
用户信息表用户名列
passwdcolumn
用户信息表密码列
crypt
加密方式,一共支持
1 / plain 明文密码。
2 / Y crypt加密方式,在mysql查询语句中对应encrypt函数。
3 / mysql passwd加密方式,在mysql查询语句中对应password函数。
4 / md5 md5加密方式,在mysql查询语句中对应md5函数。
5 / sha1 sha1加密方式,在mysql查询语句中对应sha1函数。
如果RHEL5上要使用3方式进行加密,务必把/etc/my.cnf里面的old_passwords=1
改成old_passwords=0,否则mysql会使用老的加密算法,导致和pam_mysql.so密码验证
不成功。
logtable
日志表
logmsgcolumn
日志表消息列,记录日志消息主体。
logusercolumn
日志表用户列,记录访问ftp的用户。
logpidcolumn
日志表pid列,记录调用pam_mysql.so的进程的pid。
loghostcolumn
日志表host列,记录ftp服务器ip。
logrhostcolumn
日志表rhost列,记录ftp客户端ip。
logtimecolumn
日志表时间列,记录用户访问的时间。
上面配置我不做过多解释。大家请看pam_mysql的README,有很详尽的解释。
修改vsftpd配置文件,指定由上述pam配置文件来进行用户身份验证
/etc/vsftpd/vsftpd.conf配置如下
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd_mysql
guest_enable=YES
guest_username=ftp
user_config_dir=/etc/vsftpd/userconfig
userlist_enable=YES
tcp_wrappers=YES
测试
启动ftp服务
[root@localhost vsftpd]# service vsftpd start
Starting vsftpd for vsftpd: [ OK ]
[root@localhost vsftpd]# chkconfig level
35 vsftpd on
[root@localhost vsftpd]#
添加测试用户
[root@localhost vsftpd]# mkdir userconfig
[root@localhost vsftpd]# vim userconfig/department01
[root@localhost vsftpd]# cat userconfig/department01
local_root=/var/ftp
[root@localhost vsftpd]# mysql u
vsftp p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.0.45 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> use vsftp;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with A
Database changed
mysql> INSERT INTO account (user, passwd) VALUES ("department01", "redhat");
Query OK, 1 row affected (0.00 sec)
mysql> select * from account;
++
+
+
| id | user | passwd |
++
+
+
| 1 | department01 | e2798af12a7a0f4f70b4d69efbc25f4d |
++
+
+
1 row in set (0.01 sec)
mysql> quit
Bye
[root@localhost vsftpd]#
测试登录
[root@localhost vsftpd]# ftp 192.168.122.101
Connected to 192.168.122.101.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (192.168.122.101:root): department01
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,122,101,240,33)
150 Here comes the directory listing.
drwxrxrx
2 0 0 4096 Dec 13 2007 pub
226 Directory send OK.
ftp>
查看日志
[root@localhost vsftpd]# mysql u
vsftp p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 5.0.45 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> use vsftp;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with A
Database changed
mysql> select * from log;
++
+
+
+
+
+
| msg | user | pid | host | rhost
| time |
++
+
+
+
+
+
| AUTHENTICATION FALURE (FIRST_PASS) | redhat | 24364 | 127.0.0.1 |
localhost.localdomain | 20090415
10:27:45 |
| AUTHENTICATION FAILURE | redhat | 24364 | 127.0.0.1 |
localhost.localdomain | 20090415
10:27:45 |
| AUTHENTICATION FALURE (FIRST_PASS) | department01 | 24385 | 127.0.0.1 |
192.168.122.101 | 20090415
10:33:38 |
| AUTHENTICATION SUCCESS | department01 | 24385 | 127.0.0.1 |
192.168.122.101 | 20090415
10:33:38 |
| QUERYING SUCCESS | department01 | 24385 | 127.0.0.1 |
192.168.122.101 | 20090415
10:33:38 |
++
+
+
+
+
+
5 rows in set (0.00 sec)
mysql>
实验目的达成。
后记
其实有一个问题已经存在很久了——你如果用baidu搜索一些技术关键词,基本是前基业都是
同一样的内容,连错都错一样。而且这些网站其实很少有原创的内容,他们为了增加流量,达
取他们不可告人的目的(比如赚取广告费),就拼命的摘抄别人的文章,大多数还不注明出处。
我觉得这样很不好。现在很多社区的朋友为了大家辛苦为大家撰写文章,大家要感谢他们,而
一些学术道德沦丧败坏的人却为了一己之私,用没有意义的抄袭行为破坏着Linux中文学术环
境(用google英文搜索技术关键字,往往能搜到更有用的信息,很少有重复的信息)。
我不觉得我自私,我很乐意和大家分享我的学习心得。不然我也不会把我的学习笔记放出来。
只是这个和尊重作者没有直接联系,我提倡大家,尤其是有blog的朋友,为了营造一个良好的
技术学习环境,自己和国内社区朋友,尽量少做动机不纯的摘抄,摘抄注明远处出,多尊重学
术道德,多感谢广大为大家撰写文章的朋友。







没什么可说的,向方君学习。

你可能感兴趣的:(vsftpd)