ftp服务有时需要对发出请求的进行认证,并且不同用户所赋予的权限不同。用户的认证一般在/etc/passwd/etc/shadow文件中,是通过pam_unix.so模块认证的,它的认证依赖于/etc/pam.d/system-auth文件,在此认证的用户都是系统用户,而对于被公开在互联网上被访问的服务来说,显然这种认证机制使安全无法得到相应保障。
vsftpd服务的用户有三种,分别是匿名用户,系统用户和虚拟用户。所以对于vsftpd服务的用户认证还有另外一种机制,那就是虚拟用户的引入。它的认证借助于其他的模块,例如借助于pam_listfile.so模块,到其他文件去实现认证;或者使用pam_ldap.so模块,ldap的服务中去实现认证;或者借助于pam_mysql.so,到数据库里面实现认证。可以想象一个来自于数据库的且专门为vsftpd服务所设定的用户账号和密码是不可能登入到系统中的,保证了系统安全性。
Vsftpd服务如何实现基于虚拟用户来认证呢?就以mysql为例来说明,将能够登录vsftpd服务的用户账号和密码放入mysql数据库的一个表中,当用户登录vsftpd服务时,到此表中认证用户账号和密码。
默认情况下PAM是不支持mysql来实现认证的,因此我们需要事先安装pam_mysql模块,这里使用的版本是pam_mysql-0.7RC1,下载源代码到本地:
#tar zxvf pam_mysql-0.7RC1.tar.gz            
#cd pam-mysql-0.7RC1
#./configure –with-mysql=/usr/local/mysql –with-openssl    
#make
#make install
--with-mysql=        #要用到mysql的开发组件,所以要指定mysql的安装路径
--with-openssl 
       #实现与mysql的加密通信
pam_mysql安装完成后就可以使用了,而且会在/lib/security/lib64/security目录下生成pam_mysql.xo库文件。这个pam模块支持一些选项,实现PAM认证时,到mysql数据库中查找请求用户的账号和密码是否存在。所以需要提前安装mysql服务,这里我把它安装到/usr/local路径下。在这个数据库中新建一个表,表中包含两个字段,分别是用户名和密码。密码要加密存放。
#mysql -uroot –p                    #以root用户进入mysql数据库
>create database vsftpd         #创建数据库vsftpd
> GRANT SELECT ON vsftpd.* TO vsftpd@localhost IDENTIFIED BY 'redhat'         #把select权限赋予localhost主机上的vsftpd用户,密码是redhat,它只能执行select命令。
注意:这个vsftpd用户的账号和密码是要写入pam的配置文件中的,很可能被其他用户看到,所以只能给它查询权限。
    >use vsftpd                                         #设置成默认数据库
    >create table users(                        #创建users表
->id int not null AUTO_INCREMENT PRIMARY KEY,    #字段1:id号,方便识别用户,设置为自动增长的整数,非空,主键。
->name CHAR(15) NOT NULL NUIQUE KEY,        #字段2:用户名,设置为不能重名
->password CHAR(48) NOT NULL         #字段3:密码,加密后定长48位
->);
>DESC users;                    #查看users表
添加测试的虚拟用户,其密码采取加密存放的方式,可同时添加两个用户lhf,tom:
>INSERT INTO users (name,password) VALUES ('lhf',password('redhat')),('tom',password('redhat'));
        >SELECT * FROM users;     #查看添加的虚拟用户
>FLUSH PRIVILEGES;            #使立即生效
>\q                             #退出数据库
接下来建立pam认证所需要的文件:在/etc/pam.d目录下新建一个文件vsftpd.mysql,添加如下两行:
auth   required /lib/security/pam_mysql.so user=vsftpd passwd=redhat host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account  required /lib/securitypam_mysql.so user=vsftpd passwd=redhat host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
注释:
auth:验证密码是否正确
required:必须通过检查,具有一票否决权
/lib/security/pam_mysql.so:指定使用的库文件
user=vsftpd passwd=redhat:指定连接mysql数据库的用户和密码
host=localhost:指定是本机的mysql
db=vsftpd table=users:把数据库和表与所建数据库对应起来
usercolumn=name passwdcolumn=password:指定查找时的关键字段
crypt=2:因为密码是加密存放的,指定加密的级别为2
account:审核用户账户是否依然有效
保存退出后,这两行内容就实现了让pam到指定数据库和表去验证用户的账号和密码。
配置vsftpd服务,使它能够使用上面的pam认证文件:
准备工作1虚拟用户需要映射为系统用户,所以需要新建一个用户,将vsftpd服务的所有用户映射称为这个系统用户。而且这个系统用户的家目录将成为访问vsftpd服务的起始位置。例如,创建用户ftpuser,并指定其家目录为/var/ftpuser:
#useradd -s /sbin/nologin -d /var/ftpuser  ftpuser
#chmod go+rx /var/ftpuser    #修改家目录权限,使虚拟用户登陆以后具有读和执行权限
准备工作2:确保/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     #这项需要手动加上,把所有用户都锁定在家目录下
准备工作3修改/etc/vsfptd/vsftpd.conf中的pam_service_name=vsftpd为如下内容:
pam_service_name=vsftpd.mysql
可以配置vsftpd服务的配置文件了,为/etc/vsftpd/vsftpd.conf添加以下选项:
guest_enable=YES         #启用来宾账号
guest_username=vsftp     #来宾账户是vsftpd
保存退出后就可以重启vsftpd服务进行验证了!
验证:使用数据库中的‘lhf’或‘tom’文件访问vsftpd服务。