SSH - 学习与实践探究

1. 应用场景

常用于远程登录系统[服务器, 如云服务器, AWS, 阿里云, 腾讯云等],

但是也并非一定安全的, 可以参看--下面维基百科介绍

弄清楚工作的原理。

2. 学习/操作

SSH - 学习与实践探究_第1张图片

1. 文档

SSH原理和基本使用:ssh 安全配置 以及ssh key 认证登录_xiaoluoshan的专栏-CSDN博客_ssh

将博客应用自动部署到线上服务器完整流程详解 | Laravel 5.7 版本 | Laravel 入门项目:博客系列教程

配置 SSH 密钥 - 云效2020 - 阿里云

使用ssh对服务器进行登录 - 如何如是 - 博客园

官方文档

SSH command usage, options, and configuration in Linux/Unix

2. 整理输出

2.1 介绍

ssh(安全外壳协议)_百度百科  //百度百科

SSH - 学习与实践探究_第2张图片

https://zh.wikipedia.org/wiki/Secure_Shell  //维基百科

SSH - 学习与实践探究_第3张图片

SSH(Secure Shell)是一种网络协议,用于在不安全的网络上安全地执行远程命令和传输文件。它通过加密通信来保护数据的完整性和隐私。

SSH协议有两个主要组件:SSH客户端和SSH服务器。SSH客户端是用户使用的工具,用于建立与SSH服务器的安全连接并发送命令。SSH服务器则负责接收连接请求并验证客户端身份,并将命令传输给目标计算机上运行的终端程序。

SSH可以使用多种加密算法和身份验证方式来确保安全性。例如,公钥身份验证可防止密码被窃取和重用,而基于口令的身份验证则需要输入一个口令来验证用户的身份。

SSH还可以用于传输文件,称为SCP(Secure Copy)和SFTP(Secure File Transfer Protocol)。这些协议利用SSH的加密功能,提供了对文件传输的安全支持。

总之,SSH是一种广泛使用的安全协议,用于在不安全的网络上进行远程访问和文件传输。

补充

“不安全的网络” 举例说明

不安全的网络通常指的是公共互联网或者不可信任的内部网络。例如:

  1. 公共无线网络:例如咖啡店、机场或图书馆等场所提供的Wi-Fi服务,这些网络可能存在安全风险,因为用户之间很容易受到窃听、中间人攻击等问题的影响。

  2. 公司内部网络:某些部门、位置或设备的网络可能与其他部分隔离,并没有得到足够的安全保护。未经授权的用户访问这些网络可能导致数据泄露和信息安全问题。

  3. 云服务:在使用第三方云服务时,可能需要通过公共互联网进行访问。如果未加密传输数据,那么数据可能会被窃听或篡改。此外,还有可能发生云存储提供商数据泄露等安全问题。

总之,在这些不安全的网络上使用SSH可以提高数据传输和远程命令执行的安全性。

ssh如何解决云存储提供商数据泄露等安全问题?

SSH不能直接解决云存储提供商数据泄露等安全问题,但可以提高数据传输的安全性。在使用SSH进行文件传输时,数据会被加密保护,在传输过程中不易被窃取或篡改。这样可以避免云存储提供商中间人攻击、窃听或篡改数据的问题。

另外,在使用SSH连接云服务器时,也可以通过身份验证等多种方式来确保数据安全。例如,使用公钥身份验证可以避免密码被窃取和重复使用,而基于口令的身份验证则需要输入一个口令来验证用户的身份。

总之,SSH作为一种加密协议,可以提高数据传输的安全性,并在一定程度上减少云存储提供商数据泄露等安全问题的风险。

中间人攻击 介绍

中间人攻击(Man-in-the-Middle Attack, MITM)是一种网络安全攻击方式,攻击者通过截获通信过程中的数据流量,在被攻击方不知情的情况下,篡改、窃取或伪装网络通信内容。

中间人攻击通常发生在客户端和服务器之间的通讯过程中,攻击者会伪装成合法的通讯终端,截获通讯的全部或部分内容,然后再将篡改后的信息重新发送给接收方,以实现欺骗和控制目标的目的。例如,攻击者可以截获用户登录网站的数据包,并伪造一个假的登录页面来收集用户的账号和密码,从而获取用户的敏感信息。

中间人攻击可能使用多种方式进行,如DNS欺骗、ARP欺骗、Wi-Fi热点欺骗等。为了防止中间人攻击,可以采用加密协议(如HTTPS)保护通讯内容,使用数字证书验证身份,以及检测和预防网络欺诈行为等相关技术手段。

