SSH、SSH-Agent密钥管理

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

Contact



SSH

SSHSecure 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.pubtest

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中将以textSSH配置为例。

## 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.