前言
ssh有密码登录和证书登录,密码登录,特别是外网的机器,很容易遭到攻击。真正的生产环境中,ssh登录还是证书登录。目前在使用ansible配置管理其他机器时,推荐要求机器间采用证书登录,实现无密码跳转。
证书登录步骤
- 生成证书:私钥和公钥,私钥存放在客户端,必要时为私钥加密;
- 服务器添加信用公钥:把生产的公钥,上传到ssh服务器,添加到指定的文件夹中;
- 配置开启允许证书登录,客户端就能通过私钥登录ssh服务器了。
实例配置
- 生成私钥和公钥
#rsa或者dsa加密算法,这里采用rsa
ssh-keygen -t rsa
#如果一路回车默认生成id_rsa和id_rsa.pub,前者是私钥,放在客户端,后者是公钥,需要放在ssh服务器
- 例如在客户端生成的公钥,需要将公钥拷贝到服务器上
#拷贝公钥到ssh服务器
# scp <本地私钥path> username@ip:<path>
# 还没配置完成,交互方式还是传统的用户名和密码吧
scp id_rsa.pub vagrant@10.45.47.54:~
scp lch_key.pub vagrant@10.45.47.55:~ && ssh vagrant@10.45.47.55 "cat ~/lch_key.pub >> ~/.ssh/authorized_keys"
- 服务端将公钥添加到authorized_keys
#authorized_keys一般在~/.ssh/目录下,没有可以新建,也可以后面改sshd_config配置文件,指向其他路径
#追加公钥到文件末尾
cat id_rsa.pub >> ~/.ssh/authorized_keys
- 其他配置项,注意服务端配置的是sshd_config,客户端配置的是ssh_config
- 服务端sshd_config配置
vi /etc/ssh/sshd_config
# 这里指定公钥的目录
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
- 客户端ssh_config配置
vi /etc/ssh/ssh_config
#添加私钥路径
#如果存在多个可以再次添加
IdentityFile ~/.ssh/id_rsa
IdentityFile ~/.ssh/rat_rsa
- 执行登录
#客户端如果没有配置私钥路径,可以在ssh后-i参数跟上私钥路径
#ssh user@ip 完成登录
ssh vagrant@10.45.47.54
- 其他注意
- ssh登录时可以添加-v参数打印登录的详细信息;
- 服务端的
~/.ssh
下面只能自己有读写权限,其他用户和用户组不能有写权限,至少要600,这个问题遇到过,配置了公钥和私钥,但是客户端就是不能登录,最后排查发现服务端的用户主目录曾被改过目录,但是用户的主目录有用户组的写权限导致客户端怎么都不能以证书方式登录,最后chmod g-w ~
搞定