SSH远程安全登录

为什么学SSH

  1. 系统管理与运维的需求
    • 远程管理的高效性:对于系统管理员来说,他们经常需要管理大量的服务器。如果没有SSH服务,管理员可能需要亲自到服务器所在的机房进行操作,这在很多情况下是不现实的。例如,一个大型互联网公司可能在全球有多个数据中心,通过SSH服务,管理员可以在自己的办公室远程登录到位于不同地理位置的数据中心服务器上。这样可以快速地进行系统更新、故障排查、性能监控等操作,大大提高了管理效率。
    • 安全的服务器维护:在维护服务器的过程中,涉及到很多敏感信息,如服务器的配置文件、用户数据等。SSH服务通过加密机制,确保了在远程管理过程中这些数据的安全性。比如,在更新数据库服务器的配置时,用户名、密码和配置命令等信息都是以加密形式传输的,有效防止了中间人攻击和信息泄露。
  2. 软件开发与部署的要求
    • 安全的代码传输:在软件开发过程中,开发人员需要将代码部署到测试服务器、预生产服务器和生产服务器等不同环境中。基于SSH的文件传输协议(如SCP和SFTP)提供了安全的方式来传输代码文件。例如,一家金融科技公司开发的支付系统代码包含了大量的用户资金处理逻辑等敏感信息,使用SSH服务可以确保代码在从开发环境传输到生产环境的过程中不被窃取或篡改。
    • 自动化部署流程:许多现代软件开发团队采用自动化部署工具,这些工具很多都是基于SSH来实现远程执行脚本和文件传输的。通过SSH,开发人员可以编写脚本,自动将最新的代码版本部署到服务器上,并且在部署后进行必要的测试和配置更新。这对于快速迭代开发和持续交付软件产品非常重要。
  3. 增强网络安全意识与技能
    • 理解加密通信原理:学习SSH服务有助于深入理解加密通信的基本原理。SSH采用的公钥加密和对称加密相结合的方式是现代网络安全领域中常用的加密手段。通过学习SSH,您可以更好地理解加密密钥是如何生成、交换和使用的,这对于理解其他加密协议(如SSL/TLS用于网站安全通信)也有很大的帮助。
    • 掌握安全认证机制:SSH提供了基于密码和基于公钥的认证方式,学习这些认证方式可以让您了解如何在网络环境中有效地验证用户身份。这不仅有助于在服务器管理和软件开发中设置安全的访问控制,还可以提高您对网络安全中身份认证环节的整体认识,从而能够更好地防范非法访问和数据泄露。
  4. 云计算与远程工作环境的适应
    • 云资源管理:在云计算时代,企业和个人越来越多地使用云服务。通过SSH服务,用户可以方便地访问和管理自己租用的云服务器、虚拟机和容器等资源。例如,一个小型创业公司租用了云主机来运行他们的网站和应用程序,公司的技术人员可以通过SSH登录到云主机,安装和配置所需的软件,就像在本地服务器上一样操作。
    • 远程协作和移动办公:随着远程工作模式的兴起,SSH服务也变得更加重要。开发人员、运维人员等可以在任何有网络连接的地方,通过SSH登录到公司的内部服务器进行工作。这使得工作更加灵活,同时也保证了工作过程中的数据安全。

什么是SSH服务

SSH(Secure Shell)是一种网络协议,用于在不安全的网络上提供安全的远程登录和其他安全网络服务。

一、主要功能

  1. 远程登录
    • 它允许用户通过网络远程连接到另一台计算机,就好像用户直接坐在那台计算机前操作一样。例如,系统管理员可以在自己的办公室通过SSH登录到位于机房的服务器,进行系统维护、软件安装、配置修改等操作。
    • 与传统的远程登录协议(如Telnet)不同,SSH对传输的数据进行加密。这意味着在数据传输过程中,包括用户名、密码和执行的命令等信息都是以加密的形式在网络中传输,防止这些敏感信息被网络中的攻击者窃取。
  2. 文件传输
    • SSH还支持安全的文件传输功能。通过基于SSH的文件传输协议(如SFTP - SSH File Transfer Protocol或SCP - Secure Copy Protocol),用户可以在本地计算机和远程计算机之间安全地传输文件。
    • 例如,开发人员可以使用SCP将本地开发好的代码文件安全地传输到远程的测试服务器上进行测试,确保文件内容(可能包含商业机密或关键代码)在传输过程中的安全性。

二、工作原理

  1. 加密机制
    • SSH采用了公钥加密和对称加密相结合的方式。当客户端和服务器建立连接时,首先会进行密钥交换。服务器会把自己的公钥发送给客户端,客户端利用这个公钥来加密一个对称密钥(也叫会话密钥),然后将加密后的对称密钥发送回服务器。
    • 之后,客户端和服务器就可以使用这个对称密钥来加密和解密后续传输的数据。这种方式既利用了公钥加密的安全性(用于安全地交换对称密钥),又利用了对称加密的高效性(用于大量数据的加密传输)。
  2. 认证方式
    • 基于密码的认证:这是最常见的方式之一。用户在客户端输入用户名和密码,客户端将这些信息加密后发送给服务器,服务器验证密码是否正确来决定是否允许用户登录。
    • 基于公钥的认证:这种方式更加安全。用户在客户端生成一对公钥和私钥,将公钥发送给服务器并存储在服务器的特定位置。
      • 客户端尝试登录时,服务器会向客户端发送一个随机的验证信息,客户端使用自己的私钥对这个验证信息进行签名
        • 然后将签名后的信息发送回服务器。
        • 服务器使用之前存储的公钥来验证签名,如果验证通过,则允许用户登录。

三、应用场景

  1. 服务器管理
    • 数据中心的服务器通常放置在机房环境中,管理员需要远程管理这些服务器。SSH提供了一种安全可靠的方式,让管理员可以在本地网络或通过互联网远程登录到服务器,执行诸如启动和停止服务、更新软件包、监控系统性能等操作。
  2. 软件开发和部署
    • 在软件开发过程中,开发团队可能需要将代码部署到测试服务器、预生产服务器和生产服务器上。SSH使得开发人员能够安全地传输代码文件,并在远程服务器上执行部署脚本,确保软件的发布过程安全、可靠。
    • CICD
  3. 云计算环境
    • 在云计算平台上,用户租用的虚拟机或容器等计算资源通常也是通过SSH来进行远程访问和管理。用户可以通过SSH登录到自己租用的云资源,进行应用程序的安装、配置和运行等操作。

image-20220210143224502

为什么需要SSH

如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。

Secure Shell是Linux系统首选的登录方式,以前使用FTP或telnet登录服务器,都是以明文的形式在网络中发送账号密码,很容易被黑客截取到数据,篡改后威胁服务器数据安全。因此如何对数据加密,安全传输是重中之重,主要方式有两种:

  • 对称加密(秘钥加密)
  • 非对称加密(公钥加密)

