vsftpd install

vsftpd安装

  1. 查看系统版本

    1
    2
    [root@localhost ~]# cat /etc/redhat-release
    CentOS Linux release 7.2.1511 (Core)
  2. 安装vsftpd

    1
    2
    3
    4
    [root@localhost ~]# yum -y install vsftpd* pam* db4*
    vsftp* //FTP服务
    pam* //可插入认证模块
    db4* //文件数据库
  3. 创建用户

    1
    2
    3
    4
    5
    //创建服务的宿主用户
    [root@localhost ~]# useradd -M -s /sbin/nologin vsftpd

    //创建虚拟宿主用户
    [root@localhost ~]# useradd -s /sbin/nologin vsftpduser

    说明:

    1
    2
    3
    4
    5
    6
    7
    8
    * Vsftpd服务宿主用户:
    默认的Vsftpd的服务宿主用户是root,但是这不符合安全性的需要.
    这里建立名字为vsftpd的用户,用他来作为支持Vsftpd的服务宿主用户.
    由于该用户仅用来支持Vsftpd服务用,因此没有许可他登陆系统的必要,并设定他为不能登陆系统的用户*
    * Vsftpd虚拟宿主用户:
    虚拟用户并不是系统用户,也就是说这些FTP的用户在系统中是不存在的
    他们的总体权限其实是集中寄托在一个在系统中的某一个用户身上的,所谓Vsftpd的虚拟宿主用户,就是这样一个支持着所有虚拟用户的宿主用户.
    由于他支撑了FTP的所有虚拟的用户,那么他本身的权限将会影响着这些虚拟的用户,因此,处于安全性的考虑,也要非常注意对该用户的权限的控制,该用户也绝对没有登陆系统的必要,这里也设定他为不能登陆系统的用户.
  4. 修改vsftpd配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    [root@localhost ~]# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
    [root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
    #不允许匿名访问
    anonymous_enable=NO
    # 设定本地用户可以访问
    # 注意: 主要是为虚拟宿主用户,如果该项目设定为NO那么所有虚拟用户将无法访问
    local_enable=YES
    # 设定可以进行写操作
    write_enable=YES
    # 设定上传后文件的权限掩码
    local_umask=022
    # 禁止匿名用户上传
    anon_upload_enable=NO
    # 禁止匿名用户建立目录
    anon_mkdir_write_enable=NO
    # 设定开启目录标语功能
    dirmessage_enable=YES
    # 设定开启日志记录功能
    xferlog_enable=YES
    # 设定端口20进行数据连接
    connect_from_port_20=YES
    # 设定禁止上传文件更改宿主
    # 如果设定为YES,所有匿名上传的文件的所属用户将会被更改成chown_username
    chown_uploads=NO
    # 匿名上传文件所属用户名
    #chown_username=whoever
    # 设定Vsftpd的服务日志保存路径
    # 注意:该文件默认不存在,必须要手动touch出来,并且由于这里更改了Vsftpd的服务宿主用户为手动建立的Vsftpd.必须注意给与该用户对日志的写入权限,否则服务将启动失败
    xferlog_file=/var/log/vsftpd.log
    # 设定日志使用标准的记录格式
    xferlog_std_format=YES
    # 设定空闲连接超时时间,这里使用默认
    # 将具体数值留给每个具体用户具体指定,当然如果不指定的话,还是使用这里的默认值600,单位秒
    idle_session_timeout=600
    # 设定单次最大连续传输时间,这里使用默认
    # 将具体数值留给每个具体用户具体指定,当然如果不指定的话,还是使用这里的默认值120,单位秒
    data_connection_timeout=120
    # 定支撑Vsftpd服务的宿主用户为手动建立的Vsftpd用户
    # 注意:一旦做出更改宿主用户后,必须注意一起与该服务相关的读写文件的读写赋权问题:比如日志文件就必须给与该用户写入权限等
    nopriv_user=vsftpd
    # 设定支持异步传输功能
    async_abor_enable=YES
    # 设定支持ASCII模式的上传和下载功能
    ascii_upload_enable=YES
    ascii_download_enable=YES
    # 设定Vsftpd的登陆标语
    ftpd_banner=Welcome to zhonghui FTP service
    # 创建一个文件保存某些匿名电子邮件的黑名单,以防止这些人使用Dos攻击
    #deny_email_enable=YES
    # 当启用deny_email_enable功能时,所需的电子邮件黑名单保存路径
    #banned_email_file=/etc/vsftpd/banned_emails
    # 禁止用户登出自己的FTP主目录
    chroot_local_user=NO
    # 如果启动这项功能,则所有列在chroot_list_file之中的使用者不能更改根目录
    #chroot_list_enable=YES
    # 指定限制的用户文件
    #chroot_list_file=/etc/vsftpd/chroot_list
    # 禁止用户登陆FTP后使用"ls -R"的命令.该命令会对服务器性能造成巨大开销
    # 如果该项被允许,那么当多用户同时使用该命令时将会对该服务器造成威胁
    ls_recurse_enable=NO
    # 设定该Vsftpd服务工作在StandAlone模式下,谓StandAlone模式就是该服务拥有自己的守护进程支持,在"ps -A"命令下我们将可用看到vsftpd的守护进程名
    # 如果不想工作在StandAlone模式下,则可以选择SuperDaemon模式,在该模式下vsftpd将没有自己的守护进程,而是由超级守护进程Xinetd全权代理,与此同时,Vsftp服务的许多功能将得不到实现
    listen=YES
    listen_ipv6=YES
    # 设定PAM服务下Vsftpd的验证配置文件名.因此,PAM验证将参考/etc/pam.d/下的vsftpd文件配置
    pam_service_name=vsftpd
    # 设定userlist_file中的用户将不得使用FTP
    userlist_enable=YES
    # 设定支持TCP Wrappers
    # 如果启用,则vsftpd服务器会检查/etc/hosts.allow和/etc/hosts.deny中的设置,来决定请求连接的主机,是否允许访问该FTP服务器
    tcp_wrappers=YES
    # 设定启用虚拟用户功能
    guest_enable=YES
    # 指定虚拟用户的宿主用户
    guest_username=vsftpduser
    # 设定虚拟用户的权限符合他们的宿主用户
    virtual_use_local_privs=YES
    # 设定虚拟用户个人Vsftp的配置文件存放路径.也就是说,这个被指定的目录里,将存放每个Vsftp虚拟用户个性的配置文件,一个需要注意的地方就是这些配置文件名必须和虚拟用户名相同
    user_config_dir=/etc/vsftpd/vconf

    注意: 配置文件不能有空行,多余空格

  5. 创建vsftpd日志文件

    1
    2
    [root@localhost ~]# touch /var/log/vsftpd.log
    [root@localhost ~]# chown vsftpd.vsftpd /var/log/vsftpd.log
  6. 创建vsftpd存放虚拟用户目录

    1
    [root@localhost ~]# mkdir /etc/vsftpd/vconf
  7. 创建虚拟用户数据库文件

    1
    2
    3
    //创建虚拟用户名单文件
    //这个文件就是来记录vsftpd虚拟用户的用户名和口令的数据文件
    [root@localhost ~]# touch /etc/vsftpd/virtualuser
    1
    2
    3
    4
    5
    //创建虚拟用户账号
    //用户的用户名和口令信息,格式很简单:"一行用户名,一行口令"
    [root@localhost ~]# vim /etc/vsftpd/virtualuser
    penn
    ^zqJu,S|P
    1
    2
    3
    4
    5
    6
    //生成虚拟用户数据文件
    [root@localhost ~]# db_load -T -t hash -f /etc/vsftpd/virtualuser /etc/vsftpd/virtualuser.db

    说明:
    选项-T允许应用程序能够将文本文件转译载入进数据库.由于我们之后是将虚拟用户的信息以文件方式存储在文件里的,为了让Vsftpd这个应用程序能够通过文本来载入用户数据,必须要使用这个选项.
    如果指定了选项-T,那么一定要追跟子选项-t.子选项-t,用来指定转译载入的数据库类型(Btree、Hash、Queue和Recon数据库)
    1
    2
    3
    4
    5
    6
    7
    //查看数据库文件权限
    [root@localhost ~]# ls -l /etc/vsftpd/virtualuser.db
    -rw-r--r-- 1 root root 12288 Nov 24 10:45 /etc/vsftpd/virtualuser.db

    说明:
    需要特别注意的是,以后再要添加虚拟用户的时候,只需要按照"一行用户名,一行口令"的格式将新用户名和口令添加进虚拟用户名单文件
    但是光这样做还不够,不会生效!还要再执行一遍"db_load -T -t hash -f 虚拟用户名单文件 虚拟用户数据库文件.db"的命令使其生效才可以!
  8. 设定PAM验证文件,并指定虚拟用户数据库文件进行读取

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    [root@localhost ~]# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
    [root@localhost ~]# vim /etc/pam.d/vsftpd
    #%PAM-1.0
    auth sufficient /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/virtualuser
    account sufficient /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/virtualuser
    session optional pam_keyinit.so force revoke
    auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
    auth required pam_shells.so
    auth include password-auth
    account include password-auth
    session required pam_loginuid.so
    session include password-auth

    说明:
    auth sufficient /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/virtualuser.db
    account sufficient /usr/lib64/security/pam_userdb.so db=/etc/vsftpd/virtualuser.db

    auth是指对用户的用户名口令进行验证
    account是指对用户的帐户有哪些权限哪些限制进行验证
    sufficient表示充分条件,也就是说,一旦在这里通过了验证,那么也就不用经过下面剩下的验证步骤了.相反,如果没有通过的话,也不会被系统立即挡之门外,因为sufficient的失败不决定整个验证的失败,意味着用户还必须将经历剩下来的验证审核
    /usr/lib64/security/pam_userdb.so表示该条审核将调用pam_userdb.so这个库函数进行
    db=/etc/vsftpd/virtualuser.db指定了验证库函数将到这个指定的数据库中调用数据进行验证
  9. 虚拟用户配置

    1
    2
    3
    //创建vsftpd主数据目录
    [root@localhost ~]# mkdir -p /home/vsftpduser/ftpdata
    [root@localhost ~]# chown -R vsftpduser.vsftpduser /home/vsftpduser/ftpdata
    1
    2
    3
    //创建vsftpd项目目录
    [root@localhost ~]# mkdir -p /home/vsftpduser/ftpdata/ssp
    [root@localhost ~]# chown -R vsftpduser.vsftpduser /home/vsftpduser/ftpdata/ssp
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    //创建虚拟目录配置文件
    [root@localhost ~]# vim /etc/vsftpd/vconf/ssp.conf
    # 指定虚拟用户的具体主路径
    local_root=/home/vsftpduser/ftpdata/ssp
    # 设定不允许匿名用户访问
    anonymous_enable=NO
    # 设定允许写操作
    write_enable=YES
    # 设定上传文件权限掩码
    local_umask=022
    # 设定不允许匿名用户上传
    anon_upload_enable=NO
    # 设定不允许匿名用户建立目录
    anon_mkdir_write_enable=NO
    # 设定空闲连接超时时间
    idle_session_timeout=600
    # 设定单次连续传输最大时间
    data_connection_timeout=120
    # 设定并发客户端访问个数
    max_clients=20
    # 设定单个客户端的最大线程数,这个配置主要来照顾Flashget,迅雷等多线程下载软件
    max_per_ip=5
    # 设定该用户的最大传输速率,单位b/s。
    local_max_rate=5000000
  10. 启动服务

    1
    2
    3
    4
    5
    6
    [root@localhost ~]# systemctl start vsftpd.service
    [root@localhost ~]# systemctl status vsftpd.service

    [root@localhost ~]# systemctl enable vsftpd.service
    [root@localhost ~]# systemctl list-units --type=service |grep vsftpd
    vsftpd.service loaded active running Vsftpd ftp daemon
  11. 测试

    1
    2
    ftp -i -n 127.0.0.1 21
    > user {user} {pass}

设置权限:

  • 只能上传.不能下载、删除、重命名
    cmds_allowed=FEAT,REST,CWD,LIST,MDTM,MKD,NLST,PASS,PASV,PORT,PWD,QUIT,RMD,SIZE,STOR,TYPE,USER,ACCT,APPE,CDUP,HELP,MODE,NOOP,REIN,STAT,STOU,STRU,SYST
  • 只能下载.不能上传、删除、重命名
    write_enable=NO
  • 只能上传、删除、重命名.不能下载
    download_enable=NO
  • 只能下载、删除、重命名.不能上传
  • 只能下载上传,不能删除
    cmds_allowed=FEAT,REST,CWD,LIST,MDTM,MKD,NLST,PASS,PASV,PORT,PWD,QUIT,RMD,RNFR,RNTO,RETR,DELE,SIZE,TYPE,USER,ACCT,APPE,CDUP,HELP,MODE,NOOP,REIN,STAT,STOU,STRU,SYST

具体命令介绍如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
    CWD - change working directory 更改目录
LIST - list remote files 列目录
MKD - make a remote directory 新建文件
NLST - name list of remote directory
PWD - print working directory 显示当前工作目录
RETR - retrieve a remote file 下载文件
STOR - store a file on the remote host 上传文件
DELE - delete a remote file 删除文件
RMD - remove a remote directory 删除目录
RNFR - rename from 重命名
RNTO - rename to 重命名
参考:
# ABOR - abort a file transfer 取消文件传输
# CWD - change working directory 更改目录
# DELE - delete a remote file 删除文件
# LIST - list remote files 列目录
# MDTM - return the modification time of a file 返回文件的更新时间
# MKD - make a remote directory 新建文件夹
# NLST - name list of remote directory
# PASS - send password
# PASV - enter passive mode
# PORT - open a data port 打开一个传输端口
# PWD - print working directory 显示当前工作目录
# QUIT - terminate the connection 退出
# RETR - retrieve a remote file 下载文件
# RMD - remove a remote directory
# RNFR - rename from # RNTO - rename to
# SITE - site-specific commands
# SIZE - return the size of a file 返回文件大小
# STOR - store a file on the remote host 上传文件
# TYPE - set transfer type
# USER - send username
# less common commands:
# ACCT* - send account information
# APPE - append to a remote file
# CDUP - CWD to the parent of the current directory
# HELP - return help on using the server
# MODE - set transfer mode
# NOOP - do nothing
# REIN* - reinitialize the connection
# STAT - return server status
# STOU - store a file uniquely
# STRU - set file transfer structure
# SYST - return system type