用pam_mysql做vsftp身份认证 by 小方
时间:2009-04-15 来源:rha030
|
用pam_mysql做vsftp身份认证
声明
author: Fang Yunlin
MSN: [email protected]
GTalk: [email protected]
E-mail: [email protected]
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/pam-mysql/pam_mysql-0.7RC1.tar.gz
yum install mysql-devel pam-devel gcc gcc-c++
tar zxvf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1
ln -s /usr/include/openssl/md5.h /usr/include/
如果不做这个软链接,则configure的时候找不到md5.h头文件。
./configure –with-openssl
如果不加—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_mysql-0.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_mysql-0.7RC1]#
创建pam认证规则
内容如下
[root@localhost pam_mysql-0.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_mysql-0.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.
drwxr-xr-x 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 | 2009-04-15 10:27:45 |
| AUTHENTICATION FAILURE | redhat | 24364 | 127.0.0.1 | localhost.localdomain | 2009-04-15 10:27:45 |
| AUTHENTICATION FALURE (FIRST_PASS) | department01 | 24385 | 127.0.0.1 | 192.168.122.101 | 2009-04-15 10:33:38 |
| AUTHENTICATION SUCCESS | department01 | 24385 | 127.0.0.1 | 192.168.122.101 | 2009-04-15 10:33:38 |
| QUERYING SUCCESS | department01 | 24385 | 127.0.0.1 | 192.168.122.101 | 2009-04-15 10:33:38 |
+------------------------------------+--------------+-------+-----------+-----------------------+---------------------+
5 rows in set (0.00 sec)
mysql>
实验目的达成。
后记
其实有一个问题已经存在很久了——你如果用baidu搜索一些技术关键词,基本是前基业都是同一样的内容,连错都错一样。而且这些网站其实很少有原创的内容,他们为了增加流量,达取他们不可告人的目的(比如赚取广告费),就拼命的摘抄别人的文章,大多数还不注明出处。
我觉得这样很不好。现在很多社区的朋友为了大家辛苦为大家撰写文章,大家要感谢他们,而一些学术道德沦丧败坏的人却为了一己之私,用没有意义的抄袭行为破坏着Linux中文学术环境(用google英文搜索技术关键字,往往能搜到更有用的信息,很少有重复的信息)。
我不觉得我自私,我很乐意和大家分享我的学习心得。不然我也不会把我的学习笔记放出来。只是这个和尊重作者没有直接联系,我提倡大家,尤其是有blog的朋友,为了营造一个良好的技术学习环境,自己和国内社区朋友,尽量少做动机不纯的摘抄,摘抄注明远处出,多尊重学术道德,多感谢广大为大家撰写文章的朋友。