怎么学SSH服务

  1. 理论知识学习
    • 阅读相关书籍和文档
      • 可以选择一些经典的网络和系统管理书籍,这些书籍通常会有关于SSH协议的章节。例如,《TCP/IP Illustrated》系列书籍能够帮助您深入理解网络协议的基础,从而更好地理解SSH在网络中的位置和作用。
      • 同时,官方文档是最好的学习资源之一。OpenSSH是SSH协议的最常见实现,其官方文档详细地介绍了SSH的各种功能、配置选项和安全机制。您可以在OpenSSH官方网站上找到这些文档,仔细阅读可以帮助您掌握SSH的基本概念和原理。
    • 学习网络安全基础
      • SSH服务涉及到加密和认证等网络安全知识。学习网络安全基础课程或者阅读相关书籍,如《网络安全基础:应用与标准》,可以帮助您理解SSH中使用的加密算法(如RSA、DSA等公钥加密算法和AES等对称加密算法)和认证方式(如密码认证和公钥认证)的原理。
      • 这对于深入理解SSH服务如何确保安全的远程访问至关重要。
    • 理解操作系统的用户管理和权限机制
      • 因为SSH服务是基于操作系统的用户管理和权限来实现访问控制的,所以需要学习操作系统(如Linux和Unix系统)中的用户管理知识。
      • 了解用户账户的创建、删除、权限分配(如文件读写权限、执行权限等)以及组管理等内容,这有助于您理解在SSH访问过程中如何有效地控制用户的访问范围和权限。
  2. 实践操作
    • 搭建测试环境
      • 在本地机器上(可以是个人电脑或者虚拟机)安装Linux或Unix操作系统。许多Linux发行版(如Ubuntu、CentOS等)都很容易获取和安装。
        • 安装完成后,确保系统已经安装了SSH服务软件(如OpenSSH)。如果没有安装,可以通过系统的软件包管理器(如apt - get for Ubuntu或yum for CentOS)进行安装。
      • 设置不同的用户账户和权限,模拟真实的服务器环境。例如,创建一个普通用户账户和一个管理员账户,为普通用户分配有限的文件访问权限,为管理员账户分配更高级别的权限,用于测试SSH服务在不同用户权限下的访问情况。
    • 基本的SSH登录操作
      • 学会使用SSH客户端进行远程登录。在Linux和Unix系统中,命令行下的SSH客户端是最常用的工具。例如,在本地终端中使用“ssh username@remote - ip - address”的格式来登录远程服务器,其中“username”是远程服务器上的用户名,“remote - ip - address”是远程服务器的IP地址。
      • 当您第一次登录某个远程服务器时,SSH客户端会提示您确认服务器的公钥指纹信息,这是为了防止中间人攻击。了解如何正确识别和处理这种情况是很重要的。
    • 深入实践文件传输和远程命令执行
      • 学习基于SSH的文件传输协议。例如,使用SCP(Secure Copy Protocol)来在本地和远程之间传输文件。命令格式如“scp local - file username@remote - ip - address:remote - file”,其中“local - file”是本地文件路径和文件名,“remote - file”是远程文件路径和文件名。
      • 掌握在SSH连接下远程执行命令的技巧。例如,通过“ssh username@remote - ip - address 'command'”的格式,在远程服务器上执行指定的命令,而无需登录到服务器的交互式 shell。这对于自动化脚本编写和远程系统管理非常有用。
    • 配置和优化SSH服务
      • 学习如何修改SSH服务的配置文件(通常是/etc/ssh/sshd_config文件)。可以通过修改配置参数来调整SSH服务的安全级别、允许的登录方式、端口号等内容。例如,您可以设置禁止 root 用户直接通过SSH登录,以增加系统的安全性。
      • 了解如何优化SSH服务的性能,如调整加密算法的强度和速度之间的平衡。在一些对性能要求较高的场景下,合理选择加密算法可以在保证安全的基础上提高SSH连接的速度。
  3. 高级学习与拓展
    • 学习SSH隧道技术
      • SSH隧道是一种高级应用,它可以通过SSH连接来转发其他协议的流量。例如,您可以通过SSH隧道来安全地访问位于防火墙后的内部网络服务。理解SSH隧道的原理和应用场景,掌握如何设置和使用SSH隧道(如本地转发和远程转发),可以拓展SSH服务的使用范围。
      • 以访问公司内部的数据库服务器为例,通过创建SSH隧道,可以在外部网络安全地连接到内部数据库,就好像您在公司内部网络中一样。
    • 自动化与脚本编写
      • 结合脚本语言(如Python、Shell脚本等)来自动化SSH操作。例如,使用Python中的Paramiko库可以编写脚本,实现批量登录到多个服务器、自动执行命令和传输文件等复杂操作。
      • 这对于大规模的服务器管理和自动化部署非常有用。例如,在一个拥有数百台服务器的数据中心,通过编写自动化脚本,可以快速地完成系统更新、配置检查等任务。
    • 安全审计与故障排查
      • 学习如何对SSH服务进行安全审计,检查配置文件是否存在安全漏洞,以及如何识别和防范SSH相关的攻击(如暴力破解攻击、中间人攻击等)。
      • 掌握故障排查技巧,当SSH连接出现问题时(如无法登录、连接速度慢等),能够通过查看日志文件(如/var/log/secure文件)、检查网络连接和服务状态等方法来快速定位和解决问题。

学习SSH背景

任务背景

为了最大程度的保护公司内网服务器的安全,公司内部有一台服务器做跳板机(JumpServer)。

运维人员在维护过程中首先要统一登录到这台服务器,然后再登录到目标设备进行维护和操作。

由于开发人员有时候需要通过跳板机登录到线上生产环境查看一些业务日志,所以现在需要运维人员针对不同的人员和需求对 账号密码进行统一 管理,并且遵循权限最小化原则。

image-20220210144010049

2、任务要求

  1. 跳板机上为每个开发人员创建一个账号,并且只能在指定的目录里管理自己的文件。文件,200个员工名字
  2. 线上生产服务器,禁止使用root用户远程登录。
  3. 线上生产服务器sshd服务不允许使用默认端口。22
  4. 线上生产服务器上开发人员使用的用户,密码使用工具随机生成。

3、任务拆解

  1. 跳板机上为开发人员 创建用户 及公共 目录 供开发人员使用,并做好权限控制
  2. 所有线上生产服务器 搭建ssh服务
  3. 对于ssh服务根据需求进行配置
    • 禁止root用户远程登录
    • 更改默认端口(22=>10086)
  4. 线上生产服务器创建devyu用户,并安装工具来生成随机密码

image-20220210144727523

4、涉及知识点

  • 权限管理(旧知识点),文件权限,用户权限
  • ssh服务配置(新知识点)
  • 生成随机密码工具(新知识点)

二、理论储备

1、什么是服务service(程序)

LAMP,运行discuz论坛程序。

apache

mysql

Php

  • 运行在操作系统,后台的一个或者多个程序,为系统或者用户提供特定的服务,特定功能,可能是登录?文件上传?数据库?缓存?
  • 可靠的,并发的,连续的不间断的运行,随时接受请求,守护进程。
  • 通过交互式提供服务

2、服务架构模型

1、B/S架构

  • B/S(browser/server) 浏览器/服务器

概念:这种结构用户界面是完全通过浏览器来实现,使用http协议、https协议

优势:节约开发成本

image-20220210145103400

2、C/S架构

  • C/S(client/server)客户端/服务器

概念:指的是客户端和服务端之间的通信方式,客户端提供用户请求接口,服务端响应请求进行对应的处理,并返回给客户端

优势:安全性较高,一般面向具体的应用

image-20220210145346035

3、两者区别

B/S: 1、广域网,只需要有浏览器即可 2、一般面向整个互联网用户,安全性低 3、维护升级简单

C/S: 1、需要具体安装对应的软件 2、一般面向固定用户,安全性较高

我们是怎么访问的淘宝网?

1.www.taobao.com,浏览器访问网站,IP+port

2.淘宝APP

https://www.yuchaoit.cn:443

https 协议
www.yuchaoit.cn 主机名,域名
:443 端口,对应具体应用
:80 apache/nginx
:22 ssh服务端
dns域名解析,浏览器,url检测

比如这样一个完整的URL,包括了协议,主机名,端口号

3、端口号设定

在Linux系统中,端口号是用于标识网络服务或应用程序的数字编号。以下是关于Linux端口号的详细内容:

一、端口号的范围和分类

  1. 知名端口(Well - Known Ports)
    • 范围是从0到1023。这些端口被分配给一些最常用的网络服务。例如:
      • 端口21:用于FTP(文件传输协议)服务,它主要用于在网络上进行文件的上传和下载。在早期的网络环境中,许多网站通过FTP来管理和发布文件。
      • 端口22:是SSH(Secure Shell)的默认端口。SSH提供了一种安全的远程登录和远程命令执行方式,广泛应用于服务器管理等场景。系统管理员可以通过SSH从本地计算机安全地登录到远程Linux服务器并执行各种操作。
      • 端口23:用于Telnet服务,不过由于Telnet是明文传输数据,安全性较差,现在已经逐渐被SSH取代。
      • 端口80:这是HTTP(超文本传输协议)的默认端口。当用户在浏览器中输入网址访问网页时,如果没有指定端口,浏览器默认会使用端口80来请求网页内容。例如,当访问一个普通的网站如http://www.example.com时,实际上是向服务器的80端口发送请求。
      • 端口443:是HTTPS(HTTP Secure)的默认端口。随着网络安全的重要性日益凸显,越来越多的网站使用HTTPS协议来加密数据传输,以保护用户的隐私信息。如网上银行、电商平台等敏感信息较多的网站都使用443端口进行通信。
  2. 注册端口(Registered Ports)
    • 范围是从1024到49151。这些端口可以由用户进程或应用程序注册使用。例如:
      • 端口3306:是MySQL数据库默认的监听端口。当客户端程序(如数据库管理工具)需要连接到MySQL服务器时,会尝试通过3306端口建立连接。许多Web应用程序后端使用MySQL来存储和管理数据,如WordPress网站,它的数据库连接就是通过这个端口与MySQL服务器交互。
      • 端口1521:是Oracle数据库默认使用的端口。企业级的数据库应用场景中,Oracle数据库服务器会在1521端口监听客户端的连接请求,以便进行数据查询、更新等操作。
  3. 动态和/或私有端口(Dynamic and/or Private Ports)
    • 范围是从49152到65535。这些端口一般用于临时的或动态分配的连接。例如,当一个客户端程序发起一个网络连接,并且没有指定特定的端口来使用时,操作系统可能会从这个范围中动态分配一个端口给该连接。

3.1 系统默认服务端口

/etc/services是一个文本文件,在 Linux 系统中用于将网络服务名映射到端口号与协议。

它非常方便系统管理员或者网络工程师在配置网络服务、防火墙规则时,快速确定某个网络服务对应的端口,而不需要死记硬背端口号。

[root@yuchao-linux01 ~]# cat /etc/services  |wc -l
11176

image-20220210150134620

