vsftpd分为3种用户,分别为匿名用户、系统用户和虚拟用户;
虚拟用户通常指的就是非系统用户,登录ftp时需要提供用户帐号和密码,而帐号和密码存放在何处决定用户是否为系统用户,通常系统用户是通过pam_unix.so模块查找/etc/passwd和/etc/shadow中的帐号和密码来认证用户的,通过/etc/pam.d/system-auth来实现认证。
对于在互联网上公开的服务来说把我们的系统用户开放出去是很危险的,如果我们想让多个用户访问我们的ftp服务并且权限不一样该怎么做呢?这时利用系统用户的认证方式来认证就不行了,所以这就用到了虚拟用户的认证,虚拟用户通过pam_listfile.so、pam_ldap.so或pam_mysql.so模块来认证用户,此时将用户存放在listfile表或ldap服务中或mysql数据库中,此时将用户公开出去就不会给我们的系统带来安全隐患了,下面就来说一下利用pam_mysql.so模块来对用户认证的方式:
配置前准备:
1、 事先准备好yum源、安装好开发环境(Development Libraries、Development Tools)
2、 准备好cmake-2.8.8.tar.gz源码包(跨平台编译器,编译安装mysql-5.5.25a需要用到)、mysql-5.5.25a.tar.gz源码包和pam_mysql-0.7RC1.tar.gz源码包。
安装配置:
1、 编译安装cmake-2.8.8.tar.gz;
- #tar xf cmake-2.8.8.tar.gz
- #cd cmake-2.8.8
- #./bootstrap
- #make && make install
2、 编译安装mysql-5.5.25a.tar.gz
- #groupadd -r mysql
- #useradd -g mysql -d /data/mysql mysql
- #tar xf mysql-5.5.25a.tar.gz
- #cd mysql-5.5.25a
- #cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DSYSCONFDIR=/etc -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_SSL=system -DWITH_ZLIB=system -DWITH_LIBWRAP=0 -DDEFAULT_CHARSET=utf8 -DEXTRA_CHARSETS=all -DDEFAULT_COLLATION=utf8_general_ci -DENABLE_PROFILING=1
- #mkdir /data/mysql
- #chown mysql:mysql /data/mysql/
- #cd /usr/local/mysql
- #chown -R mysql:mysql .
- #scripts/mysql_install_db --datadir=/data/mysql/ --user=mysql
- #cp support-files/my-large.cnf /etc/my.cnf
- #vim /etc/my.cnf(添加datadir = /data/mysql并修改thread_concurrency = 2)
- #cp support-files/mysql.server /etc/rc.d/init.d/mysqld
- #chkconfig --add mysqld
- #chkconfig mysqld on
- #chown -R root .
- #vim /etc/profile(添加PATH=/usr/local/mysql/bin:$PATH)
- #export PATH=/usr/local/mysql/bin:$PATH
- #echo ‘/usr/local/mysql/lib’ > /etc/ld.so.conf.d/mysql.conf
- #ldconfig
- #ln -sv /usr/local/mysql/include/ /usr/include/mysql
- #vim /etc/man.config(添加PATH /usr/local/mysql/man)
- #service mysqld start
3、 安装pam_mysql-0.7RC1;
- #tar xf pam_mysql-0.7RC1.tar.gz
- #cd pam_mysql-0.7RC1
- #./configure --with-mysql=/usr/local/mysql --with-openssl
- #make && make install
4、 安装vsftpd:
- #yum -y install vsftpd
- #service vsftpd start
配置过程:
1.准备数据库及相关表,建立名为vsftpd的数据库来存放相关虚拟用户的帐号
- mysql> create database vsftpd;
- mysql> grant select on vsftpd.* to vsftpd@localhost identified by '123456';
- mysql> grant select on vsftpd.* to [email protected] identified by '123456';
- mysql> use vsftpd;
- mysql> create table users (
- -> id int AUTO_INCREMENT NOT NULL,
- -> name char(20) binary NOT NULL,
- -> password char(48) binary NOT NULL,
- -> primary key(id)
- -> );
添加测试的虚拟用户,其密码采取加密存放的方式
- mysql> insert into users(name,password) values('benet',password('123456'));
- mysql> insert into users(name,password) values('aptech',password('123456'));
查看结果
- mysql> select * from users;
- +----+-----------+----------------------------------------------------------------------------+
- | id | name | passwd |
- +----+-----------+----------------------------------------------------------------------------+
- | 1 | benet | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
- | 2 | aptech | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
- +----+-----------+----------------------------------------------------------------------------+
- 3 rows in set (0.00 sec)
2.建立pam认证所需文件
- #vim /etc/pam.d/vsftpd.mysql
添加如下两行
- 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
3.修改vsftpd的配置文件,使其适应mysql认证
建立虚拟用户映射的系统用户及对应的目录
- #useradd -s /sbin/nologin -d /var/ftp2 vsftpd
- #chmod go+rx /var/ftp2
编辑/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
- guest_enable=YES
- guest_username=vsftpd
修改以下选项:
- pam_service_name=vsftpd.mysql
5、 重新启动vsftpd服务并验证结果:
- #service vsftpd restart
以mysql数据库中benet用户身份到另外的windows主机上进行访问:
虚拟用户benet用户登录成功;
以mysql数据库中aptech用户身份到另外的windows主机上进行访问:
虚拟用户aptech用户登录成功;
添加本地用户tom并给予密码redhat然后访问ftp服务:
-
# useradd tom
-
# passwd tom
-
Changing password for user tom.
-
New UNIX password:
-
BAD PASSWORD: it is based on a dictionary word
-
Retype new UNIX password:
-
passwd: all authentication tokens updated successfully.
本地用户tom登录失败;
这里mysql数据库中的用户的权限是一样的,怎样使aptech和benet用户权限不一样呢?这就要用到vsftp的user_config_dir指令;
我们假如让benet用户有上传权限但是没有删除权限;
让aptech用户有删除权限但是没有上传权限;
在/etc/vsftpd/目录下创建virusers目录(可以根据自己需要任意创建),然后在该目录下创建跟benet和aptech用户名相同的文件:
benet文件中内容如下:
- anon_upload_enable=YES
- anon_mkdir_write_enable=NO
- anon_other_write_enable=NO
aptech文件中内容如下:
- anon_upload_enable=NO
- anon_mkdir_write_enable=NO
- anon_other_write_enable=NO
编辑/etc/vsftpd/vsftpd.conf配置文件,添加如下行:
- user_config_dir=/etc/vsftpd/virusers
重启vsftpd服务:
- # service vsftpd restart
以mysql数据库中benet用户身份到另外的windows主机上进行访问:
benet用户仅有上传权限但是没有删除权限;
以mysql数据库中aptech用户身份到另外的windows主机上进行访问:
aptech用户仅有删除权限但是没有上传权限;
通过上述操作就实现了ftp服务通过pam_mysql认证用户并让不同的虚拟用户拥有了不同的权限,这样也给我们的ftp服务增加了安全性。