为您推荐:
精华内容
最热下载
问答
  • 5星
    131.59MB weixin_43800734 2021-05-27 14:30:22
  • 5星
    15.33MB zuoan1993 2021-05-10 10:36:55
  • 为代码资产管理者提供一个审视安全的基本框架

    本文作者:王振威 - CODING 研发总监
    CODING 创始团队成员之一,多年系统软件开发经验,擅长 Linux,Golang,Java,Ruby,Docker 等技术领域。近两年来一直在 CODING 从事系统架构和运维工作。

    不同类型的企业资产有不同的管理办法,但守护资产的安全性无一例外都是重中之重,但对如何保障代码资产安全并没有形成统一认知。本文将就“代码资产的安全性”这一话题展开全面的阐述,尝试从代码管理的生命周期进行全链路分析,读者可以据此来审视自己企业的代码资产安全。

    代码资产安全是什么

    代码资产安全不等于信息安全

    代码资产安全不等于信息安全,这是很容易理解的。整个企业的信息系统组成不仅仅是代码资产,甚至可以说大多数情况下不涉及代码资产。企业的信息系统往往由基础计算设施、网络平台、软件、数据库等方面组成。信息安全重点是关注上述信息设施在投产之后运行过程中的安全问题。而大多数软件运行的程序包是经由源代码编译的结果,跟源代码本身是分割开来的。信息安全关注的方面更为全面,代码资产安全只是其中的一部分,而且往往不是最为关注的一部分。

    代码资产安全不等于代码安全

    代码资产安全不等于代码安全,这不太容易理解。代码安全往往指代代码本身的安全性,如代码中是否有远程过程执行漏洞,注入漏洞等等。而代码资产安全是一个管理概念,强调管理过程的安全,而非代码本身安全,例如某研究机构需要研究某种计算机病毒,他们需要在源码库中存放对应病毒的源码。这病毒的源码就是这个机构的重要资产。

    代码管理系统不审视源码中的漏洞或者恶意行为,而是必须忠实地确保存储的代码的原始文件

    代码资产管理是围绕代码仓库的全生命周期管理

    代码资产管理的核心是代码仓库。仓库里存放着企业的全部代码,配置文件以及全部历史版本。守护代码资产安全的核心就是围绕代码仓库的三个关键环节构建起全链路的安全能力,这三个环节分别是检入,存储和检出

    检入安全

    检入可以理解为开发者在开发环境上编辑好代码,并且把代码传送到代码仓库的过程。这个环节关注两个方面,分别是机密性完整性

    机密性

    机密性是指开发者把开发环境中的代码检入代码仓库的过程不被第三方窃取,一般通过传输过程加密来实现。Git 代码仓库最常用的是 HTTPS 和 SSH 传输协议。

    HTTPS 协议是通过 HTTP 协议加上传输层安全协议(TLS)实现的。HTTP 协议是明文传输协议,这意味着如果没有 TLS,网络节点中的路由设备都可以轻松窃取代码。TLS 可以在 TCP 协议之上建立双向加密能力,配合 HTTP 协议上就是 HTTPS。HTTPS 客户端和服务端先通过非对称加密协商加密算法和密钥,再使用协商的算法和密钥来进行对称加密传输。本文不涉及具体算法的安全性介绍,不过随着密码学的发展,算法在与时俱进,我们可以认为加密算法本身是安全的。

    然而这一过程并不完备,攻击者可以制作中间服务器,使得客户端在发起连接的时候误连接了中间服务器,从而跟这个中间服务器进行加密通信。这将导致即便是加密传输,但最终还是会被恶意服务器窃取,这就形成了中间人攻击

    行业推出了 CA(证书授权机构)机制应对此问题,即服务器在提供加密传输服务前,要把自己的公钥和服务的域名绑定,并且在全球公信的 CA 处登记。这样一来,HTTPS 客户端在尝试建立加密链接的时候,会要求服务器出示 CA 签发的证书,客户端可以使用预安装在操作系统或者浏览器内的 CA 公钥进行验证,确认服务器对域名的所有权,这样一来就可以确保不会有中间人攻击。有行业公信力 CA,也有企业内部 CA,而后者需要在客户端安装企业内部 CA 的证书文件。

    知名安全机构 Qualys 可以在线对 HTTPS 服务器进行 SSL/TLS 多方面的报告评估,如下图为两家国内云计算公司推出的代码托管服务器的评估:

    HTTPS 虽然解决了传输安全,但在认证用户身份这里,Git 代码仓库还是依赖 Basic Auth 机制来实现。Git 代码仓库会要求 HTTPS 客户端提供账号密码,并附在请求体中一并传输给服务器,由服务器来确认操作者身份。在传输过程中,账号和密码是被 TLS 一并加密传输的,我们不必担心传输过程的密码泄露问题。但开发者通常为了不必每次操作都输入账号密码,会让电脑记住密码,如果不妥善处理,可能会导致泄露。这里重点是一定不能把账号密码拼接在远程仓库访问地址里面,正确的做法是使用 Git 在各种操作系统下的 凭据管理器,如 macOS 是使用钥匙串管理,Windows 是使用 Git Credential Manager for Windows 来进行管理。

    SSH 是一种常用于远程管理 Linux/Unix 服务器的安全加密协议,其功能非常多样。以 Git 为基础的代码托管也常使用这个协议进行加密代码传输。使用者提前把自己的公钥文件配置在服务器上后,可以在后续的传输过程中确认身份。

    SSH 使用非对称加密(用户的公钥)确认身份,用对称加密传输数据。跟 HTTPS 不同的是,SSH 协议无法指定域名,所以无法引入 CA 机制来防止中间人攻击。

    但 SSH 客户端在与未知服务器进行连接时,会提示服务器的公钥指纹信息,使用者应当对比服务供应商官方提供的公钥公告和命令行提示信息来确认服务器身份,确保不被中间人攻击。

    如图展示腾讯云 CODING SSH 服务器的公钥指纹公示:

    如图所示,SSH 客户端尝试连接服务器时给出的服务器公钥指纹确认:

    在用户确认身份(输入 yes 并按下回车)后,SSH 客户端会把服务器的公钥信息记录在 ~/.ssh/known_hosts 中,下次即可直接连接,不再询问。

    要点小结

    • 代码的传输要使用双向加密协议,HTTPS 和 SSH 都可以
    • HTTPS 协议需要关注服务器的证书签发方(CA)的权威性
    • HTTPS 协议需要关注客户端是否安装了不受信任的 CA 文件(防止 CA 欺诈)
    • 使用 Git 凭据管理器保管 Git HTTPS 协议的账号密码
    • SSH 协议在使用的时候需要仔细比对服务器提供的公钥指纹跟服务提供商公告的公钥指纹是否完全一致,防止中间人攻击
    • 客户端需要注意防止攻击者恶意篡改 ~/.ssh/known_hosts 文件内容或者 SSH 的客户端配置(可以通过忽略服务器公钥信任机制)
    • 妥善保管 SSH 私钥文件(往往存放于 ~/.ssh/id_rsa),如 Linux 下确保此文件的权限是 400 等,防止他们读取

    完整性

    代码检入的完整性包含两个方面:

    1. 开发者一次提交的代码变动是否完整(内容不被篡改)
    2. 某次提交是否确为某开发者做出的变动(不被冒名顶替)

    以 Git 为例子,这个代码版本控制软件已经从内生机制上确保了内容不被篡改。Git 采用一种类 Merkel 哈希树的机制来实现分层校验。

    哈希是一种把任意数据映射成等长数据的算法,且不可逆。哈希算法有的特点是原始数据发生一点变化,映射的结果会产生较大变化,而且这一变化毫无规律。映射后的等长的数据被称为指纹。

    哈希算法非常适合用来快速比较两段数据是否完全一致(指纹一致几乎可以推断原文一致)。在我们上文中提到的对比 SSH 服务器出示的公钥指纹,和服务提供商公告的指纹就是这种原理的应用。

    Merkel 哈希树:

    Git 对仓库中的每一个文件内容和其基本信息整合进行哈希。会将一个目录树下的所有文件路径和文件哈希值组合再哈希形成目录树的哈希。会把目录树和提交信息组合再哈希,此哈希结果就是 Git 的版本号。这意味着每次提交都产生一个完全不同的版本号,版本号即哈希。在给定一个版本号,我们可以认为这个版本背后对应的全部文件内容,历史记录,提交信息,目录结构都是完全一致的。对于确定的版本号就没有篡改的可能性

    哈希算法小概率会产生冲突(同一个指纹对应多个不同原始数据的情况),这时可能导致一致性校验失效。所以哈希算法也在与时俱进,如当下 MD5 算法已经几乎过时,Git 当前正在使用 SHA1 算法,未来可能会升级到更为安全的 SHA256 算法。

    如图展示 Git 中的某个目录树的内容信息:

    即便开发者自己提交的版本经过 Git 的层层哈希,可以确保内容不被恶意篡改,但仍然有被冒名顶替的危险

    因为 Git 在提交过程不需要验证用户身份,而且提交可以被不同的人在各种传输过程中传输和展示。设想攻击者冒充公司员工制造一个提交,却被公司其他员工认为是公司内部人士会有多可怕。目前基于 Git,业界的普遍做法是引入 GPG 签名机制

    GPG 是基于非对称加密算法的一个应用,其原理是使用私钥处理一段信息,得到一段新的信息,这段新的信息只能由私钥生成,而且可以使用对应的公钥来识别这段新的信息的生成来源,这段新的信息就被称为数字签名。

    简单来说,信息发布者使用自己的私钥(私人印章)对要发布的信息(待签名文件)进行签名,并且把原始文件和数字签名一并发送给使用方。使用方持有发布方的公钥,对收到的数字签名和原始文件进行校验就可以确认确实是发布方发出的,未被冒名顶替。这类似给要发布的信息盖了个章。

    如图展示 Git 中某个提交被开发者添加 GPG 签名的效果:

    要点小结

    • Git 本身的哈希机制可确保内容不被篡改
    • 使用 GPG 为提交签名可防止冒名顶替
    • 服务器端要校验 Git 提交邮箱声明和 GPG 签名

    存储安全

    存储安全是指当代码被检入到代码仓库后,如何保证数据的机密性,完整性和可用性。抛开基础设施的安全性不谈,对于代码存储来说,数据往往由数据库数据和代码库文件组成,这里重点讨论代码文件存储安全问题。

    机密性

    代码仓库中的代码大多直接存放于操作系统的磁盘中,在服务器软件进行读写操作的时候,不涉及网络传输的机密性风险,但直接写入磁盘上的文件在未做控制的情况下,往往可以被操作系统上的很多不相关进程随意读写,这些非预期的代码读写会造成额外的风险。

    一种做法是去控制每一个文件的读写权限,如统一设置为 600,另一种做法是干脆只允许服务器上运行一个业务进程,实现操作系统级别隔离。

    容器技术提供了一种良好的隔离进程方案:如在 Kubernetes 体系下,代码仓库存储在 PV 上,并只被挂载进代码仓库的应用容器内读写,而且基于容器的调度和弹性特性可以较好的支持高可用并避免资源浪费。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JyEXSXbD-1638353370628)(https://help-assets.codehub.cn/enterprise/20211201104942.png)]

    完整性和可用性

    我们知道 Git 本身会通过哈希校验机制来确保仓库的完整性,但前提是仓库文件是完备的。如果仓库的文件丢失或者损坏,Git 的哈希校验也将无法工作。数据的完整性有很多种解决方案,最常见的冷备,半实时备份,实时备份,磁盘快照等方案都是为了确保文件在丢失或者损坏的时候可以找回,来确保仓库的完整性的。不过总的来说,备份往往是事后的恢复手段,无法实现即时的自愈,最终依据备份机制来进行数据修复往往会影响可用性。

    虽然业界没有针对代码仓库的通用高可用方案,但数据库主从策略和 RAID 机制是两个可以参考的做法,这里来做下简要介绍。

    数据库主从策略,一种做法是数据写入主库,从库自动增量同步数据。当主库发生故障时,从库自动替代。代码存储类似,可以把存储节点分为主节点和从节点。

    RAID 机制是一种磁盘分片存储的冗余机制,有多种做法,如 RAID5,分片存储,并存储一份校验信息,当任意一块磁盘坏掉,可以通过校验信息来复原数据。

    腾讯云 CODING DevOps 在这方面进行了深入研究,并结合了主从和 RAID 的思路,实现了针对代码仓库的高可用策略,可妥善保障仓库的完整性。

    如图所示,对于 D 仓库来说,他的主仓库 D(m) 存放于第二个节点,他的从仓库 D(s) 存放于第一个节点(实质上还可以设定更多从仓库,这里为了图示方便,只显示了一个)。这样的设计让各个节点都可以不闲置计算资源,而且任意一个节点出现损坏都可以快速恢复。

    检出安全

    代码检出后才能使用,而检出也涉及传输机密性问题,这点与检入部分没有区别。而对于 Git 仓库来说,检出环节的仓库完整性会由 Git 的哈希校验机制保证,也不会有太大问题。检出环节的安全问题往往是因为不合适的权限策略和密钥管理导致代码泄露

    企业内部代码通常有如下四个场景:

    1. 检出开发
    2. 阅读评审
    3. 自动执行(CI,自动化测试等)
    4. 管理审计

    检出开发权限

    需要区分开发者能读写的权限范围,保护好关键资源和密钥,按如下原则:

    • 按照业务、组件等进行分门别类的存放,仓库隔离
    • 根据所处的部门和组织关系配置仓库的权限
    • 为分支设定读写权限,只允许有权限的成员写入
    • 使用文件锁定方式保护敏感文件不被误修改
    • 统一传输协议,如只允许 HTTPS 或者 SSH
    • 为个人密码,令牌,公钥等设定有限期
    • 审计密码,令牌,公钥等的使用记录
    • 为目录设定读写权限,只允许指定开发者读取或者写入某些目录
    • 禁止强制推送策略,防止代码被回退

    如图所示,设置仓库内的目录权限:

    阅读评审权限

    诉求是看源码和辅助信息,并做出自己的评审结果,不涉及写入代码,按如下原则:

    • 区分读写和只读成员群体,禁用后者的写入权限
    • 区分深入评审和轻量级评审,禁用后者的代码检出权限,只允许其 Web 页面查看源码
    • 使用 CODEOWNERS 机制自动指定评审成员

    如图所示,设置仓库的 CODEOWNERS:

    自动执行权限

    自动检出,检出行为背后不对应一个人,不涉及代码写回,按如下原则:

    • 禁止成员把自己的密码,令牌,密钥用于自动执行
    • 使用项目/仓库令牌,部署公钥机制确保令牌和密钥只对指定仓库有权限
    • 为不同场景设置专用的令牌,不得混用,也不得用于其他用途
    • 为令牌,公钥等设置有效期
    • 为令牌,公钥等设置禁止写入权限
    • 审计令牌,公钥等的使用记录

    如图所示,设置令牌的权限和有效期:

    管理审计权限

    这种场景是非技术人员希望了解仓库统计信息,活跃情况,了解研发过程进度等,按如下原则:

    • 给成员开放所管辖的仓库列表和仓库详情的 Web 页访问权限
    • 禁止成员使用 HTTPS/SSH 协议把源码检出到本地
    • 禁止成员在网页端下载源码包

    如图所示,设置禁止仓库写入等权限

    总结

    代码资产管理是个体系化的工程,这个过程中的安全性不是某个单点可以完全保障的,需要从检入,存储,检出三个环节对全链条进行风险分析。很多企业在这些方面很重视,但聚焦错了方向,可能付出了很大努力,但实质上依然冒着代码资产的丢失和泄露的巨大风险。希望此文可以帮助企业正视代码资产安全,为代码资产管理者提供一个审视安全的基本框架。

    让 CODING 为您的代码资产保驾护航

    展开全文
    CODING_devops 2021-12-01 18:10:00
  • 27KB weixin_42144707 2021-08-03 18:19:19
  • IntelliJ IDEA 2020.2包含了许多令人惊叹的功能,包括对GitHub拉取请求的更高级支持,的Inspections Widget,它可以在打开的文件中显示警告和错误的数量,并允许您在它们之间快速导航,以及Problems工具窗口会在...

    IntelliJ IDEA 2020.2包含了许多令人惊叹的功能,包括对GitHub拉取请求的更高级支持,新的Inspections Widget,它可以在打开的文件中显示警告和错误的数量,并允许您在它们之间快速导航,以及Problems工具窗口会在当前文件中提供问题的详细信息,并允许您快速修复它们,并且“Related Problems”嵌入提示会在您的更改破坏其他文件时通知您。还包含许多框架和技术的新功能,包括Jakarta EE,Quarkus,Micronaut,Amazon SQS API和OpenAPI。
    在这里插入图片描述
    点击下载IntelliJ IDEA 2020.2最新试用版
    JAVA
    Java 15将于9月发布,而IntelliJ IDEA 2020.2已完全准备就绪。我们已经更新了对记录功能的支持,该功能现在处于其第二个预览版中,添加了对Sealed类的基本支持,并提供了对文本块的全面支持,而文本块是Java 15中的完整功能。
    如果对Java方法或字段所做的更改将导致其他文件中的错误,则IDE会立即向您发出有关插入提示的通知。
    如果在运行您的应用程序时发生异常,则IDE可以使用静态分析找到其根本原因并查明导致异常的确切语句。
    您可以轻松地从结构搜索中创建检查,并为每个检查指定不同的描述和严重性。
    现在,引入变量重构可以替换中间作用域中某个变量的出现,而不是仅替换一个或全部出现。
    现在,您可以开始直接在集合或数组中键入Stream API方法,并且IDE建议您自动为您插入“ .stream()”。
    Stream API的另一项改进是,IDE建议在自动完成中使用预期类型的链式调用。
    我们添加了一个新操作,该操作可以将可选链转换为“ if”语句链。
    您可以将多个语句折叠成一个循环,“展开循环”意图动作现在将从数据流中获取循环大小。
    我们的数据流分析可以报告已知为0的非平凡表达式,并告知您不必要的比较,因为Math.min或Math.max永远不会比另一个操作数更大或更小。
    我们在“Settings/Preferences”的“ Java”节点下将Java实时模板分组,以使您可以更轻松地在所有其他语言的实时模板中找到它们。
    编辑
    我们很高兴推出我们全新的Inspections Widget,它可以显示当前文件中的警告和错误数量,并使您可以轻松地在它们之间进行导航。
    有一个新的“Problem”工具窗口,显示了当前文件中的警告和错误列表,并提供了有关这些问题的描述,您可以直接从工具窗口中快速修复它们。
    在将意图操作和快速修复实际应用于代码之前,请预览它们的结果。
    我们更新了后台进程对话框,以减少视觉混乱。
    状态栏的用户界面已整理整齐,看起来更加整洁。
    版本控制
    现在,整个GitHub拉取请求工作流程可以直接从IntelliJ IDEA完成。可以浏览,分配,管理甚至合并拉取请求,查看时间线和内联评论,提交评论和评论以及接受更改。
    IntelliJ IDEA 2020.2支持WSL 2中安装的Git,用于处理Linux或Windows文件系统中的项目。
    用于合并,拉动和重新设置等动作的Git对话框已更新,以具有更好的视觉一致性和更少的混乱。
    我们添加了从Git日志视图压缩提交的功能。
    现在,Git日志中也提供了Drop Commits操作。
    现在,当您在IntelliJ IDEA中比较两个分支时,您将可以在一个视图中查看比较的分支的提交。
    我们已将GitHub授权从基于密码的方式(已弃用,不久将停止工作)切换为OAuth。
    框架和技术
    我们增加了对Jakarta EE 9的支持。IDE现在支持以下Jakarta EE技术:CDI,JPA,批处理,Bean验证,JSF,JAX-RS,WebSocket,Servlet,JSP,JSON-P,JSON-B,安全性以及EJB和JTA规范。
    您可以从更新的“New Project”向导中创建Java EE 8和Jakarta EE 9项目。
    现在,IDE为Quarkus项目中的.properties和YAML配置文件提供了突出显示和代码完成功能。
    您可以使用IDE从Quarkus属性文件导航到已配置的bean,反之亦然。您也可以从Java代码导航到属性文件。
    IDE现在可以为注入的bean提供装订线导航。我们还更新了检查,使它们可以与Quarkus简化语法一起使用。
    IntelliJ IDEA为REST保证测试中的URL路径引用提供代码完成。从URL到相关资源的导航现在也可用。
    现在,IDE集成了Swagger UI工具。
    IntelliJ IDEA现在可以计算OpenAPI规范之间的结构差异。
    现在可以通过“New Project”向导生成一个新的Micronaut项目。
    对于使用通过RabbitMQ或Kafka进行异步通信的Micronaut和Amazon SQS API应用程序,IDE现在可以通过装订线图标提供导航,查找用法以及消息队列和主题的名称完成。
    IDE可以自动生成JAX-RS和MicroProfile HTTP请求,并在基于集成编辑器的REST Client中打开它们。
    Selenium插件现在与Selenoid集成在一起,并提供了一种直接从browsers.json文件运行新测试环境的简便方法。
    Profiler
    此版本增强了我们的HPROF内存查看器。除了有关堆栈的一般信息之外,它现在还显示计算出的对象保留大小,到垃圾收集器根的最短路径,对象(保留对象)的支配器树以及传入的引用。
    用户体验
    新的Shared Indexes插件使您可以下载索引而不是在本地构建索引,从而可以将大型项目的索引时间减少60%至75%。
    现在可以在建立索引期间使用Java和PHP语言的完成功能。
    我们更新了进度条指示器,以减少视觉上的混乱。状态栏的用户界面也已更新。
    Terminal
    现在可以从终端直接调用IDE功能。当您在终端中看到突出显示的命令时,请按Cmd / Ctrl + Enter打开相应的GUI工具。
    制作工具
    IntelliJ IDEA 2020.2支持Maven包装器,该包装器将必要的Maven版本自动安装到您的项目中。
    现在,可以在IntelliJ IDEA中为每个项目分别设置Maven版本。以前,Maven版本在所有打开的项目中共享。
    IntelliJ IDEA本机生成器的生成输出现在显示在“Build ”工具窗口中,该窗口是我们已经用来报告Gradle和Maven输出的工具窗口。
    IDE现在提供项目名称完成和从项目名称到build.gradle文件的导航。
    JavaScript和TypeScript
    新的智能意图将帮助您更快地执行某些操作。例如,您现在可以快速将for带有数字索引的循环转换为forEach数组方法。
    现在,使Prettier成为JavaScript项目中的默认格式化程序比以前更加容易,只需启用新的"on code reformat"复选框即可。
    我们增加了对Nuxt.js和特定于Vue的代码样式设置的支持。
    数据库
    您可以使用新的最大化模式在单独的面板中查看和编辑长单元格值。
    现在,更容易观察和编辑布尔值,因为它们不是显示为复选框而是显示为原始值。
    我们已经可以在数据编辑器中预览您所做的更改的查询。
    我们增加了对新SQL语言-Google BigQuery的支持。IDE会正确突出显示您的查询并为其提供编码帮助。
    Docker
    IntelliJ IDEA 2020.2允许您在Windows上安全地连接到Docker,因为我们添加了对从IntelliJ IDEA到Docker守护程序的TLS连接的支持
    Kubernetes
    现在,您可以在“Preferences / Settings | Build, Execution, Deployment | Kubernetes.”
    我们从当前项目和群集中添加了对ConfigMaps / Secrets的编辑支持。
    此外,您现在可以从ConfigMap / Secret的用法导航到项目或群集中的相应ConfigMap / Secret资源。
    Scala
    我们添加了自动导入。现在,两个括号都根据代码缩进自动添加和删除。
    现在,我们为同步显示可导航的装订线图标。您也可以通过在Go To on a class, trait, or object keyword.导航到一个相关联的地方。
    IntelliJ IDEA可以在编辑器中直接渲染Scaladoc,因此外观清晰简洁。
    我们还在“快速文档”弹出窗口中改进了Scaladoc呈现-现在可以正确处理段落,列表和宏。
    现在,只要当前作用域中存在适当的值,就可以在一个步骤中自动完成方法的名称及其参数。
    现在,您可以使用点表示法将“静态”函数应用于自变量,该函数可以与代数数据类型(ADT)结合使用。
    其他变更
    IntelliJ IDEA 2020.2检测到您是否正在使用屏幕阅读器,并将自动启用IntelliJ IDEA的辅助功能。
    IntelliJ IDEA 2020.2在Linux上增加了对Unicode表情符号字符的支持。
    我们已经大大改善了Java项目的远程调试性能。
    我们已经从JavaFX迁移到JCEF(铬嵌入式框架)。从v2020.2开始,我们不再捆绑JavaFX并开始将其作为单独的插件提供,以便依赖JavaFX的外部插件可以将其用作依赖项。
    重新分配了Alt + 6(Linux和Windows)/ Cmd + 6(macOS)快捷方式,现在代替调用TODO而是调用“Probelm工具窗口。
    从v2020.2版本开始,IDE将不支持在Java 5或更早版本的Java上运行和测试项目。编辑器继续支持Java 5。
    我们已经为不再使用的技术捆绑JBoss Seam,JBoss jbpm,Play Framework,Flash / Flex,ASP,CFML和Struts 2。
    您有任何问题请及时联系我们!非常感谢您的反馈,不要忘记查看我们的概述视频。

    展开全文
    qq_42444778 2020-07-30 14:02:48
  • 当前服务器使用的版本是7.6,openssh的版本为7.4p1,openssl的版本为1.0.2k 注:如果openssh版本低于7.4,可以使用镜像升级到yum仓库默认的openssh7.4p1版本【方法为挂载镜像以后,执行:yum update openssh -y 即可...

    说明

    • 虚机网络说明
      所有升级操作的机器均无外网,与生产环境内网一致,所以无需担心根据此文档操作自己虚机无外网操作会出问题。
    • 环境说明
      当前服务器使用的版本是7.6,openssh的版本为7.4p1,openssl的版本为1.0.2k
      注:如果openssh版本低于7.4,可以使用镜像升级到yum仓库默认的openssh7.4p1版本【方法为挂载镜像以后,执行:yum update openssh -y 即可】
    [root@controll ~]# cat /etc/redhat-release 
    CentOS Linux release 7.6.1810 (Core) 
    [root@controll ~]# ssh -V
    OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
    [root@controll ~]# sshd -v
    unknown option -- v
    OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
    usage: sshd [-46DdeiqTt] [-C connection_spec] [-c host_cert_file]
                [-E log_file] [-f config_file] [-g login_grace_time]
                [-h host_key_file] [-o option] [-p port] [-u len]
    [root@controll ~]# openssl version
    OpenSSL 1.0.2k-fips  26 Jan 2017
    [root@controll ~]# 
    
    • 整个过程不需要卸载原先的openssl包和openssh的rpm包。

    • 本文的环境都是系统自带的openssh,没有经历过手动编译安装方式,如果之前有手动编译安装过openssh【需要修改路径位置】,请参照本文自行测试是否能成功。

    • 如果严格参照本文操作,我保证你升级没问题。

    • 下面命令我均会放完整代码,建议复制粘贴代码,确保升级过程无误。

    配置本地源

    • 这个还是需要配置的,后面安装依赖包需要用到。
    • 找一个和系统版本相同的镜像配置本地源,如果不懂的,看下面这篇博客学习一下:

    yum源本地配置和网络源配置——超级完整详细

    • 下面是我配置的一个过程,只放命令过程代码,就不对命令做说明了【不懂的看上面连接中博客进行配置】:
    [root@controll ~]# scp 192.168.59.129:/home/CentOS-7.6-x86_64-DVD-1810.iso /home
    The authenticity of host '192.168.59.129 (192.168.59.129)' can't be established.
    ECDSA key fingerprint is SHA256:uvQ2aSyqt5ve6OP4KsUmGPb2P3Gua26u6ggKCAs9RlU.
    ECDSA key fingerprint is MD5:c6:cc:20:c3:71:cf:69:90:aa:f3:8a:ec:f5:5c:55:cd.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '192.168.59.129' (ECDSA) to the list of known hosts.
    root@192.168.59.129's password: 
    CentOS-7.6-x86_64-DVD-1810.iso                                                                                                                                                100% 4376MB  56.6MB/s   01:17    
    [root@controll ~]# ls /home
    ccx  CentOS-7.6-x86_64-DVD-1810.iso
    [root@controll yum.repos.d]# mkdir /home/centos
    [root@controll yum.repos.d]# mount /home/CentOS-7.6-x86_64-DVD-1810.iso /home/centos/
    mount: /dev/loop0 is write-protected, mounting read-only
    [root@controll yum.repos.d]# df -Th |grep /home/centos
    /dev/loop0              iso9660   4.3G  4.3G     0 100% /home/centos
    [root@controll yum.repos.d]# 
    [root@controll ~]# cd /etc/yum.repos.d/
    [root@controll yum.repos.d]# ls
    CentOS-Base.repo  CentOS-CR.repo  CentOS-Debuginfo.repo  CentOS-fasttrack.repo  CentOS-Media.repo  CentOS-Sources.repo  CentOS-Vault.repo
    [root@controll yum.repos.d]# mkdir bak
    [root@controll yum.repos.d]# mv * bak
    mv: cannot move ‘bak’ to a subdirectory of itself, ‘bak/bak’
    [root@controll yum.repos.d]# ls
    bak
    [root@controll yum.repos.d]# scp 192.168.59.129:/etc/yum.repos.d/centos.repo .
    root@192.168.59.129's password: 
    centos.repo                                                                                                                                                                   100%   76    51.6KB/s   00:00    
    [root@controll yum.repos.d]# ls
    bak  centos.repo
    [root@controll yum.repos.d]# cat centos.repo 
    [7.6-bendi]
    name=ccx_settin
    baseurl=file:///home/centos
    gpgcheck=0
    enable=1
    [root@controll yum.repos.d]# yum repolist
    Loaded plugins: fastestmirror, langpacks
    Loading mirror speeds from cached hostfile
    7.6-bendi                                                                                                                                                                                | 3.6 kB  00:00:00     
    (1/2): 7.6-bendi/group_gz                                                                                                                                                                | 166 kB  00:00:00     
    (2/2): 7.6-bendi/primary_db                                                                                                                                                              | 3.1 MB  00:00:00     
    repo id                                                                                             repo name                                                                                             status
    7.6-bendi                                                                                           ccx_settin                                                                                            4,021
    repolist: 4,021
    [root@controll yum.repos.d]# 
    

    配置telnet【可以不做】

    说明

    • 这个可以不用配置的,生产服务器上也不建议配置开启telnet,这只是简单说明telnet的配置开启方法。
    • 配置telnet的意义就是防止升级ssh过程中远程工具连接中断,但我试了4台机子,全程使用secureCRT工具远程连接,中间没有任何中断,所以可以直接操作【实在中断了再去后台操作就好了】

    允许root登陆

    • 现在很多centos7版本安装telnet-server以及xinetd之后没有一个叫telnet的配置文件了。
      如果下面telnet文件不存在的话,可以跳过这部分的更改【默认可以使用root登录】
    [root@controll ~]# ll /etc/xinetd.d/telnet
    ls: cannot access /etc/xinetd.d/telnet: No such file or directory
    [root@controll ~]# 
    
    • 如果下面文件存在,请更改配置telnet可以root登录,把disable = no改成disable = yes
    [root@rhel yum.repos.d]# vim /etc/xinetd.d/telnet
    [root@rhel yum.repos.d]# cat /etc/xinetd.d/telnet
    # default: on
    # description: The telnet server serves telnet sessions; it uses \
    #   unencrypted username/password pairs for authentication.
    service telnet
    {
        disable = yes
        flags       = REUSE
        socket_type = stream       
        wait        = no
        user        = root
        server      = /usr/sbin/in.telnetd
        log_on_failure  += USERID
    }
    

    终端登陆配置

    配置telnet登录的终端类型,在/etc/securetty文件末尾增加一些pts终端,如下

    [root@controll ~]# vim /etc/securetty 
    [root@controll ~]# tail -n 4 /etc/securetty 
    pts/0
    pts/1
    pts/2
    pts/3
    [root@controll ~]# 
    
    

    服务安装

    • 安装如下2个服务
    [root@controll ~]# yum -y install telnet*
    [root@controll ~]# yum -y install xinetd*
    
    • 启动这2个服务
    [root@centos76_2 ~]# systemctl enable telnet.socket
    Created symlink from /etc/systemd/system/sockets.target.wants/telnet.socket to /usr/lib/systemd/system/telnet.socket.
    [root@centos76_2 ~]# systemctl enable xinetd
    [root@controll ~]# systemctl start telnet.socket
    [root@controll ~]# systemctl start xinetd
    [root@controll ~]# systemctl is-active telnet.socket
    active
    [root@controll ~]# systemctl is-active xinetd
    active
    [root@controll ~]# 
    systemctl enable xinetd
    systemctl enable telnet.socket
    
    • 查看23端口是否被监听
    [root@controll ~]# netstat -ntlp | grep 23
    tcp6       0      0 :::23                   :::*                    LISTEN      1/systemd           
    [root@controll ~]# 
    

    telnet登录虚拟机

    • 直接在当前虚拟机输入:telnet ip 回车能登录成功即可【因为没有/etc/xinetd.d/telnet这个文件夹,所以默认是可以用root直接登录的】
    [root@controll ~]# telnet 192.168.59.133
    Trying 192.168.59.133...
    Connected to 192.168.59.133.
    Escape character is '^]'.
    
    Kernel 3.10.0-957.el7.x86_64 on an x86_64
    controll login: root
    Password: 
    Last login: Thu May 20 00:25:35 from ::ffff:192.168.59.133
    [root@controll ~]# logout
    Connection closed by foreign host.
    [root@controll ~]# 
    
    • 使用工具的话就是【建议使用xshell连接telnet,如果secureCRT版本过低,会导致连接失败】
      新建一个会话,协议选择为Telnet
      telnet的端口是23

    安装依赖包

    • 注:依赖包只需要镜像中的本地源就足矣了;
    • 升级需要几个组件,有些是和编译相关的等
    [root@controll ~]# yum install  -y gcc gcc-c++ glibc make autoconf openssl openssl-devel pcre-devel  pam-devel
    # 我这安装了20个包,如下
    Installed:
      autoconf.noarch 0:2.69-11.el7    gcc.x86_64 0:4.8.5-36.el7  gcc-c++.x86_64 0:4.8.5-36.el7  openssl-devel.x86_64 1:1.0.2k-16.el7  pam-devel.x86_64 0:1.1.8-22.el7 
      pcre-devel.x86_64 0:8.32-17.el7 
    
    Dependency Installed:
      cpp.x86_64 0:4.8.5-36.el7                  glibc-devel.x86_64 0:2.17-260.el7    glibc-headers.x86_64 0:2.17-260.el7       kernel-headers.x86_64 0:3.10.0-957.el7  
      keyutils-libs-devel.x86_64 0:1.5.8-3.el7   krb5-devel.x86_64 0:1.15.1-34.el7    libcom_err-devel.x86_64 0:1.42.9-13.el7   libkadm5.x86_64 0:1.15.1-34.el7         
      libselinux-devel.x86_64 0:2.5-14.1.el7     libsepol-devel.x86_64 0:2.5-10.el7   libstdc++-devel.x86_64 0:4.8.5-36.el7     libverto-devel.x86_64 0:0.2.5-4.el7     
      m4.x86_64 0:1.4.16-10.el7                  zlib-devel.x86_64 0:1.2.7-18.el7    
    
    Complete!
    [root@controll ~]# yum install  -y pam* zlib*
    # 我这安装了3个包,如下
    Installed:
      pam_krb5.x86_64 0:2.4.8-6.el7                                                   pam_pkcs11.x86_64 0:0.6.2-30.el7                                                  
    
    Dependency Installed:
      pcsc-lite-libs.x86_64 0:1.8.8-8.el7                                                                                                                               
    
    Complete!
    

    准备openssh包和openssl的包

    • 自行去下载openssh和openssl的tar包

    • 如果不想去找的,可以直接下载我下载好的,链接如下:

      • openssh和openssl_tar包下载
      • 这里面一共有4个文件,分别是:openssh-8.0p1.taropenssh-8.6p1.taropenssl-1.1.1j.taropenssl-1.0.2s.tar
    • 注意:上面的4个包中,openssl如果你当前是1.0的,就只能用openssl-1.0.2s.tar编译【openssl-1.1.1j.tar编译出来会各种出错【因为没有1.1的依赖库】 ,openssh2个版本都可以正常使用。
      如果当前是1.0的,建议不要安装1.1,否则降回去有可能会失败。

    • 这儿需要对这个包做些简单的说明,网上很多帖子说openssh和openssl的包有兼容性这个意思,但我找了很多资料,均没有看到一个正式介绍openssh和openssl使用版本对应。
      所以我做了几个版本测试,发现openssl只要是和自己当前版本一致就不会有问题【当前是1.0的,就安装为1.0的最新版本就不会有问题】,而openssh,安装任何版本都行】

    将openssl和openssh包上传到服务器

    • 上传文件有个linux自带命令,很骚,可以直接在secureCRT工具中调用的:
      rz -E ,回车以后会弹出文件选择,选择好点击添加就可以直接上传了。
      在这里插入图片描述

    • 因为我其他服务器有这些包,所以我之间考过来。
      个人习惯喜欢将工具包统一放到 /software里面【根据个人喜好随便放,不影响安装】,不过为了后面可以复制粘贴我的代码,建议你也放到/software里面

    [root@controll ~]# mkdir /software
    [root@controll ~]# scp 192.168.59.129:/software/* /software/
    root@192.168.59.129's password: 
    openssh-8.0p1.tar.gz                                                                                                              100% 1560KB  37.2MB/s   00:00    
    scp: /software/openssh-8.6p1: not a regular file
    openssh-8.6p1.tar.gz                                                                                                              100% 1744KB  38.7MB/s   00:00    
    scp: /software/openssl-1.0.2s: not a regular file
    openssl-1.0.2s.tar.gz                                                                                                             100% 5224KB  45.0MB/s   00:00    
    scp: /software/openssl-1.1.1j: not a regular file
    openssl-1.1.1j.tar.gz                                                                                                             100% 9593KB  29.6MB/s   00:00    
    [root@controll ~]# cd /software/
    [root@controll software]# ls
    openssh-8.0p1.tar.gz  openssh-8.6p1.tar.gz  openssl-1.0.2s.tar.gz  openssl-1.1.1j.tar.gz
    [root@controll software]# 
    

    开始安装openssl

    升级前版本查看

    主要就是用来对比后面是否升级成功

    [root@controll openssl-1.0.2s]# openssl version
    OpenSSL 1.0.2k-fips  26 Jan 2017
    [root@controll openssl-1.0.2s]# 
    

    文件备份

    [root@controll software]# ll /usr/bin/openssl 
    -rwxr-xr-x. 1 root root 555248 Oct 31  2018 /usr/bin/openssl
    [root@controll software]# mv /usr/bin/openssl /usr/bin/openssl_bak
    [root@controll software]# ll /usr/include/openssl
    total 1864
    -rw-r--r--. 1 root root   6146 Oct 31  2018 aes.h
    # 还有很多,但为了简洁,我给删了,只保留了上面一个
    [root@controll software]# mv /usr/include/openssl /usr/include/openssl_bak
    [root@controll software]# 
    

    解压tar包

    [root@controll software]# ls
    openssh-8.0p1.tar.gz  openssh-8.6p1.tar.gz  openssl-1.0.2s.tar.gz  openssl-1.1.1j.tar.gz
    [root@controll software]# 
    [root@controll software]# tar xfz openssl-1.0.2s.tar.gz 
    

    编译安装新版本的openssl

    • 配置、编译、安装3个命令一起执行
      &&符号表示前面的执行成功才会执行后面的
    [root@controll software]# cd openssl-1.0.2s/
    [root@controll openssl-1.0.2s]# ./config shared && make && make install  
    # 这个过程耗费时间挺长的,需要耐心等待
    
    • 中间一直在闪下面这种内容
      在这里插入图片描述
    • 以上命令执行完毕,echo $?【会shell的应该知道这个,这个是查看返回值的,0为执行成功】查看下最后的make install是否有报错,0表示没有问题,除了0以外的任何数字都是错误的【上面某个步骤出错了,需要重新弄,一直到显示结果为0才能进行下一步】
      成功界面如下
      在这里插入图片描述

    目录做软链接

    下面2个文件或者目录做软链接 【刚才前面的步骤mv备份过原来的】

    [root@controll openssl-1.0.2s]# ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
    [root@controll openssl-1.0.2s]# ln -s /usr/local/ssl/include/openssl /usr/include/openssl
    [root@controll openssl-1.0.2s]# 
    [root@controll openssl-1.0.2s]# ll /usr/bin/openssl
    lrwxrwxrwx. 1 root root 26 May 20 01:13 /usr/bin/openssl -> /usr/local/ssl/bin/openssl
    [root@controll openssl-1.0.2s]# ll /usr/include/openssl
    lrwxrwxrwx. 1 root root 30 May 20 01:13 /usr/include/openssl -> /usr/local/ssl/include/openssl
    [root@controll openssl-1.0.2s]# 
    

    加载新配置

    如果多次重复上面步骤【下面echo内容不要重复做,只做一次即可】,/sbin/ldconfig每次执行都无所谓的。

    [root@controll openssl-1.0.2s]# echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
    [root@controll openssl-1.0.2s]# /sbin/ldconfig
    

    查看确认版本

    • 不能有报错,报错就完犊子【报错了看下面的解决方案】
    • 见证奇迹的时刻到了
      未报错,成功。
    [root@controll openssl-1.0.2s]# openssl version
    # 升级前为OpenSSL 1.0.2k-fips  26 Jan 2017
    OpenSSL 1.0.2s  28 May 2019
    [root@controll openssl-1.0.2s]# 
    

    报错实例和解决方案

    • 如果执行openssl version查看版本报错了,大概率是当前openssl包和当前系统不兼容导致的,解决方法,换一个openssl的版本即可
    • 报错查看
    [root@centos76_1 openssl-1.1.1j]# openssl version
    -bash: /usr/bin/openssl: 没有那个文件或目录
    #实际上这个文件肯定是存在的
    # 这就是不兼容导致的,直接重装其他版本
    [root@centos76_1 openssl-1.1.1j]# ll /usr/bin/openssl 
    lrwxrwxrwx. 1 root root 26 5月  19 17:34 /usr/bin/openssl -> /usr/local/ssl/bin/openssl
    [root@centos76_1 openssl-1.1.1j]# 
    
    • 重装步骤,重复上面方法,不同的是,上面文件备份换成删除即可
    [root@centos76_1 software]# rm -rf /usr/bin/openssl
    [root@centos76_1 software]# rm -rf /usr/include/openssl
    

    安装openssh

    • 我这升级的是8.6

    升级前版本查看

    主要就是用来对比后面是否升级成功

    [root@controll software]# ssh -V
    OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
    [root@controll software]# sshd -v
    unknown option -- v
    OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
    usage: sshd [-46DdeiqTt] [-C connection_spec] [-c host_cert_file]
                [-E log_file] [-f config_file] [-g login_grace_time]
                [-h host_key_file] [-o option] [-p port] [-u len]
    [root@controll software]# 
    

    文件备份删除

    • 如果ssh里面配置的东西比较多,可以备份,升级完成以后把这个文件拷贝回来【如果没有配置过什么东西,直接跳过备份这部,根据下面操作给删掉】
      注:下面编译安装操作成功以后,把这个备份的文件恢复【建议不要恢复,直接参照之前的配置重新配置一遍,极端情况下会因为版本不一致,直接用原来配置会导致ssh出现不可预期的问题】
    [root@controll software]# mkdir /etc/ssh.bak
    [root@controll software]# cp -r /etc/ssh /etc/ssh.bak/
    
    • 因为我的服务器是没有对ssh做过什么配置修改的,所以我不用考虑配置问题就直接删掉了
    [root@controll software]# rm -rf /etc/ssh/*
    

    解压tar包

    [root@controll software]# tar xfz openssh-8.6p1.tar.gz 
    [root@controll software]# cd openssh-8.6p1/
    

    编译安装新版本的openssh

    • 配置、编译、安装一起执行
      命令有点长,注意复制完
    [root@controll openssh-8.6p1]# pwd
    /software/openssh-8.6p1
    [root@controll openssh-8.6p1]# ./configure --prefix=/usr/ --sysconfdir=/etc/ssh  --with-openssl-includes=/usr/local/ssl/include  --with-ssl-dir=/usr/local/ssl   --with-zlib   --with-md5-passwords   --with-pam  && make && make install
    # 这个过程耗费时间挺长的,需要耐心等待
    
    • 中间一直在闪下面这种内容
      在这里插入图片描述
    • 以上命令执行完毕,echo $?【会shell的应该知道这个,这个是查看返回值的,0为执行成功】查看下最后的make install是否有报错,0表示没有问题,除了0以外的任何数字都是错误的【上面某个步骤出错了,需要重新弄,一直到显示结果为0才能进行下一步】
      成功界面如下
      在这里插入图片描述

    配置root可登录

    • 上面文件备份步骤说过如果/etc/ssh里面配置太多的话,备份以后就在这恢复就行【重复一次,不建议恢复,直接参照备份的文件,重新配置一次】

    • 这儿只对新文件中的一个地方做修改,就是设置允许root登录【升级完毕以后默认是不允许root登录的】
      在文件/etc/ssh/sshd_config中将PermitRootLogin改为yes即可。

    [root@controll openssh-8.6p1]# cat /etc/ssh/sshd_config | egrep -nC 1 PermitRootLogin
    31-#LoginGraceTime 2m
    32:#PermitRootLogin prohibit-password
    33:PermitRootLogin yes
    34-#StrictModes yes
    

    新文件拷贝

    • 从原先的解压的包中拷贝一些文件到目标位置【如果目标目录存在就覆盖】
      可能下面的ssh.pam文件没用到,因为sshd_config配置文件貌似没使用它,请自行测试【我这边是拷贝了,反正拷贝也没坏处】
    [root@controll openssh-8.6p1]# cp -a contrib/redhat/sshd.init /etc/init.d/sshd
    [root@controll openssh-8.6p1]# cp -a contrib/redhat/sshd.pam /etc/pam.d/sshd.pam
    [root@controll openssh-8.6p1]# chmod +x /etc/init.d/sshd
    

    新增sshd服务并设置开机启动

    • 让chkconfig管理sshd服务并把sshd加入开机自启动
    # --add  增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据。
    [root@controll openssh-8.6p1]# chkconfig --add sshd
    [root@controll openssh-8.6p1]# systemctl enable sshd
    [root@controll openssh-8.6p1]# 
    
    • 把原先的systemd管理的sshd文件删除或者移走或者删除,不移走的话影响我们重启sshd服务
      可以移动到任何地方,但建议记住移动的目的位置,便于后续如果需要的话能找到源文件。
    [root@controll openssh-8.6p1]# mkdir /data
    [root@controll openssh-8.6p1]# mv  /usr/lib/systemd/system/sshd.service  /data/
    
    • 因为改为chkconfig管理了,所以需要设置sshd服务开机启动
    [root@controll openssh-8.6p1]# chkconfig sshd on
    Note: Forwarding request to 'systemctl enable sshd.socket'.
    Created symlink from /etc/systemd/system/sockets.target.wants/sshd.socket to /usr/lib/systemd/system/sshd.socket.
    [root@controll openssh-8.6p1]# 
    
    • 最后重启sshd服务并查看端口是否正常监听
    [root@controll openssh-8.6p1]# systemctl restart sshd
    [root@controll openssh-8.6p1]# systemctl is-active sshd
    active
    [root@controll openssh-8.6p1]# 
    [root@controll openssh-8.6p1]# netstat -ntlp | grep 22
    tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      12737/dnsmasq       
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      10403/sshd: /usr/sb 
    tcp6       0      0 :::22                   :::*                    LISTEN      10403/sshd: /usr/sb 
    [root@controll openssh-8.6p1]# 
    

    到此 openssh就升级完成了

    查看确认版本

    • 上面编译没出错,每一个步骤都做完了,肯定不会有问题的。
      注:ssh -V 【查看SSH版本】和 sshd -v【查看启动文件版本】, 2个都需要执行,并且2个都需要保持一致才算真正的升级成功【如果不一致,解决方法往下看】。
    [root@controll openssh-8.6p1]# openssl version
    OpenSSL 1.0.2s  28 May 2019
    [root@controll openssh-8.6p1]#
    [root@controll openssh-8.6p1]# ssh -V
    OpenSSH_8.6p1, OpenSSL 1.0.2s  28 May 2019
    [root@controll openssh-8.6p1]# sshd -v
    unknown option -- v
    OpenSSH_8.6p1, OpenSSL 1.0.2s  28 May 2019
    usage: sshd [-46DdeiqTt] [-C connection_spec] [-c host_cert_file]
                [-E log_file] [-f config_file] [-g login_grace_time]
                [-h host_key_file] [-o option] [-p port] [-u len]
    [root@controll openssh-8.6p1]# 
    
    • 下面是我升级的8.0结果展示
    [root@centos76_3 ~]# openssl version
    OpenSSL 1.0.2s  28 May 2019
    [root@centos76_3 ~]# 
    [root@centos76_3 ~]# ssh -V
    OpenSSH_8.0p1, OpenSSL 1.0.2s  28 May 2019
    [root@centos76_3 ~]# sshd -v
    unknown option -- v
    OpenSSH_8.0p1, OpenSSL 1.0.2s  28 May 2019
    usage: sshd [-46DdeiqTt] [-C connection_spec] [-c host_cert_file]
                [-E log_file] [-f config_file] [-g login_grace_time]
                [-h host_key_file] [-o option] [-p port] [-u len]
    [root@centos76_3 ~]# 
    

    sshd -v和ssh -V版本不一致解决办法

    • 只要按着上班操作步骤做完,不会出现这种问题,只是把这种情况的处理方法放这。
    • -sshd -v和ssh -V不一个版本,需要拷贝下列sshd (ssh -V是正确的)
      cp /usr/local/openssh/sbin/sshd /usr/local/sbin/sshd
      【 如果拷贝不成功先删除/usr/local/sbin/的sshd文件。命令如下
      rm -rf /usr/local/sbin/sshd

    升级到8.6必须操作【否则工具无法连接】

    • 如果升级的是openssh8.0,忽略这步

    • 升级到8.6以后,如果不做下面操作,会导致crt工具无法连接【但可以从服务器ssh过去】,报错信息如下:
      密钥交换失败。
      没有兼容的加密程序。服务器支持这些加密程序:
      chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
      在这里插入图片描述

    • 原因
      SSH和SSL升级后,取消了原先一些不太安全的加密算法,Clinet不支持新的算法所以无法交换密钥;

    • 处理方法

      • 1、要求客户升级SecureCRT版本至6.5或7.x,或更换最新版的Xshell、Putty等工具,即可正常登录【建议如果这种方法能解决就不要用下面方法】
      • 2、修改ssh配置,添加对原加密算法的支持:
        登录到无法登录的服务器【可以从正常的服务器ssh过去】修改/etc/ssh/sshd_config文件,在文件的末尾添加如下内容,然后重启ssh服务
    [root@controll openssh-8.6p1]# tail -n 2 /etc/ssh/sshd_config 
    # 下面这行信息很长,注意复制完
    KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group1-sha1,curve25519-sha256@libssh.org
    [root@controll openssh-8.6p1]#
    [root@controll openssh-8.6p1]# systemctl restart sshd
    

    升级完登录测试【重要】

    说明

    openssh升级完毕以后,下面3项必须测试,而且每一项都必须正常才算升级成功,如果有任何一项测试失败,都不行!

    工具测试

    • 如果升级了较新版本的openssh,SecureCRT版本至6.5或7.x,或更换最新版的Xshell、Putty等工具。
    • 升级完毕以后,如果是工具连接的,断开连接,重新连接看是否正常【8.6的版本一定要看上面一步,否则工具无法连接啊,当时我以为升级8.6不行,翻了挺多资料才搞定】

    别的服务器ssh该台服务器【很重要】

    • 找一个以前能正常ssh到升级服务器的机器
      发现,报错了【上面升级openssh的主机名为controll,现在是用centos76_2的服务器连接升级服务器测试】
    [root@centos76_2 ~]# ssh 192.168.59.133
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
    Someone could be eavesdropping on you right now (man-in-the-middle attack)!
    It is also possible that a host key has just been changed.
    The fingerprint for the ED25519 key sent by the remote host is
    SHA256:0uTcB4pn/p0X72gZrtG4b7MrgLJJL9Q8Gr1TrDNFThA.
    Please contact your system administrator.
    Add correct host key in /root/.ssh/known_hosts to get rid of this message.
    Offending ECDSA key in /root/.ssh/known_hosts:7
    Host key for 192.168.59.133 has changed and you have requested strict checking.
    Host key verification failed.
    [root@centos76_2 ~]# 
    
    • 原因
      是因为ssh升级过后,服务器的公钥信息改变了,所以导致无法连接的。

    • 解决方法
      在连接服务器vi编辑配置文件~/.ssh/known_hosts,删掉现有升级过ssh的服务器ip信息即可
      在这里插入图片描述

    [root@centos76_2 ~]#  # 已经删了之前记录的信息
    [root@centos76_2 ~]# cat  ~/.ssh/known_hosts | grep 133
    [root@centos76_2 ~]# ssh 192.168.59.133 # 再次连接已经正常了
    The authenticity of host '192.168.59.133 (192.168.59.133)' can't be established.
    ED25519 key fingerprint is SHA256:0uTcB4pn/p0X72gZrtG4b7MrgLJJL9Q8Gr1TrDNFThA.
    This key is not known by any other names
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
    Warning: Permanently added '192.168.59.133' (ED25519) to the list of known hosts.
    root@192.168.59.133's password: 
    Last login: Thu May 20 00:28:27 2021 from ::ffff:192.168.59.133
    [root@controll ~]# 
    

    ssh别的服务器测试

    不用修改任何信息,连接任意一台服务器均可正常连接

    [root@controll ~]# ssh 192.168.59.129
    root@192.168.59.129's password: 
    Last login: Wed May 19 22:25:35 2021 from 192.168.59.1
    [root@centos76_2 ~]# 
    

    telnet关闭 【未配置telnet忽略】

    如果配置了telnet并开启了服务,openssh升级完毕测试没问题后可以把telnet服务关闭了【特别是生产服务器】

    [root@controll ~]# systemctl stop xinetd
    [root@controll ~]# systemctl disable xinetd
    Removed symlink /etc/systemd/system/multi-user.target.wants/xinetd.service.
    [root@controll ~]# systemctl stop telnet.socket 
    [root@controll ~]# systemctl disable xinetd
    [root@controll ~]# 
    [root@controll ~]# netstat -lntp | grep 23
    [root@controll ~]# 
    [root@controll ~]# netstat -lntp | grep 22
    tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      12737/dnsmasq       
    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      13277/sshd: /usr/sb 
    tcp6       0      0 :::22                   :::*                    LISTEN      13277/sshd: /usr/sb 
    [root@controll ~]# 
    
    展开全文
    cuichongxin 2021-05-19 11:50:03
  • CVE-2021-28041漏洞描述: OpenSSH(OpenBSD Secure Shell)是Openbsd计划组的一套用于安全访问远程计算机的连接工具。...升级OpenSSH至最新版本(8.6p1) 1. 下载OpenSSH 下载地址: https://openbsd.hk/

    CVE-2021-28041漏洞描述:

    OpenSSH(OpenBSD Secure Shell)是Openbsd计划组的一套用于安全访问远程计算机的连接工具。该工具是SSH协议的开源实现,支持对所有的传输进行加密,可有效阻止窃听、连接劫持以及其他网络级的攻击。 OpenSSH before 8.5 存在安全漏洞,攻击者可利用该漏洞在遗留操作系统上不受约束的代理套接字访问。

    解决办法:

    升级OpenSSH至最新版本(8.6p1)

    注意:升级OpenSSH前,需要先升级OpenSSL版本。升级方法见:https://blog.csdn.net/lhrm0213/article/details/117561734

    准备工作,安装telnet,避免升级失败后无法ssh登录.

    yum -y install telnet-server.x86_64  //telnet服务器
    yum list | grep telnet-server  //telnet客户端(可不安装)
    yum list | grep xinetd //xinetd守护进程
    
    #配置开机启动
    systemctl enable xinetd.service
    systemctl enable telnet.socket
    
    #启动服务
    systemctl start telnet.socket
    systemctl start xinetd
    
    #查看端口,看到23端口已打开
    netstat -ntlp
    
    #开启防火墙允许访问23端口(没开防火墙跳过此步骤)
    firewall-cmd --add-port=23/tcp --permanent
    firewall-cmd --reload
    
    #默认root无法远程访问,修改/etc/securetty
    vi /etc/securetty
    在末尾添加
    pts/0
    pts/1
    
    测试使用telnet登录服务器
    
    

    1. 下载OpenSSH

    下载地址: https://openbsd.hk/pub/OpenBSD/OpenSSH/portable/openssh-8.6p1.tar.gz

    #进入要下载的目录
    [root@localhost ~]# cd /usr/local/src/
    
    #下载源码
    [root@localhost src]# wget https://openbsd.hk/pub/OpenBSD/OpenSSH/portable/openssh-8.6p1.tar.gz
    
    #解压
    [root@localhost src]# tar -zxvf openssh-8.6p1.tar.gz 
    
    

    2. 编译安装

    #进入目录
    [root@172-15-4-5 src]# cd openssh-8.6p1
    
    #编译
    [root@172-15-4-5 openssh-8.6p1]#  ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-md5-passwords --with-pam --with-tcp-wrappers --with-ssl-dir=/usr/local/openssl --with-zlib=/usr/local/lib64 --without-hardening
    #查看结果,输出为0代表正常
    [root@172-15-4-5 openssh-8.6p1]# echo $?
    0
    
    

    安装

    [root@172-15-4-5 openssh-8.6p1]# make
    
    #查看结果,输出为0代表正常
    [root@172-15-4-5 openssh-8.6p1]# echo $?
    0
    
    [root@172-15-4-5 openssh-8.6p1]# make install
    
    #查看结果,输出为0代表正常
    [root@172-15-4-5 openssh-8.6p1]# echo $?
    0
    

    3. 配置SSH文件

    #允许root账户登录
    [root@localhost openssh-8.6p1]# echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
    [root@localhost openssh-8.6p1]# grep "^PermitRootLogin"  /etc/ssh/sshd_config      
    PermitRootLogin yes
    
    [root@localhost openssh-8.6p1]# echo "UseDNS no" >> /etc/ssh/sshd_config
    [root@localhost openssh-8.6p1]# grep  "UseDNS"  /etc/ssh/sshd_config    
    UseDNS no
    
    #复制文件到系统服务目录
    [root@localhost openssh-8.6p1]# cp -a contrib/redhat/sshd.init /etc/init.d/sshd
    [root@localhost openssh-8.6p1]# cp -a contrib/redhat/sshd.pam /etc/pam.d/sshd.pam
    
    #添加执行权限
    [root@localhost openssh-8.6p1]# chmod +x /etc/init.d/sshd
    
    #添加服务,配置开机启动
    [root@localhost openssh-8.6p1]# chkconfig --add sshd
    [root@localhost openssh-8.6p1]# systemctl enable sshd
    [root@localhost openssh-8.6p1]# chkconfig sshd on
    
    #原来的服务移走,否走有时重启后ssh服务起不来
    [root@localhost openssh-8.6p1]# mv /usr/lib/systemd/system/sshd.service  /home/
    
    

    4. 测试验证

    测试服务是否正常:

    [root@localhost openssh-8.4p1]# /etc/init.d/sshd restart
    Restarting sshd (via systemctl):                           [  OK  ]
    
    #查看端口
    [root@localhost openssh-8.4p1]# netstat -ntlp
    #22端口正常即可
    
    #可以通过systemctl start/stop/restart 启动/停止/重启sshd服务
    #查看版本
    [root@localhost openssh-8.4p1]# ssh -V
    OpenSSH_8.6p1, OpenSSL 1.1.1h  22 Sep 2020
    

    5. 关闭telnet

    [root@172-15-4-5 src]# systemctl disable xinetd.service
    Removed symlink /etc/systemd/system/multi-user.target.wants/xinetd.service.
    [root@172-15-4-5 src]# systemctl stop xinetd.service
    [root@172-15-4-5 src]# systemctl disable telnet.socket
    Removed symlink /etc/systemd/system/sockets.target.wants/telnet.socket.
    [root@172-15-4-5 src]# systemctl stop telnet.socket
    
    

    再次使用telnet就不能再登录了。
    再次漏扫,漏洞消除!

    展开全文
    lhrm0213 2021-06-04 16:25:38
  • yyh352091626 2016-01-19 14:59:16
  • fly910905 2020-12-21 08:41:47
  • NewTyun 2020-10-14 08:00:00
  • qq_51577576 2021-12-15 19:23:21
  • Eastmount 2020-03-19 18:28:03
  • qq_34337272 2020-08-07 19:07:33
  • super828 2021-11-09 00:59:01
  • Eastmount 2021-11-22 19:27:16
  • 142KB weixin_38638004 2021-06-28 18:21:04
  • farmwang 2017-06-19 22:11:40
  • bloodzero_new 2020-11-29 16:43:10
  • scorpio3k 2015-09-23 12:43:48
  • loame_zyq 2019-11-06 11:21:45
  • testvaevv 2021-10-15 11:29:54
  • Luoshengyang 2014-07-21 00:59:43
  • wizardforcel 2016-12-02 15:58:54
  • qq_36421826 2018-06-06 07:20:50
  • jacky128256 2019-12-17 18:23:45
  • wutianxu123 2018-10-02 11:30:22
  • javazejian 2016-03-13 16:38:45
  • wzp1348305051 2014-07-25 16:47:27
  • jianming21 2020-08-13 22:47:45
  • wizardforcel 2016-12-06 19:53:27
  • gabsleo 2016-06-18 10:03:33
  • xjbclz 2016-07-10 12:12:20

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 45,930
精华内容 18,372
关键字:

安全守护2新版本