你看,这linux默认有11176个默认端口,表示每一个程序,默认启动后,会打开这个端口,提供访问。

那么如果黑客根据这个服务表,大规模,批量扫描这些端口,以及尝试暴力用密码登录,那你的服务器就很危险了。

4、常见的网络服务

  1. 网页服务
    • HTTP(超文本传输协议)和HTTPS(超文本传输安全协议)
      • 端口号:HTTP通常使用80端口,HTTPS使用443端口。
      • 功能用途:这是互联网上最常见的服务之一,用于在Web浏览器和Web服务器之间传输网页内容。例如,当你在浏览器中输入网址访问一个网站时,如访问百度(https://www.baidu.com),浏览器就通过HTTP或HTTPS协议与百度的服务器进行通信,服务器将网页数据发送给浏览器,浏览器再将其解析并展示出来。
      • 工作原理:HTTP是基于请求/响应模型的无状态协议。客户端(浏览器)发送一个HTTP请求,其中包含请求的方法(如GET获取资源、POST提交数据等)、URL(统一资源定位符)和协议版本等信息。服务器收到请求后,根据请求的内容查找并返回相应的资源,如HTML文件、图片、脚本等。HTTPS在HTTP的基础上加入了SSL/TLS加密层,确保数据传输的安全性,防止数据在传输过程中被窃取或篡改。
    • FTP(文件传输协议)
      • 端口号:FTP使用20和21端口。其中20端口用于数据传输,21端口用于控制连接。
      • 功能用途:主要用于在网络上进行文件的上传和下载。例如,网站开发者可能会使用FTP将本地开发好的网页文件上传到Web服务器上,以便网站能够正常访问。
      • 工作原理:FTP也采用客户端 - 服务器架构。用户通过FTP客户端软件连接到FTP服务器。在建立连接后,客户端通过21端口发送控制命令,如登录、切换目录、文件列表请求等。当需要传输文件时,服务器通过20端口建立数据连接,将文件数据传输给客户端或者接收客户端上传的文件。不过,由于FTP在传输过程中用户凭据和数据都是明文传输,存在安全风险,现在也有更安全的SFTP(SSH文件传输协议)来替代它。x
  2. 邮件服务
    • SMTP(简单邮件传输协议)
      • 端口号:通常使用25端口,也有一些扩展使用如587端口用于邮件提交。
      • 功能用途:用于发送电子邮件。当你在邮件客户端(如Outlook、Thunderbird等)编写好邮件并点击发送时,邮件客户端就会使用SMTP协议将邮件发送到你的邮件服务器,然后邮件服务器再根据收件人的地址将邮件转发到收件人所在的邮件服务器。
      • 工作原理:SMTP基于文本命令,客户端与服务器之间通过建立TCP连接来通信。客户端向服务器发送一系列命令,如HELO(标识自己)、MAIL FROM(发送者地址)、RCPT TO(收件人地址)、DATA(邮件内容)等,服务器根据这些命令来处理邮件的发送流程。如果接收方服务器暂时无法接收邮件,发送方服务器会根据一定的规则进行重试。
    • POP3(邮局协议版本3)和IMAP(互联网消息访问协议)
      • 端口号:POP3使用110端口,IMAP通常使用143端口,并且它们都有安全版本,如POP3S(995端口)和IMAPS(993端口)。
      • 功能用途:这两个协议用于接收电子邮件。POP3比较简单,它主要是将邮件从服务器下载到本地客户端,下载后服务器上的邮件可以选择删除或保留。IMAP则更灵活,它允许用户在多个设备上同步邮件状态,如已读、未读、标记等,邮件实际上仍然保留在服务器上,客户端只是显示和管理服务器上的邮件。
      • 工作原理:POP3客户端连接到服务器后,通过认证登录,然后可以使用LIST命令获取邮件列表,使用RETR命令下载指定邮件,使用DELE命令删除邮件等。IMAP客户端在连接服务器后,同样需要认证,然后可以使用各种命令来操作邮件,如SELECT选择邮箱、FETCH获取邮件内容部分或全部、STORE修改邮件标记等。
  3. 远程登录服务
    • SSH(安全外壳协议)
      • 端口号:22端口。
      • 功能用途:提供了一种安全的方式来远程登录到服务器或者其他网络设备,并且可以用于在远程系统上执行命令、传输文件等。例如,系统管理员可以通过SSH从自己的本地计算机连接到远程的数据中心服务器,进行系统维护、配置修改等操作。
      • 工作原理:SSH采用公钥加密和对称加密相结合的方式来保证通信的安全性。当客户端连接到服务器时,首先会进行密钥交换,确定加密算法和密钥。然后,客户端和服务器之间传输的数据都会通过加密处理。SSH协议还支持多种认证方式,如密码认证、公钥认证等,以确保只有合法的用户能够登录到系统。
    • Telnet
      • 端口号:23端口。
      • 功能用途:也是一种远程登录协议,但它是明文传输的,安全性较差。在早期网络环境中使用较多,现在已经逐渐被SSH取代。主要用于远程访问命令行界面的设备,如一些老式的网络设备管理。
      • 工作原理:客户端和服务器之间建立TCP连接后,客户端将用户输入的命令以明文形式发送到服务器,服务器执行命令并将结果返回给客户端,同样也是明文传输。
  4. 域名系统服务(DNS)
    • 端口号:53端口(UDP/TCP)。
    • 功能用途:DNS是互联网的核心服务之一,用于将域名(如www.example.com)转换为对应的IP地址(如192.168.1.1)。当你在浏览器中输入网址时,浏览器首先会向DNS服务器查询该域名对应的IP地址,然后才能通过IP地址与目标服务器建立通信。
    • 工作原理:当客户端需要查询域名对应的IP地址时,它会向本地配置的DNS服务器发送一个DNS查询请求。DNS服务器首先会检查自己的缓存,如果缓存中有对应的记录,则直接返回结果。如果没有,它会按照一定的层次结构向其他DNS服务器(如根DNS服务器、顶级域DNS服务器、权威DNS服务器)进行查询,直到找到目标域名的IP地址,然后将结果返回给客户端,并将该记录缓存起来,以便下次查询时能够更快地响应。

5、SSH服务概述

熟悉Linux的人那肯定都对SSH不陌生。

ssh是一种用于安全访问远程服务器的协议,远程管理工具。

它之所以集万千宠爱为一身,就是因为它的安全性。那么它到底是怎么样来保证安全的呢?到底是如何工作的呢?

首先,在讲SSH是如何保证安全的之前,我们先来了解以下几个密码学相关概念:

1、加密算法(了解)

①对称加密算法(DES)

  1. SSH与加密算法的关系
    • SSH(安全外壳协议)是一种用于安全远程登录和其他安全网络服务的协议。它的主要目的是在不安全的网络环境中提供安全的通信通道。为了实现这一目标,SSH采用了多种加密算法,其中包括对称加密算法(如DES及其衍生算法)和非对称加密算法(如RSA等)。
  2. SSH中DES算法的应用
    • 密钥交换阶段:在SSH连接建立的最初阶段,需要进行密钥交换。虽然现代SSH实现中通常不单独使用DES进行密钥交换,但在一些早期版本或特定配置下,可能会涉及到DES相关的操作。
    • 在这个阶段,会通过非对称加密算法(如Diffie - Hellman密钥交换)来安全地交换用于后续对称加密的密钥信息。这个过程有点像双方先通过一种安全的方式(非对称加密)来约定好一个“密码本”(对称加密密钥),这个“密码本”可以使用DES等对称加密算法来加密和解密后续传输的数据。
    • 数据加密阶段:一旦密钥交换完成,SSH可以使用DES或其他对称加密算法来加密在客户端和服务器之间传输的数据。当使用DES时,根据前面提到的DES加密过程,会用协商好的密钥对发送的数据包(如远程命令、文件传输数据等)进行加密。例如,客户端发送一个执行“ls -l”命令的请求,这个请求会被DES加密成密文发送给服务器,服务器收到密文后,使用相同的密钥进行解密,然后执行命令并将结果加密后返回给客户端。
  3. SSH中DES算法的局限性和替代方案在SSH中的应用
    • 局限性:DES的主要局限性在于其密钥长度相对较短,在面对现代强大的计算能力和复杂的攻击手段时,安全性有所降低。如前所述,其56位的密钥有可能被暴力破解。
    • 替代方案:在SSH中,除了DES,还经常使用AES(高级加密标准)等更安全的对称加密算法。AES有多种密钥长度(如128位、192位和256位),提供了更高的安全性。另外,在密钥交换阶段,也会使用更强大的公钥加密算法,如RSA(2048位或更高)和ECDSA(椭圆曲线数字签名算法)来确保密钥交换的安全性。这些算法与DES在SSH中的应用目的相同,都是为了保障远程通信的安全,但它们在安全性、性能等方面有不同的特点,可以根据实际需求和安全要求灵活选择。

image-20220210151308351

1.于超想和一个美女,杰西卡打招呼,但是又怕被女朋友发现,因此于超用了一个加密算法,比如通过一个密钥A来给打招呼的信息加密,得到一个密文数据,其他人是看不懂的,再发给这位外国美女杰西卡。

2.杰西卡收到消息后,必须通过同样的密钥A解密,才能看懂这句话,"交个朋友吧"

image-20220210151741056

3.加密算法是指通过程序对明文计算处理后,得到一个无法直观看懂的数据。

总结

1.发送方,使用密钥、对明文数据加密,然后再发出去

2.接收方,必须用同一个密钥、对密文解密,才能转为明文。

3.如果明文数据不加密直接发送,是非常危险的,很容易就被其他人捕获,比如于超给美女打招呼,立马被女朋友发现,当场腿打断。

4.对称加密强度很高,难以破解,问题是当机器数量较多的时候,大量的发送密钥,难以保证密钥安全性,一旦某一个Client被窃取密钥,其他机器的安全性也就崩塌了,因此,非对称加密应运而生

  1. SSH(Secure Shell)简介
    • SSH是一种用于安全远程登录和其他安全网络服务的协议。它主要的目的是在不安全的网络环境中,为用户提供安全的通信通道,使得用户可以安全地访问远程系统、传输文件等操作。例如,开发人员可以使用SSH登录到远程服务器来部署代码,系统管理员可以通过SSH进行服务器的维护和管理。
  2. DES(Data Encryption Standard)算法简介
    • DES是一种对称加密算法。它使用相同的密钥进行加密和解密操作。DES算法将明文数据分成64位的块,然后通过一系列复杂的置换、替换和循环操作,使用56位的密钥(实际密钥长度为64位,但其中8位用于奇偶校验)对数据块进行加密,得到密文。这种对称加密算法的特点是加密和解密速度相对较快,但密钥管理比较复杂。
  3. SSH和DES的关系
    • 加密通信方面
      • SSH可以使用DES算法来对传输的数据进行加密。在SSH协议的加密通信阶段,当客户端和服务器建立连接后,它们可以协商使用DES算法来加密后续传输的数据。不过,由于DES算法的密钥长度相对较短(56位),在现代安全要求较高的场景下,可能存在一定的安全风险。所以,在SSH中,通常会优先选择更安全的加密算法,如AES(Advanced Encryption Standard)。但在一些对安全性要求不是极高且需要兼容旧系统等特殊情况下,DES算法仍可能被使用。
    • 密钥交换和加密模式结合方面
      • 在SSH中使用DES算法时,还涉及到密钥交换机制。因为DES是对称加密算法,客户端和服务器需要先安全地交换用于DES加密的密钥。这个密钥交换过程通常会借助其他的加密或认证手段(如Diffie - Hellman密钥交换协议等)来完成。然后,在数据传输过程中,以加密模式(如CBC - 密码分组链接模式等)来使用DES算法对数据进行加密,以确保数据的保密性和完整性。

总之,DES算法可以作为SSH协议中数据加密的一种选择,为SSH通信提供数据加密服务,但在实际应用中,需要考虑其安全性和适用场景等因素。

python des算法

apt install python3-pip

pip install pydes

import pyDes

key = b"abcdefgh"
des = pyDes.des(key, pyDes.ECB, padmode=pyDes.PAD_PKCS5)
plain_text = b"Hello, World!"
cipher_text = des.encrypt(plain_text)
print("密文:", cipher_text)

解密

import pyDes

# 加密时使用的密钥,需为8字节
key = b"abcdefgh"  
# 初始化DES对象,采用ECB模式与PKCS5填充模式
des = pyDes.des(key, pyDes.ECB, padmode=pyDes.PAD_PKCS5)  

# 假设这是之前加密得到的密文
cipher_text = b'>\xe3\xcb\xec//1\x0823\x9d\x91\x0e\x026\xe7'

# 进行解密
plain_text = des.decrypt(cipher_text)  
print("明文:", plain_text.decode())

②非对称加密算法(RSA)

  1. SSH(Secure Shell)概述

    • SSH是一种网络协议,用于在不安全的网络上安全地进行远程登录和其他网络服务。它提供了加密的通信通道,确保数据的保密性、完整性和认证性。通过SSH,用户可以安全地登录到远程服务器、传输文件等操作。例如,系统管理员可以使用SSH从本地计算机登录到远程服务器进行系统维护、软件安装等任务。
  2. RSA算法概述
    • RSA是一种非对称加密算法。它基于数论中的大整数分解问题。在RSA算法中,有两个密钥:公钥和私钥。公钥可以公开,用于加密数据;私钥则由持有者保密,用于解密用公钥加密的数据。同时,私钥也可以用于数字签名,公钥用于验证签名。
  3. SSH与RSA的关系
    • 认证方面
      • SSH可以使用RSA算法来进行用户身份认证。在SSH协议中,用户可以生成一对RSA密钥(公钥和私钥)。用户将公钥放置在远程服务器的特定位置(如用户主目录下的~/.ssh/authorized_keys文件中)。当用户尝试通过SSH登录到服务器时,服务器会使用用户的,公钥对一个随机挑战(challenge)进行加密,然后发送给用户。
      • 用户使用自己的私钥进行解密,并将解密后的结果返回给服务器。
      • 服务器通过验证这个结果来确认用户的身份。·
    • 加密方面
      • SSH也可以使用RSA算法来建立加密的通信通道。在SSH连接建立的初始阶段,双方(客户端和服务器)会交换密钥信息,这个过程可以涉及RSA算法。例如,通过RSA密钥交换协议,双方可以协商出一个对称加密密钥,之后的数据传输就使用这个对称加密密钥进行加密,这样可以提高加密效率,同时利用RSA算法的安全性来保证对称密钥交换的安全。

总之,RSA算法为SSH提供了强大的认证和加密手段,是SSH协议实现安全通信的重要技术支撑之一。

非对称加密分为:公钥(Public Key)与私钥(Private Key)

使用公钥加密后的密文,只能使用对应的私钥才能解开,破解的可能性很低。

非对称加密的解释

非对称加密是一种加密技术,利用一对密钥(公钥和私钥)实现数据的加密和解密。与对称加密不同,它不需要加密双方共享相同的密钥。


工作原理

  1. 密钥对
    • 公钥(Public Key):公开的,任何人都可以获取。
    • 私钥(Private Key):保密的,仅拥有者可访问。
  2. 加密和解密
    • 公钥加密 的数据,必须使用 私钥解密
    • 私钥加密(签名) 的数据,必须使用 公钥验证
  3. 用途
    • 保密性:用接收方的公钥加密,只有接收方的私钥能解密。
    • 身份认证和签名:用发送方的私钥签名,接收方用发送方的公钥验证。

image-20220210154234611

1.杰西卡生成一对公私钥、其中公钥是可以直接发给任何人的,但是私钥必须杰西卡自己保护好,不得泄露;

2.当于超给杰西卡打招呼时,杰西卡的公钥会给发于超;

3.于超拿着杰西卡的公钥对明文加密,得到密文,此时可以公开发给杰西卡了;

4.杰西卡收到密文后,通过自己本地的私钥,将这个密文,解析为明文 "交个朋友吧";

总结:

1.发送方(于超)使用接收方(杰西卡)发来的公钥明文数据加密为密文,然后再发出;

2.接收方(杰西卡)收到密文消息后,用自己本地保存的私钥解密这个密文,最终得到明文数据;

2、对称、非对称加密算法区别是?

  • 对称加密
    1. 使用 同一个密钥 进行加密和解密,密钥容易泄露
    2. 加密速度快 ,效率高, 数据传输 速度 快 ,安全性较 低
  • 非对称加密
    1. 使用 不同的密钥 (公钥和私钥)进行加密和解密
    2. 加密速度 远远 慢 于对称加密, 数据传输 速度 慢 ,安全性较 高

由于机器配置足够高,网速足够快,这些快慢几乎区别不大,只有在大规模机器数量下,才能看出区别。

既然知道了关于对数据要加密后再传输,否则就是不安全的。

这就指的是,当我们用ssh命令登录时,输入的账户密码,也是被加密后发送给linux服务器的,要么多不安全。

实战,公私钥登录流程

# 1.客户端生成公私钥
C:\Users\Administrator>ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\Administrator/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\Administrator/.ssh/id_rsa
Your public key has been saved in C:\Users\Administrator/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:DvkHaUMyQl5I6+2SDx7ojiPJr/rOaa++7xaiHfKhPjI administrator@DESKTOP-3IOUQ5A
The key's randomart image is:
+---[RSA 3072]----+
|   .o..          |
|   o.o           |
|    + o .        |
|   . o = .       |
|    . + S        |
|. +..o = o       |
|.B.+=.. o .      |
|E*+o.=   .       |
|B@#O= .          |
+----[SHA256]-----+

C:\Users\Administrator>


# 2.需要吧客户端公钥,发给服务器上(以实现后续的免密登录,一次输入密码,后续免密登录)
# 办法1,命令传输
# 需要安装 git bash 工具,https://git-scm.com/downloads
# root免密登录,普通用户免密登录 
ssh-copy-id yu@192.168.110.24

# 办法2,手工传输


# 3.检查服务器上的,客户机公钥文件

3、SSH认证方式

SSH(Secure Shell)提供了多种认证方式,以下是一些常见的认证方式:

  1. 基于密码的认证

    • 原理:这是最基本的认证方式。当用户尝试通过SSH连接到服务器时,客户端会将用户输入的用户名和密码发送给服务器。服务器会将接收到的密码与本地存储的用户密码(通常是经过加密存储的)进行比对。如果匹配成功,用户就可以成功登录。
    • 优点:操作简单,易于理解和使用。对于用户数量较少、安全要求不是特别高的环境比较方便。
    • 缺点:安全性相对较低。如果密码被窃取(例如通过网络嗅探或者服务器被攻破后密码文件泄露),攻击者就可以轻易登录。而且,在多用户环境下,用户可能会使用弱密码,增加安全风险。
  2. 基于公钥 - 私钥对的认证(RSA、DSA、ECDSA等)

    • 原理
      • 用户在本地生成一对公钥和私钥(例如使用ssh - keygen命令生成RSA密钥对)。公钥可以被发送给服务器并存储在服务器上指定的位置(如用户主目录下的.ssh/authorized_keys文件)。
      • 当用户尝试通过SSH连接时,服务器会使用用户存储在服务器上的公钥对一个随机生成的挑战(challenge)进行加密,并将加密后的内容发送给用户。
      • 用户使用自己的私钥对收到的加密内容进行解密,并将解密后的结果返回给服务器。
      • 服务器通过验证解密后的结果是否与原始挑战相同来确认用户的身份。
    • 优点
      • 安全性高。私钥只有用户自己拥有,即使公钥被泄露,没有私钥也无法完成认证。
      • 方便自动化操作。例如,在脚本中可以使用私钥进行认证,而不需要人工输入密码。
    • 缺点
      • 密钥管理相对复杂。用户需要妥善保管私钥,一旦私钥丢失或泄露,需要及时更换密钥对。
      • 对于非技术用户来说,理解和使用公钥 - 私钥认证可能有一定难度。
  3. 基于主机的认证(Host - Based Authentication)

    • 原理
      • 这种认证方式主要基于主机的身份来进行认证。它利用客户端和服务器主机的密钥对(通常是在系统安装或配置过程中生成的)。
      • 服务器会检查客户端主机的身份信息,包括主机名、IP地址等,以及与之对应的公钥。同时,客户端也会有相应的私钥用于认证。
      • 服务器会根据预先配置的信任关系和主机密钥信息来判断是否允许客户端主机连接。
    • 优点
      • 对于在受信任的内部网络环境中的主机之间的连接非常方便。例如,在一个企业内部的局域网中,已知的可信主机之间可以使用这种方式快速建立连接。
      • 可以减少用户认证的繁琐步骤,提高效率。
    • 缺点
      • 安全性依赖于主机本身的安全性。如果主机被攻破,攻击者就可以利用主机的身份进行连接。
      • 适用范围相对较窄,主要适用于内部信任网络环境。
  4. 多因素认证(Multi - Factor Authentication)

    • 原理
      • 结合了多种认证方式来增强安全性。常见的是将基于密码的认证和基于令牌(如硬件令牌或软件令牌)的认证相结合。
      • 例如,用户在输入密码后,还需要输入从硬件令牌或手机软件令牌中获取的一次性验证码。服务器会同时验证密码和验证码来确认用户的身份。
    • 优点
      • 大大提高了安全性。即使密码被泄露,没有令牌中的验证码,攻击者也无法登录。
      • 适应现代高安全需求的环境,如金融机构、企业的关键系统等。
    • 缺点
      • 增加了用户操作的复杂性。用户需要携带和使用额外的认证设备(如硬件令牌)或者安装软件令牌应用。
      • 系统实现和管理也相对复杂,需要配置和维护多种认证机制。

4、SSH基于用户名密码认证原理(重点)

  1. 连接初始化

    • 客户端:用户在SSH客户端(如PuTTY或OpenSSH客户端)输入要连接的服务器地址(可以是IP地址或域名)和端口号(默认是23)。客户端发起一个TCP连接请求到服务器指定的端口。
    • 服务端:SSH服务器在指定端口监听连接请求。当收到客户端的TCP连接请求后,服务器接受请求,建立TCP连接。这一步类似于普通网络应用程序建立连接的过程,为后续的SSH协议通信搭建了基础通道。
  2. 协议版本协商

    • 客户端:发送自己支持的SSH协议版本号,例如SSH - 2.0,告知服务器其协议能力。
    • 服务端:收到客户端发送的协议版本号后,检查自己是否支持该版本。如果支持,服务器会向客户端发送自己支持的协议版本号,通常也是SSH - 2.0。这个阶段确保双方使用兼容的SSH协议版本进行后续通信。
  3. 服务请求与用户身份标识

    • 客户端:在协议版本协商成功后,客户端向服务器发送一个服务请求,表明希望进行用户认证和相关服务(如远程登录、文件传输等)。同时,客户端会发送用户想要登录的用户名,这个用户名作为初步的用户身份标识,帮助服务器确定后续验证所需的信息。
    • 服务端:收到服务请求和用户名后,服务器在本地用户数据库(如/etc/passwd/etc/shadow文件,在Linux系统中)中查找是否存在该用户名对应的用户账户信息。
  4. 密码请求与传输

    • 服务端:如果服务器找到对应的用户账户,会向客户端发送一个密码请求消息。这个消息提示客户端需要提供用户密码来完成认证。
    • 客户端:用户在客户端输入密码。客户端会使用之前与服务器协商好的加密方式对密码进行加密。在SSH - 2协议中,这个加密过程通常涉及通过密钥交换协议(如Diffie - Hellman密钥交换)得到的对称加密密钥。例如,客户端可能会使用AES对称加密算法将密码加密后发送给服务器。
  5. 密码验证与认证结果

    • 服务端:接收到加密后的密码后,服务器使用相同的对称加密算法进行解密。然后,服务器会将解密后的密码与本地存储的用户密码进行比对。在服务器端,用户密码通常是经过哈希处理(如使用SHA - 256等哈希函数)后存储在安全的文件(如/etc/shadow)中的。服务器会对接收的密码进行相同的哈希处理,然后与存储的哈希值进行比较。
    • 认证结果反馈
      • 成功情况:如果密码比对成功,服务器会向客户端发送认证成功的消息。此后,客户端就可以与服务器进行正常的交互,如执行命令、传输文件等操作。
      • 失败情况:如果密码比对失败,服务器会向客户端发送认证失败的消息,客户端可能会根据具体的设置显示相应的错误提示信息,并且通常会终止此次连接尝试。
yu@DESKTOP-1TDLFH9 MINGW64 ~/Desktop
$ ssh root@10.96.0.149
The authenticity of host '10.96.0.149 (10.96.0.149)' can't be established.
ECDSA key fingerprint is SHA256:vjyKCLajbwDmNfuX7Ld9ycWYnad8oxxndE/aVLEH13Y.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.96.0.149' (ECDSA) to the list of known hosts.
root@10.96.0.149's password:
Last login: Thu Feb 10 17:05:25 2022 from 10.96.0.1
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]#

