SSH、SSH-Agent密钥管理

SSH为建立在应用层基础上的安全协议, 专为远程登录会话和其他网络服务提供安全性的协议, 可以有效防止远程管理过程中的信息泄露问题。

Contact



SSH

SSH是 Secure Shell 的缩写。SSH为建立在应用层基础上的安全协议。SSH 是目前较可靠, 专为远程登录会话和其他网络服务提供安全性的协议。利用SSH 协议可以有效防止远程管理过程中的信息泄露问题。

基于账号口令的安全验证

SSH协议的一种验证方式是基于账号密码的安全验证, 会通过账号和密码登录到远程主机。虽然所有传输的数据都会被加密, 但是不能一定保证你正在连接的服务器就是你所想要的服务器。你也可能会连接到伪装的服务器, 也就是受到“中间人”这种方式的攻击, 比如DNS劫持或者IP欺骗。他们可能截获这些密码口令和数据。

基于密钥的安全验证

对于上面的风险可以通过SSH协议的另一种验证方式来进行规避, 就是基于密钥的安全验证的方式, 代码管理工具大多都实用SSH的这种验证方式。

它需要你生成一个密钥对, 即一个公私钥对。把公钥放在需要访问的服务器上, 自己本地保留私钥。如果你要连接到SSH服务器上, 客户端会向服务器发出请求, 请求用你的私钥进行安全验证。服务器收到请求之后, 先在该服务器上你的主目录下寻找你的公钥, 然后把它和你发送过来的公钥进行比较。如果两个密钥一致, 服务器就用公钥加密“质询”(challenge)并把它发送给客户端。客户端收到“质询”之后就可以用你的私钥解密再把它发送给服务器, 这样就完成了你的身份认证的过程。

这种方式不仅加密所有传送的数据, 而且不需要在网络上传送你的密码口令。所以就没有“中间人”这种攻击方式的风险, 因为他没有你的私钥就无法通过验证。这样就规避了DNS劫持或者IP欺骗的风险。

通过SSH连接到服务器

使用SSH协议, 可以连接和验证远程服务器和服务。这里说到的, 是使用SSH密钥的方式, 可以在每次访问时无需提供用户名或密码即可连接到你的服务器。

生成SSH钥匙对

1.检查本地的SSH Keys列表, 查看是否存在现有SSH:

$ ls -al ~/.ssh
## Lists the files in your .ssh directory, if they exist

2.如果有你想要添加账户的钥匙对不存在列表中, 则需要为你的账号生成一个钥匙对; 否则, 跳过生成步骤, 可以直接使用之前生成的钥匙对。

$ cd ~/.ssh
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

3.执行后, 会有以下提示, 则需要你输入一个名称作为你钥匙对的名称。我这里以test为例。

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/yourname/.ssh/id_rsa): test

4.再次执行, 会提示你输入你密钥的密码口令。口令可以为空, 这里以123456为例。

Enter passphrase (empty for no passphrase): 123456
Enter same passphrase again: 123456

5.再次执行, 如果出现以下打印内容, 则说明你生成成功了。在~/.ssh文件夹中, 便多了两个文件, test.pub和test。

Your identification has been saved in test.
Your public key has been saved in test.pub.
The key fingerprint is:
SHA256:VULzjkqvZWUeINizwEdg2Xfe4XPMqsidRekaYV4Ss7w your_email@example.com
The key's randomart image is:
+---[RSA 4096]----+
|     .o*+o= .    |
|     .+ +..*+ .. |
|       o.ooo**.=.|
|       ..+ **.=o=|
|        S +o.B .o|
|         +  E +  |
|        .. o *   |
|          o =    |
|                 |
+----[SHA256]-----+

6.拷贝你刚刚生成的SSH公钥。这里以test.pub为例。

$ pbcopy <〜/.ssh/test.pub 

你也可以选择直接在~/.ssh中打开test.pub文件进行拷贝。但要注意.ssh文件夹默认是隐藏文件夹, 你需要先显示隐藏文件。

