SSH 与 SSH-Key

ssh 提供两种级别的安全认证:git

  1. 基于口令的安全认证
  2. 基于证书的安全认证

基于口令的安全认证

知道用户名和密码便可登陆。链接是加密的,但客户端不能确认目标主机是否为“伪造的”,也不能保证口令安全。github

开启口令认证须要在远程主机的配置文件 /etc/ssh/sshd_config 添加:算法

PasswordAuthentication yes

重启 sshd 使改动生效:vim

$ /etc/init.d/sshd reload

基于证书的安全认证

这须要用户持有“公钥/私钥对”证书。具体是用户在远程主机存有公钥,本地持有私钥和公钥。缓存

客户端向服务器发出请求。服务器收到请求以后,在用户的主目录下找到该用户的公钥(公钥存放在远程主机的 ~/.ssh/authorized_keys 中,一行一条),对比用户发送过来的公钥。若是一致,服务器用公钥加密“质询”并发送给客户端。客户端收到“质询”后用私钥解密,再发还给服务器。认证结束。安全

须要生成密钥,使用 ssh-keygen,选加密算法(rsa、dsa),给秘钥命名(可选):bash

$ ssh-keygen -t rsa -C "name"

而后会提示你输入 passphrase,即私钥密码。这能够增强安全性,避免证书被恶意复制。服务器

完成后,会在 ~.ssh 下生成 id_rsa, id_rsa.pub 两个文件,分别是 私钥/公钥。并发

公钥需复制一份到远程服务器 ~/.ssh/authorized_keys 文件里。ssh

要保证 ~/.ssh/authorized_keys 都只有用户本身有写权限。不然验证无效。

$ chmod -R 700 ~/.ssh/
$ chmod 600 ~/.ssh/authorized_keys

sshd_config 配置实践

$ vim /etc/ssh/sshd_config

# 是否容许root帐户远程登陆,为了安全可关闭
PermitRootLogin no

# 是否检查用户的文件系统权限,避免因目录、文件的权限配置错误可能引发信息泄露
StrictModes no

# 是否容许使用证书登陆,受权文件路径
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys

# 是否容许使用口令登陆,为了安全可关闭
PasswordAuthentication no

使用 SSH-Agent 缓存保存密钥口令

默认会在每次使用私钥时请求该口令,你也能够将其加入本地密码库:

$ ssh-add ~/.ssh/id_rsa

这样在本机使用就不会每次输入密码了,减弱了安全性,但增长了便利。

持有多个证书时的使用方法

简单状况下,经过手动指定私钥文件登陆

$ ssh -i ~/.ssh/my_id_rsa username@hostname

以为麻烦能够配置客户端的 /etc/ssh/ssh_config

# 其实默认 id_rsa 已经加入私钥路径了,这里只是示范
IdentityFile ~/.ssh/id_rsa
# 若是有其余的私钥,再加入其余私钥的路径
IdentityFile ~/.ssh/my_id_rsa

你也可使用 SSH Agent,下面以使用 GitHub 为场景简单介绍。

# 建立证书
$ ssh-keygen -t rsa -C 'second@mail.com'
# 将证书加入 SSH Agent 缓存
$ ssh-add ~/.ssh/id_rsa_second

建立 ~/.ssh/config

# default github user(first@mail.com)
Host github.com
HostName github.com
User git
IdentityFile C:/Users/username/.ssh/id_rsa

# second user(second@mail.com)
Host github-second
HostName github.com
User git
IdentityFile C:/Users/username/.ssh/id_rsa_second

配置完成后,在链接非默认帐号的仓库时,远端地址要修改成:

git remote add test git@github-second:second/test.git
# 原来是 git@github.com:second/test.git
# git 根据配置的 user.email 来获取 github 账号来显示 author 信息,记得将 user.email 改成相应的 email 如例中的 second@mail.com。
相关文章
相关标签/搜索