目录
[3.1 对称加密与非对称加密](#3.1 对称加密与非对称加密)
[3.1.1 对称加密(Symmetric Encryption)](#3.1.1 对称加密(Symmetric Encryption))
[3.1.2 非对称加密(Asymmetric Encryption)](#3.1.2 非对称加密(Asymmetric Encryption))
[3.2 公钥传输的原理](#3.2 公钥传输的原理)
[3.3 加密通讯的原理](#3.3 加密通讯的原理)
[2.1 直接远程连接](#2.1 直接远程连接)
[2.2 连接指定用户](#2.2 连接指定用户)
[2.3 指定端口号](#2.3 指定端口号)
[2.4 跳板登录](#2.4 跳板登录)
[2.5 远程执行命令操作](#2.5 远程执行命令操作)
[3.1 黑名单](#3.1 黑名单)
[3.2 白名单](#3.2 白名单)
[3、 登录验证](#3、 登录验证)
一、ssh协议简介
1、实现远程访问的协议和程序
协议:
- SSH(Secure Shell):SSH是一种加密网络协议,用于通过安全通道在不安全网络上进行远程访问和管理。它提供了加密的通信会话,包括远程登录和执行命令,以及传输文件等功能
- Telnet:虽然不安全,但仍然被用于远程登录到服务器或设备,通常用于简单的文本交互
- RDP(Remote Desktop Protocol):主要用于Windows系统,允许用户通过图形界面远程访问另一台计算机。
- VNC(Virtual Network Computing):允许用户远程控制另一台计算机的图形界面。它是跨平台的远程桌面协议。
- X11:用于在UNIX和Linux系统上进行图形界面的远程访问。
- ICA(Independent Computing Architecture):由Citrix Systems开发,用于提供应用程序和桌面虚拟化服务
程序:
-
OpenSSH:OpenSSH 是 SSH 协议的免费开源实现,包括服务器端和客户端程序。它支持加密和身份验证功能,被广泛用于Linux和类Unix系统上
-
PuTTY:PuTTY 是一个流行的免费的SSH和Telnet客户端程序,可在Windows平台上使用。它提供了SSH连接所需的工具和功能
-
WinSCP:WinSCP 是一个免费的SFTP、SCP和FTP客户端程序,用于在Windows平台上与远程计算机进行安全文件传输。它支持SSH协议,提供了用户友好的界面
-
SecureCRT:SecureCRT 是一个商业化的SSH客户端程序,提供了强大的功能和定制选项,适用于Windows、Mac和Linux操作系统
接下来主要详细介绍ssh协议和OpenSSH程序
2、ssh协议的概念及功能
SSH(Secure Shell)是一种加密网络协议,用于在不安全的网络中安全地进行远程访问和管理。它通过加密数据传输,防止信息被窃听或篡改
功能:
- 加密通信:SSH协议通过加密技术,确保通信过程中的数据传输是安全的,防止数据被窃听或篡改
- 远程登录:用户可以使用SSH协议远程登录到其他计算机或服务器,以便进行命令行操作、文件管理等任务
- 加密身份验证:SSH协议支持使用公钥和私钥对进行身份验证,这种方式比传统的基于密码的身份验证更加安全
- 端口转发:SSH协议支持端口转发,可以通过安全的通道在两个计算机之间建立安全的连接
- 远程执行命令:SSH允许用户在远程主机上执行命令,这对于自动化脚本和远程管理非常有用
- 文件传输:SSH协议还支持安全的文件传输,可以在客户端和服务器之间进行安全的文件传输和管理
3、ssh协议的工作原理
3.1 对称加密与非对称加密
3.1.1 对称加密(Symmetric Encryption)
-
概念:在对称加密中,加密和解密使用相同的密钥。发送方使用密钥将消息加密,接收方使用相同的密钥将消息解密。常见的对称加密算法包括AES(高级加密标准)、DES(数据加密标准)和3DES等
-
优点:对称加密算法加密和解密速度快,适合大量数据的加密和解密操作
-
缺点:密钥的安全分发是对称加密的一个挑战,因为发送方和接收方都需要共享相同的密钥。如果密钥在传输过程中被截获,那么加密的安全性就会受到威胁
3.1.2 非对称加密(Asymmetric Encryption)
-
概念:在非对称加密中,加密和解密使用不同的密钥,分别称为公钥和私钥。公钥用于加密,私钥用于解密。常见的非对称加密算法包括RSA、Diffie-Hellman和ECC(椭圆曲线加密)等
-
优点:非对称加密算法解决了密钥分发的问题,因为公钥可以公开发布,而私钥则只有接收方知道
-
缺点:非对称加密算法的加密和解密速度比对称加密算法慢,因此不适合大规模数据的加密和解密操作
| 区别 | 对称加密 | 非对称加密 |
| 密钥数量 | 使用相同的密钥进行加密和解密 | 使用不同的密钥进行加密和解密 |
| 速度 | 较快 | 较慢 |
| 密钥分发 | 需要解决密钥分发的问题 | 通过公钥和私钥的方式解决了密钥分发的问题 |
安全性 | 较低 | 更高 |
---|
3.2 公钥传输的原理
SSH协议中的公钥传输原理通常涉及到公钥认证和密钥交换
详细阐释:
① 客户端向服务端发起连接请求
② 服务端接收到请求后,返回自己的公钥以及一个会话id(此处客户端得到服务端的公钥)
③ 客户端生成密钥对,客户端用自己的公钥异或会话id,计算出一个值res,并用服务端的公钥加密
④客户端发送加密值到服务端,服务端用私钥解密,得到res
⑥ 服务端用解密后的值res异或会话id,计算出客户端的公钥(此处服务端得到客户端公钥)
⑦ 最终:双方各自持有三个密钥,分别为自己的一对公钥、私钥,以及对方的公钥,之后所有的通讯都会被加密
3.3 加密通讯的原理
详细阐释:
首先ssh通过加密算法在客户端产生密钥对(公钥和私钥),公钥发送给服务器端,自己保留私钥,如果要想连接到带有公钥的SSH服务器,客户端SSH软件就会向SSH服务器发出请求,请求用联机的用户密钥进行安全验证。SSH服务器收到请求之后,会先在该SSH服务器上连接的用户的家目录下
二、openSSH程序
1、openSSH程序及配置文件
openSSH是实现SSH协议的开源软件项目,适用于各种UNIX、Linux操作系统
执行"systemctl start sshd"命令即可启动sshd服务,默认端口使用的22端口
sshd:服务名称
/usr/sbin/sshd :服务端主程序
/etc/ssh/sshd_config:服务端配置文件,设置与服务端相关的应用可通过此文件实现
/etc/ssh/ssh_config:客户端配置文件,设置与客户端相关的应用可通过此文件实现
**~/.ssh/known_hosts:**客户端用来存储已知服务端公钥信息的文件
①当SSH客户端连接到一个新的服务端时,它会检查这个服务端的公钥是否在~
/.ssh/known_hosts
文件中。如果公钥在这个文件中,则说明这个服务端是可信的,SSH 客户端会继续连接并进行认证;如果公钥不在这个文件中,则 SSH 客户端会给出一个警告,提示用户这个服务端可能不是可信的,并询问用户是否继续连接②如果客户端之前已经连接过这个服务端,那么它就会在 ~
/.ssh/known_hosts
文件中找到这个服务端的公钥,并使用它进行加密通信。(再次连接时,可通过对比文件中的公钥来确定连接的服务器是否正确)。如果客户端之前没有连接过这个服务端,那么它就会将这个服务端的公钥添加到 ~/.ssh/known_hosts
文件中,以便下次连接时使用注:
如果服务端的公钥发生了变化,比如重新安装了操作系统或者更换了硬件,那么客户端会提示服务端的公钥发生了变化,并询问用户是否继续连接。这是因为公钥的变化可能意味着服务端的身份已经被篡改,因此需要用户确认服务端的身份。(解决方法:将之前的密钥文件删除,重新连接新的服务端,生成新的密钥文件)
2、ssh命令基本用法
用于建立安全的远程连接
2.1 直接远程连接
bash
ssh IP地址
2.2 连接指定用户
bash
ssh 用户名@IP地址
ssh -l 用户名 IP地址
2.3 指定端口号
bash
ssh ip地址 -p 端口号
首先可在服务端的/etc/ssh/sshd_config配置文件修改端口号
bash
systemctl restart sshd #重启sshd服务,修改的配置才能生效
那在客户端远程连接服务端时,可通过-p选项来指定服务端的端口号才能登录
2.4 跳板登录
SSH跳板登录(SSH jump host)是一种通过一个中间主机(跳板主机)来访问其他无法直接访问的目标主机的方法。它提供了一种安全的方式来管理和连接到位于内部网络中的主机,同时限制了对内部网络的直接访问
使用SSH命令从本地计算机连接到跳板主机,再通过跳板主机连接到目标主机
bash
ssh -t 跳板机ip地址 ssh -t 跳板机ip地址 ........ ssh -t 目的机ip地址
bash
#在目标服务端主机上模拟防火墙拒绝客户端连接,客户端使用跳板连接到目标主机上
[root@localhost .ssh]#iptables -A INPUT -s 172.16.12.10 -j REJECT
[root@localhost ~]#ssh -t 172.16.12.12 ssh 172.16.12.13
2.5 远程执行命令操作
SSH服务可以通过远程执行命令的方式进行远程操作。通过在ssh
命令后直接跟上要执行的命令,可以在远程主机上执行该命令而无需登录到远程主机的shell中
bash
ssh ip地址 想使用的命令
3、黑白名单
SSH的黑白名单通常指的是用于限制SSH连接的IP地址列表,以便控制哪些IP地址可以连接到SSH服务器(黑名单)或者哪些IP地址不允许连接到SSH服务器(白名单)
3.1 黑名单
黑名单是一种限制访问的方式,其中列出的IP地址被禁止连接到SSH服务器,而不在黑名单的IP地址允许连接到SSH服务器
设置黑名单:
①通常由系统管理员在SSH服务器的配置文件中定义。在OpenSSH中,这通常是在/etc/ssh/sshd_config
文件中进行配置
②可以使用DenyUsers
或DenyGroups
选项来指定禁止连接的用户或用户组
3.2 白名单
白名单是一种允许访问的方式,其中列出的IP地址被允许连接到SSH服务器。只有在白名单中列出的IP地址才能建立SSH连接,其他IP地址将被拒绝
设置白名单:
①通常由系统管理员在SSH服务器的配置文件中定义。在OpenSSH中,这通常是在/etc/ssh/sshd_config
文件中进行配置
②可以使用AllowUsers
或AllowGroups
选项来指定允许连接的用户或用户组
在172.16.12.12服务器上配置:允许所有主机连接本机的mimi用户,却只允许172.16.12.10主机连接本机的dh用户,修改完之后重启sshd服务
只允许172.16.12.10客户端连接服务端的dh用户
允许所有主机连接本机的mimi用户
4、禁止远程连接到服务器的root用户
修改服务端配置:禁止root用户登录,再重启sshd服务
5、ssh服务器的最佳调优
①建议使用非默认端口
bash
vim /etc/ssh/sshd_config
#找到以下两个配置项:
port 123 #设置特定的ssh服务端口号
②禁止使用protocol version 1
因为SSH协议版本一存在多个已知的安全漏洞,其使用的加密算法和密钥交换机制相对较弱,易受到中间人攻击等威胁
SSH 协议版本二已经成为现代标准,并且得到广泛支持,绝大多数 SSH 客户端和服务器都默认使用协议版本二,而且很多安全性工具也不再支持协议版本一
③限制可登录用户的白名单
详细操作可参考上面的黑白名单
④设定空闲会话超时时长
bash
vim /etc/ssh/sshd_config
#找到以下两个配置项:
ClientAliveInterval 0
ClientAliveCountMax 3
ClientAliveInterval:
表示服务器向客户端发送空闲会话确认消息的时间间隔,单位为秒。默认值为0,表示不发送确认消息。将其设置为一个正整数,表示每隔多长时间向客户端发送一次确认消息。
ClientAliveCountMax:
表示服务器向客户端发送确认消息后,客户端没有响应的最大次数。默认值为3,表示如果服务器连续发送3次确认消息后,客户端仍未响应,则认为客户端已经断开连接。将其设置为一个正整数,表示服务器最多发送多少次确认消息后,认为客户端已经断开连接
⑤利用防火墙设置ssh访问策略
bash
#利用防火墙禁止特定IP地址:172.16.12.10访问
iptables -A INPUT -s 172.16.12.10 -j REJECT
⑥仅监听特定的IP地址
bash
vim /etc/ssh/sshd_config
#找到以下三个配置项:
ClientAliveInterval 300
ClientAliveCountMax 2
ListenAddress 172.16.12.10
ClientAliveInterval:
表示SSH服务器将向客户端发送空闲会话检查的时间间隔(以秒为单位),默认值为0,表示禁用此功能
ClientAliveCountMax:
表示SSH服务器将向客户端发送空闲会话检查的最大次数,如果达到此次数后仍未收到客户端的响应,则会话将被终止,默认值为3
ListenAddress:监听特定的IP地址的SSH连接
⑦基于口令认证时,使用强密码策略
bash
比如:tr -cd [a-zA-Z0-9] < /dev/random | head -c 12 | xargs
#设定12位的随机密码
⑧使用基于密钥的认证
详细操作参考下面的使用密钥对免交互验证登录
⑨禁止使用空密码
bash
vim /etc/ssh/sshd_config
#找到以下一个配置项:
PermitEmptyPasswords no #禁止使用空密码
⑩禁止远程连接到服务器的root用户
详细操作参考上面的禁止远程连接到服务器的root用户
⑪限制ssh的访问频度和并发在线数
bash
vim /etc/ssh/sshd_config
#找到以下一个配置项:
MaxStartups 10 #最多允许10个并发连接,如果超过这个数量,会拒绝新的连接
使用PAM模块:通过Pluggable Authentication Modules (PAM) 可以实现更复杂的控制,
例如限制用户的并发登录数
使用防火墙:你也可以使用防火墙软件如iptables来限制从特定IP地址发起的并发SSH连接数
⑫经常分析、分离日志
独立sshd服务日志文件:默认sshd服务日志在/var/log/secure下,可通过rsyslog程序将sshd服务日志文件独立出来放到特定的文件夹中,方便查看和管理。
(具体操作请查看《Linux文件系统与日志分析》博客)
使用日志分析工具:可以使用工具如grep
、awk
、sed
等来分析SSH日志文件。这些工具可以帮助搜索特定的关键字、过滤信息、提取有用的数据等
设置日志轮转:为了避免日志文件过大,可以配置日志轮转。通过日志轮转,旧的日志文件会被重命名并压缩,同时创建新的日志文件。可以使用logrotate
工具来实现日志轮转,并在其配置文件中指定SSH日志文件的处理方式(具体操作请查看《Linux文件系统与日志分析》博客)
三、使用密钥对免交互验证登录
1、创建密钥
可指定算法类型:输入 ssh-keygen -t ed25519 (ecdsa)
bash
[root@localhost ~]#ssh-keygen #客户端创建密钥
2、将密钥文件传送到远程服务端
bash
#客户端将密钥传送到远程服务端
[root@localhost ~]#ssh-copy-id -i /root/.ssh/id_rsa.pub 172.16.12.10
3、 登录验证
此时我们去登录服务端,会使用密钥文件进行验证,提高了安全性
为保障更安全,可开启密钥验证,关闭密码验证,如此只有密钥的客户端才可连接到远程服务端
4、免交互登录(无须密钥密码验证)
客户端先输入 ssh-agent bash 将这个命令交给 bash 去管理
再输入 ssh-add 是将用户的私钥添加到运行中的 ssh-agent 中,这样在后续的SSH连接过程中,就不需要每次都手动输入私钥的密码了。一旦私钥被添加到ssh-agent 中,它会暂时保存解密后的私钥以供后续使用
但重启客户端设备后就会失效,需要重新进行上述操作