SSH 为建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH 协议可以有效防止远程管理过程中的信息泄露问题。
从客户端来看,SSH提供两种级别的安全验证:
1、基于口令的验证
只要知道帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但缺点是:不能保证你正在连接的服务器就是你想连接的服务器。连接过程如下
当第一次链接远程主机时,会提示您当前主机的”公钥指纹”,询问您是否继续,如果选择继续后就可以输入密码进行登录了,当远程的主机接受以后,该台服务器的公钥就会保存到~/.ssh/known_hosts文件中
2、基于密钥的验证
这种验证的前提是客户端需要生成一对密钥,将公钥放到需访问的远程服务器。这种验证比上一种的好处是,不能仿冒真正的服务器,因为要仿冒必须拿到客户端生成的公钥。缺点就是验证等待过程稍长些。
如何生成密钥:
- 在客户端打开终端,执行ssh-keygen,该命令会默认在~/.ssh/目录下创建id_rsa、id_rsa.pub两个文件,分别为您的公钥和私钥
- 将公钥id_rsa.pub文件拷贝到服务器端的~/.ssh/authorized_keys文件中,有三种方法:
- 通过scp拷贝,例:scp -P 22 ~/.ssh/id_rsa.pub user@host:~/authorized_keys #可选参数-P代表指定用端口号22
- 通过ssh-copyid程序,例:ssh-copy-id -i 绝对路径/file_name 目标主机IP #此种方式简单,不需追加改文件名,但不能指定端口号,默认以22端口而且需要输入密码
- 通过cat方法: 例:cat ~/.ssh/id_rsa.pub | ssh -p 22 user@host ‘cat >> ~/.ssh/authorized_keys’
原理图如下:
图解,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要做一次加密验证。对于非对称加密,公钥加密的密文不能公钥解开,只能私钥解开。
实际操作
#生成密钥对,t参数指定加密方式rsa,回车3次
[root@localhost ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
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:
eb:38:2d:a0:9e:3d:93:95:a2:52:ec:eb:0b:60:65:44 root@localhost.localdomain
The key's randomart image is:
+--[ RSA 2048]----+
| .E |
| . |
| o |
| o |
|.o .S |
|o o o o . |
|.o o = .. |
|..+o+ oo. |
| +*o.o.o. |
+-----------------+
#查看密钥存放的目录
[root@localhost ~]# ll /root/.ssh/
总用量 8
-rw------- 1 root root 1675 12月 19 15:16 id_rsa # 私钥自留
-rw-r--r-- 1 root root 408 12月 19 15:16 id_rsa.pub #公钥拷贝给目标主机
#传送公钥给目标主机需要输入密码
[root@localhost ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.15.150
The authenticity of host '192.168.15.150 (192.168.15.150)' can't be established.
RSA key fingerprint is 76:72:55:b7:3f:e1:8b:6d:8d:d7:50:fb:d5:27:bb:c1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.15.150' (RSA) to the list of known hosts.
Now try logging into the machine, with "ssh '192.168.15.150'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
#SSH免密设置成功,可以直接在本机获取远程主机的参数,ssh -l user_name IP "command"
[root@localhost ~]# ssh -l root 192.168.15.150 "df -h"
Filesystem Size Used Avail Use% Mounted on
/dev/sda5 58G 3.7G 52G 7% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 194M 30M 155M 17% /boot
/dev/sda2 20G 5.7G 14G 31% /data
[root@localhost ~]# ssh -l root 192.168.15.150 "ifconfig"
eth0 Link encap:Ethernet HWaddr 00:0C:29:BA:80:B0
inet addr:192.168.15.150 Bcast:192.168.15.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:feba:80b0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:661 errors:0 dropped:0 overruns:0 frame:0
TX packets:348 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:75506 (73.7 KiB) TX bytes:54018 (52.7 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:840 (840.0 b) TX bytes:840 (840.0 b)
服务主配置
服务主配置文件一般保存服务的主要参数,一般路径/etc/soft/soft.conf
普通配置文件一般是由主配置文件调用
[root@localhost ssh]# vim sshd_config
17 #Port 22 #默认端口号
48 #PermitRootLogin yes #允许超级管理员登录,取消注释改为no,root用户无法远程登录
77 #PermitEmptyPasswords no #允许空密码登录,no不允许
78 PasswordAuthentication yes #允许通过密码登录
#重启ssh服务
[root@localhost ssh]# systemctl restart sshd
备注:特殊情况主机上保存了对方主机过期的公钥文件或者因为内网IP冲突,不同服务器使用同一个IP,导致前后公钥信息有差异无法发送公钥文件到目标主机
一般公钥信息都保存在文件/root/.ssh/known_hosts
中,可以手动进文件删除相关信息或直接清空文件
但这可能会影响到其他主机的公钥文件
可以使用ssh-keygen
来删除指定IP的公钥文件
ssh-key-gen -R 172.16.10.22