一、原理简介:
1、SSH公钥认证的基本原理:
SSH是一个专为远程登录会话和其他网络服务提供安全性的协议。默认状态下SSH链接是需要密码认证的,可以通过添加系统认证(即公钥-私钥)的修改,修改后系统间切换可以避免密码输入和SSH认证。
对信息的加密和解密采用不同的key,这对key分别称作private key和public key,其中,public key存放在欲登录的服务器上,而private key为特定的客户机所持有。
当客户机向服务器发出建立安全连接的请求时,首先发送自己的public key,如果这个public key是被服务器所允许的,服务器就发送一个经过public key加密的随机数据给客户机,这个数据只能通过private key解密,客户机将解密后的信息发还给服务器,服务器验证正确后即确认客户机是可信任的,从而建立起一条安全的信息通道。
通过这种方式,客户机不需要向外发送自己的身份标志“private key”即可达到校验的目的,并且private key是不能通过public key反向推断出来的。这避免了网络窃听可能造成的密码泄露。客户机需要小心的保存自己的private key,以免被其他人窃取,一旦这样的事情发生,就需要各服务器更换受信的public key列表。
2、要实现的效果:
网络拓扑图如下:共4台服务器,主机名分别为flower1~4,要实现flower1到另外3台服务器的免密码登录。
3、基本步骤:
- 设置主机名。
- 在服务器flower1上利用ssh-keygen命令生成公钥私钥对。
- 将flower1上的公钥分别拷贝到flower2~4服务器上。
- 修改相关文件的权限。
- 验证免密码登录。
二、实际操作流程:
1、修改4台服务器上的主机名:
这里以主机1为例,hostname修改为flower1。那么有几种修改方式呢?下面4种方式都可以做到,但是效果有所不同。
1: hostname flower1 --运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
2: echo flower1 > /proc/sys/kernel/hostname --运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
3: sysctl kernel.hostname=flower1 --运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
4: 修改/etc/sysconfig/network下的HOSTNAME变量 --需要重启生效,永久性修改。
上面4种方式的区别在哪呢?
hostname是Linux系统下的一个内核参数,它保存在/proc/sys/kernel/hostname下,但是它的值是Linux启动时从/etc/rc.d/rc.sysinit读取的。
而/etc/rc.d/rc.sysinit中HOSTNAME的取值来自与/etc/sysconfig/network下的HOSTNAME。
所以,如果服务器重启,就肯定以/etc/sysconfig/network为准。其余3种方式都是临时的修改。
另外,从上面的逻辑上看,hostname的取值跟/etc/hosts中的配置没什么关系。
所以,如果要服务器的hostname立刻生效,并保证重启后生效,该如何操作呢?
只要修改/etc/sysconfig/network中的HOSTNAME,并在命令行执行 hostname flower1即可。
[root@iZ940419pwoZ ~]# vim /etc/sysconfig/network
[root@iZ940419pwoZ ~]# hostname flower1
[root@iZ940419pwoZ ~]# hostname
flower1
[root@iZ940419pwoZ ~]# reboot
重启看一下效果。如法炮制,修改其余3台服务器,分别命名为flower2\flower3\flower4
2、在服务器flower1上利用ssh-keygen命令生成公钥私钥对:
这里需要注意一点,虽然flower1也是服务器,但是它是作为ssh客户端来进行配置的。
在用户的主目录下执行以下命令(这里使用的是root用户,可以根据个人需要调整),连续按3次回车即可。
[root@flower1 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
df:71:f6:3e:bb:bb:6c:38:91:f4:bc:70:a1:dd:86:a9 root@flower1
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| |
| . . |
| S o Ooo|
| . . Oo*o|
| . ..=.o|
| Eo.= |
| o*B|
+-----------------+
进入到~/.ssh目录下查看生成的文件:其中id_rsa为私钥,id_rsa.pub为公钥。
3、将flower1上的公钥拷贝到flower2~4相关目录下:
这里使用scp命令进行复制,首先保证flower2~4下有~/.ssh目录。
这里以flower2为例
[root@flower1 .ssh]# scp id_rsa.pub root@10.170.125.14:~/.ssh
然后到flower2机器上
# touch ~/.ssh/authorized_keys (如果已经存在这个文件, 跳过这条)
# chmod 600 ~/.ssh/authorized_keys (# 注意: 必须将~/.ssh/authorized_keys的权限改为600, 该文件用于保存ssh客户端生成的公钥,可以修改服务器的ssh服务端配置文件/etc/ssh/sshd_config来指定其他文件名)
# chmod 700 ~/.ssh/ (# 注意:jenkins和远程服务器权限配置需要一致.ssh 700 authorized_keys 600)
# cat ~/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys (将id_rsa.pub的内容追加到 authorized_keys 中, 注意不要用 > ,否则会清空原有的内容,使其他人无法使用原有的密钥登录)
4、验证:
[root@flower1 .ssh]# ssh 10.170.125.14
其余几台服务器使用类似的方式修改即可。
1、SSH公钥认证的基本原理:
SSH是一个专为远程登录会话和其他网络服务提供安全性的协议。默认状态下SSH链接是需要密码认证的,可以通过添加系统认证(即公钥-私钥)的修改,修改后系统间切换可以避免密码输入和SSH认证。
对信息的加密和解密采用不同的key,这对key分别称作private key和public key,其中,public key存放在欲登录的服务器上,而private key为特定的客户机所持有。
当客户机向服务器发出建立安全连接的请求时,首先发送自己的public key,如果这个public key是被服务器所允许的,服务器就发送一个经过public key加密的随机数据给客户机,这个数据只能通过private key解密,客户机将解密后的信息发还给服务器,服务器验证正确后即确认客户机是可信任的,从而建立起一条安全的信息通道。
通过这种方式,客户机不需要向外发送自己的身份标志“private key”即可达到校验的目的,并且private key是不能通过public key反向推断出来的。这避免了网络窃听可能造成的密码泄露。客户机需要小心的保存自己的private key,以免被其他人窃取,一旦这样的事情发生,就需要各服务器更换受信的public key列表。
2、要实现的效果:
网络拓扑图如下:共4台服务器,主机名分别为flower1~4,要实现flower1到另外3台服务器的免密码登录。
3、基本步骤:
- 设置主机名。
- 在服务器flower1上利用ssh-keygen命令生成公钥私钥对。
- 将flower1上的公钥分别拷贝到flower2~4服务器上。
- 修改相关文件的权限。
- 验证免密码登录。
二、实际操作流程:
1、修改4台服务器上的主机名:
这里以主机1为例,hostname修改为flower1。那么有几种修改方式呢?下面4种方式都可以做到,但是效果有所不同。
1: hostname flower1 --运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
2: echo flower1 > /proc/sys/kernel/hostname --运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
3: sysctl kernel.hostname=flower1 --运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改
4: 修改/etc/sysconfig/network下的HOSTNAME变量 --需要重启生效,永久性修改。
上面4种方式的区别在哪呢?
hostname是Linux系统下的一个内核参数,它保存在/proc/sys/kernel/hostname下,但是它的值是Linux启动时从/etc/rc.d/rc.sysinit读取的。
而/etc/rc.d/rc.sysinit中HOSTNAME的取值来自与/etc/sysconfig/network下的HOSTNAME。
所以,如果服务器重启,就肯定以/etc/sysconfig/network为准。其余3种方式都是临时的修改。
另外,从上面的逻辑上看,hostname的取值跟/etc/hosts中的配置没什么关系。
所以,如果要服务器的hostname立刻生效,并保证重启后生效,该如何操作呢?
只要修改/etc/sysconfig/network中的HOSTNAME,并在命令行执行 hostname flower1即可。
[root@iZ940419pwoZ ~]# vim /etc/sysconfig/network
[root@iZ940419pwoZ ~]# hostname flower1
[root@iZ940419pwoZ ~]# hostname
flower1
[root@iZ940419pwoZ ~]# reboot
重启看一下效果。如法炮制,修改其余3台服务器,分别命名为flower2\flower3\flower4
2、在服务器flower1上利用ssh-keygen命令生成公钥私钥对:
这里需要注意一点,虽然flower1也是服务器,但是它是作为ssh客户端来进行配置的。
在用户的主目录下执行以下命令(这里使用的是root用户,可以根据个人需要调整),连续按3次回车即可。
[root@flower1 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
df:71:f6:3e:bb:bb:6c:38:91:f4:bc:70:a1:dd:86:a9 root@flower1
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| |
| . . |
| S o Ooo|
| . . Oo*o|
| . ..=.o|
| Eo.= |
| o*B|
+-----------------+
进入到~/.ssh目录下查看生成的文件:其中id_rsa为私钥,id_rsa.pub为公钥。
3、将flower1上的公钥拷贝到flower2~4相关目录下:
这里使用scp命令进行复制,首先保证flower2~4下有~/.ssh目录。
这里以flower2为例
[root@flower1 .ssh]# scp id_rsa.pub root@10.170.125.14:~/.ssh
然后到flower2机器上
# touch ~/.ssh/authorized_keys (如果已经存在这个文件, 跳过这条)
# chmod 600 ~/.ssh/authorized_keys (# 注意: 必须将~/.ssh/authorized_keys的权限改为600, 该文件用于保存ssh客户端生成的公钥,可以修改服务器的ssh服务端配置文件/etc/ssh/sshd_config来指定其他文件名)
# chmod 700 ~/.ssh/ (# 注意:jenkins和远程服务器权限配置需要一致.ssh 700 authorized_keys 600)
# cat ~/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys (将id_rsa.pub的内容追加到 authorized_keys 中, 注意不要用 > ,否则会清空原有的内容,使其他人无法使用原有的密钥登录)
4、验证:
[root@flower1 .ssh]# ssh 10.170.125.14
其余几台服务器使用类似的方式修改即可。