image-20220210171045467

3.SSH客户端、使用服务端发来的公钥,将超哥输入的密码加密为密文后,再发给SSH服务端;

4.SSH服务端收到密文密码后,再用自己本地的私钥解密,看到超哥输入的密码;

5.SSH服务端将解密后的明文,和linux上的用户密码文件做对比,/etc/shadow,正确则登录成功

6.ssh认证成功后,返回登录成功,并且返回一个随机会话口令给客户端,这个随机口令用于后续两台机器之间的数据通信加密。

总结

1.ssh登录时,为了最大程度保证账户、密码安全,使用非对称加密;

2.登录后,客户端、服务端之间的数据通信,采用随机口令,进行对称加密,因为速度快;

5、SSH总结

  • SSH是Linux下远程管理的工具,相比Telnet安全,运维人员必备的神器!

  • SSH的全称Secure Shell,安全的shell,是Client/Server架构,默认 端口号为22,TCP协议

  • 学会SSH通信加密的原理、过程

6、SSH服务配置

1、搭建所有服务的套路

  • 关闭防火墙和selinux(实验环境都先关闭掉)
  • 配置yum源(公网源或者本地源)
  • 软件安装和检查
  • 了解并修改配置文件
  • 启动服务检查运行状态并设置开机自启动

2、搭建SSH服务

