在某些情况下,我们可能希望不通过用户名密码的方式通过SSH登录服务器。
例如大规模批量部署应用时,如果各服务器用户名密码均不相同,各自配置用户名密码登录将是一个非常繁琐的任务。每次输入密码不仅繁琐,而且也不安全。
SSH分为有password登录方式和证书登录方式。考虑到安全因素,我们推荐配置证书登录。既:每次登录无需输入password。
首先明确几个角色:
Server端:既需要登录的服务。
Client端:既执行登录动作的服务器。
一、证书登录的过程
1、Client生成证书的私钥和公钥
私钥放在Client,公钥上传到Server端。
一般为了安全考虑,防止有入侵者非法拷贝Client的私钥,在生成私钥时,会为私钥设置一个password,以后每次使用该私钥登录时,Client需要输入passwod解开私钥(仅仅为了解密,这个密码不会被发送出去)。假设在工作中你使用了没有password的私钥,有一天你的Server被黑了,你是跳到黄河也洗不清的。
2、Server加入信用公钥
把Client生成的公钥,上传到Server端,加入到指定文件里,这样就完成了SSH证书登录的配置。
如果Client想要通过私钥登录多个Server,只需要把公钥上传到这些Server就可以了。
二、实际应用举例
在Client生成证书的公钥和私钥的命令如下:
ssh-keygen -t rsa
rsa是一种加密算法,还有一种是dsa,证书登录常用的是rsa。
假设用户名是user,执行ssh-keygen,会在/home/user/.ssh目录下产生两个key文件,分别是私钥(id_rsa)与公钥(id_rsa.pub)。
命令要求输入可选的私钥密码(passphrase),如果是非测试环境或者不要求使用无密码ssh,对于私钥密码,不应直接留空(直接回车),而应考虑设置合理强度的密码并妥善保存。
将公钥复制到Server端,并添加到信用公钥(authorized_keys)
在Client端执行:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@server
可将id_rsa.pub中的密钥添加到Server端指定用户~/.ssh/authorized_keys文件中,并设好权限。
SSH服务端配置可参考:
修改/etc/ssh/sshd_config文件。
#禁用root账户登录,非必要,但为了安全性,请配置
PermitRootLogin no
# 是否允许用户自行使用成对的密钥系统进行登入行为,仅针对 version 2。
# 至于自制的公钥数据就放置于用户家目录下的 .ssh/authorized_keys 内
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
#禁用密码登录,可选。
PasswordAuthentication no
修改完配置别忘了重启SSH服务,使修改生效。
Client通过私钥登录ssh Server端
可使用命令:
ssh -i ~/.ssh/id_rsa server_user@<server_ip>
每次登录都使用命令指定私钥是一件比较繁琐的事,我们可以修改SSH Client端的默认配置:
修改Client端/etc/ssh/ssh_config:
#将默认的id_rsa就加入私钥的路径
IdentityFile ~/.ssh/id_rsa
#如果有其他的私钥,还要再加入其他私钥的路径
IdentityFile ~/.ssh/other.rsa
日常工作中,使用ssh证书登录其实是最常用的登录方式。尤其是需管理大量服务器的场景下,合理配置证书认证可以节省大量时间并提高安全性。