哈喽,大家好呀!这里是码农后端。今天来聊一聊什么是SSH以及SSH基于用户名密码的认证原理。

一、SSH概述

SSH(Secure Shell,安全的shell),是一种用于安全访问远程服务器的协议,是Linux下远程管理的工具,相比Telnet安全。其采用CS(Client/Server)架构,默认端口号为22,TCP协议。

注:SSH其实用于商业,而OpenSSH即为开源的,在Linux中默认安装。

1、加密算法

在学习SSH服务之前先来了解一下两种加密算法。

1.1 对称加密算法(DES)

1)发送方使用密钥将明文数据加密成密文发送出去。
2)接收方收到密文后,使用同一个密钥将密文解密成明文进行读取。

1.2 非对称加密算法(RSA)

1)发送方使用接收方发送过来的公钥明文数据加密成密文,然后发送出去。
2)接收方收到密文后,使用自己本地留存的私钥将密文解密成明文进行读取。

注:公钥和私钥是一对用于非对称加密和解密的密钥。公钥可以公开分享,用于加密数据或验证签名私钥必须保密,用于解密数据或创建签名

1.3 对称加密与非对称加密比较

对称加密:

1)使用同一个密钥进行加密和解密,密钥容易泄露。
2)加密速度快,效率高,数据传输速度快,安全性较低。

非对称加密:

1)使用不同的密钥(公钥和私钥)进行加密和解密。
2)加密速度远远慢于对称加密,数据传输速度慢,安全性较高。

二、SSH基于用户名密码的认证原理

1、基本语法

1
2
3
ssh [选项] 远程服务器的用户名@远程服务器的IP地址
# 选项说明:
-p:指定ssh服务的端口号,默认为22

2、认证原理

1)SSH客户端向SSH服务端发起一个登录请求。
2)SSH服务端将自己的公钥发送给SSH客户端。
3)SSH客户端使用服务端发过来的公钥将自己的密码加密并发送给SSH服务端。
4)SSH服务端收到SSH客户端发过来的加密密码后使用本地留存的私钥进行解密。
5)SSH服务端将解密出来的密码和/etc/shadow文件里的用户密码对比认证。
6)SSH服务端认证成功,则返回登录成功结果,并发送一个随机会话口令给客户端,该口令用于后面两台主机进行数据传输的一个临时加密会话口令。

3、案例背景

为了最大程度的保护公司内网服务器的安全,公司内部有一台服务器做跳板机(JumpServer)。运维人员在维护过程中先要统一登录到这台服务器,然后再登录到目标设备进行维护和操作。由于开发人员有时候需要通过跳板机登录到线上生产环境查看一些业务日志,所以现在需要运维人员针对不同的人员和需求对账号密码进行统一管理,并且遵循权限最小化原则。

3.1 环境准备

准备两台机器,跳板机(JumpServer)和线上生产服务器(RealServer)。

第一步:把现有的CentOS7操作系统恢复快照(刚装完系统的Linux服务器) => 母机(模板机)

第二步:对CentOS7操作系统进行克隆,生成JumpServer与RealServer

注:克隆备份要求克隆时操作系统必须处于关闭状态。

1)查看各自IP地址:


2)整理如下表:

编号 IP地址 主机名称 角色信息
1 192.168.91.130 jumpserver.itweb.cn JumpServer
2 192.168.91.128 realserver.itweb.cn RealServer

3)修改主机名称:

JumpServer:

1
hostnamectl set-hostname jumpserver.itweb.cn

RealServer:

1
hostnamectl set-hostname realserver.itweb.cn

3.2 模拟通过JumpServer跳板机远程连接RealServer线上生产服务器

JumpServer:

1
2
3
4
# ssh远程登录操作
ssh root@192.168.91.128
# 显示结果(注:如果是第一次访问,则提示无法确认主机的真实性)
# The authenticity of host '192.168.91.128 (192.168.91.128)' can't be established.

注:当客户端输入yes确认对方的公钥指纹后, server端的公钥就会被存放到客户机的用户家目录(~/ .ssh/known _hosts文件)中,下次再访问就直接通过密码登录,不需要再确认公钥。