一,安装相关工具包
#yum -y install pam vsftpd db4 db4-utils
-- pam 是用来提供身份验证的
-- vsftpd 是ftp服务的主程序
-- db4支持文件数据库
-- db4的工具包
二,创建一个不能登录的用户,用作ftp服务的虚拟用户
由于这个ftp用户将来都是用来向网站上传文件的,所以
创建用户的时候将这个用户的家目录设置在web服务器的根目录
#useradd -d /home/web -s /sbin/nologin vuser_ftp
-d /home/web --指定用户的家目录;/home/web是web服务器的根目录
-s /sbin/nologin --指定用户的shell /sbin/nologin表示不能登录到shell
这里使用vuser_ftp作为虚拟用户的映射对象,在web服务器中可以使用httpd
这个服务的用户来作为虚拟用的映射。比如www apapche web
三,创建一个记录ftp虚拟用户的用户名和密码文件(文件名随便指定这里用login.txt)
此文件的格式为:一行用户名,换一行密码;多个用户分行写入。
例如:
#vi /etc/vsftpd/login.txt
test1
test1passwd
test2
test2passwd
四,使用db_load 命令生成虚拟用户认证文件
#db_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/vsftpd_login.db
longin.txt 文件是刚刚新建的用户名和密码文件。
vsftpd_login.db文件是db_load命令生成的虚拟用户认证文件,这个文件用vi打开
是看不到的,而且这个db文件的权限是600
db_load 这个命令是由db4-utils软件包提供的。如果没有这个命令就需要用安装
db4-utils这个安装包。redhat和centos可以直接用
#yum -y install db4-utils 来安装之前我已经用yum安装了 几个包同时安装的
其他版本的linux系统用其他的工具。
#
#目前login.txt内容是实验环境,如果需要增加用户就把用户名和密码按照规定的
#格式写入login.txt文件。每次增加完虚拟用户之后都用使用db_load 上面执行过
#那条命令来更新vsftpd_login.db这个虚拟用户认证文件。
#
五,修改ftp服务配置文件/etc/vsftpd/vsftpd.conf
可以把/etc/vsftpd/vsftpd.conf 备份一下然后修改vsftpd.conf 或者备份之后
重写一个vsftpd.conf文件
本次实验的vsftpd.conf 内容如下:
#vi /etc/vsftpd/vsftpd.conf
----------------------------------------------------------------------
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
listen=YES
userlist_enable=YES
tcp_wrappers=YES
max_per_ip=5
max_clients=100
#### 下面是关于虚拟用户的配置
guest_enable=YES #打开用户虚拟
guest_username=vuser_ftp #将所有虚拟用户映射成vuer_ftp这个本地用户
#此用户是之前新建的用户
pam_service_name=ftp.vu #ftp用户的pam验证方式,默认是vsftpd,必须改掉。
user_config_dir=/etc/vsftpd/vsftpd_user_conf #这里放置每个虚拟用户的配置文件
-------------------------------------------------------------------------
#####特别注意:vsftpd.conf 这个配置文件中每行的两端都不能有空格######
六,创建vsftpd.conf中提到的验证文件。
(1)使用 #rpm -ql vsftpd 这个命令查找验证模块的例文
/usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_USERS/vsftpd.pam
(2)然后拷贝到vsftpd.conf文件中配置的路径中并改变文件名
这条选项 pam_service_name=ftp.vu中ftp.vu使用的是相对路径。
绝对路径为: /etc/pam.d/ftp.vu
#cp /usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_USERS/vsftpd.pam /etc/pam.d/ftp.vu
上面这条命令就是把vsftpd程序自带的关于pam认证的模板文件拷贝到pam.d这个服务的工作
目录,同时改变文件名为ftp.vu;/etc/pam.d/目录下已经有了一个vsftpd.pam文件,
现在要做的是让vsftpd虚拟用户的这个功能用到的一个特殊的pam认证。还要修改下ftp.vu这个
文件
先来看下原文件的内容:
#vi /usr/share/doc/vsftpd-2.2.2/EXAMPLE/VIRTUAL_USERS/vsftpd.pam
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/login
account required /lib/security/pam_userdb.so db=/etc/vsftpd/login
在看下本次实验修改后的内容
#vi /etc/pam.d/ftp.vu
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
-----
这里有两个需要注意修改的地方:
1,db=/etc/vsftpd/login 修改成db=/etc/vsftpd/vsftpd_login
把db= 定义的是验证数据文件存放的位置,这个文件是以.db结尾的。但是在/etc/pam.d/ftp.vu
中配置的时候不要加上.db
2,配置文件中间的 /lib/security/pam_userdb.so 如果你的系统是64位的,那么相应的路径
应是/lib64/security/pam.userdb.so 不然会出错
七,创建vsftpd.conf中提到的虚拟用户配置目录 。user_config_dir=/etc/vsftpd/vsftpd_user_conf
以及在这个目录下面创建每个用户的权限配置文件
1,创建/etc/vsftpd/vsftpd_user_conf目录:
#mkdir /etc/vsftpd/vsftpd_user_conf
2,在/etc/vsftpd/vsftpd_user_conf目录下面分别创建之前在login.txt虚拟用户名和密码文件中
提到的test1 test2 这两个虚拟用户的权限配置文件
可以使用#touch test1 命令先创建这个文件然后再用vi进行编辑。也可以直接用vi打开一个不
存在的文件,编辑后保存就可以了
#vi /etc/vsftpd/vsftpd_user_conf/test1
3,虚拟用户配置文件内容如下
#vi /etc/vsftpd/vsftpd_user_conf/test1
anon_world_readable_only=no #用户可以浏览和下载文件,不能设为yes,否则无法看到文件
write_enable=yes #用户可以创建文件
anon_upload_enable=yes #用户可以上传文件
anon_mkdir_write_enable=yes #用户有创建和删除目录的权限
anon_other_write_enable=yes #用户具有文件改名和删除文件的权限
local_root=/home/web/html #指定这个虚拟FTP用户的家目录。这里的html是你网站的根目录
在虚拟用户配置文件中以yes和no 这两个参数根据实际情况来控制ftp用户的权限,或者把对应的
语句删除
######这里需要注意的是配置语句的两端都不能有空格
之后在创建test2的权限控制文件
#cp /etc/vsftpd/vsftpd_user_conf/test1 /etc/vsftpd/vsftpd_user_conf/test2
在test2 文件中修改下test2文件的家目录即可
八,到这里,ftpd 的虚拟用户配置完毕。重启ftp服务就可以使用虚拟用户登录ftp
vuser_ftp这个用户是用来被映射的,所以这个用户不能登录到ftp
#/etc/init.d/vsftpd restart
九,诡异的问题
配置都正确但是vftpd的虚拟用户就是登录不了;或者可以登录但没有对这个目录下应有的权限。
此时此刻最有可能的罪魁祸首可能是selinux和iptables的问题。
1,iptables防火墙如果开启而ftp端口没有打开的话就不能连接到ftp
关闭防火墙:
#/etc/init.d/iptables stop
2,selinux如果没有关闭,它内置的一些规则就会让你的虚拟ftp用户服务器登录或者获得相应的
权限
关闭selinux:
#setenforce 0
十,补充:
1,虚拟用户的根目录如果在虚拟用户的配置文件中如果没有定义(local_root= ) 那么默认的根目录
就会被被映射为本地用户的根目录(之前建的vuser_ftp);所以虚拟用户要在这个目录中有权限
的话必须先开启,就是说被映射的这个本地用户要对这个虚拟用户指定的根目录有相应的权限。
2,这里实验用的是本地用户是vuser_ftp。在实际的配置中可以用httpd这个服务用户来作为被映射的
用户。这样一来整个网站的目录只需要一个用户,很容易做权限控制