免密登录解决的痛点问题:远程跨服务器节点操作(集群启动/停止)需要频繁输入登陆密码。
1. 对称加密和非对称加密
SSH的主要优势在于安全性,当下主要的加密方式有 对称加密 和 非对称加密 两种。
1.1 对称加密
对称加密使用同一个密钥来进行加密和解密,这样在传输时是安全可靠的,但是如何安全的保存密钥呢,在集群中,客户端的数量比较多,一旦任意一个客户端的密钥被窃取,那么整个系统的安全性也就不复存在。
1.2 非对称加密
由于对称加密的弊端,催生了非对称加密,非对称加密中有两个密钥:公钥和私钥。公钥由私钥生成,但却无法推算出私钥,公钥加密后的密文,只能通过对应的私钥来解密。
2. ssh免密
2.1 ssh非对称加密
ssh采用的非对称加密方式如何解决中间人攻击问题
那么SSH采用了非对称的加密方式,是怎么解决这个问题的呢?
[work@client.com: ~]$ ssh work@server.com
The authenticity of host 'server.com (10.10.10.24)' can't be established.
RSA key fingerprint is ad:2e:92:41:6f:31:b1:c1:35:43:eb:df:f1:18:a1:c1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'server.com,10.10.10.24' (RSA) to the list of known hosts.
Password: (enter password) 在这个认证信息中,可以看到提示:无法确认主机server.com (10.10.10.24)的真实性,不过知道它的公钥指纹,是否继续连接?
输入yes继续连接后,就会确认该服务器为可信任服务器,然后添加到known_hosts文件中,下次不用再次确认,然后跳转到输入密码的验证阶段。这种简单粗暴的方式相当于让我们肉眼比对来判断目标服务器是否是真实服务器,我觉得并不是最理想的方式,希望后续会有更完美的认证方式。
之所以用fingerprint(公钥指纹)代替key,主要是key过于长(RSA算法生成的公钥有1024位),很难直接比较。所以,对公钥进行hash生成一个128位的指纹,这样就方便比较了。
2.2 ssh免密登录的原理
Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中构建安全通道来实现SSH客户端与服务端间的连接。虽然任何网络服务都可以通过SSH实现安全传输,但是SSH最常用的场景是远程登录系统,通常利用SSH来传输命令行界面和远程执行命令。
SSH是Telnet/rlogin等非安全Shell的替代品,这些协议采用的明文传输会导致很多安全问题。
如上图所示,telnet使用23端口,所有的信息(包括用户名、密码)都是明文传输,而SSH使用22端口,所有的信息都会被加密传输,安全性明显得到了保障。
SSH使用也十分简单,命名语法如下:
ssh 目标节点的用户名@目标节点的主机名或ip
[tom@hadoop02 ~]$ ssh tom@hadoop03
tom@hadoop03’s password:ssh连接时出现Host key verification failed
ssh hadoop03出现:
The authenticity of host '192.168.1.121 (192.168.1.123)' can't be established.
RSA key fingerprint is cf:1e:de:d7:d0:4c:2d:98:60:b4:fd:ae:b1:2d:ad:06.
Are you sure you want to continue connecting (yes/no)?
直接输入yes然后回车即可
2.3 ssh免密登录配置
ssh-genkey是生成密钥的工具,此命令执行完成后生成公钥和密钥,这两个文件会默认保存在 ~/.ssh/ 路径下。
常用参数:
No. | 参数 | 作用 |
---|---|---|
1 | -t | 指定生成密钥类型(rsa、dsa)。默认为rsa |
2 | -f | 指定存放私钥的文件,公钥文件名为私钥文件名加.pub后缀。默认为id_rsa |
3 | -P | 指定passphrase(私钥的密码),用于确保私钥的安全。默认为空 |
4 | -C | 备注。默认为user@hostname |
例子:
分别在hadoop02 hadoop03 hadoop04生成公钥和私钥:
ssh-keygen -t rsa然后回车(一般需要敲三次回车),就会在 ~/.ssh目录下生成两个文件
id_rsa(私钥)
id_rsa.pub(公钥)
分别在hadoop02、hadoop03、hadoop04执行,将公钥拷贝到需要免密登录的目标机器上
ssh-copy-id hadoop02
ssh-copy-id hadoop03
ssh-copy-id hadoop04
注意:
如果还想实现其他用户的免密登录,还需要在每台节点上采用其他账号,完成免密的配置。
如果ssh-copy-id没生效,没有自动创建authorized_keys文件并把公钥拷贝进入,可以创建authorized_keys文件拷手动拷贝公钥:
如果没有生成authorized_keys文件,可以手动创建,把公钥内容拷贝到需要免密登录这台机器的机器上的authorized_keys文件中。
2.4 ~/.ssh目录下文件
.ssh目录,默认是隐藏的,ls -a才能看到
No. | 文件名 | 功能描述 |
---|---|---|
1 | known_hosts | 记录ssh访问过的服务器节点的公钥(public key) |
2 | id_rsa | 私钥文件 |
3 | id_rsa.pub | 公钥文件 |
4 | authorized_keys | |
5 | config | 指定不同域名使用哪个密钥的配置文件 |
因为一台机器既可以是客户端也可以是服务端,因此可能同时存在authorized_keys和konwn_hosts文件。