因此多年来我不得不生成并使用大量 ssh 密钥。一些必须始终完成的事情是 ~/.ssh 需要为 0700,~/.ssh/authorized_keys 需要为 0600,然后用于登录服务器的私钥始终需要为 0600。我知道 ssh 强制执行这些权限,但我想知道为什么拥有以下内容不安全的原因(是的,我正在打电话给白帽子、黑帽子以及介于两者之间的任何人来获得这个答案)。
- ~/.ssh/ = 0755
- ~/.ssh/authorized_keys = 0644
- ~/.ssh/id_rsa = 644 (或任何私钥)
答案1
出于安全原因...防止未经授权的用户获取任何可能有助于破坏您帐户的信息。
记住您的安全原则,只向外部方提供执行任务所需的绝对最少信息(如果有的话)。设计的权限集就是这么做的。而且 ssh 被设计为高度可信的安全软件。
答案2
Linux 文件权限可以用三位数字来表示。每位数字代表:Owner
、Group
、Others
。
Digit | Permissions
------------------------------
0 | None
1 | Execute
2 | Write
3 | Write and Execute
4 | Read
5 | Read and Execute
6 | Read and Write
7 | Read, Write and Execute
使用755
,您将向所有人授予读取和执行权限。使用644
,您将向所有人授予读取权限。
SSH 客户端和服务器会提醒您使用强权限,以确保您不会意外地与服务器上的每个用户共享您的私钥。
答案3
传统上,Unix 和 Linux 服务器被设计为多用户系统。由于使用公钥/私钥加密,保持私钥的秘密变得很重要。八进制文件权限含义如下所述@gregory 在他的回答中,并更充分地描述了Unix 模式维基百科页面。我的其余回答将集中在您感兴趣的内容上,即~/.ssh
目录和底层文件的权限松懈可能产生的影响。
启用sshd
时强制执行权限的理由如下:StrictModes
~/.ssh/
=0700
:- 整个
~/.ssh/
目录包含需要由运行的用户读取的文件ssh
,以及在 的情况下写入的文件~/.ssh/config
。 - 它还包含恶意用户可能滥用的文件,这些文件可以读取或写入。您提到的
0755
此目录以及其他目录(~/.ssh/id_rsa = 0644
、~/.ssh/authorized_keys = 0644
)的权限松懈可能会导致大量滥用。例如:- 攻击者可能会窃取
~/.ssh/id_rsa
或此目录中的其他私钥,从而允许他们登录目标用户有权通过 SSH 访问的任何主机。这就是为什么~/.ssh/id_rsa = 0644
很糟糕,这是攻击者首先会寻找的最明显的唾手可得的果实。 - 攻击者可能会将他们的公钥添加到
~/.ssh/authorized_keys
,这将授予该用户通过 SSH 进入主机的权限并伪装成该用户。如果目标用户处于 状态/etc/sudoers
并启用了无密码 sudo,则这将成为权限提升攻击。
您提到的权限~/.ssh/authorized_keys = 0644
在技术上不允许这样做,但这就是为什么sshd
的StrictModes on
设置对此文件强制执行严格权限的原因。允许其他用户写入此文件是不好的,读取它并不那么糟糕,因为从技术上讲,公钥不需要保密。 - 攻击者可能会
~/.ssh/known_hosts
修改远程主机的公钥,用他们自己的公钥覆盖该主机,然后执行 DNS 缓存中毒攻击,将主机名重定向到他们自己的 IP。这基本上是一种中间人攻击,当用户登录到该主机时,将用户重定向到他们的恶意主机。 - 攻击者可能会更改设置以
~/.ssh/config
关闭该功能StrictHostKeyChecking
,从而实施上述 MitM 攻击。 - 攻击者可能会进行上述两种 MitM 攻击,然后设置
ForwardAgent yes
并劫持目标用户的 SSH 套接字文件。当目标用户登录攻击者的 MitM 主机时,攻击者会修改 SSH 代理套接字文件上的文件权限,然后使用远程用户的 SSH 代理(包含其私钥)登录目标用户有权通过 SSH 访问的其他主机。
- 攻击者可能会窃取
- 如果 SSH 版本较旧,攻击者可能会读取旧式明文
~/.ssh/known_hosts
,以获取有关目标用户能够访问哪些主机的信息。 - 因此,权限位
0700
确保以下内容: 7
:为用户设置的读取、写入和执行位允许:- 用户可以在目录中创建、重命名或删除文件,并修改目录的属性。
这样,用户可以创建和写入他们的 SSH 配置文件,管理他们的~/.ssh/authorized_keys
文件等... - 读取位允许用户列出目录中的文件。
显然,拥有目录的用户需要它来管理目录中的文件。 - 执行位允许用户进入目录并访问其中的文件和目录。
同样,这对于用户管理自己的~/.ssh/
目录是显而易见且必要的。
- 用户可以在目录中创建、重命名或删除文件,并修改目录的属性。
0
:用户在同一个目录中没有目录权限group
,并且other
用户确保至少在目录级别不允许上述任何恶作剧。
- 整个
~/.ssh/authorized_keys
=0600
:- 上面已经提到,重要的是该文件归真正的所有者所有,并且没有其他用户可以写入该文件。
- 攻击者可以修改此文件以更改选项(就在这里更多关于此文件的内容当用户连接到目标系统时,将使用此密钥创建一个新的密钥(而不仅仅是一个公钥列表)。
- 攻击者可以修改此文件来更改
command
选项在用户登录时以用户身份运行命令。这可以视为本地特权提升或本地命令执行,以伪装成该用户。
~/.ssh/id_rsa
=0600
(或任何私钥)- 上面还提到,重要的是任何私钥文件都归真正的所有者所有,并且任何其他用户都不能读取或写入它们。
- 如果攻击者能够覆盖私钥文件,则可能导致 DoS 并阻止目标用户登录服务器
- 如上所述,攻击者可以读取私钥文件,以用作目标用户可以访问的其他主机的身份验证方法。