对于FTP服务器,登陆的用户有3类:匿名用户、系统用户和虚拟用户。对于匿名用户和系统用户身份的认证是通过/etc/passwd /etc/shadow来认证的。系统用户是可以直接登陆系统的用户,用户的账号和密码在网络中传输,是明文的,对于系统的安全来说是一个极大的漏洞。而实现虚拟用户的认证在很大程度上加强了安全性。虚拟用户可以有很多个,为了方便管理,mysql数据库就首当其冲了


查询mysql匿名用户 mysql创建匿名用户_虚拟用户

    我们知道在系统用户认证的过程中对权限的控制通过pam_unix.so和/etc/pam.d/system-auth这两个pam模块。同样对于虚拟用户而言,vsftp和mysql的连接也需要用到pam模块即pam_mysql.so ,将登陆vsftpd的账号放在Mysql的表当中。

本文要点:

1、基于mysql的虚拟用户

2、为每个虚拟用户定制权限

3、系统用户和虚拟用户同时可以访问

4、FTP服务器的访问控制


<服务器IP:172.16.20.1  测试机IP172.16.100.150>

一、基于mysql的虚拟用户

1、安装pam_mysql-0.7RC1
安装好开发环境和Mysql(源码编译),过程就不重复了,博文中有mysql的编译过程

http://sourceforge.net/projects/pam-mysql/files/pam-mysql/0.7RC1/pam_mysql-0.7RC1.tar.gz/download 下载pam-mysql的模块

1. #yum -y  install vsftpd //安装vsfptd服务(可以是编译的也可以是rpm包)
2. #setenforce 0 //关闭selinux
3. #tar zxvf  pam_mysql-0.7RC1.tar.gz  
4. #cd  pam_mysql-0.7RC1  
5. #./configure --with-mysql=/usr/local/mysql --with-openssl  
6. #make  
7. #make install  
8. //会在这个目录中/lib/security/ 生成一个模块 pam_mysql.so

2、准备数据库及相关表

建立名为vsftpd的数据库来存放相关虚拟用户的帐号,创建2个虚拟用户magedu,marion

密码分别为12345   redhat

1. # id magedu //保证要创建的虚拟用户不是系统用户
id: magedu: No such user
# id marion
id: marion: No such user2. mysql>
3. mysql>
4. mysql>
5. >
6. >
7. >
8. >
9. mysql>
10. +----------+----------+------+-----+---------+----------------+
| Field    | Type     | Null | Key | Default | Extra          |
+----------+----------+------+-----+---------+----------------+
| id       | int(11)  | NO   | PRI | NULL    | auto_increment |
| name     | char(15) | NO   | UNI | NULL    |                |
| password | char(48) | NO   |     | NULL    |                |
+----------+----------+------+-----+---------+----------------+11. //添加测试的虚拟用户,其密码采取加密存放的方式  
12. mysql>
13. mysql>
14. mysql>
15. mysql>
16. mysql> select * from users;
+----+--------+-------------------------------------------+
| id | name   | password                                  |
+----+--------+-------------------------------------------+
|  1 | magedu | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
|  2 | marion | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
+----+--------+-------------------------------------------+

 3、建立pam认证所需文件

1. #vi /etc/pam.d/vsftpd.my  
2. //添加如下两行  
3. auth required /lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
4. account required /lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

4、修改vsftpd的配置文件,使其适应mysql认证

1. 建立虚拟用户映射的系统用户及对应的目录  
2. # useradd -s /sbin/nologin -d /var/ftpuser ftpuser       //这个家目录将成为虚拟用户访问ftp目录的起始位置  
3. # chmod go+rx /var/ftpuser 
4.  
5. 请确保/etc/vsftpd/vsftpd.conf中已经启用了以下选项
anonymous_enable=YES
local_enable=YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
以上这几项都是默认的,只要添加下面一条即可
chroot_local_user=YES6. 添加以下选项
pam_service_name=vsftpd.my
userlist_enable=YES
tcp_wrappers=YES7. guest_enable=YES
guest_username=ftpuser8. #service vsftpd restart

5、测试配置


1. # ftp localhost  
2. Connected to localhost (127.0.0.1).  
3. 220 (vsFTPd 2.0.5)  
4. Name (localhost:root): marion  
5. 331 Please specify the password.  
6. Password: //密码是redhat 
7. 230 Login successful.  
8. Remote system type is UNIX.  
9. Using binary mode to transfer files.  
10. ftp>

 二、为每个虚拟用户定制权限

