vsftpd+pam_ihosts.so实现虚拟用户权限控制

1、基础介绍html

1.vsftpd运行模式分为standalone和xinetd模式,如今生产环境中,绝大多数均采用standalone模式。git

  • vsftpd一启动,standalone模式中进程会一直驻留在内存中,当接收到21端口的请求时vsftpd进程会fork出一个子进程去处理链接,而原进程继续监听21端口。另更加便于PAM验证的应用(可经过pam_ihosts.so实现单一IP、单一用户的限制)。github

  • xinetd模式的话默认是xinetd进程监听21端口,当网卡收到外部链接请求时,xinetd进程会去调用ftp进程,并将21端口收到数据转交给vsftpd进程处理(链接处理完毕后,vsftpd进程会自动退出),而xinetd则继续监听21端口(另支持单一IP限制)数据库


既然vstandlone的模式这么好,那么该怎么配置呢windows

1)首先禁用xinetd进程中的vsftpd,并重启xinetd服务centos

# grep 'disable' /etc/xinetd.d/vsftpd
        disable                 = yes

2)把vsftpd配置文件中的 listen 参数置为 YES bash

# grep '^listen' /etc/vsftpd/vsftpd.conf
listen=YES


2.vsftpd工做模式分主动(PORT)及被动(PASV)2 种,centos及windows等常见系统默认通常采用被动模式链接ftp server,因此搭建vsftpd时,推荐使用被动模式。若是需启用防火墙,能够在FTP SERVER上限制被动模式数据端口范围并放行便可。下面咱们来看看这两种模式的区别。服务器

  • PORT模式(FTP服务器主动去链接客户端的数据端口): 服务器端口固定,命令端口21,数据端口20。客户端从任意特权限端口N(N>1024)发起请求链接服务器命令端口21,并监听本机的 N+1端口,并发送FTP命令(port N+1)到服务器,FTP服务器会从本身的数据端口(默认20)主动链接客户端的N+1端口,这样就完成了数据传输通道创建了。并发

  • PASV模式(FTP服务器数据端口被动的等待客户来链接):客户端打开2个任意特权端口(N>1024,N+1),并从端口N发起一个链接,PASV模式执行PASV命令,并受权服务器链接它的数据端口,即N+1。FTP服务器会开启一个任意的非特权端口P(若是vsftpd.conf没有限制端口范围),并向客户端发送PORT P 命令。而后等待客户经过 N+1 来链接端口P创建数据传输通道。app

参考文档:http://www.javashuo.com/article/p-grdlqeeu-ca.html


2、vsftpd安装配置

1.安装

# wget  http://mirror.centos.org/centos/7/os/x86_64/Packages/vsftpd-3.0.2-22.el7.x86_64.rpm
# rpm -ivh vsftpd-3.0.2-22.el7.x86_64.rpm


2.参数以下,具体配置根据业务需求定义 

经常使用参数:
local_umask=022  本地用户上传文件后的默认权限(umask是unix系统的概念,新建的目录权限为755,文件644)
anon_umask=077      匿名用户的umask值,默认为077,及目录权限是700,文件是 600
anonymous_enable=NO    禁止匿名访问
listen=YES             运行于standalone mode
local_enable=YES    任何非匿名用户(包含本地及虚拟用户)都需启用此参数
max_clients=100  #FTP服务器最大承载用户数
max_per_ip=4     # 限制一个用户最多链接数为4
local_max_rate=512000    # 限制本地下载带宽不能超过500KB
anon_max_rate                    限制匿名用户的下载带宽,单位是bytes/s
accept_timeout=60  #超时,以秒计,用于远程客户端以PASV模式创建数据链接
connect_timeout=60     #超时,以秒计,用于远程客户端以PORT模式创建数据链接
connect_from_port_20=YES    # 控制端口数据走端口20,若是是被动模式,需把此参数改成NO
listen_port=8080    #更改监听端口8080, 默认是21
#anon_upload_enable=YES    容许匿名用户上传文件,默认禁止
#anon_mkdir_write_enable=YES    容许匿名用户建立目录,默认禁止
user_config_dir=/etc/vsftpd/vsftpd_user_conf    建立虚拟用户存储文件
virtual_use_local_privs=NO    虚拟用户权限与匿名用户权限相同,虚拟用户权限单独设定
chroot_local_user=YES     将全部用户锁定在主目录(vsftpd若是启用chroot,默认必须保证ftp根目录不可写,chmod a-w /vsftp/chenss/)
chroot_list_enable=YES    启动锁定用户的名单(NO或注释为禁用),若是为NO,只锁定chroot_list中限制用户,YES则代表将全部用户锁定在主目录,而chroot_list中的用户不锁定
chroot_list_file=/etc/vsftpd/chroot_list    锁定用户名单列表
allow_writeable_chroot=YES                默认为NO,当启用chroot并配置些参数为YES后,虚拟用户将具有对其根目录写权限
dirmessage_enable=YES       #用户切换进入目录时显示.message(若是存在)文件的内容

权限参数
userlist_deny        若是userlist_enable为YES则检查此项(默认YES)
userlist_enable      当值为YES时,若是userlist_deny为YES则禁用/etc/vsftpd/user_list文件中帐号,在输入密码以前就提示权限拒绝。若是userlist_deny=NO,则表明仅容许此文件中的帐号登录

