ubuntu 使用 vsftpd 基于系统用户配置相互隔离的 ftp (ftps) 服务并禁止账户 ssh shell 登陆功能

发布于:2020年05月03日    浏览:4815 次    属于:服务器运维 > 环境配置 原创作者:张晓栋

 

    我们在日常使用 UbuntuServer 服务器时,经常会直接使用基于 ssh 的  sftp 连接服务器直接进行文件上传和下载,不过这个方式其实有一定的安全隐患,当一个团队有多个人员,需要连接服务器去发布时,如果使用 ssh 则意味着需要将系统的 账户和密码 告知对方,别人就不仅拥有了 sftp 的连接权限,同时也拥有了 ssh 的连接权限,意味着可以直接登陆服务器,而且 对方使用 sftp 登陆之后可以看到服务器上全部的文件,这显示是不符合预期的,我们要的仅仅是给对方提供一个 ftp 文件上传下载的权限,并且最好能够限定到具体的目录。


    针对上面的痛点,我也百度看过不少解决方案,有人说可以 通过配置 账户的 shell ,比如 /usr/sbin/nologin 来实现 账户禁止 ssh 登陆,只保留 sftp 权限,然而我按照多个文章的教程,进行反复操作之后,发现这样的配置确实禁止对应账户远程登陆 ssh 了,但是,,,sftp 也连不上了,,所以在反复实验之后,选择放弃,这时回归最原始的点,想想我需要的是一个ftp服务来提供文件上传下载的方法,为何不直接独立配置 ftp 服务,顺着这个思路,我找到了 Linux Server 下非常优秀的一款软件  vsftpd,这款软件 支持  ftp, ftps(隐式加密), ftpes(显示加密) ,可以完美解决我们的需求,接下来开始我们的正文,在 Ubuntu Server 配置 vsftpd 实现不同通过账户,指向不同的文件夹,并且禁用账户的 shell 登陆功能。


    sudo apt update   #刷新软件源信息

    sudo apt install vsftpd    #安装 vsftpd


    sudo vim /etc/vsftpd.conf   安装好之后开始编辑配置文件,进行如下几项的调整,有些配置项在配置文件中本来存在,修改对应的值即可,有些则不存在需要手动编写,在操作的时候小伙伴要注意    

    listen=YES                            #开启监听 ipv4 地址

    listen_ipv6=NO                    #关闭监听 ipv6 地址,ipv4 和 ipv6 不可以同时监听,否则会无法启动

    chroot_local_user=YES        #限定用户只能操作主目录

    write_enable=YES                #开启文件写入功能

    ssl_enable=YES                    #开启 ssl 加密功能,默认为 ftpes 显示加密

    ssl_tlsv1=YES                       #开启 tlsv1 加密支持,默认为 tlsv1

    ssl_sslv2=YES                       #开启 sslv2 协议支持

    ssl_sslv3=YES                       #开启 sslv3 协议支持

    implicit_ssl=YES                   #指定ssl 加密方式为隐式加密(该项开启之后 ftp 工作于 ftps 隐式加密模式下,ftps 模式端口默认为 990,需要特意指定端口为 990,如果不开启则,不需要修改端口)

    listen_port=990                    #设定ftp服务端口 (默认情况不需要指定端口值,implicit_ssl=YES 时才需要该端口配置,个人推荐使用隐式加密,连接更加稳定)

    file_open_mode=0777         #配置 用户默认上传的文件权限为 0777 

    pasv_min_port=6000           #被动连接模式 最小端口

    pasv_max_port=7000          #被动连接模式最大端口

    pasv_enable=YES                 #启用被动连接模式

    pasv_address=x.x.x.x           #服务器对应的外部IP地址(云服务器,这里一定要填写外网ip地址,如果在内网中使用这边,这行配置可以直接注释)


    经过上面的调整,vsftpd 模块就算配置完成了,大家可能在百度的时候可能会看到别人还要配置其他很多选项,但是那些其实没必要了,vsftpd 的默认配置,在加上我们上面的调整就相对来说比较完美了,下面介绍三个 vsftpd 的常用命令。

    sudo service vsftpd start         #启动 vsftpd

    sudo service vsftpd restart     #重启 vsftpd

    sudo service vsftpd stop        #停止 vsftpd


    vsftpd服务安装完成之后,就可以创建账户来进行测试,我们今天教大家的方法,账户是基于系统账户来配置的,操作如下:

    vim /etc/shells       #编辑系统 shell 规则,加入静止登陆的 shell 规则,追加在文件最后一行即可

    /usr/sbin/nologin    #屏蔽 ssh 登陆


    sudo useradd xiaoming      #创建用户xiaoming

    sudo passwd xiaoming        #修改用户 xiaoming 的密码

    sudo usermod -d /var/www xiaoming        #为xiaoming 指定账户主目录

    sudo chmod 555 /var/www        #去除主目录的可写权限 (vsfpd在 chroot_local_user=YES 禁止默认的登陆目录拥有可写权限,如果拥有则会无法登陆)

    sudo usermod -s /usr/sbin/nologin xiaoming        #屏蔽xiaoming对于系统的 ssh 登陆权限    如果要重新放开登陆权限,执行 sudo usermod -s /bin/bash xiaoming


    这样一来我就创建了一个账户xiaoming,该账户无法使用 ssh 连接系统,但是支持 ftp 登陆系统,ftp 登陆系统之后默认就会进入 ubuntu 中 nginx 默认的网站目录  /var/www ,这个其实就是我们配置的主目录,大家可以根据自己需求自己调整,主目录地址。客户端这时候可以进行连接测试,客户端推荐使用 FileZilla 创建一个站点,注意 协议选择 ftp,加密方式 选择 要求隐式的 FTP over TLS,如下图:


    FileZilla 这时候应该就可以连接到我们 ftp 服务器了,这时候各位如果进行文件上传动作,应该会全部失败,因为我之前设定了主目录的权限为 555,意味着没有任何的可写权限,所以我们需要 在 服务器上提前创建好子目录,以方便我们使用,操作如下:


    sudo mkdir /var/www/www.xxxx.com            #创建一个文件夹用于存放 www.xxxx.com 的文件

    sudo chmod 777 /var/www/www.xxxx.com        #调整创建的文件夹权限为 777 


    这时候我们重新刷新 ftps 应该就可以看到我们创建的  www.xxxx.com 这个文件夹了,点击进入这个文件夹,然后进行文件上传下载删除动作就会发现全部都可以正常操作了。