为了提高系统的安全性,我们采用虚拟用户而非系统(匿名)用户的形式访问FTP。整体思路是通过开启vsftp中的虚拟账户功能并调用新的pam认证模块,然后再修改pam模块使得可以通过mysql验证用户的合法性。以下为实验过程。
第一步装包:
yum install -y vsftpd mysql-server mysql-devel pam-devel
yum groupinstall -y Development tools
tar -xf pam_mysql-0.7RC1.tar.gz -C /usr/src/
cd /usr/src/pam_mysql-0.7RC1
./configure
make && make install
第二步配置mysql
service mysqld start
mysql -p
create database ftpusers;
use ftpusers;
create table users( id int AUTO_INCREMENT NOT NULL,name char(20) NOT NULL UNIQUE KEY, passwd char(48) NOT NULL, primary key(id) );
insert into users(name,passwd)values('nick',password('redhat'));
grant select on ftpusers.* to virftp@localhost identified by 'vftpadm';
flush privileges;
第三步编辑vsftpd.conf,以下是我的配置:
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
xferlog_std_format=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
listen=YES
user_config_dir=/etc/vsftpd/user_config
local_root=/var/ftp/pub
guest_enable=YES
guest_username=virftp
pam_service_name=vftp
userlist_enable=YES
tcp_wrappers=YES
userlist_deny=YES
第四步编辑pam文件:vim /etc/pam.d/vftp
session optional pam_keyinit.so force revoke
auth sufficient /lib64/security/pam_mysql.so user=virftp passwd=vftpadm host=localhost db=ftpusers table=users usercolumn=name passwdcolumn=passwd crypt=2
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include password-auth
account sufficient /lib64/security/pam_mysql.so user=virftp passwd=vftpadm host=localhost db=ftpusers table=users usercolumn=name passwdcolumn=passwd crypt=2
account include password-auth
session required pam_loginuid.so
session include password-auth
上面红色字体是验证虚拟账户用的,其余为默认vsftpd验证,local账户验证时用得到。
第五步:添加虚拟账户
useradd virftp -s /sbin/nologin -d /home/virftp virftp
chown virftp. -R /home/virftp/
第六步:创建虚拟账户配置文件
mkdir /etc/vsftpd/user_config
cd /etc/vsftpd/user_config
创建虚拟账户nick:
vim nick
local_root=/home/virftp/
这里只限制了其根目录,这里不定义的一律继承主配置文件的设定(/etc/vsftp/vsftpd.conf)
cp一个文件到此目录来验证试验
cp /etc/inittab /home/virftp
service vsftpd restart
最后登陆账户nick 密码redhat 查看结果
试验总结:开始我在pam文件中mysql验证没用sufficient而用了required,直接导致不能用local账户登录。
这里解释下两者的含义,sufficient代表一旦满足这条规则,则直接退出不往下匹配了,如果不满足,则往下继续匹配。
required说明如果不匹配则直接退出,如果匹配则继续往下匹配。
所以当我用required时,local账户不匹配直接退出。