VPS 上的 Ubuntu 系统中搭建安全的 FTP 服务

本文目标旨在 VPS 的 Ubuntu 系统中安装 VSFTPD(Very Secure FTP Deamon)服务,并调整配置文件提高 ftp 访问的安全性。

  1. 使用 root 用户登录 VPS 服务器

  2. 更新系统安装包列表,安装 VSFTPD 二进制包:

    1
    2
    
    apt-get update
    apt-get install vsftpd
    
  3. 手动开启服务,并使得在下次开机时能够自动开启服务:

    1
    2
    
    systemctl start vsftpd
    systemctl enable vsftpd
    
  1. 创建一个原始配置文件 /etc/vsftpd/vsftpd.conf 的备份文件:

    1
    
    cp /etc/vsftpd.conf /etc/vsftpd.conf.bak
    
  2. 打开 vsftpd 配置文件

    1
    
    vi /etc/vsftpd.conf
    
  3. 把下面的这些选项添加 / 改成所展示的值:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    anonymous_enable=NO             # 关闭匿名登录
    local_enable=YES                # 允许本地用户登录
    write_enable=YES                # 启用可以修改文件的 FTP 命令
    local_umask=022                 # 本地用户创建文件的 umask 值
    dirmessage_enable=YES           # 当用户第一次进入新目录时显示提示消息
    xferlog_enable=YES              # 一个存有详细的上传和下载信息的日志文件
    connect_from_port_20=YES        # 在服务器上针对 PORT 类型的连接使用端口 20(FTP 数据)
    xferlog_std_format=YES          # 保持标准日志文件格式
    listen=NO                       # 阻止 vsftpd 在独立模式下运行
    pam_service_name=vsftpd         # vsftpd 将使用的 PAM 验证设备的名字
    tcp_wrappers=YES                # 打开 tcp 包装器
    
  4. 继续增加配置 ,使得服务器可以基于用户列表文件 /etc/vsftpd.userlist 来允许或拒绝用户访问 FTP

    1
    2
    3
    
    userlist_enable=YES                     # vsftpd 将会从所给的用户列表文件中加载用户名字列表
    userlist_file=/etc/vsftpd.userlist      # 存储用户名字的列表
    userlist_deny=NO                        #  允许列表中的用户访问 ftp 服务器
    

    注意:

    • 在默认情况下,如果通过 userlist_enable=YES 启用了用户列表,且设置 userlist_deny=YES 时,那么,用户列表文件 /etc/vsftpd.userlist 中的用户是不能登录访问的。但是,选项 userlist_deny=NO 则反转了默认设置,这种情况下只有用户名被明确列出在 /etc/vsftpd.userlist 中的用户才允许登录到 FTP 服务器。
    • 另外,如果 pam_service_name=vsftpd 被设置,则还要查看 /etc/pam.d/vsftpd 的内容包含 sense=deny 时,/etc/pam.d/vsftpd 中列出的用户仍然不可访问 ftp 服务器
  5. 建立新的用户用以访问 ftp 服务器

    1
    2
    
    useradd -m -c "Ciel Yang, owner of the server" -s /bin/bash ciel
    passwd
    
  6. 重启服务后,测试 ftp 服务器连通性(这里使用 Windows 下的 FileZilla FTP Client 测试)

    1
    
    systemctl restart vsftpd
    

    注意:一定不要忘记测试匿名用户能否登录 ftp 服务器,防止粗心大意造成的安全隐患。

  1. 首先在 /etc/ssl/ 下创建一个子目录来存储 SSL/TLS 证书和密钥文件,如果它不存在的话这样做:

    1
    
    mkdir /etc/ssl/private
    
  2. 在一个单一文件中生成证书和密钥,运行下面的命令:

    1
    
    openssl req -x509 -nodes -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem -days 365 -newkey rsa:2048
    

    注意:上述命令执行后会出现多行提示,要求输入个人信息以便登录方确认服务器的证书提供者信息,根据自己实际情况输入即可。(自用服务器可随意)

  3. 打开 vsftpd 配置文件并定义 SSL 详细信息:

    1
    
    vi /etc/vsftpd.conf
    
  4. 添加或找到选项 ssl_enable,并将它的值设置为 YES 来激活使用 SSL ,同样,因为 TLS 比 SSL 更安全,启用 ssl_tlsv1 选项限制 vsftpd 只使用 TLS:

    1
    2
    3
    4
    
    ssl_enable=YES
    ssl_tlsv1=YES
    ssl_sslv2=NO
    ssl_sslv3=NO
    
  5. 接下来,使用#字符注释掉证书设置的行然后进行修改(或径直修改也可),如下所示:

    1
    2
    3
    4
    5
    
    #rsa_cert_file=/etc/ssl/private/ssl-cert-snakeoil.pem
    #rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
    
    rsa_cert_file=/etc/ssl/private/vsftpd.pem
    rsa_private_key_file=/etc/ssl/private/vsftpd.pem
    
  6. 阻止匿名用户使用 SSL 登录,并且迫使所有的非匿名登录使用安全的 SSL 链接来传输数据和在登录期间发送密码:

    1
    2
    3
    
    allow_anon_ssl=NO
    force_local_data_ssl=YES
    force_local_logins_ssl=YES
    
  7. 提高加密算法等级:

    1
    
    ssl_ciphers=HIGH
    
  8. 重启服务

    1
    
    systemctl restart vsftpd
    
  9. 测试 ftp 服务器连通性,FileZilla 中选择“站点管理器”以新建站点进行测试,站点信息如下(其他信息无限更改):

    • 协议:FTP - 文件传输协议
    • 加密:要求显式的 FTP over TLS