总之,中间人攻击是一种常见的网络安全攻击方式,能够导致信息泄露、数据篡改、隐私泄露等问题。因此,采取相应的安全措施是非常必要的。

2.2 SSH的工作原理

SSH(Secure Shell)的工作原理是通过加密和身份验证来保障网络通信的安全性。

具体来说,SSH的工作流程如下:

  1. 客户端发起连接请求:客户端向服务器发送连接请求,请求建立SSH连接。

  2. 服务器响应请求:服务器接收到连接请求后,返回一个欢迎消息,并请求客户端提供身份验证信息。

  3. 客户端提供身份验证信息:客户端根据服务器的要求,提供相应的身份验证信息。常见的身份验证方式有密码、公钥和基于证书的身份验证。

  4. 服务器验证身份信息:服务器根据客户端提供的身份验证信息,进行身份验证。如果身份验证通过,则允许客户端访问服务器资源;否则,拒绝访问。

  5. 加密通信:一旦身份验证成功,客户端和服务器之间的通信将被加密,以确保数据的保密性和完整性。这通常使用对称密钥加密算法实现。

  6. 断开连接:当客户端和服务器之间的会话结束时,会话将被关闭,SSH连接也会自动断开。

总体来说,SSH通过加密和身份验证来保护网络通信的安全性,使得远程访问和管理操作系统更加安全可靠。

2.3 设置 ssh 免密码登录远程服务器

由于在上线和运维过程中,可能需要到多次登录到远程服务器,每次都要输入密码很麻烦.

我们可以设置以加密的方式免密码通过 ssh 登录远程 Linux 主机,这样可以节省很多时间,也能解决你忘记密码的烦恼。

生成私钥公钥文件  即SSH提供两种方式之一的密钥对验证

如果你的本地主机不包含 ~/.ssh/id_rsa 文件,可以通过运行如下命令生成:

ssh-keygen -t rsa

每次执行上述命令后产生的私钥文件都不同,如果 ~/.ssh/id_rsa 文件已经存在,会提示是否覆盖,选择 n 不覆盖,如果该文件不存在则会生成该文件(提示需要输入的地方都可以留空)。

运行该命令会生成 ~/.ssh/id_rsa 和 ~/.ssh/id_rsa.pub 两个文件,分别存储私钥和公钥,

接下来我们通过 scp 命令将公钥文件拷贝到远程服务器的 .ssh 目录下(如果服务器上没有该目录,先创建这个目录):

 scp ~/.ssh/id_rsa.pub root@your-server-ip:~/.ssh

记得将命令中的 your-server-ip 换成你的服务器公网 IP。

其实并不建议直接复制文件到.ssh目录下,因为服务器本身也有密钥对在该目录下

另外,不需要通过文件复制的方式,直接打开公钥文件,将其中的内容拷贝,复制到authorized_keys文件即可。

将公钥添加到授权KEY

登录到远程服务器,运行如下命令将公钥文件内容追加到 ~/.ssh/authorized_keys 文件:

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

如果服务器上没有 ~/.ssh/authorized_keys 这个文件,可以运行如下命令将 ~/.ssh/id_rsa.pub 文件拷贝过来:

cp id_rsa.pub authorized_keys

接下来,我们在本地主机测试通过 ssh 登录远程服务器:

SSH - 学习与实践探究_第4张图片

注意将上述命令中的 IP 地址替换成自己的服务器公网 IP,这样一来,就可以无需输入密码即可登录远程服务器了,非常方便。

SSH - 学习与实践探究_第5张图片

Note:

上面是阿里云ECS, 阿里云已经提供配置SSH服务, 可以界面化操作

具体操作参考: 配置 SSH 密钥 - 云效2020 - 阿里云  -- 跟github配置ssh是一样的,就是将本机的公钥放到远程服务器,从而远程服务器能确保你是你「私钥在本机」。

SSH - 学习与实践探究_第6张图片

注意

密钥对[公钥]与instance只能绑定一 一对应, 一个公钥对应一个instance

猜测这是云服务商设置的限制「TBD」

如果已经有instance绑定了某台PC的公钥,需要先解除绑定,然后再绑定另外的ssh公钥

然后重启instance才能生效。

后续补充

...

3. 问题/补充

1. 但是遇到一个问题,就是ssh远程到服务器,如果没有活动,很快就会被强制退出,还需要重新连接,有时候会让人有点小困扰。 

解决方案:⚠️ 不要在正式服上做这样的修改!

要配置服务器的SSH连接存活时间,可以通过修改SSH服务器的配置文件来设置超时时间。具体来说,需要按照以下步骤进行操作:

1. 编辑SSH服务器的配置文件:打开SSH服务器的配置文件/etc/ssh/sshd_config,并找到以下行:

