文章目录

  • 前言
  • 一、SSH密钥如何工作?
  • 二、SSH密钥的类型以及可供选择的密钥
  • ED25519 SSH密钥
  • RSA SSH密钥
  • ECDSA SSH密钥
  • Insight:使用 -o选项
  • 三、SSH密钥的使用
  • 创建
  • 测试连接



前言

SSH(或安全外壳)是一种安全协议,是安全管理远程服务器的最常用方法。SSH使用多种加密技术,提供了一种机制,可在两方之间建立加密安全的连接,相互认证对方,并来回传递命令和输出。


一、SSH密钥如何工作?

SSH协议采用客户端-服务器模型来验证两方并加密它们之间的数据。

  • 服务器组件在指定的端口上侦听连接。它负责协商安全连接,验证连接方并在接受凭据的情况下产生正确的环境。
  • 客户端负责开始与服务器的初始TCP握手,协商安全连接,验证服务器的身份与先前记录的信息匹配以及提供凭据以进行身份验证。

SSH服务器可以使用多种不同的方法对客户端进行身份验证。其中最基本的是密码身份验证,它易于使用,但不是最安全的。

尽管密码以安全的方式发送到服务器,但是密码通常不够复杂或不够长,无法抵御重复的持久性攻击者。现代化的处理能力与自动脚本相结合,使得强行实施受密码保护的帐户变得非常有可能。尽管还有其他增加安全性的方法(fail2ban等),但是SSH密钥被证明是可靠且安全的替代方法。

SSH密钥对是两个加密安全密钥,可用于向SSH服务器验证客户端。每个密钥对都包含一个公用密钥和一个专用密钥。

私钥由客户端保留,应绝对保密。私钥的任何泄露都将使攻击者无需其他身份验证即可登录配置有关联公钥的服务器。作为额外的预防措施,可以使用口令在磁盘上对密钥进行加密。

关联的公共密钥可以自由共享,而不会产生任何负面影响。公钥可用于加密仅私钥可以解密的消息。此属性用作使用密钥对进行身份验证的方式。

公钥已上载到您希望能够使用SSH登录的远程服务器。该密钥已添加到您要登录的用户帐户内的特殊文件中,名为~/.ssh/authorized_keys

当客户端尝试使用SSH密钥进行身份验证时,服务器可以测试客户端是否拥有私钥。如果客户端可以证明其拥有私钥,则将产生一个shell会话或执行所请求的命令。

二、SSH密钥的类型以及可供选择的密钥

GitLab支持RSA,DSA,ECDSA和ED25519密钥。它们的区别在于签名算法,其中一些具有其他优势。有关更多信息,您可以在ArchWiki上阅读这篇不错的文章。我们将重点关注ED25519和RSA等。

注意⚠️:作为gitlab管理员,您可以限制哪些密钥是被允许的以及其最小长度。默认情况下,所有的密钥都是被允许的。

ED25519 SSH密钥

选择ED25519类型的SSH密钥是最好的选择,因为它使用的是椭圆曲线签名方案,比其他类型更安全并且具有更好的性能,它的主要优点是速度,恒定的运行时间(以及对旁通道攻击的抵抗力)以及缺少模糊的硬编码常数。

ED25519 SSH密钥是OpenSSH 6.5中引入的,因此任何现代OS都应包括创建它们的选项(较早的SSH客户端和服务器可能不支持这种密钥),此类型的密钥可用于用户和主机密钥。

RSA SSH密钥

RSA密钥是最常见的密钥,提供了所有算法的最佳兼容性。ssh-keygen默认为RSA,因此无需使用该-t(type)选项进行指定。

最小密钥大小为1024位,默认为3072(最新的,有的ssh-keygen默认的密钥大小还是2048,可以使用man查看ssh命令的-b参数说明),最大为16384。如果要生成更强的RSA密钥对(例如,防止尖端或未知攻击以及更复杂的攻击者),请指定-b 设置比默认值高的标志位。例如:

$ ssh-keygen -b 4096

SSH私钥的旧的默认密码编码是不安全的,它只进行了一轮MD5哈希。从OpenSSH 6.5版开始,您应该使用该-o选项以ssh-keygen新的,以更安全的格式对私钥进行编码。

如果您已经具有可用的旧的RSA SSH密钥对,请考虑通过在私钥上使用以下命令来升级它以使用更安全的密码加密格式:

ssh-keygen -o -f ~/.ssh/id_rsa

ECDSA SSH密钥

引入椭圆曲线数字签名算法(ECDSA)作为OpenSSH 5.7中的首选身份验证算法。由于潜在的专利问题,一些供应商还禁用了所需的实现。

Insight:使用 -o选项

如上文中【RSA SSH密钥】中提到的,在较新的版本OpenSSH 6.5+中,支持-o选项的使用。使用-o选项就是使用新的OpenSSH格式保存SSH私钥,它使用bcrypt / pbkdf2对私钥进行哈希处理,从而使其更能抵御暴力破解密码的企图。不过,对于ED25519密钥类型,-o选项是隐含的,不必提供。此外,不需要位大小,因为ED25519密钥类型始终为256位。

三、SSH密钥的使用

创建

创建命令及最为常见的几个选项参数组合使用:

ssh-keygen [-q] [-b bits] -t type [-N new_passphrase] [-C comment] [-f output_keyfile]

测试连接

要测试是否正确添加了SSH密钥,请在终端中运行以下命令(替换gitlab.com为实例域):

ssh -T git@gitlab.com

如果连接成功,会提出successfully的信息,如果未出现欢迎消息,请通过替换-T-vvvT来运行SSH的详细模式,以了解错误的位置。