环境: CentOS 6.9 套件: vsftpd , pam
原因:
在linux系统上说道FTP伺服器,大家都会很直觉的联想到vsftpd。
vsftpd的预设登入帐号密码会与我们linux系统上的进行串接;
所以很多时候你要开几个帐号,你就得在系统上开几个帐号。
其实这样是非常危险的,
你只要稍不注意很可能就会让某些帐号变成系统的大漏洞。
所以我们这边要使用虚拟帐号来当给FTP作为登入使用。
处理方式:
1.下载相关套件
#yum install -y vsftpd
#yum install -y pam* db4*
#yum install libdb-utils (db_load使用)
2.vsftpd设定档调整
#vim /etc/vsftpd/vsftpd.conf
(下面为设定内容)
=!================================================
#log 设定
xferlog_enable=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
#pam验证的档案是哪一只(/etc/pam.d/vsftpd.virtual)
pam_service_name=vsftpd.virtual
#禁止匿名登入
anonymous_enable=NO
nopriv_user=vsftpd
local_enable=YES
#使用者权限
dirlist_enable=YES
download_enable=YES
write_enable=YES
local_umask=022
virtual_use_local_privs=YES
#变更家目录路径的相关设定
chroot_list_enable=YES
chroot_local_user=YES
chroot_list_file=/etc/vsftpd/chroot_list
#预设禁止登入的系统帐号
userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd/user_list
#虚拟帐号登入时,是使用哪个帐号做串接(vsftpd)
guest_enable=YES
guest_username=vsftpd
#虚拟帐号登入&预设的家目录位置
($USER 是指登入后的帐号)
user_sub_token=$USER
local_root=/home/vsftpd/$USER
user_config_dir=/etc/vsftpd/userconf
#FTP显示档案的拥有者
hide_ids=YES
#系统设定
listen=YES
dirmessage_enable=YES
tcp_wrappers=YES
max_clients=200
max_login_fails=5
=!================================================
建立虚拟帐号
这边是先建立帐号的清单
#vim /etc/vsftpd/virtual_users
清单格式(一行帐号;一行密码,有多组帐号就依序填下去)
=!==================================
範例:
#ftpuser001account #帐号
#tpuser001passwd #密码
#ftpuser002account #帐号
#ftpuser002passwd #密码
user001
passwd001
…..
=!==================================
利用刚刚建立的清单建立.db的验证登入档案。
(这边比较麻烦的是,如果要新增帐号,这个流程都要重做)
相较之下如果可以直接用mysql验证登入会简单许多。
#db_load -T -t hash -f /etc/vsftpd/virtual_users /etc/vsftpd/virtual_users.db
4.创建每个虚拟帐号的家目录路径&权限
#mkdir /etc/vsftpd/userconf
这个资料夹中,每一个帐号都是一个独立档案。
权限&家目录都会在这里设定。
(家目录位置必须是实体帐号可以连结过去的位置)
#vim /etc/vsftpd/userconf/user001
=!=範例为唯读的帐号权限============
#家目录路径位置
local_root=/home/volume01
#是否可以写入档案
write_enable=NO
#是否可以匿名上传档案
anon_upload_enable=NO
=!=================================
锁定家目录
#touch /etc/vsftpd/chroot_list
一般来说我们会将使用者限制在我们给他的家目录之下。
但是有时候会有些特殊帐号,要可以离开家目录,
到他的上一层的路径捞取一些档案资料。
这时候我们就是chroot的时候。
一般来说我们会建立一个空档。
当有特殊帐号要离开家目录的需求时,
我们会在这个档案裏面加入他的【帐号名称】。
服务重启后,他就可以自由地切换目录路径,
因为太自由对管理者来说是很危险的事,
所以当使用者使用完毕后,要即刻将帐号从chroot中移除。
6.设定登入验证的选项
#cp -rf /etc/pam.d/vsftpd /etc/pam.d/vsftpd.virtual
原始档我们保留不动。
#vim /etc/pam.d/vsftpd.virtua
在设定/etc/pam.d/vsftpd.virtua的时候,
千万记住用不到的东西就直接注解调。
虽然这便设定应该是一个没有对应到,会继续往下找对应的登入方式。
但我当时真的是因为部分设定没注解,
造成我虚拟帐号要登入时需多的异常问题。
#%PAM-1.0
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/virtual_users
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/virtual_users
这边要特别说明,你建立好的.db档案,
在pam里面设定时不需要将.db带入设定档当中,
他会自己去相关路径当中找寻对应的档案。
这好像也是很多人在说,
当你的帐号设定档产生完.db档后,要将设定档砍掉的原因。
因为当你有相同的档名在同一个路径下,不管后面是不是带.db,
他好像都会去读取,结果就会造成部分的错误。
7.创建实体帐号
#useradd vsftpd -G users -d /home/vsftpd -s /bin/false
这边的实体帐号就是我们虚实串接的一个桥樑。
我们的虚拟帐号需要有一个实体帐号的串接才可以在系统中做存取的动作。
到这边就差不多都设定完了。
可以重启一下vsftpd看看有没有甚么问题。
#service vsftpd restart
试着用刚刚创建的虚拟帐号进行登入测试。
8.错误讯息查询
如果登入发生错误,就要去检查一下LOG档,
这边我们要查询pam.d验证部分,
登入失败原因的时候要去看【/var/log/secure】
(基本上错误都不超过5行,当登入失败时就马上去看一下吧)
#tail –n 5 /var/log/secure
这边会很清楚地跟你说相关的错误原因。
=!成功讯息==========================================
vsftpd[25807]: pam_userdb(vsftpd.virtual:auth): user 'user001' granted access
=!==================================================
=!失败讯息==========================================
这边明显地说出你的帐号user001密码验证失败,
失败的原因就得去看pam.d那边的设定是不是有误,
才会无法正确的验证密码部分。
pam_succeed_if(vsftpd.virtual:auth): error retrieving information about user user001
pam_userdb(vsftpd.virtual:auth): user ' user001' granted access
pam_unix(vsftpd.virtual:auth): check pass; user unknown
=!=================================================
=!失败讯息=========================================
这边是说因为MD5的问题,造成我的密码无法正确的验证。
这个讯息是指在用mysql做帐号密码验证的时候才会出现的问题。
pam_succeed_if(vsftpd.virtual:auth): error retrieving information about user user001
pam_mysql - non-crypt()ish MD5 hash is not supported in this build.
pam_unix(vsftpd.virtual:auth): check pass; user unknown
=!===================================================
原本我也是要用mysql Service作为我帐密登入验证。
但我的pam_mysql.so一直不支援md5,
重新在编译的时候套用了openssl也是一样的状况,
暂时就先不考虑用mysql的方式做登入验证。
所以就先改为现在的方式,之后会再研究看看。
9.备注
下面是如果要使用mysql做帐号登入验证时会需要的套件。
(1)mysql
#yum install -y mysql mysql-server pam_mysql
(2)pam_mysql-0.7RC1.tar.gz (重点在md5加解密)
#wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
#./configure --with-openssl=/usr --with-mysql=/usr
#make && make install
#ls /usr/lib/security | grep pam_mysql.so (检查一下lib是否存在了)
(3)再来就是自己设计资料库 & 在pam.d当中做些许设定的修改。
因为这部分我个人测试是失败的状况,
所以可能就请大家google寻找一些相关文件进行后续设定了。
10.附带一提
我当初是为了要将外接式硬碟挂载到LINUX主机上,
提供外部使用者做连线使用,才会做到这个专题。
#mount -t ntfs-3g /dev/sdb1 /home/volume01
透过系统挂载上来的外接式硬碟的权限是777
也就是不管谁都可以直接存取。
而挂载点也必须有点留心,
要放在你的实体帐号可以过去的路径。
(例如我建的帐号vsftpd,家目录/home/vsftpd,有权限连到/home路径下)
如果放错路径,不管你的权限是不是777,
在你的实体帐号要连过去那个资料夹之前就已经先被阻挡了。
所以这也是我把外接式硬碟挂载在/home目录下的原因。
上面的方法只是临时挂载,要开机启用时就挂载,
当然还是要写到/etc/fstab当中。
#vim /etc/fstab
=!格式==============================================
/dev/sdb1 /home/volume01 ntfs-3g defaults 0 0
=!==================================================
修改完可以试着挂载看看。
#mount -a
发现挂载失败,要马上先把刚才的设定拿掉,检查有甚么问题。
如果不处理,你下次重开机就会发现因为硬碟挂载的问题,你开不了机。
11.参考网址
http://www.kuqin.com/article/50vpn/1321601.html
http://it001.pixnet.net/blog/post/328302817-IT%E5%B0%88%E9%A1%8C-%E8%99%9B%E6%93%AC%E5%B8%B3%E8%99%9F%E7%99%BB%E5%85%A5FTP
(本篇完)