虚拟帐号参数:
pam_service_name=vsftpd    PAM认证文件名。PAM将根据/etc/pam.d/vsftpd进行认证
guest_enable=YES    启用虚拟用户功能
guest_username=vsftpd    指定虚拟用户(无需是系统用户)的宿主用户,虚拟用户今后帐号继承权限
user_config_dir=/etc/vsftpd/vsftpd_user_conf    设定虚拟用户我的vsftp的文件存放路径(配置文件名=虚拟用户名)
anon_upload_enable         若是设置为YES,匿名用户将能够在特定条件下上传文件,此参数必须激活write_enable,并且ftp用户必须具有对上传目录的写权限,虚拟用户默认为被匿名处理,所以也需启用此参数
anon_mkdir_write_enable  若是设置为YES,匿名用户将能够建立目录,条件同anon_upload_enable
write_enable          建议主配置文件中不启用此参数,在虚拟用户配置中开启。容许或禁止任意形式的FTP命令写入

详细配置参数请参考:https://security.appspot.com/vsftpd/vsftpd_conf.html


被动模式参考配置:

anonymous_enable=NO
local_enable=YES
write_enable=NO
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=NO
xferlog_std_format=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
userlist_deny=YES
tcp_wrappers=YES
guest_enable=YES
guest_username=ftp
user_config_dir=/etc/vsftpd/vsftpd_user_conf
vsftpd_log_file=/var/log/vsftpd.log
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30010


3.虚拟帐号建立

1)建立用户密码文本

# cat /etc/vsftpd/logins.txt    # 奇数行是帐号,偶数行是密码
chenss
abcdefg
test
123456

2)生成虚拟用户认证文件 

# db_load -T -t hash -f /etc/vsftpd/logins.txt /etc/vsftpd/vsftpd_login.db

备注:

  • -T    容许应用程序将文本转译载入数据库

  • -t     指定载入的数据库类型,使用hash码加密

  • -f     指定帐号密码文本文件

3)配置认证文件(注释vsftpd原所有内容,再加如下2行)

# cat /etc/pam.d/vsftpd
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login

备注:

  • auth是指对用户的用户名口令进行验证。

  • accout是指对用户的账户有哪些权限哪些限制进行验证。

  • 再后面的/lib64/security/pam_userdb.so表示该条审核将调用pam_userdb.so这个库函数进行。

  • 若是是32bit系统,该文件所在位置是/lib/security/pam_userdb.so

  • 若是是64bit系统,该文件所在位置是/lib64/security/pam_userdb.so

  • 最后db=/etc/vsftpd/login则指定了验证库函数将到这个指定的数据库中调用数据进行验证。其实该文件指的是/etc/vsftpd/login.db文件。注意:db=/etc/vsftpd/login格式是这样的,去掉.db后缀。


4)建立虚拟用户配置目录和文件(虚拟用户配置文件必须与用户名一致)

# cat /etc/vsftpd/vsftpd_user_conf/chenss
local_root=/vsftp/chenss    # 虚拟用户根目录
guest_username=vsftp    #虚拟用户的宿主用户
file_open_mode=0400    # 文件权限
write_enable=YES    # 写权限
anon_upload_enable=YES    # 上传权限
anon_mkdir_write_enable=YES    # 建立文件夹权限
virtual_use_local_privs=YES      #虚拟用户和本地用户有相同的权限(即vsftpd用户)
cmds_allowed=ABOR,CWD,LIST,MDTM,MKD,NLST,PASS,PASV,PORT,PWD,QUIT,RETR,SIZE,STOR,TYPE,USER,HELP,STAT  #受权读写,禁止删除

备注:cmds_allowed详细信息请参考:http://dreamway.blog.51cto.com/1281816/1045610


5)建立虚拟用户根目录(test帐号同chenss)

[root@test2 ~]# mkdir -p /vsftp/chenss
[root@test2 ~]# chmod 500 /vsftp/chenss
[root@test2 ~]# chown -R vsftpd.vsftpd /vsftp/chenss

其实到了这里,启用vsftpd服务便可使用了


3、编译pam_ihosts.so并加载入PAM认证

1.编译

# git clone git@github.com:ColumPaget/pam_ihosts.git
# ./configure
# make
# make instal


2.受权chenss用户只能能过192.168.1.10来访问ftp:

# cat /etc/pam.d/vsftpd
account    required  /lib/security/pam_ihosts.so  user=chenss syslog allow-ip=192.168.1.10
auth    required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login

pam_ihosts用法:https://github.com/ColumPaget/pam_ihosts


4、FTP数字代码的意义(忘记在哪看到的,没有连接,就直接贴代码了)

110 从新启动标记应答。
120 服务在多久时间内ready。
125 数据链路端口开启,准备传送。
150 文件状态正常,开启数据链接端口。
200 命令执行成功。
202 命令执行失败。
211 系统状态或是系统求助响应。
212 目录的状态。
213 文件的状态。
214 求助的讯息。
215 名称系统类型。
220 新的联机服务ready。
221 服务的控制链接端口关闭,能够注销。
225 数据连结开启,但无传输动做。
226 关闭数据链接端口,请求的文件操做成功。
227 进入passive mode。
230 使用者登入。
250 请求的文件操做完成。
257 显示目前的路径名称。
331 用户名称正确,须要密码。
332 登入时须要帐号信息。
350 请求的操做须要进一部的命令。
421 没法提供服务,关闭控制连结。
425 没法开启数据链路。
426 关闭联机,终止传输。
450 请求的操做未执行。
451 命令终止:有本地的错误。
452 未执行命令:磁盘空间不足。
500 格式错误,没法识别命令。
501 参数语法错误。
502 命令执行失败。
503 命令顺序错误。
504 命令所接的参数不正确。
530 未登入。
532 储存文件须要帐户登入。
550 未执行请求的操做。
551 请求的命令终止,类型未知。
552 请求的文件终止,储存位溢出。
553 未执行请求的的命令,名称不正确。