本文的作者反对OpenSSH中的标准密钥加密机制。攻击者最近使用npm软件包eslint-scope从用户主目录中窃取了npm令牌。 鉴于此事件,我们开始检查其他类似的漏洞,并考虑如何减少此类事件的风险和后果。
我们大多数人手中都有RSA SSH密钥。 该密钥为所有者提供了各种特权:通常,它用于访问生产环境或在GitHub中。 与nmp令牌不同,SSH密钥是加密的,因此,即使它们落入错误的手,也不会发生任何不良情况,这是公认的。 但是真的是这样吗? 让我们找出答案。
user@work /tmp $ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa): mykey
...
user@work /tmp $ head -n 5 mykey
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,CB973D5520E952B8D5A6B86716C6223F
+5ZVNE65kl8kwZ808e4+Y7Pr8IFstgoArpZJ/bkOs7rB9eAfYrx2CLBqLATk1RT/
如文件的第一行所示,此密钥已加密。 另外,在开始时,没有MII-RSA中使用的base64编码密钥。 而且,当然,AES吸引了您的注意! 很好吧? 乍一看,CBC具有随机初始化向量。 没有验证码(MAC)。 那么,将不会有填充oracle攻击,对吗?
找出DEK-Info内容的真正含义并不是那么简单。 在openssh-portable存储库中搜索关键字“ DEK-Info”仅显示密钥示例。 但是这里的要点是AES密钥不过是一个简单的MD5哈希(密码||初始化向量[:8])。 这很不好,因为存储密码的最佳实践表明,纯格式的密码(由于其低熵)是不好的加密材料。 为了使它更好,您需要像Argon2这样的昂贵函数。 但是,与后者不同,MD5易于计算。
该方案的唯一优点是将盐放在了密码之后,因此,无法计算中间状态MD5(IV [8:])并根据该密码找到密码。 但是,这简直无济于事,特别是在一个每秒可以发出数十亿次MD5呼叫的机器可供我们使用的时代-密码所能提供的远远超过了密码。
您可能想知道OpenSSH如何活着看到这一点。 the,答案很简单:默认情况下,OpenSSL命令行工具默认情况下最初使用此方案,并且已成为标准。
最后,事实证明,标准的密码加密密钥并不比普通的未加密密钥好,仅仅是因为加密机制无效。 但是,我们会说得更大胆-更糟。 这很容易争论。
许多人不太可能使用密码管理器来存储SSH密钥的密码。 相反,用户只会记住它。 并且,由于这是存储的组合之一,因此用户可能已经在其他地方使用过它。 也许它甚至与设备上的用户密码匹配。 很有可能会猜到它(它的格式化功能太不可靠了),并且如果知道密码,则可以使用公共密钥来检查它。
对这对RSA密钥本身没有任何抱怨:唯一的问题是私钥的对称加密方法。 仅知道公钥就不可能进行上述攻击。
我该如何解决这种情况?
OpenSSH提供了一种新的密钥格式供使用。 “ new”是指在2013年推出的产品。 这种格式使用bcrypt_pbkdf,它实际上是根据PBKDF2标准实现的固定复杂性bcrypt。
方便地,您会在生成Ed25519密钥时自动收到新格式的密钥,因为旧的SSH密钥格式不支持较新的密钥类型。 这很奇怪,因为事实上,我们真的不需要密钥格式来确定Ed25519序列化的工作方式,因为Ed25519本身就设置了序列化工作。 但是,如果您确实需要良好的格式化功能,那么您就不必为这些琐事而烦恼。 结果,答案之一是
ssh-keygen -t ed25519 。
如果出于兼容性原因而必须遵循RSA,则可以使用ssh-keygen -o。 因此,即使对于旧类型的键也可以获得新的格式。 您可以使用命令
ssh-keygen -p -o -f key name更新旧密钥。 如果您的密钥位于Yubikey或智能卡上,则这些修正已被考虑在内。
一种或另一种方式,我们努力追求更好的退出。 一方面,有一个aws-vault的很好的例子,其中凭证信息从磁盘移到了钥匙串。 还有另一种方法:将开发移至共享环境。 最后,大多数初创企业应考虑放弃SSH密钥的长期存储,并转移到SSH认证中心,但密钥存储时间有限,并且需要使用单点登录系统。 不幸的是,对于GitHub,这种方法是不可能的。
PS很难在权威来源中验证此信息,但是如果内存对我们有用,则OpenSSH PEM格式的私钥中的版本控制参数只会影响加密方法。 但是,这没有任何作用:问题在于密钥形成功能,我们认为这是反对讨论各部分协议的另一个论点。 我们的博客中将有关于此主题的单独文章。
最后-
指向完整密钥的
链接 。 以防万一您今天准备入侵任何东西。
