Fab*_*adi 59 security scp sftp
我在 Un*x 中有 20 多年的经验,而且我一直在使用它scp
。
scp
通过 SSH,因此我认为它与后者一样安全。现在,在我最近开始工作的公司中,安全官说scp
不应使用它,因为它不安全且已过时。sftp
应该比它更受青睐(但也比 SSH 更......)
基于 scp 下的基础设施,以及scp
在专业社区以及我前公司的其他同事中的受欢迎程度和信任度,我并不立即同意这一点。我不想仅仅因为某些 CSO 这么说就改变主意。
scp
突然的害群之马?scp
只是好用?JoL*_*JoL 36
这是轻微的“不安全”,然后加入scp -T
在OpenSSH的8.0,它仍然是轻微的“不安全”当使用scp -r
。
就像其他答案所说的那样,声称 scp 不安全来自客户端之前无法验证它是否正在接收它所请求的内容。scp 无法验证的原因是因为请求是使用在服务器环境中运行的 shell 代码(具有服务器状态)发出的。
例如,假设服务器的 shell 设置为带有扩展 glob 的 zsh,并且我将我的项目目录设置为 zsh 动态命名目录以便快速访问。如果我想从 Rails 项目foo获取文件,我可以通过以下方式获取:
scp server:~foo/config/database.yml .
Run Code Online (Sandbox Code Playgroud)
我服务器上的 zsh 扩展~foo
为~/work-for/client/$client_name/foo
.
如果我想获取服务器的 10 个最新的常规文件,我可以这样做:
scp server:'*(.oc[1,10])' .
Run Code Online (Sandbox Code Playgroud)
如果服务器有普通的 bash,我可以这样做:
scp server:'$(ls -t | head -10)' .
Run Code Online (Sandbox Code Playgroud)
如果我想获取在其内容中包含模式 foo 的文件,我可以这样做:
scp server:'$(grep -l foo *)' .
Run Code Online (Sandbox Code Playgroud)
scp 客户端无法验证这些使用 shell 代码的请求。但是,令人担忧的是它使恶意服务器能够响应:
scp -r server:foo/ ~
Run Code Online (Sandbox Code Playgroud)
与覆盖.ssh/authorized_keys
。在 眼中scp
,foo/
是服务器 shell 代码,它将评估谁知道什么。
输入scp -T
:
-T禁用严格的文件名检查。默认情况下,将文件从远程主机复制到本地目录时,scp 会检查接收到的文件名是否与命令行上请求的文件名匹配,以防止远程端发送意外或不需要的文件。由于各种操作系统和 shell 解释文件名通配符的方式不同,这些检查可能会导致所需文件被拒绝。此选项以完全信任服务器不会发送意外文件名为代价禁用这些检查。
总而言之,之前的默认行为scp
已移至-T
,现在默认是检查接收到的内容,使用提供的参数作为简单模式,当不进行递归复制时。我相信它可以识别简单的 globs 和转义符(查看源代码,它使用fnmatch(3)进行匹配,标志设置为 0)。换句话说,当您不希望利用其通过 shell 代码指定文件的独特能力时,它的行为更可预测。
所以现在,如果你不使用-T
也不使用-r
,覆盖之类的东西的唯一方法.bashrc
就是明确地要求它。如果你想使用 shell 代码,你必须以-T
信任服务器为代价使用:
scp -T server:'*(.oc[1,10])' .
Run Code Online (Sandbox Code Playgroud)
因此,现在您可以在简单的非递归情况下获得安全性,而无需完全放弃scp
比其他实用程序(如sftp
or )更有用的独特功能rsync
。
sftp 不能用shell 代码指定它想要的文件。它只接受实际的文件路径。这样就比较有限了。如果您只需要 scp 用于简单的文件路径,那么是的。但是,如果您希望能够从带有服务器端 shell 代码的简单命令中指定文件的附加功能(尽管以必须信任您的服务器为代价),那么我认为您唯一的选择是scp
.
这是不安全的,但前提是您不相信服务器不会受到损害。就我而言,也许对于大多数人来说,我们将 scp 与我们以其他方式完全信任的服务器一起使用。特别是,我用它从我的笔记本电脑登录到我的台式机,反之亦然。如果我们不能相信自己的设备,那我们还能相信什么?这就是为什么我认为将其称为简单不安全是夸张的。例如,它无法与我们称 telnet 不安全的方式相提并论。
不过,我仍然感谢对 required 的更改-T
。它是安全的。此外,对于那些不需要由 启用的功能的人来说-T
,使用 scp 确实比 sftp 或 rsync 并没有太大优势。
Arc*_*mar 21
我读它的方式是“视情况而定”。
但是,scp 客户端仅对返回的对象名称进行粗略验证(仅防止目录遍历攻击)。恶意 scp 服务器(或中间人攻击者)可以覆盖 scp 客户端目标目录中的任意文件。如果执行递归操作 (-r),服务器也可以操作子目录(例如,覆盖 .ssh/authorized_keys 文件)。
因此,如果scp
在您的场所(数据中心)内的主机之间进行,很可能(但不确定)不会执行 MITM 攻击。
但是,如果从世界各地的野生网的客户/合作伙伴获取业务文件,你应该依靠sftp
,或更好的ftps
。(至少,确保scp
客户端和ssh
服务器有正确的版本)
如果您认为 SSH 上的 MITM 是可能的,我会说很多 Unix 命令变得不安全。恶意者sudo
可以窃取您的密码,恶意通信客户端可以读取您的邮件/即时消息等。
至少可以说,在与受感染的服务器交谈时替换scp
withsftp
会以某种方式纠正这种情况是非常乐观的。任何对scp
本地文件造成的破坏也可以通过二进制文件、shell 脚本、Python 文件、Makefile 等来完成,流氓sftp
会很乐意为您服务。
简而言之,如果您不注意 SSH 连接到哪些服务器,那么无论您使用哪种工具,您都有很高的风险,而使用sftp
代替scp
只会稍微安全一点。
这并不是说切换到sftp
是一个坏主意:如果它是手头任务的高级工具,那么您就有充分的理由切换,顺便说一下,这与安全性无关。
小智 5
对于针对CVE-2019-6111所做的新 OpenSSH更改以及它们应该如何保证一切的安全性,存在很多困惑。scp
它们的目的是防止用作文件源的恶意服务器发送请求之外的其他文件名,并覆盖本地计算机上的随机文件。
但当使用该选项时它们没有任何作用-r
。使用-r
意味着-T
.
虽然完全合乎逻辑,但许多人无法意识到这一点,并且他们会因为总是期望scp
检查文件名而陷入自满感。直到有一天,他们遇到了残酷的事实。由此提供的“安全性”并不比alias rm='rm -i'
.
由于仅用于测试而设置流氓 ssh/scp 服务器可能非常复杂,因此您可以使用选项-S program
(scp
指示它使用另一个程序而不是ssh
设置通道)来验证我的声明。
在这里,我使用一个小的可执行脚本ssh_from_hell
,无论要求什么,它总是发送一个lolcats.lol
文件:
$ chmod 755 ssh_from_hell
$ scp -S ./ssh_from_hell user@host:foo.txt .
protocol error: filename does not match request
# OK, as expected
$ scp -S ./ssh_from_hell -r user@host:foo/ .
lolcats.lol 100% 12 62.0KB/s 00:00
$ cat lolcats.lol
LOL LOL LOL
$ cat ssh_from_hell
#! /usr/bin/perl
use strict;
$|=1; # autoflush
sub readack { local $/=\1; <STDIN> }
sub ack { print "\0" }
my $data = join '', <DATA>;
readack;
printf "C%04o %lld %s\n", 0666, length($data), "lolcats.lol";
readack;
print $data;
ack;
__DATA__
LOL LOL LOL
Run Code Online (Sandbox Code Playgroud)
新更改带来的另一个不幸是您不能再引用远程文件名,而是不能再引用远程文件名。
scp 'user@host:"a file with spaces and * love *.txt"' .
Run Code Online (Sandbox Code Playgroud)
你应该使用
scp 'user@host:a\ file\ with\ spaces\ and\ \*\ love\ \*.txt' .
Run Code Online (Sandbox Code Playgroud)
然而,一些有影响力的开发人员显然喜欢大括号,因此他们还添加了一个带有大括号支持的临时模式匹配实现scp
——他们可能已经使用glob(3)
with GLOB_ALTDIRFUNC|GLOB_BRACE
,但编写新代码总是更有趣。无论如何,fwiw,请注意 scp 中的大括号扩展实现几乎与 csh 类似,即。{{foo}}
将扩展到foo
:
$ scp -S ./ssh_from_hell 'user@host:{{lolcats.lol}}' .
lolcats.lol 100% 12 61.6KB/s 00:00
Run Code Online (Sandbox Code Playgroud)
csh
但与、perl
和 的内容并不完全相同glob(3)
:
$ scp -S ./ssh_from_hell 'user@host:lolcats{}.lol' .
protocol error: filename does not match request
Run Code Online (Sandbox Code Playgroud)
还有越野车:
$ scp -S ./ssh_from_hell 'user@host:lolcats{,}.lol' .
protocol error: filename does not match request
Run Code Online (Sandbox Code Playgroud)
Mar*_*art -4
他们不正确,你是!
sftp 是 ssh 的衍生产品。我认为他的意思是不使用FTP而使用sftp。
SCP 和 sftp 大部分都在 SSH 之上运行,因此如果他们希望您不使用 SCP,他们也不应该希望您使用 SSH(或 sftp)。sftp 和 scp 都允许安全文件传输、加密密码和传输数据。
sftp 可以做一些 scp 不能做的事情,但据我所知与安全无关
此外,SCP 比 sftp 更快,因为它使用更快的算法。
显示 sftp 是 ssh 的衍生版本的链接。
https://www.linux.com/tutorials/transfer-files-securely-sftp/
https://www.goanywhere.com/blog/are-ssh-and-sftp-the-same https://www.technology.pitt.edu/security/secure-shell-ssh-and-sftp