(一)关闭防火墙和selinux

# 关闭firewalld防火墙
# 临时关闭
systemctl stop firewalld

# 关闭开机自启动
systemctl disable firewalld

# 关闭selinux
# 临时关闭
setenforce 0

# 修改配置文件  永久关闭
vim /etc/selinux/config
SELINUX=disabled

# ubuntu防火墙
root@yc-ubuntu ~# ufw status
状态:不活动

(二)配置yum源

注意:一般情况下使用网络源即可。

如果 没有网络 的情况下,才需要配置本地源

# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# yum clean all
# yum makecache

这个yum源配置,看超哥前面笔记

# ubuntu apt源
root@yc-ubuntu ~# cat /etc/apt/sources.list
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse

# 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
root@yc-ubuntu ~#

(三)软件安装

①确认是否安装
[root@yuchao-linux01 ~]# rpm -qa|grep openssh
openssh-clients-7.4p1-16.el7.x86_64         客户端安装包
openssh-server-7.4p1-16.el7.x86_64           服务端安装包
openssh-7.4p1-16.el7.x86_64                 客户端、服务端公共依赖包


root@yc-ubuntu ~# dpkg -l |grep openssh
ii  openssh-client                             1:8.9p1-3ubuntu0.10                     amd64        secure shell (SSH) client, for secure access to remote machines
ii  openssh-server                             1:8.9p1-3ubuntu0.10                     amd64        secure shell (SSH) server, for secure access from remote machines
ii  openssh-sftp-server                        1:8.9p1-3ubuntu0.10                     amd64        secure shell (SSH) sftp server module, for SFTP access from remote machines
root@yc-ubuntu ~#
②查看openssh-server软件包的文件列表
[root@yuchao-linux01 ~]# rpm -ql openssh-server
# 配置文件
/etc/ssh/sshd_config
/etc/sysconfig/sshd

