发布 OpenSSH 8.2,支持 FIDO/U2F 双因素身份验证令牌

经过四个月的开发 提交 发布 OpenSSH 8.2,一个开放的客户端和服务器实现,用于通过 SSH 2.0 和 SFTP 协议工作。

OpenSSH 8.2 版本中的一个关键改进是能够使用支持该协议的设备进行双因素身份验证 U2F,由联盟开发 FIDO。 U2F 允许创建低成本硬件令牌来验证用户的实际存在,并通过 USB、蓝牙或 NFC 与他们交互。 此类设备作为网站上的双因素身份验证手段进行推广,已得到主流浏览器的支持,并由多家制造商生产,包括 Yubico、Feitian、Thetis 和 Kensington。

为了与确认用户存在的设备进行交互,OpenSSH 中添加了新的密钥类型“ecdsa-sk”和“ed25519-sk”,它们使用 ECDSA 和 Ed25519 数字签名算法,并结合 SHA-256 哈希。 与令牌交互的过程放置在中间库中,该中间库的加载方式与支持 PKCS#11 的库类似,并且是库顶部的包装器 自由度2,它提供了通过 USB 与令牌通信的工具(支持 FIDO U2F/CTAP 1 和 FIDO 2.0/CTAP 2 协议)。 OpenSSH开发者准备的中间库libsk-libfido2 包括 进入核心 libfido2,以及 HID驱动程序 对于 OpenBSD。

要验证并生成密钥,必须在设置中指定“SecurityKeyProvider”参数或设置 SSH_SK_PROVIDER 环境变量,指示外部库 libsk-libfido2.so 的路径(export SSH_SK_PROVIDER=/path/to/libsk-libfido2.so)。所以)。 可以构建带有层库内置支持的 openssh (--with-security-key-builtin),在这种情况下,您需要设置“SecurityKeyProvider=internal”参数。
接下来,您需要运行“ssh-keygen -t ecdsa-sk”,或者,如果已创建并配置密钥,则使用“ssh”连接到服务器。 当您运行 ssh-keygen 时,生成的密钥对将保存在“~/.ssh/id_ecdsa_sk”中,并且可以像其他密钥一样使用。

应将公钥 (id_ecdsa_sk.pub) 复制到服务器的authorized_keys 文件中。 服务器端仅验证数字签名,客户端与token交互(服务器端不需要安装libsk-libfido2,但服务器端必须支持“ecdsa-sk”密钥类型) 。 生成的私钥(id_ecdsa_sk)本质上是一个密钥句柄,只有与U2F令牌侧存储的秘密序列结合才能形成真正的密钥。 如果 id_ecdsa_sk 密钥落入攻击者手中,为了通过身份验证,他还需要获得对硬件令牌的访问权限,否则存储在 id_ecdsa_sk 文件中的私钥将毫无用处。

另外,默认情况下,当使用密钥执行任何操作时(无论是在生成期间还是在认证期间),都需要本地确认用户的物理存在,例如,建议触摸令牌上的传感器,这使得很难使用连接的令牌对系统进行远程攻击。 作为另一道防线,还可以在 ssh-keygen 的启动阶段指定密码来访问密钥文件。

新版本的 OpenSSH 还宣布即将弃用使用 SHA-1 哈希值的算法,因为 晋升 具有给定前缀的碰撞攻击的有效性(选择碰撞的成本估计约为 45 美元)。 在即将发布的版本之一中,他们计划默认禁用使用公钥数字签名算法“ssh-rsa”的功能,该算法在 SSH 协议的原始 RFC 中提到,并且在实践中仍然广泛存在(以测试使用如果您的系统中没有 ssh-rsa,您可以尝试使用选项“-oHostKeyAlgorithms=-ssh-rsa”通过 ssh 连接)。

