原理讲解,vsftpd网上教程一大堆,但很多同学一说虚拟用户还是有点不解,这里我来抛砖引玉和大家分享,VSFTPD利用了PAM登陆认证模块,但是确没有直接使用系统的用户,而是用自己的用户数据库,但由于vsftpd必须要存取操作系统上的文件,所以又离不开系统那个用户,那么就来个映射,不用系统直接登陆,只需要用自己的用户登陆之后在和系统用户做个映射,这样,就能安全很多了。
应用场景:1,网站虚拟主机配合磁盘配额可以用来管理不同的用户;2,企业用户提供文件共享;3,运维中的原创备份FTP服务器端。
下面是配置详细过程:
一,安装
yum -y install vsftpd db4-utils
复制代码
二,配置
cd /etc/vsftpd/
vi ftpuser.txt
复制代码
输入FTP用户名和密码
ftpuser1
123456
ftpuser2
654321
复制代码
注意:奇数行为用户名,偶数行为密码
生成FTP账户的数据库文件
db_load -T -t hash -f ./ftpuser.txt ./ftplogin.db
chmod 600 ./ftplogin.db
复制代码
生成和虚拟用户数据库相关联的PAM文件,因为FTP目录的权限需要根据系统用户来设定
cd /etc/pam.d/
vi vsftpd.pam
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/ftplogin
account required /lib/security/pam_userdb.so db=/etc/vsftpd/ftplogin
复制代码
注意:是ftplogin而不是ftplogin.db
建立虚拟用户,设置该用户所要访问的目录,并设置虚拟用户访问的权限:
useradd -d /data/ftpdata virtual_user
chmod 700 /data/ftpdata
复制代码
经过该步骤的设置,/data/ftpdata就是virtual_user用户的主目录,该用户也是ftpdata目录的拥有者。除root用户之外,只有该用户具有对该目录的读、写和执行的权限。
配置vsftpd,使之启用虚拟用户
vi /etc/vsftpd/vsftpd.conf
输入:
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
#anon_upload_enable=NO
#anon_mkdir_write_enable=NO
dirmessage_enable=NO
xferlog_enable=YES
connect_from_port_20=YES
#chown_uploads=YES
#chown_username=root
#xferlog_file=/var/log/xferlog
xferlog_std_format=YES
idle_session_timeout=600
data_connection_timeout=36000
#nopriv_user=ftpsecure
#async_abor_enable=YES
#ascii_upload_enable=YES
#ascii_download_enable=YES
#ftpd_banner=Welcome to blah FTP service.
#deny_email_enable=YES
#banned_email_file=/etc/vsftpd/banned_emails
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd/chroot_list
#ls_recurse_enable=YES
listen=YES
#listen_ipv6=YES
guest_enable=YES
guest_username=virtual_user
pam_service_name=vsftpd.pam
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
复制代码
其中:
guest_enable=YES
guest_username=virtual_user
pam_service_name=vsftpd.pam
复制代码
guest_enable=YES:表示启用虚拟用户
guest_username=virtual_user:本地用户,就是虚拟用户要映射的本地用户,这个主要是用来设置本地文件系统的权限的
pam_service_name=vsftpd.pam:虚拟用户的认证用户
注意,默认pam_service_name=vsftpd,要改过来,否则报“530 Login incorrect.” 这样的错误的哦
整个过程是:用户输入虚拟用户账户(ftpuser.txt这里设置的)------登陆服务器利用PAM模块认证------映射为本地用户virtual_user----以virtual_user用户的身份去存取virtual_user的根目录下的文件
登陆实验:
ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 2.0.5)
Name (127.0.0.1:root): ftpuser1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
227 Entering Passive Mode (127,0,0,1,150,205)
150 Here comes the directory listing.
226 Transfer done (but failed to open directory).
ftp> pwd
257 "/"
ftp>
复制代码
OK,没有问题了,我用的账户其实在服务器里是不存在的,就算这个用户密码泄露,别人也无法直接登陆我的linux主机
三,权限配置
我们还可以对每个用户设置权限
vi /etc/vsftpd/vsftpd.conf
添加用户配置目录:
user_config_dir=/etc/vsftpd/vsftpd_user_conf
复制代码
mkdir -p /etc/vsftpd/vsftpd_user_conf
cd /etc/vsftpd/vsftpd_user_conf
配置每个用户的控制信息
vi /etc/vsftpd/vsftpd_user_conf/ftpuser1
输入:
write_enable=NO
anono_upload_enable=NO
复制代码
注意/etc/vsftpd/vsftpd_user_conf/ftpuser1这里的文件名和用户名必须相同哦
四,用户隔离
但是这里有个问题,当我有多个用户的时候ftpuser1 ftpuser2,那么这两个用户默认都在同一个目录,就是/data/ftpdata那我很多情况需要把用户隔离开来,例如我一台主机上有很多不同用户的网站,他们需要单独管理,企业用户也需要保护自己的隐私,原创备份服务器也有多中数据需要备份到不同的目录,所以,实现主目录隔离的虚拟用户才是终解决方案。下面就来看看如何解决这个问题了
接着上面,我们以ftpuser1为例
vi /etc/vsftpd/vsftpd_user_conf/ftpuser1
添加:
local_root=/data/ftpdata/ftpuser1
mkdir -p /data/ftpdata/ftpuser1
chown -R virtual_user:virtual_user /data/ftpdata/ftpuser1
其他用户同理
五,后期维护
这个算是建立好了,那以后还需要添加用户怎么办呢,步骤如下:
1.在ftpuser.txt中添加用户名和密码
2.运行如下命令,将用户名和密码添加到数据库中
db_load -T -t hash -f ./ftpuser.txt ./ftplogin.db
复制代码
3.在vsftpd_user_conf文件夹下新建和用户名相同的文件,并在其中加入
vi /etc/vsftpd/vsftpd_user_conf/username
输入:
local_root=/data/ftpdata/username
复制代码
4.在/data/ftpdata中新建一个文件夹,与用户名相同
mkdir -p /data/ftpdata/username
chown -R virtual_user:virtual_user /data/ftpdata/username
复制代码
如何改用户名:
只需要修改下ftpuser.txt里面的密码行,然后执行
db_load -T -t hash -f ./ftpuser.txt ./ftplogin.db
复制代码
即可,连重启都不需要,所以这里注意ftpuser.txt这个文件保护好,为了以后维护方面还是不要删除了吧
原创作品,转载务必保留出处:http://bbs.ywlm.net/thread-580-1-1.html
作者:gotop
转载于:https://blog.51cto.com/svsky/1671013