我使用 Mac Book Pro(名为 foo)工作。我有一台服务器,我的客户可以将大文件传输到其中。 (称为酒吧)。我经常通过 ssh 进入 bar,然后通过 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:
我不想每次将文件 scp 回 Mac 时都输入密码,因为我最终会自动执行此操作。
我知道我可以设置 ssh 密钥,但我担心如果有人破解bar
他们可以轻松访问foo
. (如我错了请纠正我)
有没有一种方法可以在没有密码的情况下将文件从 bar 复制到 foo ,并且在服务器受到威胁时不会让某人对我的 Mac 进行完全 shell 访问?
注意:我正在考虑在我的 Mac 上设置一个新用户并禁用该用户的 shell 访问权限可能工作,但我觉得有更好的方法。如果可能的话我宁愿不添加用户。
答案1
好吧,你把事情搞砸了。
据我了解,您只想从以下位置复制文件酒吧到富:
[file] *bar* ------copy------> *foo*
为了做到这一点,你首先ssh
要酒吧然后scp
归档到富:
*bar* -------ssh------> *foo* [file]
然后:
*foo* ----scp[file]---> *bar*
如果你这样做,你就是这样做的不安全且错误的。您所要做的就是直接 scp 将文件返回给您:
bob@foo$ scp bob@bar:/guest/buzz ~
换句话说:
*foo* <---scp[file]---- *bar*
现在有几个问题需要解决……
如何知道文件在哪里?
a) 在另一个终端中使用 SSH
只需打开第二个终端,SSH 即可酒吧,找到您的文件并将路径复制/粘贴到第一个文件。
b) 使用 SFTP
SFTP(与 FTP 或 FTPS 没有任何关系!)在 OpenSSH 中实现,并且默认可用。只需通过 SFTP 连接到服务器并使用类似 FTP 的命令来查找文件及其get
内容。
c) 使用图形用户界面
例如,Filezilla 或 Nautilus 可以浏览远程 SFTP/SSH 共享。
d) 设置证书
当您设置证书连接时,您可以在本地端以及远程端执行制表符补全!例如,按照您的buzz
示例,您可以执行以下操作:
bob@foo$ scp bob@bar:/guest/[tab][tab]
稍等一下,就会出现远程 /guest/ 文件夹中包含的文件列表。
如何使用证书设置 SSH?
a) 如果尚未完成,请生成您的个人 RSA 密钥对
如果您已经安装了 OpenSSH 客户端,则可以通过键入
bob@foo$ ssh-keygen -t rsa
(查看手册或在线了解所有可用选项)。它可能会要求您输入密码。这不是您的本地帐户密码,而是一个可选密码,可用于加密私钥你即将生成。
实际上,您将生成 2 个文件:
- /Users/[您的用户名]/.ssh/id_rsa
- /Users/[您的用户名]/.ssh/id_rsa.pub
第一个,*id_rsa* 应该是私人的。默认情况下,ssh-keygen
将尽一切努力避免公开(使用文件系统访问权限)。这就是为什么它还会要求您输入(可选)密码。不要对此过于偏执,但请记住 *id_rsa* == 个人密钥 ==私人的。这个键应该永远不能离开你的电脑。
第二个是公开的。从这个公共证书中取回你的私钥需要大量的计算机能力(我真的意思是呵呵)。与全世界分享是完全安全的。即使在极不可能的情况下,美国国家安全局或类似机构真的想花费数百万美元破解您的公钥,您的 MacBook 仍然会安全……(或者不安全。想想看,如果有人想花那么多钱,您就处于安全状态)麻烦 :)
该公共证书实际上是您将放在远程服务器上的证书酒吧。
b) 如何将我的公共证书放在服务器上?
两个选择。
ssh-copy-id
如果可用,请使用:bob@foo$ ssh-copy-id bob@bar
。完毕。如果是不是, 复制
~/.ssh/id_rsa.pub
到酒吧:bob@foo$ sftp ~/.ssh/id_rsa.pub bob@bar:pub_cert
(在这里,您将个人文件夹中的id_rsa.pub
公共证书复制到远程计算机.ssh/
~
酒吧在用户的主文件夹中鲍勃。这是默认设置。另请注意,已在该过程中id_rsa.pub
重命名为。pub_cert
我过去sftp
只是为了向您展示它可以完全按照scp
) 使用。
现在,我们将该证书复制到正确的位置:
bob@foo$ ssh bob@bar
现在您位于 Bob 的个人文件夹中酒吧。
bob@bar$ cat pub_cert >> .ssh/known_hosts
(在这里,您使用 来显示 pub_cert 的内容cat
。但是,您不是将其打印到屏幕上,而是将此输出重定向到文件:.ssh/known_hosts
。请注意,重定向>
意味着“用此流替换文件的内容”,而>>
意味着“将流附加到现有文件的末尾”)。
c) 结果?
现在您可以scp
//sftp
到ssh
酒吧无需提供密码即可随意使用。您还可以使用 [tab] 键自动完成本地和远程路径。
d) 我的 Mac 安全性怎么样?
通过这种方式,您甚至不需要在计算机上运行 SSH 服务器。只有一个 SSH 客户端(scp
//程序sftp
)ssh
。这对您来说是安全的,即使酒吧受到损害。
e) 我用这些密钥/证书到底做了什么?
首先,您生成了几个文件:私钥和公共证书。您可以使用它们做很多与安全和身份验证相关的事情。但在我们的例子中,经过相当程度的简化,它们的使用方式如下:
当您尝试连接到酒吧,您将宣告您已获得可用于连接的证书。
酒吧将检查系统中的各个位置,包括~/.ssh/known_hosts
.它将找到您发布的证书并使用它向您发送加密数据。
实际上,公共证书可以加密东西!
现在这很棒,但是如何才能富明白?使用您的私钥。
私钥可以解密用相应的公共证书加密的东西!
这就是所谓的非对称加密。
然后,基本上,服务器会向您发送一个使用您的公共证书加密的复杂密码。您将收到它,用您的私钥解密它,并开始使用它与服务器双向加密数据。
现在,如果你真的很想按照自己的方式做事并且 SCP 回到富?
你只是自找麻烦而已。但为了减轻可能的妥协的影响,您可以设置仅 chroot 的SFTP
服务器。scp
并且ssh
不再起作用,但是sftp
,Filezilla 和其他东西会起作用。
参考:https://www.allthingsdigital.nl/2013/05/12/setting-up-an-sftp-only-account-with-openssh/
答案2
如果您查看文件的格式authorized_keys
,您会发现您可以限制允许与特定键一起使用的命令。scp
在本例中,这是我之前使用的方法,允许使用指定密钥对特定命令执行 SSH 操作。使用 来查看手册页man authorized_keys
。
答案3
您可能想看看https://github.com/scponly/scponly/wiki/Download或者你可以限制你的用户sftp
只喜欢这样......
# usermod -s /usr/libexec/openssh/sftp-server whoever
答案4
与其他人一样,我建议您直接从其他机器复制:
bob@foo$ scp bar:/guest/buzz ~
如果出于某种原因,您想要从 bar 启动复制,您可以在 foo 上创建一个 ssh 密钥对,以允许 foo 登录到 foo。然后您可以使用 ssh 代理通过同一连接传递密钥。
bob@foo$ ssh -A bar
password:
bob@bar$ scp /guest/buzz bar:
# no password prompt
您也可以将公钥复制到 bar,这样就不会出现密码提示,或者您可以向密钥添加密码,在 ssh 进入 bar 时输入它,然后由于 ssh 代理,您不需要它用于相反的连接,同时保持安全。