允许 SCP 但不允许使用 SSH 实际登录

DrS*_*ker 68 linux ssh scp

有什么方法可以在 Linux 机器上配置用户(在本例中为 Centos 5.2),以便他们可以使用 scp 检索文件,但实际上无法使用 SSH 登录到服务器?

小智 48

已弃用:请注意以下答案已过时。rssh 不再维护,不再是一种安全的方法。

rssh shell ( http://pizzashack.org/rssh/ ) 正是为此目的而设计的。

由于 RHEL/CentOS 5.2 不包含用于 rssh 的软件包,您可以查看此处以获取 RPM:http : //dag.wieers.com/rpm/packages/rssh/

要使用它,只需将其设置为新用户的 shell,如下所示:

useradd -m -d /home/scpuser1 -s /usr/bin/rssh scpuser1
passwd scpuser1
Run Code Online (Sandbox Code Playgroud)

..或更改现有的外壳,如下所示:

chsh -s /usr/bin/rssh scpuser1
Run Code Online (Sandbox Code Playgroud)

..并编辑/etc/rssh.conf以配置 rssh shell - 特别是取消注释allowscp行以启用所有 rssh 用户的 SCP 访问。

(您可能还想使用 chroot 将用户留在家中,但那是另一回事。)

  • scponly 也或多或少是一样的,而且显然不那么容易被利用:http://sublimation.org/scponly/wiki/index.php/Main_Page (7认同)
  • rssh 背后的想法很好,但 iirc rssh 并不是编程术语中安全的奇迹。一个简单的“rssh 漏洞利用”谷歌产生的结果超出了我的预期...... (6认同)
  • 这个答案应该删除!它真的过时了,可能会让人们感到困惑 - scponly、rssh 和类似的工具都已经死了,并在多年前从所有操作系统存储库中删除。rssh 存在多年未修补的漏洞。 (3认同)

小智 41

我迟到了,但是您可以使用 ssh 密钥并指定其 ~/.ssh/authorized_keys 文件中允许的确切命令,例如

no-port-forwarding,no-pty,command="scp 源目标" ssh-dss ...

您可能需要在目标上使用 ps 来设置正确的命令设置。

PS:如果您使用“-v”运行测试 scp 命令,您可以看到类似这样的内容

debug1: Sending command: scp -v -t myfile.txt
Run Code Online (Sandbox Code Playgroud)

您会注意到“-t”是一个未公开的 scp 选项,由远端的程序使用。这让您了解需要放入authorized_keys 中的内容。

编辑: 您可以在此 StackOverflow 问题中找到更多信息(带有多个链接)。

这是一个工作示例,适用backup_user于在服务器端命名的用户。

~backup_user/.ssh/authorized_keys 服务器端的内容(有更多安全限制):

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="scp -v -r -d -t ~/CONTENT" ssh-rsa AAAAMYRSAKEY...
Run Code Online (Sandbox Code Playgroud)

在 ~backup_user/ 中创建一个链接,链接到应该可以访问内容的目录。

$ ln -s /path/to/directory/with/accessible/content ~backup_user/CONTENT
Run Code Online (Sandbox Code Playgroud)

现在,从客户端,以下命令应该可以工作:

scp -v  -r  -P 2222 -i .ssh/id_rsa_key_file path/to/data backup_user@SERVER:~/CONTENT
Run Code Online (Sandbox Code Playgroud)

此命令的作用:

  • 它显示详细信息(可选:您可以-v从命令和authorized_keys 文件中删除)
  • 它递归地复制路径/到/数据的内容。(可选-r如果您不想进行递归复制,您可以从 command 和 authorized_keys 文件中删除)
  • 它使用端口 2222 连接到服务器(可选:您可以-P 2222从命令中删除)
  • 它使用身份文件来自动连接(可选:您可以删除-i .ssh/id_rsa_key_file
  • 的内容path/to/data将被复制到/path/to/directory/with/accessible/content/

要将文件(或多个)从服务器复制到客户端,您应该创建一个 shell 脚本来处理这里描述的情况

  • @Dan - 应该可以对 authorized_keys 文件设置只读权限,即。`chmod 400 ~/.ssh/authorized_keys`。 (3认同)
  • 此外,您应该将 `~/.bashrc`(以及 Bash 执行的任何其他内容)和 `~/.ssh/rc` 设为只读。但是如果恶意用户可以访问 rsync 或 sftp,他仍然可以删除`~/.bashrc`,并上传一个新的。由于很难保护,我建议不要使用这种方法(`command="..."`)。 (3认同)

Fra*_*eas 34

我参加聚会有点晚了,但是我建议您查看ForceCommandOpenSSH的指令。

Subsystem sftp internal-sftp

Match group sftponly
         ForceCommand internal-sftp
Run Code Online (Sandbox Code Playgroud)

当然,这是 SFTP 而不是 SCP,但它达到了相同的目标,比使用受限 shell 更安全。此外,如果您愿意,您可以 chroot 用户。

  • `ForceCommand internal-sftp -u 0077 -d /uploaddir` 可以通过在上传目录上强制使用 umask 来进一步强化它。结合“ChrootDirectory”,它创建了一个非常受控制的、隔离的上传环境。额外说明:如果你想让它们工作,默认目录和 umask _必须在`ForceCommand` 中设置,而不是在`Subsystem` 指令中。 (4认同)
  • 在匹配部分之后添加 `chrootDirectory %h` 和 `AllowTcpForwarding no` 以强制 sftponly 用户 chroot 到他们的家。请注意,匹配应该(必须!)是 ssh 配置的最后一部分,之后的选项是仅适用于匹配用户的选项 (2认同)

J.Z*_*man 9

我使用 MySecureShell 来做到这一点。您也可以配置其他限制。

https://github.com/mysecureshell/mysecureshell

将连接限制为仅 SFTP/SCP。没有外壳访问。


syn*_*yn- 7

我建议使用 scponly。

它是一个受限制的 shell,允许用户执行听起来像的操作,将 SCP 文件发送到服务器,但实际上并不登录。软件的信息和源代码下载可在此处获得,预编译的 RPM 包可通过以下网址获得EPEL YUM 存储库

安装后,您需要配置您希望限制访问的每个用户帐户,以使用新安装的受限 shell。您可以通过 /etc/passwd 手动执行此操作或使用以下命令: usermod -s /usr/bin/scponly USERNAME

  • scponly 似乎已经死了。debian 似乎已将其删除:https://packages.debian.org/search?keywords=scponly 并且 [github 上的代码](https://github.com/scponly/scponly/) 也已死。后续讨论:http://serverfault.com/questions/726519/replacement-for-scponly-on-debian (4认同)