如何安全地允许 scp,但不允许 ssh

spu*_*der 7 bash ssh scp

我使用 Mac Book Pro(称为 foo)工作。我有一个服务器,我的客户将大文件 scp 到其中。(称为酒吧)。我经常 ssh 进入 bar,然后将一个文件(称为 buzz)scp 到我的 Mac。

bob@foo$ ssh bar  
Last login: Fri Aug 23 14:49:32 2013 from foo  
bob@bar$ scp /guest/buzz bob@foo:~
Password: 
Run Code Online (Sandbox Code Playgroud)

我不想每次将文件 scp 传送回 Mac 时都输入密码,因为我最终会自动执行此操作。
我知道我可以设置 ssh 密钥,但我担心如果有人破解bar他们可以轻松访问foo. (如果我错了纠正我)

有没有办法在没有密码的情况下将文件从 bar 复制到 foo,如果服务器受到威胁,它不会让某人完全访问我的 Mac?

注:我想建立在我的Mac新用户,并禁止该用户shell访问力量的工作,但我觉得有一个更好的办法。如果可能,我宁愿不添加用户。

小智 6

好吧,你把事​​情搞砸了。

据我了解,您只想将文件从bar复制到foo

[file]  *bar* ------copy------> *foo*
Run Code Online (Sandbox Code Playgroud)

为了做到这一点,您首先sshbar然后scp归档到foo

        *bar* -------ssh------> *foo* [file]
Run Code Online (Sandbox Code Playgroud)

然后:

        *foo* ----scp[file]---> *bar*
Run Code Online (Sandbox Code Playgroud)

如果你这样做,你这样做是不安全和错误的。您所要做的就是直接将文件 scp 返回给您:

bob@foo$ scp bob@bar:/guest/buzz ~
Run Code Online (Sandbox Code Playgroud)

换句话说:

        *foo* <---scp[file]---- *bar*
Run Code Online (Sandbox Code Playgroud)

现在有几个问题需要解决?...

如何知道文件在哪里?

a) 在另一个终端中使用 SSH

只需打开第二个终端,SSH 到bar,找到您的文件并将路径复制/粘贴到第一个。

b) 使用 SFTP

SFTP(与 FTP 或 FTPS 没有任何关系!)在 OpenSSH 中实现并且默认可用。只需 SFTP 到服务器并使用类似 FTP 的命令来查找文件和get它们。

c) 使用图形用户界面

例如 Filezilla 或 Nautilus 可以浏览远程 SFTP/SSH 共享。

d) 设置证书

当您设置证书连接时,您可以在本地和远程进行选项卡补全!例如,使用您的buzz示例,您可以执行以下操作:

bob@foo$ scp bob@bar:/guest/[tab][tab]
Run Code Online (Sandbox Code Playgroud)

并稍等片刻,查看远程 /guest/ 文件夹中包含的文件列表。

如何使用证书设置SSH?

a) 如果尚未完成,请生成您的个人 RSA 密钥对

如果您已经安装了 OpenSSH 客户端,您可以通过键入

bob@foo$ ssh-keygen -t rsa
Run Code Online (Sandbox Code Playgroud)

(查看手册或在线获取所有可用选项)。它可能会要求您输入密码。这不是您的本地帐户密码,而是一个可选密码,可用于加密您将要生成的私钥

实际上,您将生成 2 个文件:

  • /用户/[您的用户名]/.ssh/id_rsa
  • /Users/[您的用户名]/.ssh/id_rsa.pub

第一个, *id_rsa* 应该是private。默认情况下,ssh-keygen将尽其所能避免将其公开(使用文件系统访问权限)。这就是为什么它还会要求您输入(可选)密码的原因。不要太偏执,但请记住 *id_rsa* == personal key == private。此密钥永远不应离开您的计算机。

第二个是公开的。从这个公共证书中取回你的私钥需要大量的计算机能力(我的意思是HUUUUUUGE)。与全世界分享它是完全安全的。即使在极不可能的情况下,国家安全局或类似机构真的想花费数百万美元来破解你的公钥,你的 macbook 仍然是安全的吗?......(或者不是。想想看,如果有人想花那么多钱,你是麻烦 :)

这个公共证书其实就是你要放到远程服务器上的

b) 如何将我的公共证书放在服务器上?

两种选择。

  1. ssh-copy-id如果可用,请使用:bob@foo$ ssh-copy-id bob@bar。完毕。
  2. 如果不是,请复制~/.ssh/id_rsa.pub

    bob@foo$ sftp ~/.ssh/id_rsa.pub bob@bar:pub_cert

(在这里,您将您的公共证书id_rsa.pub.ssh/个人~文件夹中的 , 复制到用户bob主文件夹中的远程计算机。这是默认设置。另外请注意,在此过程中已重命名为。我曾经只是向您展示它可以完全用作)。id_rsa.pubpub_certsftpscp

现在,我们将此证书复制到正确的位置:

bob@foo$ ssh bob@bar
Run Code Online (Sandbox Code Playgroud)

现在您位于bar中 bob 的个人文件夹中。

bob@bar$ cat pub_cert >> .ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)

(在这里,你显示pub_cert的内容cat,但不是将它打印到屏幕上,这个输出重定向到文件:.ssh/known_hosts注意,有一个重定向>将意味着“取代与此流的文件的内容”,而>>表示“将流附加到现有文件的末尾”)。

c) 结果?

现在您可以scp/ sftp/尽可能多ssh禁止,而无需提供密码。您还可以使用 [tab] 键自动完成本地和远程路径。

d) 我的 mac 安全性怎么样?

通过这种方式,您甚至不需要在您的计算机上运行 SSH 服务器。只有一个SSH客户端(scp/ sftp/ssh程序)。即使酒吧受到损害,这对您来说也是安全的。

e) 我对这些密钥/证书做了什么?

首先,您生成了几个文件:一个私钥和一个公共证书。您可以使用它们做很多与安全性和身份验证相关的事情。但在我们的例子中,经过一些简化,它们是这样使用的:

当您尝试连接到bar 时,您将宣传您已获得可用于连接的证书。 bar将检查系统中的各个位置,包括~/.ssh/known_hosts. 它将找到您宣传的证书并使用它向您发送加密数据。

实际上,公共证书可以加密东西!

现在这很好,但是foo怎么能理解呢?使用您的私钥。

私钥可以解密用相应的公共证书加密的东西!

这就是所谓的非对称加密。

然后,基本上,服务器会向您发送一个用您的公共证书加密的复杂密码。您将收到它,用您的私钥对其进行解密,然后开始使用它与服务器双向加密数据。


现在,如果您真的真的想按照自己的方式做事并且 SCP 回到foo呢?

你只是自找麻烦。但是为了减轻可能的妥协的影响,您可以设置一个仅限 chroot 的SFTP服务器。scp并且ssh不再起作用,但是sftp,Filezilla 和其他东西会起作用。

参考:https : //www.allthingsdigital.nl/2013/05/12/setting-up-an-sftp-only-account-with-openssh/


mdp*_*dpc 5

如果您查看authorized_keys文件的格式,您会注意到您可以限制允许与特定键一起使用的命令。这是我以前使用的方法,scp在这种情况下,允许使用指定密钥对特定命令进行 SSH 操作。使用man authorized_keys.