对于FTP服务器,登陆的用户有3类:匿名用户、系统用户和虚拟用户。对于匿名用户和系统用户身份的认证是通过/etc/passwd /etc/shadow来认证的。系统用户是可以直接登陆系统的用户,用户的账号和密码在网络中传输,是明文的,对于系统的安全来说是一个极大的漏洞。而实现虚拟用户的认证在很大程度上加强了安全性。虚拟用户可以有很多个,为了方便管理,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服务器的相关配置