Ubuntu 使用 vsftpd 基于系统用户配置相互隔离的 ftp (ftps) 服务并禁止账户 ssh shell 登陆功能
我们在日常使用 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-get update #刷新软件源信息
sudo apt-get 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 这个文件夹了,点击进入这个文件夹,然后进行文件上传下载删除动作就会发现全部都可以正常操作了。