跳转至内容

SCP 和 SFTP

来自 ArchWiki
(重定向自SCP)

本文或章节是合并到 SFTP chroot 的候选。

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

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

警告 scp 协议已过时、不灵活且不易修复。其作者建议使用更现代的协议,如 sftp 和 rsync 进行文件传输。[1]

安全文件传输协议 (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 中添加一个条目,以使绑定挂载在重启后仍然存在。

创建非特权用户

创建共享用户并设置一个强密码

# 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 工具。

通过安装额外的软件包可以获得更多功能,例如 rsshAUR 或下面介绍的 scponly

注意 自 OpenSSH 9.0 起,scp 工具默认使用 SFTP 协议。必须使用 -O 选项才能使用旧版 SCP 协议。

通用用法

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 访问。此外,还可以设置 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 服务器)。