为了顺利过渡到 OpenSSH 中的新算法,在未来版本中,将默认启用 UpdateHostKeys 设置,这将自动将客户端迁移到更可靠的算法。 推荐的迁移算法包括基于 RFC2 RSA SHA-256 的 rsa-sha512-8332/2(自 OpenSSH 7.2 起支持并默认使用)、ssh-ed25519(自 OpenSSH 6.5 起支持)和基于 ecdsa-sha2-nistp256/384/521 RFC5656 ECDSA(自 OpenSSH 5.7 起支持)。

在 OpenSSH 8.2 中,使用“ssh-rsa”进行连接的功能仍然可用,但该算法已从 CASignatureAlgorithms 列表中删除,该列表定义了允许对新证书进行数字签名的算法。 同样,diffie-hellman-group14-sha1 算法已从支持的默认密钥交换算法中删除。 值得注意的是,在证书中使用 SHA-1 会带来额外的风险,因为攻击者有无限的时间来搜索现有证书的冲突,而对主机密钥的攻击时间则受到连接超时 (LoginGraceTime) 的限制。 )。

运行 ssh-keygen 现在默认使用 rsa-sha2-512 算法,该算法自 OpenSSH 7.2 起受支持,当尝试在运行旧版 OpenSSH 版本的系统上处理 OpenSSH 8.2 中签名的证书时,可能会产生兼容性问题(以解决该问题)生成签名时,您可以显式指定“ssh-keygen -t ssh-rsa”或使用 ecdsa-sha2-nistp256/384/521 算法(自 OpenSSH 5.7 起支持)。

其他变化:

  • sshd_config 中添加了 Include 指令,允许您在配置文件的当前位置包含其他文件的内容(指定文件名时可以使用 glob 掩码);
  • ssh-keygen 中添加了“no-touch-required”选项,这使得在生成密钥时无需物理确认对令牌的访问;
  • sshd_config 中添加了 PubkeyAuthOptions 指令,它组合了与公钥身份验证相关的各种选项。 目前,仅支持“无需触摸”标志来跳过令牌身份验证的物理存在检查。 以此类推,在authorized_keys文件中添加了“no-touch-required”选项;
  • 向 ssh-keygen 添加了“-O write-attestation=/path”选项,以允许在生成密钥时写入其他 FIDO 证明证书。 OpenSSH 尚未使用这些证书,但稍后可以使用它们来验证密钥是否放置在受信任的硬件存储中;
  • 在 ssh 和 sshd 设置中,现在可以通过 IPQoS 指令设置流量优先级模式 LE DSCP (省力的每跳行为);
  • 在 ssh 中,当设置值“AddKeysToAgent=yes”时,如果密钥不包含注释字段,则会将其添加到 ssh-agent 中,指示密钥的路径作为注释。 在
    ssh-keygen 和 ssh-agent 现在也使用 PKCS#11 标签和 X.509 主题名称而不是库路径作为密钥中的注释;

  • 添加了将 DSA 和 ECDSA 密钥的 PEM 导出到 ssh-keygen 的功能;
  • 添加了新的可执行文件 ssh-sk-helper,用于隔离 FIDO/U2F 令牌访问库;
  • 向 ssh 和 sshd 添加了“--with-zlib”构建选项,以便使用 zlib 库支持进行编译;
  • 根据RFC4253的要求,在连接过程中显示的横幅中提供了有关由于超出MaxStartups限制而导致访问阻塞的警告。 为了简化诊断,使用 ps 实用程序时可见的 sshd 进程标头现在显示当前经过身份验证的连接数和 MaxStartups 限制的状态;
  • 在 ssh 和 ssh-agent 中,当调用程序在屏幕上显示通过 $SSH_ASKPASS 指定的邀请时,现在会另外传输带有邀请类型的标志:“confirm” - 确认对话框(是/否)、“none” ” - 信息性消息,“空白” - 密码请求;
  • 向 ssh-keygen 添加了新的数字签名操作“find-principals”,用于搜索与指定数字签名关联的用户的 allowed-signers 文件;
  • 使用 seccomp 机制改进了对 Linux 上 sshd 进程隔离的支持:禁用 IPC 系统调用,允许使用clock_gettime64()、clock_nanosleep_time64 和clock_nanosleep()。

来源: opennet.ru

添加评论