如何在Ubuntu系统上配置SFTP服务以实现安全数据共享?

摘要:通过配置 Ubuntu 的 SFTP 服务并使用 bind mount 共享指定目录,可在 Windows 上借助 FreeFileSync 实现安全、高效的镜像同步。
1. 需求 先说一下笔者的需求:实现 Ubuntu 系统机器与其他机器的数据共享,尤其是让 Ubuntu 系统下的某个目录镜像到 Windows 本地环境中。 2. 协议 除了安装现成的软件,一种比较好的方案是基于 Ubuntu 系统本身来搭建 SFTP 服务。SFTP(SSH File Transfer Protocol)是一种通过 SSH 加密通道安全传输文件的网络协议,是运维人员的首选文件传输方式。SFTP 是 SSH 协议的一个子系统,必须先建立 SSH 连接才能使用 SFTP。 SSH(Secure Shell)提供安全的远程登录和命令执行,可作为其他协议的安全隧道。 3. 操作 笔者的目的是将 /home/ubuntu/data 这个目录共享出去。 3.1 配置 安装并运行 SSH : sudo apt update sudo apt install openssh-server -y sudo systemctl enable --now ssh 创建专用 SFTP 用户,使用禁止用户通过 SSH 登录到交互式终端的 shell: # 创建用户,禁止 shell 登录,主目录设为 /home/ubuntu/data sudo useradd -d /home/ubuntu/data -s /usr/sbin/nologin sftpuser # 设置密码(客户端连接时用) sudo passwd sftpuser 设置目录权限,SFTP 的 chroot 要求 chroot 目录必须由 root 拥有且不可写,但子目录可以给用户写: # 创建父目录作为 chroot 根(必须 root 所有) sudo mkdir -p /sftp/sftpuser # chroot 根目录必须是 root:root 且 755 sudo chown root:root /sftp/sftpuser sudo chmod 755 /sftp/sftpuser 假设我们想要共享的目录就是 /home/ubuntu/data : # 软链接 sudo ln -s /home/ubuntu/data /sftp/sftpuser/upload # 子目录(upload)归 sftpuser 所有,可读写 sudo chown sftpuser:sftpuser /sftp/sftpuser/upload sudo chmod 755 /sftp/sftpuser/upload 配置 SSH 支持 SFTP chroot,在 /etc/ssh/sshd_config 文件末尾添加以下内容: Match User sftpuser ChrootDirectory /sftp/sftpuser ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no PermitTunnel no 表示当用户是 sftpuser 时,将其限制在 /sftp/sftpuser 目录中,且只能使用 SFTP。 最后重启 SSH 服务: sudo systemctl restart ssh 3.2 测试 如果在 Windows 下测试是否能访问远端 Ubuntu 的 SFTP 服务,可以直接使用 PowerShell ,因为现在主流的 Windows 10/11 已经内置可 OpenSSH 客户端: sftp sftpuser@Ubuntu-IP 输入密码后就可以进入 sftp> 提示符。不过笔者在进入 upload 目录的时候失败了: sftp> dir upload sftp> cd upload realpath /upload: No such file 这是因为笔者前面设置的路径 /sftp/sftpuser/upload 是一个软链接,而 OpenSSH 的 internal-sftp 在 chroot 环境中默认不解析软链接。为了保证通用性,这里还是换成 bind mount 的方式。
阅读全文