对于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 user
  2. mysql> create database vsftpd;  
  3. mysql> use vsftpd;  
  4. mysql> create table users (  
  5.     -> id int not null auto_increment primary key,    
  6.     -> name char(15) not null unique key,  
  7.     -> password char(48) not null  
  8.     -> );  
  9. mysql> desc users;  
  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> insert into users (name,password) values ('magedu',password('123456')),('marion',password('redhat'));  
  13. mysql> grant select on vsftpd.* to vsftpd@localhost identified by '123456';  
  14. mysql> grant select on vsftpd.* to vsftpd@127.0.0.1 identified by '123456';  
  15. mysql> flush privileges; 
  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=YES
  6. 添加以下选项
    pam_service_name=vsftpd.my
    userlist_enable=YES
    tcp_wrappers=YES
  7. guest_enable=YES
    guest_username=ftpuser
  8. #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> ls 

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

 
  
  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> put inittab  
  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> ls     
  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> get fstab  
  42. local: fstab remote: fstab  
  43. 227 Entering Passive Mode (127,0,0,1,223,8)  
  44. 550 Failed to open file.   //不可以下载
  45. ftp> bye  
  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> ls   
  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> ls   
  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服务器的相关配置