1. 实现:magedu 可上传文件  marion 只有访问权限 
2. user_config_dir 指令  可以实现让我们指定一个目录,在这个目录中为每一个用户创建一个同名的配置文件,用于定义这个用户在访问目录的  
3. 时候自己所独有的权限  
4. #cd /etc/vsftpd  
5. #mkdir virusers //创建一个目录,而后为用户建立对应的文件 
6. #cd virusers  
7. #vim  magedu  
8. 添加    
9. anon_upload_enable=YES
10. anon_mkdir_write_enable=NO
11. anon_other_write_enable=NO
12. #vim marion  
13. 添加    
14. anon_upload_enable=NO
15. anon_mkdir_write_enable=NO
16. anon_other_write_enable=NO
17.  
18. 编辑 /etc/vsftpd/vsftpd.conf  
19. 添加  
20. user_config_dir=/etc/vsftpd/virusers  
21. 测试:  
22. #ftp localhost  
23. Name (localhost:root): magedu  
24. 331 Please specify the password.  
25. Password:  
26. 230 Login successful.  
27. Remote system type is UNIX.  
28. Using binary mode to transfer files.  
29. ftp>
30. local: inittab remote: inittab  
31. 227 Entering Passive Mode (127,0,0,1,250,166)  
32. 150 Ok to send data.  
33. 226 File receive OK.  
34. 1666 bytes sent in 0.017 seconds (98 Kbytes/s)   //上传成功
35. ftp>
36. 227 Entering Passive Mode (127,0,0,1,46,110)  
37. 150 Here comes the directory listing.  
38. -rw-------    1 503      503           608 Aug 04 10:22 fstab  
39. -rw-------    1 503      503          1666 Aug 04 10:55 inittab  
40. 226 Directory send OK.  
41. ftp>
42. local: fstab remote: fstab  
43. 227 Entering Passive Mode (127,0,0,1,223,8)  
44. 550 Failed to open file.   //不可以下载
45. ftp>
46. 同样方法测试mrion用户  
47. 不可以删除、上传

三、系统用户和虚拟用户同时可以访问 useradd -r -M gentoo  

1. #useradd -r gentoo
2. #passwd gentoo  
3.  redhat   //密码为redhat
4. #ftp localhost //用gentoo登陆 失败  
5. # tail -1 /var/log/secure   
6. Aug  4 19:08:20 station11 vsftpd: pam_mysql - SELECT returned no result.  
7. //到mysql中去找了,当然找不到了   系统用户用的是/etc/pam.d/vsftpd  虚拟用户用的是/etc/pam.d/vsftpd.my  将两个文件整合都一起  
8. #vim /etc/vsftpd/vsftpd  
9. 将内容改为如下形式,将/etc/pam.d/vsftpd.my中的内容添加到此文件中  
10. #session    optional     pam_keyinit.so    force revoke  
11. auth    sufficient /lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
12. auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
13. auth       required     pam_shells.so  
14. auth       include      system-auth  
15. account sufficient /lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
16. account    include      system-auth  
17. session    include      system-auth  
18. session    required     pam_loginuid.so  
19. 而后编辑配置文件/etc/vsftpd/vsftpd.conf  
20. 将pam_service_name=vsftpd.my  改为 pam_service_name=vsftpd
21.  
22. 重启服务  
23. #service vsftpd restart  
24.  
25. 测试:  
26. [root@sut20 ~]# ftp localhost  
27. Connected to localhost.localdomain.  
28. 220 (vsFTPd 2.0.5)  
29. 530 Please login with USER and PASS.  
30. 530 Please login with USER and PASS.  
31. KERBEROS_V4 rejected as an authentication type  
32. Name (localhost:root): magedu  //虚拟用户登陆
33. 331 Please specify the password.  
34. Password:  
35. 230 Login successful.  
36. Remote system type is UNIX.  
37. Using binary mode to transfer files.  
38. ftp>
39. 227 Entering Passive Mode (127,0,0,1,239,100)  
40. 150 Here comes the directory listing.  
41. -rw-------    1 503      503           608 Aug 04 10:22 fstab  
42. -rw-------    1 503      503          1666 Aug 04 10:55 inittab  
43. 226 Directory send OK.  
44.  
45. [root@sut20 ~]# ftp localhost  
46. Connected to localhost.localdomain.  
47. 220 (vsFTPd 2.0.5)  
48. 530 Please login with USER and PASS.  
49. 530 Please login with USER and PASS.  
50. KERBEROS_V4 rejected as an authentication type  
51. Name (localhost:root): gentoo  //系统用户登陆
52. 331 Please specify the password.  
53. Password:  
54. 230 Login successful.  
55. Remote system type is UNIX.  
56. Using binary mode to transfer files.  
57. ftp>
58. 227 Entering Passive Mode (127,0,0,1,239,100)  
59. 150 Here comes the directory listing.  
60. -rw-------    1 503      503           608 Aug 04 10:22 fstab  
61. -rw-------    1 503      503          1666 Aug 04 10:55 inittab  
62. 226 Directory send OK.

四、FTP服务器的访问控制

例如:禁止vsftp为172.16.100.200访问  


1. #vim /etc/hosts.deny  
2. 添加  
3. vsftpd: ALL EXCEPT 172.16. EXCEPT 172.16.100.150  
4.  
5. 测试机地址为172.16.100.150  
6. ftp 172.16.20.1  
7. 421 Service not available  
8. User <172.16.20.1:<none>>;  //访问失败

综上:实现了基于mysql数据库架设FTP服务器的相关配置