7.将SSH的公钥粘贴到你服务器上的账户中, 比如GitHub或者GitLab的服务器的个人设置的SSH Keys中。

8.这样你就可以通过SSH密钥的方式进行代码版本管理了。

修改SSH私钥的密码口令(passphrase)

1.可以通过以下命令来更改现有私钥的密码,而无需重新生成密钥对:

$ ssh-keygen -p

2.执行后, 需要输入你想要修改的SSH私钥的名称。以test为例。

Enter file in which the key is (/Users/yourname/.ssh/id_rsa): test

3.然后, 输入旧的口令, 再输入新的口令。

Enter old passphrase:
Key has comment 'your_email@example.com'
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:

4.当终端打印出以下文字, 说明已经修改成功了。

Your identification has been saved with the new passphrase.

添加多个SSH

这只是上面一个重复的过程, 你通过上面的步骤生成一个你的GitHub账号的SSH Keys, 然后你还可以再生成一个你的另一个GitHub账号或者一个GitLab账号的SSH keys。它们是可以同时存在的, 你只需要注意对它们的命名做好管理就可以了。

SSH-Agent管理

ssh-agent是密钥管理器,运行ssh-agent以后,使用ssh-add命令将私钥交给ssh-agent保管,其他程序需要身份验证的时候默认将验证申请交给ssh-agent来完成整个认证过程。它是用来帮助免密登录, 而且ssh-agent可以同时管理多个私钥。

当你不使用ssh-agent来管理密钥时, 当你每次登录远程机器都需要你输入密码口令(即上面的passphrase)。而当你使用ssh-agent时, 它就不需要你每次都输入密码口令, 因为ssh-agent可以帮助你完成整个认证过程。

将SSH添加到SSH-Agent

1.在后台启动ssh-agent

$ eval "$(ssh-agent -s)"

2.需要修改~/.ssh/config文件以设置SSH私钥在ssh-agent中的属性。如果没有config文件, 则需要手动进行创建。在config中将以text的SSH配置为例。

## Host	HostName别名
## HostName 要登录的主机的主机名
## Port	连接到远程主机的端口号(自己搭建的git服务器可能会用到)
## User github登录名
## IdentityFile 私钥路径
## UseKeychain 是否使用Keychain来存储
## RSAAuthentication	设置是否使用RSA算法进行安全验证
## PreferredAuthentications   指定优先使用哪种方式验证,支持密码和密钥验证方式。可设为 publickey

Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/test
PreferredAuthentications publickey

3.将SSH添加到ssh-agent并将密码存储在keychain中。将test中的SSH添加到ssh-agent中。

$ ssh-add -K ~/.ssh/test

4.ssh-add命令会将私钥加入ssh-agent。执行后会提示你输入passphrase后以解密私钥,然后将解密后的私钥加入到ssh-agent中管理。

Enter passphrase for /Users/yourname/.ssh/test: 123456
Identity added: /Users/yourname/.ssh/test (your_email@example.com)

5.完成后, 则添加成功, ssh-agent可以帮助你完成整个认证过程, 不需要你每次都输入密码口令了。

添加多个SSH到SSH-Agent

同样, 按照上述步骤操作就可以了, 只是config文件中多加入一个SSH的信息。下面例子中包含一个GitHub的SSH和一个GitLab账号的SSH:

## Host	HostName别名
## HostName 要登录的主机的主机名
## Port	连接到远程主机的端口号(自己搭建的git服务器可能会用到)
## User github登录名
## IdentityFile 私钥路径
## UseKeychain 是否使用Keychain来存储
## RSAAuthentication	设置是否使用RSA算法进行安全验证
## PreferredAuthentications   指定优先使用哪种方式验证,支持密码和密钥验证方式。可设为 publickey, 

## github
Host github.com
HostName github.com
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/github
PreferredAuthentications publickey

## gitlab
Host gitlab.yourserver.com
HostName gitlab.yourserver.com
PreferredAuthentications publickey
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/gitlab

欢迎指正, wangyanchang21.