实战:VSFTP+MYSQL虚拟用户的配置
时间:2007-02-27 来源:lyjjr
实验环境:
操作系统 RedHat 4AS (内核2.6.9-5),自定义只选择development tools安装
VSFTP-2.0.4 Mysql -5.0.24 pam_mysql-0.7RC1
一、 VSFTPD编译安装
1、上传源包到 /usr/local/vsftpd-2.0.4.tar.tar
2、tar zxvf vsftpd-2.0.4.tar.tar
3、cd /usr/local/vsftpd-2.0.4
4、vi builddefs.h内容如下
#ifndef VSF_BUILDDEFS_H
#define VSF_BUILDDEFS_H
#define VSF_BUILD_TCPWRAPPERS
#define VSF_BUILD_PAM (这行是关键,其它的用默认的就可以了。)
#define VSF_BUILD_SSL
#endif /* VSF_BUILDDEFS_H */
5、make
6、ls -l vsftpd
-rwxr-xr-x 1 root root 86088 Jun 6 22:26 vsftpd //可执行程序已被编译成功
7、创建必要的帐号,目录.
# useradd nobody //可能你的系统已经存在此帐号,那就不用建立
# mkdir /usr/share/empty //可能你的系统已经存在此目录,那就不用建立
# mkdir /var/ftp //可能你的系统已经存在此目录,那就不用建立
# useradd -d /var/ftp ftp //可能你的系统已经存在此帐号,那就不用建立
# chown root:root /var/ftp
# chmod og-w /var/ftp
请记住,如果你不想让用户在本地登陆,那么你修改/etc/passwd文件,把他的登陆SHELL设置成/sbin/nologin,比如以上的nobody和ftp我就设置成/sbin/nologin
8、安装vsftp配置文件,可执行程序,man等:
# install -m 755 vsftpd /usr/local/sbin/vsftpd
# install -m 644 vsftpd.8 /usr/share/man/man8
# install -m 644 vsftpd.conf.5 /usr/share/man/man5
# install -m 644 vsftpd.conf /etc/vsftpd/vsftpd.conf
如果该步出错(install: cannot create regular file `/etc/vsftpd/vsftpd.conf': No such file or directory)是因为没有/etc/vsftpd目录,自己建一下就可以了。
mkdir /etc/vsftpd
9、编译/etc/vsftpd/vsftpd.conf在最后加入一行
listen=YES
10、启动FTP服务
/usr/local/sbin/vsftpd /etc/vsftpd/vsftpd.conf &
此时已经可以匿名登录FTP了,这样就完成了VSFTPD的安装。
(如果直接/usr/local/sbin/vsftpd 来启动的话,默认会调用/etc/vsftpd.conf配置文件的内容,请注意!)
如果要退出VSFTPD的话,只能用ps aux 命令把有关VSFTPD相关的行,用KILL ID的形式删除。
该步是启动vsftpd服务,如果你想要让机器一开机自动运行FTP的话,则应该把该步写到/etc/rc.d/rc.local中去。
二、 MYSQL编译安装
1、 上传源包到/usr/local/mysql-5.0.24.tar.tar
2、 tar zxvf mysql-5.0.24.tar.tar
3、 cd /usr/local/mysql-5.0.24
4、 groupadd mysql
5、 useradd -g mysql mysql
6、 ./configure --prefix=/usr/local/mysql
7、 make
8、 make install
9、 cp support-files/my-medium.cnf /etc/my.cnf
10、cd /usr/local/mysql
11、bin/mysql_install_db --user=mysql
12、chown -R root .
13、chown -R mysql var
14、chgrp -R mysql .
15、bin/mysqld_safe --user=mysql &
该步是启动mysql服务,如果你想要让机器一开机自动运行的话,则应该把该步写到 /etc/rc.d/rc.local中去。
三、 配置虚拟用户
VSFTPD的本地用户本身是系统的用户,除了可以登录FTP服务器外,还可以登录系统使用其他系统资源,而VSFTPD的虚拟用户则是FTP服务的专用用户,虚拟用户只能访问FTP服务器资源。对于只需要通过FTP对系统有读写权限,而不需要其他系统资源的用户或情况来说,采用虚拟用户方式是很适合的。 VSFTPD的虚拟用户采用单独的用户名/口令保存方式,与系统账号(passwd/shadow)分离,这大大增强了系统的安全性。VSFTPD可以采用数据库文件来保存用户/口令,如hash;也可以将用户/口令保存在数据库服务器中,如MySQL等。VSFTPD验证虚拟用户,则采用PAM方式。由于虚拟用户的用户名/口令被单独保存,因此在验证时,VSFTPD需要用一个系统用户的身份来读取数据库文件或数据库服务器以完成验证,这就是guest用户,这正如同匿名用户也需要有一个系统用户ftp一样。当然,guest用户也可以被认为是用于映射虚拟用户。
配置虚拟用户分为几部分:guest用户的创建、用户/口令的保存、PAM认证配置、vsftpd.conf文件设置等。
1、 guest用户的创建
useradd -d /home/ftpsite virtual
2、 用户/口令的保存
1)mysql 该命令在 /usr/local/mysql/bin中。
2)create database vsftpd; 创建一个数据库,注意SQL语句以分号结尾。
3)use vsftpd; 打开刚建的数据库。
4)create table users (id int AUTO_INCREMENT NOT NULL,name char(16) binary NOT NULL,passwd char(48) binary NOT NULL,primary key(id)); 建一张表,两个字段。
5)create table logs (msg varchar(255), user char(16), pid int, host char(32), rhost char(32), logtime timestamp ); 建一张表,两个字段。
6)quit
7)mysql
8)grant select on vsftpd.users to virtual@localhost identified by 'adm0509';
grant insert on vsftpd.logs to virtual@localhost identified by 'adm0509';
第一行意思为,允许virtual用户在本地对vsftpd.users表可以执行select命令。并设置密码。
第二行意思为,允许virtual用户在本地对vsftpd.logs表可以执行insert命令。并设置密码。
注意此处的密码要与以下配置的PAM认证中的密码保持一致。
9)use vsftpd
10)insert into users (name,passwd) values('lyjjr1','abc');
insert into users (name,passwd) values('lyjjr2','bcd');
向表内加入两个帐号及密码。
11)select * from users;
如果能看到表内容就表示正常了。
3、 PAM认证配置
1)把源包考到 /usr/src/pam_mysql-0.7RC1.tar.gz
2)tar zxvf pam_mysql-0.7RC1.tar.gz
3)cd pam_mysql-0.7RC1
ln -s /usr/local/mysql/lib/mysql /usr/lib/mysql
ln -s /usr/local/mysql/include/mysql /usr/include/mysql
4)./configure --with-openssl
5)make
6)make install
7)配置/etc/pam.d/vsftpd
内容如下(注意一下实际pam_mysql.so的路径,进行相应更改.)
auth required /usr/lib/security/pam_mysql.so user=virtual passwd=adm0509 host=/tmp/mysql.sock db=vsftpd table=users usercolumn=name passwdcolumn=passwd crypt=0 sqllog=1 logtable=logs logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=logtime verbose=1
account required /usr/lib/security/pam_mysql.so user=virtual passwd=adm0509 host=/tmp/mysql.sock db=vsftpd table=users usercolumn=name passwdcolumn=passwd crypt=0 sqllog=1 logtable=logs logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=logtime verbose=1
说明:如果MYSQL安装好以后,要修改MYSQL某个数据库的启动用户密码的话,只要做如下两步操作:
1)修改/etc/pam.d/vsftpd内容.把2处类似passwd=adm0509这样的密码改成你要设置的密码.
2)进入mysql后,运行
grant select on vsftpd.users to virtual@localhost identified by 'yourpasswd';
grant insert on vsftpd.logs to virtual@localhost identified by 'yourpasswd';
第1)步与第2)步的密码要一致.
3)重启MYSQL.
4、 配置vsftpd
/etc/vsftpd/vsftpd.conf内容如下
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
anon_world_readable_only=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
chroot_local_user=YES
guest_enable=YES
guest_username=virtual '第三中1步创建的用户名
listen=YES
listen_port=21
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30999
virtual_use_local_privs=YES
pam_service_name=vsftpd '/etc/pam.d/vsftpd文件名
anon_max_rate=30000 '限制虚拟帐号下载速率
local_max_rate=30000 '限制本地帐号下载速率
max_per_ip=2 '同时只能有2线程在下载
dirlist_enable=NO '关闭帐号登录后的ls功能
重启VSFTP服务,此时客户端就lyjjr1和lyjjr2登录就可以访问FTP空间了。
四、 虚拟用户的个人目录设置
从上面的实验大家可能感觉出来了,无论哪个用户登录FTP后大家都访问同一个地方,即/home/ftpsite目录。这样的结果当然不是我们所想要的。我们想要的是一个用户一个目录,并且有不同的权限控制。解决方法:
1、 修改FTP配置文件/etc/vsftpd/vsftpd.conf,在其中加入一行代码
user_config_dir=/etc/vsftpd/vsftpd_user_conf
2、 生成/etc/vsftpd/vsftpd_user_conf目录,并在该目录下建立与特定虚拟用户同名的文件
mkdir /etc/vsftpd/vsftpd_user_conf
touch lyjjr1
touch lyjjr2
以上的操作为虚拟用户lyjjr1 lyjjr2建立了个人配置文件/etc/vsftpd/vsftpd_user_conf/lyjjr1 和/etc/vsftpd/vsftpd_user_conf/lyjjr2。接下来,在他们的个人配置文件中将lyjjr1的自家目录修改为/home/lyjjr1,在他们的个人配置文件中将lyjjr2的自家目录修改为/home/lyjjr2,配置选项类似为:
local_root=/home/lyjjr1
3、 接下来建/home/lyjjr1 和/home/lyjjr2目录,并设置相应权限
#chown virtual.virtual /home/lyjjr1
#chown virtual.virtual /home/lyjjr2
#chmod 700/home/lyjjr1
#chmod 700 /home/lyjjr2 这里值得大家注意的是,一定要把X的权限给U,否则没有X权限不能打开目录,就无法登录FTP了。
4、 综上所述,建议两个配置文件的内容如下:
/etc/vsftpd/vsfptd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
anon_world_readable_only=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
chroot_local_user=YES
guest_enable=YES
guest_username=virtual
listen=YES
listen_port=21
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30999
virtual_use_local_privs=NO
pam_service_name=vsftpd
user_config_dir=/etc/vsftpd/vsftpd_user_conf
大家可以看到有四处anon,我们默认先让每个虚拟用户禁止所有这些权限,然后在每个虚拟用户的个人配置文件中设置,这样比较灵活。
virtual_use_local_privs=NO这句是关键。这样设置是虚拟用户与匿名用户相同的权限 ,这样才会使个人用户配置文件中的anon的相关配置生效。
(virtual_use_local_privs参数,
当该参数激活(YES)时,虚拟用户使用与本地用户相同的权限。所有虚拟用户的权限使用local参数。
当此参数关闭(NO)时,虚拟用户使用与匿名用户相同的权限,所有虚拟用户的权限使用anon参数。
这两者种做法相比,后者更加严格一些,特别是在有写访问的情形下。默认情况下此参数是关闭的(NO)。)
/etc/vsftpd/vsftpd_user_conf/lyjjr1
anon_world_readable_only=NO YES时不能显示FTP空间的内容
write_enable=YES 控制是否可写
anon_upload_enable=YES 控制是否可以上传
anon_mkdir_write_enable=YES 控制是否可以建目录
anon_other_write_enable=YES 控制是否可以删除文件及目录
local_root=/home/lyjjr1 lyjjr1这个虚拟用户的主目录
以后凡要增加用户,只要在vsftpd数据库的users表中加用户,然后配置用户个人的配置文件及目录就可以了。添加用户无需重启FTP,只有当修改了/etc/vsftpd/vsftpd.conf文件才要求重启FTP服务。
注意事项
1、在实验时,千万要注意在写配置文件时,不要随便加上空格,否则就会让你抓破头皮,找不出失败的原因。比如我就在pam_service_name=vsftpd后面加了一个空格保存到/etc/vsftpd/vsftpd.conf中去了,结果怎么调试就是登录不了FTP,后来删除了后面的空格就成功了。差点被活活的气死,请大家不要犯我一样的毛病。一般来说都是在使用复制粘贴时会出现这样的问题,实在不行,你就老老实实的一个个敲上去吧。
2、影响FTP登录成功于否的地方主要有,/etc/vsftpd/vsftpd.conf文件配置正确于否,这个文件如果语法错的话,VSFTPD服务会启动失败。/etc/pamd/vsftpd这个认证文件里面涉及到访问MYSQL时的用户名密码,及表名等等,也会影响到登录FTP失败。再还有就是FTP用户的根目录的权限问题。一般要访问一个目录必须要有X权限的。这个要视情况而定具体权限。
3、以上配置如果使用了iptables防火墙的话,建议在filter中加入以下语句:
-A INPUT -p tcp --dport 21 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 30000:30999 -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m state --state INVALID,NEW -j DROP
前面两句是关键性的,后面两句可以不加,但建议加上。