一、SSH简介
产生场景
对于需要远程管理其它机器,一般使用远程桌面或者telnet。linux一般只能是telnet。但是telnet的缺点是通信不加密,存在不安全因素,只适合内网访问。为解决这个问题,推出了通信加密通信协议,即SSH(Secure Shell)。使用非对称加密方式,传输内容使用rsa或者dsa加密,可以避免网络窃听。
算法分类
SSH(Secure Shell)是一种通信加密协议,加密算法包括:RSA、DSA等。
- RSA:非对称加密算法,其安全性基于极其困难的大整数的分解(两个素数的乘积);
- DSA:也是非对称加密算法,其安全性基于整数有限域离散对数难题;
原理与安全性
RSA 与 DSA 都是非对称加密算法。其中RSA的安全性是基于极其困难的大整数的分解(两个素数的乘积);DSA 的安全性是基于整数有限域离散对数难题。基本上可以认为相同密钥长度的 RSA 算法与 DSA 算法安全性相当。
有点要注意,RSA 的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解 RSA 就一定需要作大数分解。不过也不必太过担心,RSA 从诞生以来,经历了各种攻击,至今未被完全攻破(依靠暴力破解,小于1024位密钥长度的 RSA 有被攻破的记录,但未从算法上被攻破)
用途:
DSA 只能用于数字签名,而无法用于加密(某些扩展可以支持加密);RSA 即可作为数字签名,也可以作为加密算法。不过作为加密使用的 RSA 有着随密钥长度增加,性能急剧下降的问题。
性能:
相同密钥长度下,DSA 做签名时速度更快,但做签名验证时速度较慢,一般情况验证签名的次数多于签名的次数。
相同密钥长度下,DSA (在扩展支持下)解密密文更快,而加密更慢;RSA 正好反过来,一般来说解密次数多于加密次数。不过由于非对称加密算法的先天性能问题,两者都不是加密的好选择。
二、SSH免密登陆原理
图解,server A免登录到server B: 1.在A上生成公钥私钥。
2.将公钥拷贝给server B,要重命名成authorized_keys(从英文名就知道含义了)
3.Server A向Server B发送一个连接请求。
4.Server B得到Server A的信息后,在authorized_key中查找,如果有相应的用户名和IP,则随机生成一个字符串,并用Server A的公钥加密,发送给Server A。
5.Server A得到Server B发来的消息后,使用私钥进行解密,然后将解密后的字符串发送给Server B。Server B进行和生成的对比,如果一致,则允许免登录。
总之:A要免密码登录到B,B首先要拥有A的公钥,然后B要做一次加密验证。对于非对称加密,公钥加密的密文不能公钥解开,只能私钥解开。
三、主机间建立信任关系,免密码登录
配置ssh免密码登录(三个节点master、slave1、slave2)
1. 主节点配置:
生成密钥
在master
机器的宿主目录下执行命令生成密钥
ssh-keygen -t rsa
或
ssh-keygen -t rsa -P ''
-P表示密码,-P '' 就表示空密码,也可以不用-P参数,这样就要三车回车,用-P就一次回车
(使用rsa加密方式生成密钥)回车后,会提示三次输入信息,我们直接回车即可。
将会在家目录下的隐藏目录/.ssh下生成文件:
id_rsa.pub //公钥
id_rsa //密钥
追加公钥
在master机器上,将id_rsa.pub的内容写入authorized_keys
文件中
cat id_rsa.pub >> authorized_keys
2. 从节点配置:
生成密钥
以 master 同样的方式, slave1, slav2 生产密钥。
3. 将次节点的公钥发送到主节点
在slave1机器上,将id_rsa.pub复制到master机器的/.ssh目录下,并重新命名位 id_rsa.pub.slave1:
scp id_rsa.pub hadoop@master:/home/hadoop/.ssh/id_rsa.pub.slave1
复制文件的时候,由于还没有免密码登录的,所以要输入密码
在slave2机器上,将id_rsa.pub复制到master机器的/.ssh目录下,并重新命名位id_rsa.pub.slave2 :
scp id_rsa.pub hadoop@master:/home/hadoop/.ssh/id_rsa.pub.slave2
复制文件的时候,由于还没有免密码登录的,所以要输入密码
4、追加次节点服务器的公钥至 authorized_keys 文件中
在master机器上,在/.ssh目录下将看到从slave1、slave2发送过来的文件:
id_rsa.pub.slave1
id_rsa.pub.slave2
将这两个公钥内容追加写入到master机器/.ssh
目录下的authorized_keys
中:
5、确认公钥内容
在master机器上,查看authorized_keys文件内容,确认包含slave1、slave2机器的两个公钥内容:
cat authorized_keys
6、发送authorized_keys
master机器上,将authorized_keys发送到slave1、slave2机器的/.ssh目录下:
scp authorized_keys hadoop@slave1:/home/hadoop/.ssh/
scp authorized_keys hadoop@slave2:/home/hadoop/.ssh/
复制文件的时候,由于还没有免密码登录的,所以要输入密码
7、修改authorized_keys文件权限
分别在master、slave1、slave2机器上执行,对auhorized_keys进行权限修改,否则将无法实现免密码登录:
chmod 600 authorized_keys
authorized_keys的权限要是600。文件和目录的权限千万别设置成chmod 777.这个权限太大了,不安全,数字签名也不支持。
8、SSH登陆测试
在master机器上,从master机器通过ssh登录到slave1,第一次需要密码,退出后以后登录就不需要密码了,其他机器类似操作:
//登陆slave1
ssh slave1
//登陆后退出
exit
//重新登陆
ssh slave1 即可直接登录
9.失败原因,有可能是以下原因:
1、权限问题
.ssh目录,以及/home/当前用户 需要700权限,参考以下操作调整
sudo chmod 700 ~/.ssh
sudo chmod 700 /home/当前用户
.ssh目录下的authorized_keys文件需要600或644权限,参考以下操作调整
sudo chmod 600 ~/.ssh/authorized_keys
2、StrictModes问题
编辑
sudo vi /etc/ssh/sshd_config
找到
#StrictModes yes
改成
StrictModes no
如果还不行,可以用ssh -vvv 目标机器ip 查看详情,根据输出内容具体问题具体分析了
ssh -v debug
总结:
- authorized_keys:存放远程免密登录的公钥,主要通过这个文件记录多台机器的公钥
- id_rsa : 生成的私钥文件
- id_rsa.pub : 生成的公钥文件
- know_hosts : 已知的主机公钥清单
如果希望ssh公钥生效需满足至少下面两个条件:
- .ssh目录的权限必须是700
- .ssh/authorized_keys文件权限必须是600
查看ssh的登录日志
less /var/log/secure