#ClientAliveInterval 0 #ClientAliveCountMax 3

这两行通常是被注释掉的或者没有出现在配置文件中。它们用于设置SSH连接的存活时间和检查频率。

2. 设置SSH连接的存活时间:取消注释“ClientAliveInterval”行,并将其值设置为所需的秒数。例如,要将SSH连接的存活时间设置为10分钟(600秒),则可以将该行更改为:

ClientAliveInterval 600

这意味着如果SSH客户端在10分钟内没有向服务器发送任何数据,则服务器将向客户端发送一个保持连接的消息。

3. 设置SSH连接的检查次数:取消注释“ClientAliveCountMax”行,并将其值设置为所需的次数。默认情况下,这个值是3,也就是说,如果客户端没有响应服务器发送的保持连接消息3次连续,那么服务器将自动断开连接。例如,要将此值设置为5,可以将该行更改为:

ClientAliveCountMax 5

4. 重新加载SSH服务器配置:在保存更改后,请重新启动SSH服务器或执行以下命令使更改生效:

sudo service sshd reload

这将重新加载SSH服务器的配置文件,并使更改生效。// 同时还要退出本次连接,重新ssh到远程服务器才会发挥效果。

通过以上步骤,就可以成功地设置SSH连接的存活时间和检查次数。

需要注意的是,如果您在客户端上使用了SSH会话保持工具(例如tmux或screen),则可能需要将其定期刷新以避免被SSH服务器断开连接。

补充

在SSH服务器配置文件中设置的“ClientAliveInterval”选项指定了应该多久(以秒为单位)向客户端发送一次保持连接的消息。默认情况下,这个值是0,也就是说服务器不会主动发送任何保持连接的消息。如果将其设置为一个非零值,例如300秒(即5分钟),则服务器将每隔5分钟向客户端发送一次保持连接的消息。

需要注意的是,“ClientAliveInterval”仅指定了发送保持连接消息的时间间隔,并不意味着连接将在此时间后自动关闭。

它只是用来检测连接是否处于活动状态。如果客户端无响应,则服务器将尝试发送指定数量(由“ClientAliveCountMax”选项指定)的保持连接消息。如果仍然无响应,则服务器将关闭连接。

因此,在实际应用中,您需要根据您的需求和网络条件来调整“ClientAliveInterval”和“ClientAliveCountMax”选项的值,以确保SSH连接的稳定性和安全性。

SSH - 学习与实践探究_第7张图片

SSH - 学习与实践探究_第8张图片

2. “SSH作为一种加密协议,可以提高数据传输的安全性,并在一定程度上减少云存储提供商数据泄露等安全问题的风险。” 是否表述有误

这个表述没有明显的错误。

SSH协议确实是一种加密协议,可以提高数据传输的安全性。使用SSH协议进行数据传输,可以减少数据在传输过程中被窃听或篡改的风险。

然而,SSH协议并不能完全消除云存储提供商数据泄露等安全问题的风险,因为这些问题可能不仅限于数据传输过程,还与云存储提供商的系统和网络安全等方面有关。

因此,在使用云存储服务时,需要综合考虑各种安全问题,并采取适当的安全措施来保护数据的安全。

3. SSH和SSL/TLS之间的关系

SSH和SSL/TLS都是用于加密通信的协议,但它们有不同的设计目标和使用场景。

SSH(Secure Shell)是一种网络协议,主要用于在不安全的网络上安全地远程访问计算机系统。SSH提供了身份验证、数据加密和数据完整性保护等安全功能,可防止被窃听、篡改和伪造。SSH通常用于连接远程服务器、管理网络设备和传输文件等场景。

SSL/TLS(Secure Sockets Layer/Transport Layer Security)是另一种加密协议,主要用于保护Web浏览器和Web服务器之间的通信。SSL/TLS可以确保数据传输的隐私性、完整性和身份验证,可防止中间人攻击和数据泄露。SSL/TLS常用于网站加密通信、电子邮件安全和虚拟专用网络(VPN)等场景。

虽然SSH和SSL/TLS都提供了安全通信的基本功能,但它们的应用领域和实现方式不同。SSH更适合远程访问和管理操作系统,而SSL/TLS更适合保护Web应用程序和其他互联网服务。

4.  "客户端提供身份验证信息" 中的证书 有谁提供,证书中内容有哪些

在SSH中,客户端提供身份验证信息的方式之一是基于证书的身份验证(Public Key Authentication)。

这种身份验证方式需要客户端提供自己的公钥证书。【是将客户端的公钥证书提供配置到服务端】

