IT技术互动交流平台

vsftp虚拟用户通过pam和mysql认证

作者:zhanghansina  发布日期:2013-12-17 09:06:48

VSFTPD是一种在UNIX/Linux中非常安全且快速的FTP服务器,目前已经被许多大型站点所采用。VSFTPD支持将用户名和口令保存在数据库文件或数据库服务器中。VSFTPD称这种形式的用户为虚拟用户。相对于FTP的本地(系统)用户来说,虚拟用户只是FTP服务器的专有用户,虚拟用户只能访问FTP服务器所提供的资源,这大大增强系统本身的安全性。相对于匿名用户而言,虚拟用户需要用户名和密码才能获取FTP服务器中的文件,增加了对用户和下载的可管理性。对于需要提供下载服务,但又不希望所有人都可以匿名下载;既需要对下载用户进行管理,又考虑到主机安全和管理方便的FTP站点来说,虚拟用户是一种极好的解决方案。

 


1、编译安装pam_mysql
注意:安装这些软件包之前不要忘记安装开发环境
yum -y groupinstall "Development Tools"
yum -y groupinstall "Development Libraries"
mysql安装请参考本文LAMP最新编译安装
tar xf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1
./configure --with-mysql=/usr/local/mysql
make && make install
cp /usr/lib/security/pam_mysql.so /lib/security/


2、编译安装vsftpd
tar xf vsftpd-2.3.5.tar.gz
cd vsftpd-2.3.5
less INSTALL /建议查看这个安装文档,里面有详细说明安装vsftpd步骤/
make && make install


复制vsftpd的主配置文件
mkdir -pv /etc/vsftpd
cp vsftpd.conf /etc/vsftpd/


编辑配置文件/etc/vsftpd/vsftpd.conf
添加:listen=YES


启动vsftpd服务器
/usr/local/sbin/vsftpd &


-----------------------------------------------------------------------------------------


二、服务配置
1、配置mysql,创建数据库表用户等操作


创建数据库为vsftpd
mysql> create database vsftpd;
Query OK, 1 row affected (0.10 sec)


创建表为users
mysql> use vsftpd;
Database changed
mysql> create table users (
   -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   -> name CHAR(15) NOT NULL UNIQUE KEY,
   -> password CHAR(48) NOT NULL );
Query OK, 0 rows affected (0.22 sec)


添加两个用户,采用加密模式
mysql> insert into users (name,password) values ('test',password('123456'));
Query OK, 1 row affected (0.06 sec)


mysql> insert into users (name,password) values ('test1',password('123456'));
Query OK, 1 row affected (0.01 sec)


为用户vsftpd授权
mysql> grant select on vsftpd.* to vsftpd@localhost identified by '123456';
Query OK, 0 rows affected (0.08 sec)


mysql> grant select on vsftpd.* to vsftpd@127.0.0.1  identified by '123456';
Query OK, 0 rows affected (0.01 sec)


最后刷新一下表
mysql> flush privileges;           
Query OK, 0 rows affected (0.05 sec)

 


2、建立认证文件
cd /etc/pam.d
touch vsftpd.mysqluser
vim vsftpd.mysqluser 添加以下内容
auth required pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
保存退出


说明:
auth 对用户所提供的认证信息进行验证,比如检查用户账号及密码
account 执行基于非验证的账号管理。它主要用来允许或者限制用户对某个服务的访问时间,当前有效的系统资源最多可以有多少个用户,限制用户的位置等
crypt=2: 使用MYSQL中的password()函数加密

 


3、建立虚拟用户映射的系统用户及对应的目录
useradd -s /sbin/nologin -d /var/ftpuser ftpuser
chmod go+rx /var/ftpuser


4、配置vsftpd主配置文件/etc/vsftpd/vsftpd.conf
请确保/etc/vsftpd/vsftpd.conf中已经启用了以下选项
anonymous_enable=YES           #表示允许匿名用户登录访问
local_enable=YES   #表示允许本地系统用户登录访问
write_enable=YES               #表示允许写入权限
anon_upload_enable=NO   #表示匿名用户是否有上传的权限,这里是关闭的,要开启NO改成YES
anon_mkdir_write_enable=NO     #表示匿名用户没有写入的权限,这里是关闭的,开开启NO改成YES
chroot_local_user=NO           #表示把ftp本地用户锁定在家目录,为了安全,建议关闭


添加以下选项
guest_enable=YES   #启用虚拟用户
guest_username=ftpuser   #虚拟用户映射的系统用户,就是上面我们建立的用户,名字是ftpuser
pam_service_name=vsftpd.ftp    #启用PAM认证,并指定文件,这个文件路径在/etc/pam.d/ftp


6、关闭vsftpd和开启vsftpd
关闭vsftpd:killall vsftpd
开启vsftpd:/usr/local/sbin/vsftpd   /etc/vsftpd/vsftpd.conf &


测试:lftp test@172.16.0.23


输入密码就可以正常登录了

 


三、解决系统用户无法登录ftp
如果使用虚拟用户,那么系统本地用户就无法登录了,如果要解决这个问题,必须可以修改/etc/pam.d/vsftpd文件,把虚拟用户基本mysql的配置文件(/etc/pam.d/vsftpd.my),放置到/etc/pam.d/vsftpd里就可以解决了,需要添加和修改的几个选项如下:
#%PAM-1.0
auth sufficient  pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account sufficient  pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
#session    optional     pam_keyinit.so    force revoke
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    include      system-auth
#session    include     system-auth  
#session    required     pam_loginuid.so


此时,再次测试,虚拟用户和系统本地用户都可以正常登录,但是系统本地用户登录的家目录是虚拟用户的家目录,无法登录自己系统
本地的家目录,如果系统用户要想使用家目录,可以用以下参数定义

 


实验过程中遇到的问题:
问题一、用虚拟账号登录ftp的时候报错:ls: Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()
解决方法:chown a-w /var/ftpuser,做完这步但是虚拟用户就无法上传文件了,这时在/

 


user_config_dir=/etc/vsftpd/users
1. which vsftpd                       # 确定文件路径         
2. vim /etc/hosts.deny                 # 改文件立即生效 
vsftpd: 172.16.0.2300 


#假设仅允许172.16网段访问 
vim /etc/hosts.allow 
vsftpd: 171.16                        # 只允许172.16.0.0/16网段 
vim /etc/hosts.deny 
ALL: ALL                                            # 拒绝其他的用户登陆

Tag标签: vsftp   虚拟用户   mysql认证  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规