对于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的模块
- #yum -y install vsftpd //安装vsfptd服务(可以是编译的也可以是rpm包)
- #setenforce 0 //关闭selinux
- #tar zxvf pam_mysql-0.7RC1.tar.gz
- #cd pam_mysql-0.7RC1
- #./configure --with-mysql=/usr/local/mysql --with-openssl
- #make
- #make install
- //会在这个目录中/lib/security/ 生成一个模块 pam_mysql.so
2、准备数据库及相关表
建立名为vsftpd的数据库来存放相关虚拟用户的帐号,创建2个虚拟用户magedu,marion
密码分别为12345 redhat
- # id magedu //保证要创建的虚拟用户不是系统用户
id: magedu: No such user
# id marion
id: marion: No such user- mysql> create database vsftpd;
- mysql> use vsftpd;
- mysql> create table users (
- -> id int not null auto_increment primary key,
- -> name char(15) not null unique key,
- -> password char(48) not null
- -> );
- mysql> desc users;
- +----------+----------+------+-----+---------+----------------+
| 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 | |
+----------+----------+------+-----+---------+----------------+- //添加测试的虚拟用户,其密码采取加密存放的方式
- mysql> insert into users (name,password) values ('magedu',password('123456')),('marion',password('redhat'));
- mysql> grant select on vsftpd.* to vsftpd@localhost identified by '123456';
- mysql> grant select on vsftpd.* to vsftpd@127.0.0.1 identified by '123456';
- mysql> flush privileges;
- mysql> select * from users;
+----+--------+-------------------------------------------+
| id | name | password |
+----+--------+-------------------------------------------+
| 1 | magedu | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| 2 | marion | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
+----+--------+-------------------------------------------+
3、建立pam认证所需文件
- #vi /etc/pam.d/vsftpd.my
- //添加如下两行
- auth required /lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
- 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认证
- 建立虚拟用户映射的系统用户及对应的目录
- # useradd -s /sbin/nologin -d /var/ftpuser ftpuser //这个家目录将成为虚拟用户访问ftp目录的起始位置
- # chmod go+rx /var/ftpuser
- 请确保/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- 添加以下选项
pam_service_name=vsftpd.my
userlist_enable=YES
tcp_wrappers=YES- guest_enable=YES
guest_username=ftpuser- #service vsftpd restart
5、测试配置
- # ftp localhost
- Connected to localhost (127.0.0.1).
- 220 (vsFTPd 2.0.5)
- Name (localhost:root): marion
- 331 Please specify the password.
- Password: //密码是redhat
- 230 Login successful.
- Remote system type is UNIX.
- Using binary mode to transfer files.
- ftp> ls
二、为每个虚拟用户定制权限
- 实现:magedu 可上传文件 marion 只有访问权限
- user_config_dir 指令 可以实现让我们指定一个目录,在这个目录中为每一个用户创建一个同名的配置文件,用于定义这个用户在访问目录的
- 时候自己所独有的权限
- #cd /etc/vsftpd
- #mkdir virusers //创建一个目录,而后为用户建立对应的文件
- #cd virusers
- #vim magedu
- 添加
- anon_upload_enable=YES
- anon_mkdir_write_enable=NO
- anon_other_write_enable=NO 有上传权限没有删除权限
- #vim marion
- 添加
- anon_upload_enable=NO
- anon_mkdir_write_enable=NO
- anon_other_write_enable=NO
- 编辑 /etc/vsftpd/vsftpd.conf
- 添加
- user_config_dir=/etc/vsftpd/virusers
- 测试:
- #ftp localhost
- Name (localhost:root): magedu
- 331 Please specify the password.
- Password:
- 230 Login successful.
- Remote system type is UNIX.
- Using binary mode to transfer files.
- ftp> put inittab
- local: inittab remote: inittab
- 227 Entering Passive Mode (127,0,0,1,250,166)
- 150 Ok to send data.
- 226 File receive OK.
- 1666 bytes sent in 0.017 seconds (98 Kbytes/s) //上传成功
- ftp> ls
- 227 Entering Passive Mode (127,0,0,1,46,110)
- 150 Here comes the directory listing.
- -rw------- 1 503 503 608 Aug 04 10:22 fstab
- -rw------- 1 503 503 1666 Aug 04 10:55 inittab
- 226 Directory send OK.
- ftp> get fstab
- local: fstab remote: fstab
- 227 Entering Passive Mode (127,0,0,1,223,8)
- 550 Failed to open file. //不可以下载
- ftp> bye
- 同样方法测试mrion用户
- 不可以删除、上传
三、系统用户和虚拟用户同时可以访问 useradd -r -M gentoo
- #useradd -r gentoo
- #passwd gentoo
- redhat //密码为redhat
- #ftp localhost //用gentoo登陆 失败
- # tail -1 /var/log/secure
- Aug 4 19:08:20 station11 vsftpd: pam_mysql - SELECT returned no result.
- //到mysql中去找了,当然找不到了 系统用户用的是/etc/pam.d/vsftpd 虚拟用户用的是/etc/pam.d/vsftpd.my 将两个文件整合都一起
- #vim /etc/vsftpd/vsftpd
- 将内容改为如下形式,将/etc/pam.d/vsftpd.my中的内容添加到此文件中
- #session optional pam_keyinit.so force revoke
- auth sufficient /lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
- auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
- auth required pam_shells.so
- auth include system-auth
- account sufficient /lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
- account include system-auth
- session include system-auth
- session required pam_loginuid.so
- 而后编辑配置文件/etc/vsftpd/vsftpd.conf
- 将pam_service_name=vsftpd.my 改为 pam_service_name=vsftpd
- 重启服务
- #service vsftpd restart
- 测试:
- [root@sut20 ~]# ftp localhost
- Connected to localhost.localdomain.
- 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 (localhost:root): magedu //虚拟用户登陆
- 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 (127,0,0,1,239,100)
- 150 Here comes the directory listing.
- -rw------- 1 503 503 608 Aug 04 10:22 fstab
- -rw------- 1 503 503 1666 Aug 04 10:55 inittab
- 226 Directory send OK.
- [root@sut20 ~]# ftp localhost
- Connected to localhost.localdomain.
- 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 (localhost:root): gentoo //系统用户登陆
- 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 (127,0,0,1,239,100)
- 150 Here comes the directory listing.
- -rw------- 1 503 503 608 Aug 04 10:22 fstab
- -rw------- 1 503 503 1666 Aug 04 10:55 inittab
- 226 Directory send OK.
四、FTP服务器的访问控制
例如:禁止vsftp为172.16.100.200访问
- #vim /etc/hosts.deny
- 添加
- vsftpd: ALL EXCEPT 172.16. EXCEPT 172.16.100.150
- 测试机地址为172.16.100.150
- ftp 172.16.20.1
- 421 Service not available
- User <172.16.20.1:<none>>; //访问失败
综上:实现了基于mysql数据库架设FTP服务器的相关配置