# 服务管理脚本
/usr/lib/systemd/system/sshd.service        =>  systemctl start sshd

# 文件共享服务 提供文件上传下载的服务
/usr/libexec/openssh/sftp-server

# 二进制文件程序文件
/usr/sbin/sshd

# 公钥生成工具
/usr/sbin/sshd-keygen

# man手册
/usr/share/man/man5/sshd_config.5.gz
/usr/share/man/man8/sftp-server.8.gz
/usr/share/man/man8/sshd.8.gz

# ubuntu查询软件文件列表
root@yc-ubuntu ~# dpkg -L openssh-server
③查看openssh-clients软件包的文件列表
rpm -ql openssh-clients

# 客户端配置文件
/etc/ssh/ssh_config

# 远程copy命令 服务器间进行文件传输
/usr/bin/scp

# sftp客户端  上传下载文件操作
/usr/bin/sftp
/usr/bin/slogin
/usr/bin/ssh
/usr/bin/ssh-add
/usr/bin/ssh-agent
/usr/bin/ssh-copy-id
/usr/bin/ssh-keyscan

# 客户端man手册
/usr/share/man/man1/scp.1.gz
/usr/share/man/man1/sftp.1.gz
/usr/share/man/man1/slogin.1.gz
/usr/share/man/man1/ssh-add.1.gz
/usr/share/man/man1/ssh-agent.1.gz
/usr/share/man/man1/ssh-copy-id.1.gz
/usr/share/man/man1/ssh-keyscan.1.gz
/usr/share/man/man1/ssh.1.gz
/usr/share/man/man5/ssh_config.5.gz
/usr/share/man/man8/ssh-pkcs11-helper.8.gz

# ubuntu 客户端ssh命令文件
root@yc-ubuntu ~# dpkg -L openssh-client |grep bin
/usr/bin
/usr/bin/scp
/usr/bin/sftp
/usr/bin/ssh
/usr/bin/ssh-add
/usr/bin/ssh-agent
/usr/bin/ssh-argv0
/usr/bin/ssh-copy-id
/usr/bin/ssh-keygen
/usr/bin/ssh-keyscan
/usr/bin/slogin

(四)查看了解并修改配置文件

man 5 sshd_config

[root@yuchao-linux01 ~]# cat /etc/ssh/sshd_config 

root@yc-ubuntu /etc/ssh# ls
moduli      ssh_config.d  sshd_config.d       ssh_host_ecdsa_key.pub  ssh_host_ed25519_key.pub  ssh_host_rsa_key.pub
ssh_config  sshd_config   ssh_host_ecdsa_key  ssh_host_ed25519_key    ssh_host_rsa_key          ssh_import_id

解决需求,禁止root登录,必须用普通用户,降低权限

vim /etc/ssh/sshd_config
# 打开文件第38行 修改以下内容
#PermitRootLogin yes
PermitRootLogin no

image-20220210173341600

改了配置文件就得重启

(五)服务管理

# 重启服务
systemctl restart sshd

# 查看状态
systemctl status sshd
# 进程查看方式
ps aux |grep sshd
# 端口查看方式
netstat -lntp|grep sshd

# 开启自启动
systemctl enable sshd

image-20220210173506811

只能用普通用户登录

image-20220210173641671

练习结束,为了方便,可以再改回来。

允许root登录

7、任务解决方案

  • 环境准备
IP地址 主机名称 服务器角色
10.96.0.146 jumpserver 跳板机
10.96.0.149 real-server 真实业务服务器

image-20220210175611951


image-20220210175628992

1、创建用户并授权(跳板机上操作)

公司的测试服务器、有很多人用

1.测试组 testgroup

2.开发组 devgroup 、用户devyu

3.运维组 opsgroup、用户opsyu

(一)用户和用户组创建

①添加用户组,开发组
groupadd devgroup
②添加用户到用户组中
[root@jumpserver ~]# groupadd devgroup 
[root@jumpserver ~]# 
[root@jumpserver ~]# 
[root@jumpserver ~]# useradd -g devgroup devyu
[root@jumpserver ~]# 
[root@jumpserver ~]# id devyu
uid=9662(devyu) gid=9663(devgroup) groups=9663(devgroup)

(二)使用非交互式设置密码

[root@jumpserver ~]# echo 123456 |passwd --stdin devyu
Changing password for user devyu.
passwd: all authentication tokens updated successfully.

(三)为开发人员创建数据目录并且设置相应的权限

创建目录
[root@jumpserver ~]# mkdir -p /devyu/data/
[root@jumpserver ~]# 
[root@jumpserver ~]# ll -d /devyu/data
drwx-wx-wx 2 root root 6 Feb 10 18:15 /devyu/data

修改目录属组
[root@jumpserver ~]# chgrp -R devgroup /devyu/

查看权限
[root@jumpserver ~]# ll -d /devyu
drwx-wx-wx 3 root devgroup 18 Feb 10 18:15 /devyu


设置黏滞位,防止other用户,随便删除别人的数据

加上-R参数,递归该目录下所有的文件夹
[root@jumpserver ~]# chmod -R 1777 /devyu
[root@jumpserver ~]# 
[root@jumpserver ~]# ll -d /devyu/*
drwxrwx--T 2 root devgroup 6 Feb 10 18:15 /devyu/data

image-20220211105020225

(四)测试结果

测试用户权限是否设置成功,可以结合第(三)步一起完成

注意看效果

黏滞位的作用是,给文件夹设置黏滞位,t权限

然后该目录内的文件,只有属主、以及root才可以删除、移动文件。

image-20220211111313032

2、禁止root远程登录

注意:在生产服务器server端完成

参见上面sshd的配置文件的操作

3、更改默认端口

需求:防止扫IP使用默认端口暴力破解(一次一次试)。故将默认端口更改为:22122

(一)确定当前服务器端口没有被占用

[root@jumpserver ~]# netstat -tunlp|grep 22122
[root@jumpserver ~]# 

[root@jumpserver ~]# ss -anlp|grep 22122
[root@jumpserver ~]# 


[root@jumpserver ~]# lsof -i:22122
[root@jumpserver ~]#

(二)修改配置文件

[root@jumpserver ~]# grep 'Port' /etc/ssh/sshd_config 
Port 22122
#GatewayPorts no

(三)、重启sshd服务

[root@jumpserver ~]# systemctl restart sshd
[root@jumpserver ~]# 
[root@jumpserver ~]# 
[root@jumpserver ~]# 
[root@jumpserver ~]# systemctl reload sshd
[root@jumpserver ~]# 


检查最新的端口
[root@jumpserver ~]# netstat -tnlp|grep 22122
tcp        0      0 0.0.0.0:22122           0.0.0.0:*               LISTEN      27504/sshd          
tcp6       0      0 :::22122                :::*                    LISTEN      27504/sshd          
[root@jumpserver ~]#

image-20220211120640659

4、用户密码随机

注意:在线上生产环境中创建一个开发人员专用的账号,devyuchao

思路:

1、在线上生成环境,创建公共账号(开发人员)

2、安装随机密码生成工具pwgen

3、使用pwgen工具生成随机密码

4、给账号设置密码

(一)创建用户

useradd  devyuchao

(二)安装pwgen

pwgen软件需要配置epel源安装

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
②安装pwgen
[root@jumpserver ~]# yum install -y pwgen

(三) 生成随机密码


