ssh 提供两种级别的安全认证:基于口令的安全认证基于证书的安全认证基于口令的安全认证知道用户名和密码即可登录。连接是加密的,但客户端不能确认目标主机是否为“伪造的”,也不能保证口令安全。开启口令认证
ssh 提供两种级别的安全认证:
- 基于口令的安全认证
- 基于证书的安全认证
基于口令的安全认证
知道用户名和密码即可登录。连接是加密的,但客户端不能确认目标主机是否为“伪造的”,也不能保证口令安全。
开启口令认证需要在远程主机的配置文件 /etc/ssh/sshd_config
添加:
PasswordAuthentication yes
重启 sshd 使改动生效:
$ /etc/init.d/sshd reload
基于证书的安全认证
这需要用户持有“公钥/私钥对”证书。具体是用户在远程主机存有公钥,本地持有私钥和公钥。
客户端向服务器发出请求。服务器收到请求之后,在用户的主目录下找到该用户的公钥(公钥存放在远程主机的 ~/.ssh/authorized_keys
中,一行一条),对比用户发送过来的公钥。如果一致,服务器用公钥加密“质询”并发送给客户端。客户端收到“质询”后用私钥解密,再发还给服务器。认证结束。
需要生成密钥,使用 ssh-keygen
,选加密算法(rsa、dsa),给秘钥命名(可选):
$ ssh-keygen -t rsa -C "name"
然后会提示你输入 passphrase,即私钥密码。这可以加强安全性,避免证书被恶意复制。
完成后,会在 ~.ssh
下生成 id_rsa
, id_rsa.pub
两个文件,分别是 私钥/公钥。
公钥需复制一份到远程服务器 ~/.ssh/authorized_keys
文件里。
要保证 ~/.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 yesPubkeyAuthentication yesAuthorizedKeysFile %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 '[email protected]'# 将证书加入 SSH Agent 缓存$ ssh-add ~/.ssh/id_rsa_second
创建 ~/.ssh/config
# default github user([email protected])Host github.comHostName github.comUser gitIdentityFile C:/Users/username/.ssh/id_rsa# second user([email protected])Host github-secondHostName github.comUser gitIdentityFile C:/Users/username/.ssh/id_rsa_second
配置完成后,在连接非默认账号的仓库时,远端地址要修改为:
git remote add test git@github-second:second/test.git# 原来是 [email protected]:second/test.git# git 根据配置的 user.email 来获取 github 帐号来显示 author 信息,记得将 user.email 改为相应的 email 如例中的 [email protected]。