公钥证书通常由数字证书颁发机构(Certificate Authority,简称CA)或者自签名证书机构(Self-Signed Certificate Authority)签发。数字证书颁发机构是可信任的第三方机构,它为公众和组织颁发数字证书,并对这些证书进行管理和监督。而自签名证书机构则是由组织自行创建的证书管理机构,自签名证书不会得到公共信任。

公钥证书一般包含以下内容:

  1. 证书序列号:唯一标识该证书的序列号。

  2. 颁发者信息:颁发机构的名称、联系方式等信息。

  3. 证书有效期:证书的生效日期和失效日期。

  4. 公钥信息:证书持有者的公钥,以及公钥算法信息。

  5. 证书持有者信息:证书持有者的名称、电子邮件地址等信息。

公钥证书的作用是验证客户端身份的真实性和合法性,以及保证数据传输的安全性和完整性。

在SSH中,服务器通过验证客户端提供的公钥证书,确认客户端的身份,从而决定是否允许其访问服务器资源。

补充

在SSH中,基于证书的身份验证需要客户端和服务器双方各自拥有公钥和私钥。客户端将自己的公钥安装到远程服务器中,而私钥则留存在客户端本地。当客户端连接到远程服务器时,它会用自己的私钥来进行身份验证,从而证明自己的身份。

因此,在使用SSH连接远程服务器时,您需要在本地计算机上保存自己的私钥,并将相应的公钥安装到远程服务器中。这样,当您连接到远程服务器时,SSH协议会使用您本地计算机上的私钥来进行身份验证,并且利用公钥加密技术保证通信数据的安全性和完整性。

SSH - 学习与实践探究_第9张图片

5. .ssh/known_hosts 介绍

ssh/known_hosts是SSH客户端保存已知主机公钥的文件,通常位于用户家目录下的.ssh目录中。

当SSH客户端第一次连接到一个新的SSH服务器时,它会将该服务器的公钥保存到该文件中,以便后续连接时进行验证。

每个条目由三部分组成:主机名、公钥算法和公钥指纹。例如:

example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCszGeJgKfZwRdYk...

其中,"example.com"是SSH服务器的主机名,"ssh-rsa"是公钥算法,"AAAAB3NzaC1yc2EAAAADAQABAAABAQCszGeJgKfZwRdYk…"是公钥指纹(该指纹经过哈希计算,用于验证所保存的公钥是否与远程服务器的公钥匹配)。

当SSH客户端连接远程服务器时,它会首先检查远程服务器的公钥是否存在于本地的known_hosts文件中。

如果找到了匹配的公钥,则SSH客户端会使用该公钥对服务器身份进行验证。如果没有找到匹配的公钥,则SSH客户端会提示用户确认是否信任该服务器,并询问是否将其公钥保存到known_hosts文件中。

通过使用known_hosts文件,SSH客户端可以防止中间人攻击等安全问题,提高SSH连接的安全性。

SSH - 学习与实践探究_第10张图片

6. 问题: 为什么SSH客户端使用服务器的私钥连接到远程服务器?

懂了,因为使用的服务器生成的密钥对[公钥和私钥],
当然也可以使用本地主机生成的密钥对[公钥和私钥]。

使用ssh命令连接远程服务器,默认使用的是 ~/.ssh/id_ras【私钥证书】进行加密
远程服务器需要使用对应的公钥进行解密,响应则使用公钥进行加密, 客户端使用连接时的私钥进行解密,
如此,进行安全的通信。

所以,只要这里的密钥对[公钥和私钥]能匹配即可,而不用理会是由谁生成.

7. 使用ssh-keygen -t rsa 生成的公钥和私钥 有数字签名吗

使用ssh-keygen命令生成的公钥和私钥是基于非对称加密算法的,其中包含数学上相关的公钥和私钥。这些密钥不直接包含数字签名,但可以用于进行数字签名。

在SSH中,公钥和私钥通常用于基于证书的身份验证,客户端将自己的公钥安装到远程服务器中以进行身份验证。当客户端与远程服务器进行握手时,远程服务器会发送自己的公钥给客户端,并要求客户端提供相应的数字签名来证明身份。客户端使用自己的私钥进行签名,然后将签名发送给服务器,由服务器验证签名是否有效。这样,就实现了身份验证的过程。

需要注意的是,在SSH中,数字签名一般是在基于证书的身份验证之上进行的,而不是直接使用公钥和私钥进行数字签名。也就是说,使用ssh-keygen命令生成的公钥和私钥虽然没有直接包含数字签名,但可以用于进行数字签名,以保证数据传输的安全性和完整性。

后续补充

...

你可能感兴趣的:(工具-TOOLS,LINUX,SSH,密钥对认证)