直接使用本地用户(Linux系统的用户账户)来访问vsftpd服务器可能带来安全问题,变通的方法是使用虚拟用户(virtual user)来作为专门的FTP账户。FTP虚拟用户并不是操作系统的用户账户,不能登入系统,只能访问FTP服务器,对操作系统的影响更小。虚拟用户主要用来访问提供给非信任用户,但又不适合公开的内容。
PAM(Pluggable Authentication Modules)是一套身份验证共享库,用于限定特定应用程序的访问。使用PAM身份验证机制可以实现vsftpd的虚拟用户功能。实现的关键是攒关键vsftpd的PAM用户数据库文件和修改相应的PAM配置文件,具体步骤如下。
1.创建虚拟用户数据库
需要使用PAM用户数据库来验证虚拟用户,为此要建立一个采用通用数据库格式(db)的文件来存储用户名和密码。
(1)建立包含虚拟用户名和密码的文本文件。文件中奇数行为用户名,偶数行为对应的密码。例如创建/etc/vsftpd/login.txt,并在其中个输入如下内容:
abc
123
def
456
上面的文本文件包含连个用户abc和def,密码分别为123和456.
(2)执行以下命令将包含虚拟用户的文本文件转换成数据库文件。
#db_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db
注意:找不到db_load命令,需要安装db4软件。
(3)执行以下命令以限制改数据库我那件的访问权限。
#chmod 600 /etc/vsftpd/login.db //防止该文件被普通用户修改。
2.修改vsftpd的PAM配置文件
安装vsftpd时创建了一个相应的PAM配置文件/etc/pam.d/vsftpd,对该文件进行修改,将所有的行加上#使其成为注释,或者直接删除,然后添加一下两行内容。
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/login
account required /lib/security/pam_userdb.so db=/etc/vsftpd/login
db=/etc/vsftpd/login和上一步建立的数据库文件相对应,只是在PAM文件里不能写后缀名.db。这两行内容告知PAM使用新的数据库(/etc/vsftpd/login.db)来验证用户。
PAM的目的是对客户端进行验证,也可另外创建一个PAM文件用于vsftpd虚拟用户验证。
3.为虚拟用户创建一个系统用户和主目录
#useradd -d /home/ftpsite -s /sbin/nologin virtual
这样就创建了一个名为“virtual”的普通用户,同时为其创建一个名为“/home/ftpsite”的主目录。
可以讲要下载的内容复制到该目录。
4.创建或修改现有的vsftpd.conf配置文件,启用虚拟用户功能。这里为了示范,创建一个新的vsftpd.conf配置文件,具体配置如下:
anonymous_enable=NO #启用非匿名用户访问(包括虚拟用户) local_enable=YES write_enable=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 #设置vsftpd进行PAM认证是所用的PAM配置文件名 pam_service_name=vsftpd listen=YES #设置vsftpd监听非标准口8021的FTP请求 listen_port=8021 #被动模式端口设置为高端口范围 pasv_min_port=30000 pasv_max_port=30999
其中与虚拟用户功能最相关的选项有3个。
* guest_enable:设置是否启用vsftpd的虚拟用户功能,默认设置为NO。将其设置为YES,所有非匿名用户的访问都会被认为“虚拟用户”登录。将虚拟用户登录重新映射到有guest_username选项指定的用户。
* guest_username: 指定虚拟用户在系统中的用户名,及虚拟用户被映射为哪一个本地系统用户,默认设为ftp(等同于匿名用户)。
* pam_service_name:设置vsftpd进行PAM认证是所用的PAM配置文件名,告诉vsftpd对那个文件实现PAM身份验证。默认值为ftp。但是默认配置文件中将该选项设置为vsftpd,表示PAM配置文件为/etc/pam.d/vsftpd。