SCP 和 SFTP

出自 ArchWiki

本文或本章节可能需要与 SFTP chroot 合并。

注意: 说明似乎与 SFTP chroot 中的相同,并且内容更多。(在 Talk:SCP and SFTP#Incorrect 'Considered for redirection' banner? 中讨论)

安全复制 (SCP) 是一种通过 安全 Shell 连接传输文件的协议。 SSH 文件传输协议 (SFTP) 是一种相关协议,也依赖于安全 shell 后端。 这两种协议都允许安全的文件传输,加密密码和传输的数据。 然而,SFTP 协议具有额外的功能,例如,恢复中断的传输或远程文件操作(如删除)。

安全文件传输协议 (SFTP)

安装和配置 OpenSSH。 运行后,SFTP 默认可用。

使用 sftp 程序或 SSHFS 访问文件。 许多标准的 FTP 程序也应该可以工作。

带 chroot 监狱的安全文件传输协议 (SFTP)

系统管理员可以使用 openssh 将一部分用户限制在 chroot 监狱中,从而限制他们对特定目录树的访问。 这对于简单地共享一些文件而不授予完全系统访问权限或 shell 访问权限非常有用。 具有这种类型设置的用户可以使用 SFTP 客户端(如 filezilla)在 chroot 监狱中上传/下载文件。

设置文件系统

创建一个监狱目录

# mkdir -p /var/lib/jail

可选地,将要共享的文件系统绑定挂载到此目录。 在此示例中,将使用 /mnt/data/share。 它由 root 拥有,并且具有八进制权限 755。

# mount -o bind /mnt/data/share /var/lib/jail
提示: 考虑在 /etc/fstab 中添加条目,以使绑定挂载在重启后仍然存在。

创建一个非特权用户

创建 share 用户并设置一个安全的密码

# useradd -g sshusers -d /var/lib/jail foo
# passwd foo

设置 OpenSSH

将以下内容添加到 /etc/ssh/sshd_config 的末尾,以启用共享并强制执行限制

/etc/ssh/sshd_config
...
 Match group sshusers
  ChrootDirectory %h
  X11Forwarding no
  AllowTcpForwarding no
  PasswordAuthentication yes
  ForceCommand internal-sftp

重启 sshd.service 以重新读取配置文件。 有关在使用 chroot 时正确配置密钥的信息,请参阅 SFTP chroot,否则会遇到权限被拒绝的问题。

测试实际上是否强制执行了限制,方法是尝试通过 shell 进行 ssh 连接。 ssh 服务器应返回有关设置的礼貌通知

$ ssh foo@someserver.com
foo@someserver.com's password:
This service allows sftp connections only.
Connection to someserver.com closed.

安全复制协议 (SCP)

安装、配置和启动 OpenSSH。 它包含用于传输文件的 scp 实用程序。

安装其他软件包可以获得更多功能,例如下面描述的 rsshAURscponly

注意: 自 OpenSSH 9.0 起,scp 实用程序默认使用 SFTP 协议。 必须使用 -O 选项才能使用旧版 SCP 协议。
警告: scp 协议已过时、不灵活且不易修复。 其作者建议使用更现代的协议(如 sftp 和 rsync)进行文件传输。[1]

通用用法

Linux 到 Linux

从远程主机复制文件到本地主机 SCP 示例

$ scp username@from_host:file.txt /local/directory/

从本地主机复制文件到远程主机 SCP 示例

$ scp file.txt username@to_host:/remote/directory/

从远程主机复制目录到本地主机 SCP 示例

$ scp -r username@from_host:/remote/directory/  /local/directory/

从本地主机复制目录到远程主机 SCP 示例

$ scp -r /local/directory/ username@to_host:/remote/directory/

从远程主机复制文件到远程主机 SCP 示例

$ scp username@from_host:/remote/directory/file.txt username@to_host:/remote/directory/

Linux 到 Windows

使用 Windows 程序,例如 WinSCP

Scponly

Scponly 是一个受限的 shell,用于允许用户进行 scp/sftp 访问,并且仅允许 scp/sftp 访问。 此外,可以设置 scponly 以将用户 chroot 到特定目录中,从而提高安全级别。

安装 scponly

对于现有用户,只需将用户的 shell 设置为 scponly

# usermod -s /usr/bin/scponly username

添加 chroot 监狱

该软件包附带一个用于创建 chroot 的脚本。 要使用它,请运行

# /usr/share/doc/scponly/setup_chroot.sh
  • 提供答案
  • 检查 /path/to/chroot 是否具有 root:root 所有者和 r-x 其他人的权限
  • 将所选用户的 shell 更改为 /usr/bin/scponlyc
  • sftp-server 可能需要一些 libnss 模块,例如 libnss_files。 将它们复制到 chroot 的 /lib 路径。

上传到 Chroot 监狱根目录

出于安全原因,设置为 chroot 目录的目录必须由 root 拥有,并且只有 root 具有对其的写入权限,否则 sftp/ssh 连接将被拒绝。 这当然意味着普通用户无法将文件上传到根目录。 为了在不损害安全性的前提下解决此问题,您可以在 chroot 目录中创建一个文件夹,普通用户或组对其具有写入权限,例如

# cd /var/lib/jail
# mkdir uploads
# chown :sshusers uploads
# chmod 730 uploads
注意: 这将仅允许 “sshusers” 组的用户上传到 “uploads” 目录(但不能列出其内容)。 使用 chmod 770 允许 sshusers 查看内容。

某些使用 SFTP 的应用程序在执行操作(例如上传文件)时不允许输入子目录,并且会尝试将文件上传到 chroot 基本目录(这将​​被拒绝)。 为了强制这些应用程序使用特定的子目录,您可以将以下内容附加到 “ForceCommand” 选项

/etc/ssh/sshd_config
...
 Match group sshusers
  ...
  ForceCommand internal-sftp -d /uploads

连接的用户随后将其起始目录更改为指定的子目录(请记住重启 sshd 服务器)。