pwgen支持的选项。
  -c或-大写字母
    在密码中至少包含一个大写字母
  -A或--不大写
    不在密码中包含大写字母
  -n 或 --数字
    在密码中至少包含一个数字
  -0 或 --no-numerals
    不在密码中包含数字
  -y或--符号
    在密码中至少包括一个特殊符号
  -r <chars> 或 --remove-chars=<chars>(删除字符
    从生成密码的字符集中删除字符
  -s 或 --secure
    生成完全随机的密码
  -B 或--模棱两可
    不要在密码中包含模棱两可的字符
  -h 或 --help
    打印一个帮助信息
  -H 或 --sha1=path/to/file[#seed] 。
    使用指定文件的sha1哈希值作为(不那么)随机生成器
  -C
    以列形式打印生成的密码
  -1
    不在列中打印生成的密码
  -v或--不使用元音
    不要使用任何元音,以避免意外的讨厌的字。
[root@jumpserver ~]# pwgen -n
Faa4tie4 ahX3Ahki hu3Aejae peV5nio2 ohz2Phoo ye4aeyuM AhYaR3nu Che3aeku
ahf7eePh sieSi4ai oa5baiCu ooNg2eoP tow1zahV Ohbuo4ph Aef3jooS pe3Iu0oo
pee7jaCa dah5ujeY Eec3Chie oomohG0a Ait0um7t OhF3mu8U eexo7AeY Thee4bu2
Aa2Iesei Erahvi6i IK9cohB7 rei0ohTh Rohb7zur rahz4huV raiQu1Ja qui8ooJ1
ge2Uo1wi oQu6Yoof Te3ihoon Moheib4u OoCh2Bu2 xoBoo8ai iegahSh0 Ja7Ahgie
Ohwoh4ak ahqueo9X Tae8uiku oz0ieSoo yiePh7gu Phahm4Qu eth2Eixe OPh0vooj
gaeNaiC6 Ahthai0u see6cu2H Eithoh8x die6ohJu Soo2aegh pe6acheT Uu8Ohn7b
zieSie8u fe1eiN9e maiwuM5n ioYoh3ka Ohoov7Ee Wahvova3 Upheo7oZ Ahneev2j
Ir9fug1e Lou3oe1D sheiM0vi eu8aeThi eeZ9eipu Jee6So0w jo7Faehe fahWu8ah
Ke4agiiy ca5zai3I rohL3Sha utoo5Gi5 Pie6Aa3i ood7Faic de4Aing9 Eevoe0ir
ooT7naic Lahpae6k Kuoquei7 MoKohR5o Lo8oiw3j Gaiz6uyu Ahshaix9 Lei8xahx
ui6pooYi bohJ5aed Phu0oove iePh9OoD Dah4ties paeR0Cox OoX9eefa ena6re7U
aith5EiP paeNgu3e yae3Fohh ieB0GiKe rie9Ohk5 gieKa6oh ra9leeNa Baipeif1
eShough0 Theet6ze xiaDae7r Iero1Oh0 afie0Ohl Io0Ih0Ug eiyee0Ae Lah2aiTh
Sieh6ohv zooNg5sh Eaz5Xaiv Heed7ahf Ahcaibo0 AoZ0foe4 Biexeij1 Zetee5he
Laif5ong fe8li1Ch eizi3ooM ing2Okou Thai9Oat Ahph7Eek aeQuaet0 phaeHoh0
Joa4thai beex8eaK Wae5aey0 Uqu8buHa Ausie6ka Iehe7be9 Bal0Aele ahN1Oshe
oovaeh0E oochah2R Lu1eur8I yu5Sie4y eaJ2eaNu Sae7eeda Bid2ba0m geD7Aeku
Hui3diej veibiuK4 OhHaith2 AhX6OoDo iju8ahNi seeNg9sh caesho7L shahr4eG
Ni3xoh3r ek5Saesh ooRohgh0 eo7ey9Da aiMee3ho ieB1ahM9 OhShai3e ezie3Uoh

(四)设置用户密码

echo eo7ey9Da  |passwd --stdin devyuchao

image-20220211134757035

此时可以用这个随机密码,登录服务器。

image-20220211134926588

随机生成指定风格的密码

打印,包含大写字母、数字、不包含特殊歧义、完全随机、且一行一个密码、密码长度为8、生成5个密码。

[root@jumpserver ~]# pwgen -cnBs1 8 5
3MwPLJwi
TAeqdf3h
rXn4EojU
9hJw3XWK
9k4rzxfM

本章总结

  • 掌握ssh认证方式
    • ssh通信加密方式原理、流程。
    • 密码模式、公钥模式(免密码登录,待会超哥再补充)
  • 禁止root登录服务器,增强服务器安全性
  • 更改ssh服务默认端口,增强服务器安全性
  • 熟练使用ssh客户端工具,xshell、ssh命令、secureCRT等。

课外补充

1、ssh客户端工具

  • 查看参数和帮助方法

ssh --help

man ssh

  • 常见参数

    • windows
    • linux
    • macos
    • 提供的ssh命令,会有些区别,查看帮助后使用即可。

    linux下ssh远程登录

image-20220211135510985

windows下远程登录

image-20220211135815672

常见参数

-p ssh端口

-l 远程用户名,如果不指定用户,会使用当前默认的登录用户名。

[yuchao66@yuchao-linux01 ~]$ ssh -l root  -p 22122  10.96.0.146 
root@10.96.0.146's password: 
Last login: Fri Feb 11 12:06:10 2022 from 10.96.0.1
[root@jumpserver ~]# 
[root@jumpserver ~]# 
[root@jumpserver ~]# 
[root@jumpserver ~]#

image-20220211140710014

xshell工具,其实就是帮你执行ssh命令。

image-20220211142215865

2、踢掉用户下线

who命令
w命令

查看当前机器登录用户信息

看看自己是谁

干掉用户,让他下线。

干掉这个xshell。

image-20220211143604235

3、免密登录(重点)

经过一段时间后,开发人员和运维人员都觉得使用密码SSH登录的方式太麻烦(每次登录都需要输入密码,难记又容易泄露密码)。

为了安全和便利性方面考虑,要求运维人员给所有服务器实现免密码登录。

任务要求

所有开发人员通过远程管理用户devyuchao登录生产服务器实现免密码登录。

任务拆解

  1. 理解免密登录原理
  2. 根据需求针对不同用户配置免密登录

涉及知识点

  • 免密登录原理( 理解 )
  • 用户生成秘钥对(公钥和私钥)
  • 免密码登录配置( 重点

课程目标

  • 了解sshd服务的认证方式
  • 理解免密等原理
  • 能够根据需求对用户进行免密码登录配置

理论储备

ssh认证方式(精简版)

1、账户密码认证

10.96.0.146  jumpserver  ,ssh服务端

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑  远程登录

10.96.0.149  yuchao-linux01   ssh客户端

服务端的公私钥文件

image-20220211144617838

[root@jumpserver ~]# ls -l  /etc/ssh/ssh_host_rsa*
-rw-r-----. 1 root ssh_keys 1679 Dec 31 18:38 /etc/ssh/ssh_host_rsa_key
-rw-r--r--. 1 root root      382 Dec 31 18:38 /etc/ssh/ssh_host_rsa_key.pub
[root@jumpserver ~]# 
[root@jumpserver ~]#

客户端用于保存公钥的文件。

[root@yuchao-linux01 ~]# 
[root@yuchao-linux01 ~]# cat ~/.ssh/known_hosts 
10.96.0.146 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGDOreHTX0pDGG1KhVXZ5G1d137SijI8a9sF/FSpVURqtir3G/0mZLk38okfPURSV8ccaVPyNoZUJHo4OEMeR8o=
10.96.0.147 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGDOreHTX0pDGG1KhVXZ5G1d137SijI8a9sF/FSpVURqtir3G/0mZLk38okfPURSV8ccaVPyNoZUJHo4OEMeR8o=
[root@yuchao-linux01 ~]# 
[root@yuchao-linux01 ~]# 


这个文件就存放着,已经连接过的ssh服务端的公钥信息,可以删除,然后需要重新yes确认。

image-20220211151613643

2、基于密钥对的认证

基于密钥对认证,也就是所谓的免密码登录,理解免密登录原理:

image-20220211154418278

3、基于密钥对的免密登录(实践)

原理很复杂,超哥给你讲原理,是因为当你发现免密登录失败时候,你应该去哪一个环节找问题,这是你的解决思路!

其实部署操作很简单。

image-20220211155415575

实际免密登录过程

1.在你想免密登录的机器上执行,比如windows,免密登录linux机器
yu@DESKTOP-1TDLFH9 MINGW64 ~/.ssh

# 这个是最重要的命令

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/yu/.ssh/id_rsa):
/c/Users/yu/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/yu/.ssh/id_rsa
Your public key has been saved in /c/Users/yu/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:/kalajC4h7ZsGEITXc9KW9x68gJHj+Xa7+uFaRJvzIw yu@DESKTOP-1TDLFH9
The key's randomart image is:
+---[RSA 3072]----+
|  . ..           |
| . .  + .        |
|  .  . * o       |
| o  . = *   .    |
|. .  = =S= o     |
|. . . =.* X o    |
| . o o =.E X .   |
|  ..= . +.* .    |
|   ooo . .+=.    |
+----[SHA256]-----+

yu@DESKTOP-1TDLFH9 MINGW64 ~/.ssh
$ pwd
/c/Users/yu/.ssh

yu@DESKTOP-1TDLFH9 MINGW64 ~/.ssh
$ ls
id_rsa  id_rsa.pub  known_hosts

免密登录命令,把客户端的公钥,发给服务器。
yu@DESKTOP-1TDLFH9 MINGW64 ~/.ssh
$ ssh-copy-id root@10.96.0.149
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/c/Users/yu/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.96.0.149's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@10.96.0.149'"
and check to make sure that only the key(s) you wanted were added.

image-20220211163945937

此时就可以免密登录了。

yu@DESKTOP-1TDLFH9 MINGW64 ~/.ssh
$
s
yu@DESKTOP-1TDLFH9 MINGW64 ~/.ssh
$ ssh root@10.96.0.149
Last login: Fri Feb 11 14:56:48 2022 from 10.96.0.1
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]#

image-20220211165042629

超哥这里是教大家用windows免密连接linux

linux之间也是一样的操作。

扩展总结

图解SSH加密算法

动画解释对称加密、非对称加密

对称加密

  • des 对称的公钥加密算法,安全低,数据传输速度快;使用同一个秘钥进行加密或解密
  • rsa 非对称的公钥加密算法,安全,数据传输速度慢 ,SSH默认的加密算法

image-20220211165843700

非对称加密

上面的数据是加密了,这个钥匙,如果丢了怎么办?被别人恶意获取到不还是危险吗?

image-20220211171802522

中间人攻击

image-20220211172540491

【Client如何保证自己接收到的公钥就是来源于目标Server机器的?】

上图看似理所当然,然而此时一位不愿意透露姓名的黑客路过,并且做了如下事情

  1. 拦截客户端的登录请求
  2. 向客户端发送黑客自己的公钥,这时客户端可能并不知道,并且用了此公钥对数据进行了加密
  3. 客户端发送假的公钥,加密后的数据,黑客拿到了此加密后的数据,再用自己的私钥进行解密
  4. 客户端的数据此时已被黑客截取

ssh安全登录

问题: SSH中是如何解决这个问题的呢?

答:基于用户名密码认证和密钥对认证

  • 基于用户密码的认证

1.在首次ssh登录时,客户端需要确认服务器的信息,理论上应该是对公钥的确认,由于公钥通过RSA算法加密,太长,不好直接比较,所以给公钥生成一个hash(sha256)的指纹,方便比较。

# 指纹信息,写入在,known_hosts文件里

[root@yuchao-linux01 .ssh]# ssh root@10.96.0.146
The authenticity of host '10.96.0.146 (10.96.0.146)' can't be established.
ECDSA key fingerprint is SHA256:vjyKCLajbwDmNfuX7Ld9ycWYnad8oxxndE/aVLEH13Y.
ECDSA key fingerprint is MD5:1f:91:5a:92:fb:dc:b4:91:2c:c8:9f:6f:bf:3b:f4:0c.
Are you sure you want to continue connecting (yes/no)?

这表示,当前无法确认这个10.96.0.146机器的真实性,但是得知了它的指纹,你自己确认下,是不是你要连接的机器。

2.一般不需要做这些事,我们既然学习其原理,可以来看下服务端的指纹

[root@jumpserver ~]# ssh-keygen -E SHA256 -lf /etc/ssh/ssh_host_ecdsa_key.pub
256 SHA256:vjyKCLajbwDmNfuX7Ld9ycWYnad8oxxndE/aVLEH13Y no comment (ECDSA)

image-20220211173308045

3.当你输入yes之后,输入账号密码,正确后,即可登录服务器。

该server的公钥就会被放到client的家目录 ~/.ssh/known_hosts文件里

便于下次连接,不用再确认公钥

客户端机器
[root@jumpserver ~]# cat  ~/.ssh/known_hosts
10.96.0.146 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBGDOreHTX0pDGG1KhVXZ5G1d137SijI8a9sF/FSpVURqtir3G/0mZLk38okfPURSV8ccaVPyNoZUJHo4OEMeR8o=

关于ssh连接的文件总结

目录所在
[root@jumpserver ~]# ls ~/.ssh/
authorized_keys  id_rsa  id_rsa.pub  known_hosts
  • Known_hosts:当Client接收Server的公钥以后,Server的公钥信息会放在Client$HOME/.ssh/known_hosts文件中,下次再次连接的时候,系统能够识别出Server的公钥已经存在了本地,因此可以跳过警告部分,直接提示输入密码了.
    • 保存已认证的远程主机公钥;
  • authorized_keys:Server远程主机将用户的公钥,保存在已登录用户的$HOME/.ssh/authorized_keys文件中。
    • 用于免密登录会用到,保存已授权的客户端公钥;
  • id_rsa:私钥文件
  • id_rsa.pub:公钥文件
加密. 将明文信息变为难以读取的密文内容,让其不可读
加密算法. 加密算法就是加密的方法

sshd最佳安全实战

以下是针对 SSH 服务(sshd)的最佳安全实践,以提高其安全性并减少被攻击的风险:


1. 更改默认端口

默认的 SSH 端口是 22,容易成为暴力破解的目标。将其更改为非标准端口可以降低被扫描的可能性。

配置方法:

  • 编辑 /etc/ssh/sshd_config
    Port 2222
    
  • 重启服务:
    sudo systemctl restart sshd
    

2. 禁用 Root 登录

直接允许 root 用户登录会增加风险,建议只允许普通用户登录,并使用 sudo 提权。

配置方法:

  • 修改 /etc/ssh/sshd_config
    PermitRootLogin no
    
  • 重启服务:
    sudo systemctl restart sshd
    

3. 使用密钥认证

密码登录容易被暴力破解,改用密钥认证更安全。

配置方法:

  1. 生成密钥对(客户端):
    ssh-keygen -t rsa -b 4096
    
  2. 上传公钥(客户端到服务器):
    ssh-copy-id user@server
    
  3. 禁用密码登录(服务器): 修改 /etc/ssh/sshd_config
    PasswordAuthentication no
    
  4. 重启服务:
    sudo systemctl restart sshd
    

image-20241230222816342

4. 使用 Fail2Ban 防暴力破解

Fail2Ban 会监控 SSH 日志,并在多次失败后临时封禁 IP。

配置方法:

  1. 安装 Fail2Ban:
    sudo apt install fail2ban
    
  2. 创建自定义规则: 编辑 /etc/fail2ban/jail.local
    [sshd]
    enabled = true
    port = 2222
    logpath = /var/log/auth.log
    maxretry = 5
    bantime = 3600
    
  3. 启动服务:
    sudo systemctl enable --now fail2ban
    

5. 限制登录用户

只允许特定用户通过 SSH 登录。

配置方法:

  • 修改 /etc/ssh/sshd_config
    AllowUsers user1 user2
    

6. 限制 IP 地址范围

通过防火墙(如 iptablesufw)限制只允许可信 IP 地址访问。

配置方法(以 UFW 为例):

sudo ufw allow from 192.168.1.100 to any port 2222
sudo ufw enable

7. 使用两步验证(2FA)

在 SSH 上启用 Google Authenticator 或类似的两步验证工具。

配置方法:

  1. 安装 PAM 模块:
    sudo apt install libpam-google-authenticator
    
  2. 运行配置(每个用户):
    google-authenticator
    
  3. 修改 /etc/ssh/sshd_config
    ChallengeResponseAuthentication yes
    
  4. 修改 /etc/pam.d/sshd,添加:
    auth required pam_google_authenticator.so
    
  5. 重启服务:
    sudo systemctl restart sshd
    

8. 启用 SSH 审计

记录所有登录和会话的活动,便于安全审计。

配置方法:

  • 确保 Auditd 已安装:
    sudo apt install auditd
    
  • 创建规则:
    sudo auditctl -a always,exit -F arch=b64 -S execve -k ssh_commands
    

9. 定期更新和监控

  • 更新系统和软件: 确保 OpenSSH 和系统补丁为最新版本。
    sudo apt update && sudo apt upgrade
    
  • 监控登录日志: 查看 /var/log/auth.log,检查是否有异常登录活动。

10. 禁用 SSH 版本 1

SSH v1 存在已知漏洞,必须禁用。

配置方法:

  • 修改 /etc/ssh/sshd_config
    Protocol 2
    

总结配置示例 (/etc/ssh/sshd_config)

Port 2222
PermitRootLogin no
PasswordAuthentication no
ChallengeResponseAuthentication yes
AllowUsers user1 user2
Protocol 2
MaxAuthTries 3
LoginGraceTime 60

通过以上配置和操作,可以大幅提升 SSH 服务的安全性。

Copyright © www.yuchaoit.cn 2025 all right reserved,powered by Gitbook作者:于超 2024-12-30 22:28:23

results matching ""

    No results matching ""