
SFTP - SSH File Transfer Protocol(SSH 文件传输协议)
他虽然也用 ssh 的 22 端口,但确是一套独立的协议,和 scp 命令完全不同:
cp 的命令,并通过管道传输数据。当然和 FTP,FTPS 更完全不同。FTP是20/21端口,主动被动模式的那个。FTPS 就是使用了域名证书的FTP。他俩的关系就和HTTP和HTTPS一样。
配置了普通ssh用户,既可以使用SFTP功能,但不安全,他也有机会去执行其他命令。若只想要一个传输文件的账号,我们需要做些限制。
第一步:创建用户
# 1. 创建专用SFTP用户组
sudo groupadd sftpusers
# 2. 创建用户,将其加入SFTP组,并禁用Shell
# -d: 指定用户家目录(Chroot根目录)
# -s: 指定Shell为/sbin/nologin,禁止SSH登录
# -g: 指定主组为sftpusers
sudo useradd -d /data/sftp/sftpuser -s /sbin/nologin -g sftpusers sftpuser
# 3. 设置用户密码
sudo passwd sftpuser第二步:创建相关路径
# 1. 创建Chroot根目录(用户将被限制在此目录内)
sudo mkdir -p /data/sftp
# 2. 设置目录属主为root,权限为755(用户可读可进入,不可写)
sudo chown root:root /data/sftp
sudo chmod 755 /data/sftp
# 3. 在Chroot根目录下创建用户家路径
sudo mkdir /data/sftp/sftpuser
# 4. 将子目录的属主设置为用户,赋予其读写权限
sudo chown sftpuser:sftpusers /data/sftp/sftpuser
sudo chmod 750 /data/sftp/sftpuser第三步:配置sftp用户
编辑 /etc/ssh/sshd_config,大概在最后的位置写入
Subsystem sftp internal-sftp
Match User sftpuser
# 将用户限制在其家目录
ChrootDirectory /data/sftp/
# 强制使用内部SFTP,禁用Shell
ForceCommand internal-sftp
# 允许的登陆方式
PubkeyAuthentication yes
PasswordAuthentication yes
# 禁用不必要的转发功能,增强安全性
PermitTTY no
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no重启sshd服务: systemctl reload sshd
这样,用户就被锁在了特定路径中,没有执行其他命令的权限,不能ssh登录了。
使用 sftp 命令试下:
sftp sftpuser@x.x.x.x配置 ssh key 登陆
和普通配置免密登陆是一样的(使用ssh-keygen 生成私钥公钥对,本文略), 注意上文 sshd_config 配置中PubkeyAuthentication 配为yes
# 1. 进入该用户的家目录
cd /data/sftp/sftpuser
# 2. 创建 .ssh 目录,并设置严格权限(必须是 700)
mkdir .ssh
chown sftpuser:sftpusers .ssh
chmod 700 .ssh
# 创建文件
touch /data/sftp/sftpuser/.ssh/authorized_keys
# 设置严格权限(必须是 600)并修改属主
chmod 600 /data/sftp/sftpuser/.ssh/authorized_keys
chown sftpuser:sftpusers /data/sftp/sftpuser/.ssh/authorized_keys将你本地电脑上的公钥(通常是 ~/.ssh/id_rsa.pub 或 id_ed25519.pub)内容,写入到服务器上的 authorized_keys 文件中。
使用如下命令登录:
sftp sftpuser@172.16.1.69
# 或
sftp -i ~/.ssh/id_ed25519 sftpuser@172.16.1.69当然,如果你想有更强大的管理功能,也可以直接使用之前介绍过的《SFTPGo 托管文件传输 (MFT) 平台》