Vsftpd 配置之结合MySql数据库
将vsftpd与MySql相结合,我们可以把用户和日志信息放到数据库里面去,如果再结合php来管理数据库,则可以使vsftpd管理更加方便。下面我们就来讨论一下基于MySql的虚拟户和日志功能。
使用MySql来实现虚拟用户
前面我们介绍了两类用户,关于匿名用户的语句比较多,权限限制比较灵活;而本地用户的特点是每个用户对应一个密码和主文件夹,登录控制比较灵活。可不可以将两者的优点结合一下呢?答案是肯定的,这就是虚拟用户。关于虚拟用户的启用,需要使用以下两条语句:
- guest_enable=yes/no
- guest_username=user_name
上述guest_enable表示是否开启虚拟用户功能,guest_username表示虚拟用户登录后映射的本地用户名。如果开启虚拟用户功能,本地用户登录后将映射到guest_username参数指定的用户,主目录也变成该用户的主目录。
我们修改vsftpd主配置文件,变为下面的样子:
- listen=yes
- anonymous_enable=yes
- local_enable=yes
- pam_service_name=vsftpd
- write_enable=yes
- dirlist_enable=yes
- download_enable=yes
- anon_upload_enable=yes
- anon_mkdir_write_enable=yes
- anon_other_write_enable=no
- anon_umask=073
- guest_enable=yes
- guest_username=virftp
再新建一个用户virftp改变一下其主目录的权限:
- # useradd -d /var/virftp -s /sbin/nologin virftp
- # chmod 704 /var/virftp
这时再以/etc/passwd中的用户登录ftp,通过查看内容,会发现主目录已经切换到/var/virftp/,可以下载和上传文件,但不能改名和删除。这就是说,限制匿名用户的参数也同样适用于本地用户。
如果想让虚拟用户像本地用户那样拥有每个用户独立的主目录、独立的配置文件和权限,又该怎么办呢?还记得user_config_dir参数吧!在每个用户独立的配置文件里设定不同的权限和local_root参数就可以了。
再来看看这个参数:
- virtual_use_local_privs=yes/no
从刚才的实验可以看到,虚拟用户登录后,受到匿名用户参数的限制。我们可以通将此参数的值改为yes,则虚拟用户会变得和本地用户一样,拥有和本地用户一样的特权。由于我们平常都是看中了匿名用户限制参数比较细致这个特点才启用虚拟用户的,所以此参数默认值为no!
下面我们结合MySql,把用户登录信息放到数据库里面去。首先我们需要安装MySql。
到官网下载MySql,为了简单起见,我们下载在linux下已经编译好的版本。我下载的版本是mysql-5.1.18-beta-linux-i686-glibc23.tar.gz,然后照下面的步骤来安装MySql。
- # groupadd mysql
- # useradd -g mysql mysql
如果系统中已经有了mysql用户,就可以省掉这步操作。
- # cd /usr/local
- # tar zxvf mysql-5.1.18-beta-linux-i686-glibc23.tar.gz
- # ln -s mysql-5.1.18-beta-linux-i686-glibc23 mysql
如果原来系统中已经安装旧版mysql,***将它卸载,除非你有足够的把握很好地面对系统中的两个mysql;通常习惯将mysql安装在/usr/local/mysql中,但为了将来版本升级的需要,建议使用链接方式使用mysql。
- # cd mysql
- # chown -R mysql:mysql .
- # scripts/mysql_install_db --user=mysql
初始化mysql数据库,这步之前必须保证mysql用户有权限访问mysql目录。
- # chown -R root .
- # chown -R mysql data
***做这两步,至少官方文档是这么建议的。
MySql的命令和man文档并不在PATH和MANPATH中,所以我们要手动加入。打开vi /etc/profile文件,找到export PATH ...那一行,大约在40行左右,在它的前面加上一行:
- PATH=”$PATH”:/usr/local/mysql/bin
打开/etc/man.config(有的版本为/etc/man.conf),在它的任何地方加入一行:
- MANPATH /usr/local/mysql/man
到这时mysql就已经安装好了,通过这个命令启动mysql:
/usr/local/mysql/bin/mysqld_safe --user=mysql &
为了让mysql支持开机启动,执行下面的命令:
- # cp support-files/mysql.server /etc/rc.d/init.d/mysqld
- # chkconfig –add mysqld
这样就可以让mysql以服务的方式开机启动,且还可以使用如下命令管理mysql服务:
# service mysqld {start|stop|restart|reload|force-reload|status}
启动mysql服务,检测下是否正常运行:
- # netstat -l|grep mysql
- tcp 0 0 *:mysql *:* LISTEN
- unix 2 [ ACC ] STREAM LISTENING 25534 /tmp/mysql.sock
看到了吧,mysql已经在监听了,但它的socket file在/tmp/下,郁闷!
默认情况下,mysql没有密码,任何人都可以登入。为了加强安全性,我们给mysql加上root帐号密码:
- # mysqladmin -u root password 'your_P@ssw0rd'
这样以后登录就需要密码了:
- # mysql -u root -p
- Enter password:
- Welcome to the MySQL monitor. Commands end with ; or \g.
- Your MySQL connection id is 5
- Server version: 5.1.18-beta MySQL Community Server (GPL)
- Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
- mysql>
建立数据库ftpdb:
- mysql> create database ftpdb;
#p#
在数据库ftpdb中建立一个表ftpuser,表中有username和password字段:
- mysql> use ftpdb;
- Database changed
- mysql> create table ftpuser(username char(20) not null, password char(64) not null);
- Query OK, 0 rows affected (0.15 sec)
这里要注意密码字段的长度,不同的算法生成的密文长度是不一样的,建议不要少于50位,否则可能导致密文在存储时被截短。
我们插入两条记录作为两个ftp的登录名和密码,使用mysql自带的password函数来加密密码:
mysql> insert into ftpuser values('test1',password('abc'));
Query OK, 1 row affected, 1 warning (0.08 sec)
mysql> insert into ftpuser values('test2',password('123'));
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from ftpuser;
---------- -------------------------------------------
| username | password |
---------- -------------------------------------------
| test1 | *0D3CED9BEC10A777AEC23CCC353A8C08A633045E |
| test2 | *23AE809DDACAF96AF0FD78ED04B6A265E0***A257 |
---------- -------------------------------------------
2 rows in set (0.00 sec)
然后我们再建立一个可以让ftp服务登陆数据库的用户:
mysql> grant select on ftpdb.ftpuser to ftpdb_query@localhost identified by 'P@ssw0rd';
这个用户只能浏览 ftpdb 数据库下的 ftpuser 表中内容,我们如果想以后分配一个可以完全管理 ftpdb 数据库的用户,再这样:
mysql> grant all on ftpdb.* to ftpdb_all@localhost identified by 'P@ssw0rd';
到这里MySql的设置就算完了,接下来安装 PAM 基于 mysql 数据库的认证插件,我们可以到http: //sourceforge.net/projects/pam-mysql/下载得到。我下载的文件是pam_mysql- 0.7RC1.tar.gz。
- # tar zxvf pam_mysql-0.7RC1.tar.gz
- # cd pam_mysql-0.7RC1
- # ./configure –with-mysql=/usr/local/mysql
- # make
- # make install
这里要注意两点,一是我们的mysql是手动安装在/usr/local/mysql下的,因此./configure命令需要指定mysql安装目录;二是安装好之后,pam_mysql.so被安装到了/usr/lib/security. 如果make过程出现错误,不要理会,只要产生pam_mysql.so文件即可,我们可以直接将此文件考入/lib/security/目录。
然后来编写PAM认证文件:
- # vi /etc/pam.d/ftpdb
- auth required /usr/lib/security/pam_mysql.so user=ftpdb_query passwd=P@ssw0rd host=localhost db=ftpdb table=ftpuser usercolumn=username passwdcolumn=password crypt=2
- account required /usr/lib/security/pam_mysql.so user=ftpdb_query passwd=P@ssw0rd host=localhost db=ftpdb table=ftpuser usercolumn=username passwdcolumn=password crypt=2
注意,整个这个文件中只有auth和account两行内容,中途不要加回车换行;文件中不要再有包含其它pam模块的行;如果pam_mysql.so文件没有在/lib/security目录,就需要指定文件路径。文件中其它字段的意思是:
user 访问数据库用户名
passwd 访问数据库用户密码
host 数据库主机
db 数据库名
table 表名
usercolumn 用户列名
passwdcolumn 密码列名
crypt 密码验证机制;0 代表明文,1 代表DES 加密,2 代表Mysql的password()函数加密,3代表md5算法,4代表sha加密。
现在我们修改vsftpd主配置文件/etc/vsftpd/vsftpd.conf,把pam_service_name的值改为ftpdb,也就是我们刚才建立的那个PAM认证文件的名字。再登录服务器测试,可以发现/etc/passwd中的用户已经无法登录到服务器了,而数据库中存储的用户名是可以登录的。我们还可以按前面所述的方法为每个虚拟用户建立独立的配置文件,指定独立的主目录;还可以结合apache服务建立php页面,然后实现让用户在web界面注册帐号、修改密码,这要比原来的认证方式灵活得多。
在MySql中记录日志
接下来我们看一下如何利用刚才的PAM 模块来结合mysql 数据库记录vsftpd 服务的日志。在介绍之前,我们来看看vsftp中关于日志记录的参数。
- xferlog_enable=yes/no //是否启用 xferlog 日志格式
- xferlog_std_format=yes/no //是否采用标准格式记录日志
- xferlog_file=/path/to/logfile //xferlog 日志文件所在位置,默认为/var/log/xferlog
上面的参数设置记录xferlog日志的格式。这是早期Wu-ftpd服务的日志格式,它会记录上传和下载的动作。vsftpd也有专有的日志格式,用下列参数设置:
- dual_log_enable=yes/no //是否采用Vsftpd自己的日志记录方式
- log_ftp_protocol=yes/no //是否记录所有的ftp命令日志
- vsftpd_log_file=/path/to/logfile //指定vsftpd 日志文件位置,默认为/var/log/vsftpd.log
xferlog_enable的默认值为no(vsftpd提供的配置文件模版将其值改为了yes),dual_log_enable的默认值也为no,就是说默认情况下vsftpd是不记录日志的。我们也可以将日志信息写入系统日志/var/log/messages中,使用如下参数:
syslog_enable=yes/no
还是建议大家把日志记录为单独的文件,以便浏览和管理。实验比较简单,我们就不做了。
对于使用文件来记录日志的方式来说,我们必须登录到服务器之后,才能查看日志。这样做不方便,不灵活。我们可以把日志放到数据库中,结合www服务建立一个浏览日志的页面,这样就非常舒服的看到web方式的日志了。下面来看看如何将日志写入数据库中去。
首先必须使用虚拟用户所在的同一个数据库,新建立存储日志的表:
mysql> create table ftplog
-> (log char(100),
-> user char(20),
-> host char(20),
-> time datetime,
-> pid int);
修改 PAM 配置文件,在原来的基础上我们改动一下:
- # vi /etc/pam.d/ftpdb
- auth required /usr/lib/security/pam_mysql.so user=ftpdb_all passwd=P@ssw0rd host=localhost db=ftpdb table=ftpuser usercolumn=username passwdcolumn=password crypt=2 sqllog=yes logtable=ftplog loglogmsgcolumn=log logusercolumn=user loghostcolumn=host logtimecolumn=time logpidcolumn=pid
- account required /usr/lib/security/pam_mysql.so user=ftpdb_all passwd=P@ssw0rd host=localhost db=ftpdb table=ftpuser usercolumn=username passwdcolumn=password crypt=2 sqllog=yes logtable=ftplog loglogmsgcolumn=log logusercolumn=user loghostcolumn=host logtimecolumn=time logpidcolumn=pid
注意在这个文件中依然就是原来的两行,其中加入的内容分别对应如下:
sqllog 表示是否将日志记录到数据库中
logtable 记录日志的表名
logmsgcolumn 记录日志信息的列
logusercolumn 登录用户
loghostcolumn 登录主机
logtimecolumn 登录时间
logpidcolumn 处理该用户连接的进程pid
这次我换了一个登陆数据库用户,使用先前建立的有完全权限的用户ftpdb_all,这个用户才有在数据库中使用insert命令的权限。
【编辑推荐】