Nexus之安全管控

一、前言

Linux 基金会报道,70%- 90%的现代应用程序都包含开源软件 。2022 年 6 月 21 日—— Snyk 和Linux 基金会宣布了一份联合研究报告——2022开源安全状况(The State of Open Source Security)。报告指出:

  • 软件供应链的依赖复杂性在增加,平均每个项目有49个安全漏洞,涉及79个直接依赖。
  • 依赖传递关系复杂,修复起来更为麻烦,每个项目有18-20个漏洞源自依赖传递。
  • 只有49%的公司或组织针对开源软件开发或使用制定了相关安全策略。
  • 41%的公司或组织对他们的开源软件安全性没有很高的信心。
  • Log4Shell 从通用漏洞评分系统 (CVSS) 获得了 10 分——最严重的评级。截止到2021 年 12 月,包含 Log4J 的所有 Java 项目中有 60.8% 使用该包作为依赖传递,超过 2% 的项目仍然存在未解决的 Log4J 漏洞。
  • 修复开源项目漏洞所需的时间从2018年的49天增长到2021年的110天。修复开源项目中的漏洞所花的时间比特有项目长近 20% (18.75%)。

目前公司内部基于开源软件,上线了在CI、CD(流水线平台)阶段的检测,对于其中使用含有高危漏洞的组件进行检测,并推进治理。但是由于并不是所有项目都经过流水线平台发布,故会对部分项目检测会产生遗漏,如何从源头治理组件的安全性,是安全首要解决的问题。

二、基本介绍

软件安全重要性越来越高,接下来到我们本篇文章的主角Nexus。相信Java同学对Nexus并不陌生,Nexus 是一个仓库管理器,其主要用于软件供应链中管理二进制文件和软件包的分发,通俗的说Nexus也是常用的私服服务,用于公司内部访问。

2.1  Nexus特点

  • Nexus 目前支持18种包格式,常见的Maven、Pypi、Docker、Go、Helm、npm等都支持。
  • Nexus 支持hosted、proxy、group等仓库类型。既支持代理远程仓库,也支持维护本地私有仓库,如果本地仓库没有,将会同步中央仓库并把数据缓存。
  • Nexus 支持 SAML/SSO 、与LDAP 等安全身份认证(专业版)。
  • Nexus 提供了仓库管理功能,并支持基于角色的访问控制。
  • Nexus 提供了 REST API、Webhook、Bundle开发等功能,方便与公司更好的集成。Nexus不只支持Maven,对于Python的Pypi源、Node的npm源都有较好的支持,对其Pypi源使用感兴趣的可以查看该文章Nexus之Pypi私服管理。

2.2  Nexus使用

以Maven项目为例,编辑  ~/.m2/settings.xml,镜像里添加nexus私服地址

  <mirror>
    <id>nexus-poizon</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus Poizon</name>
    <url>http://nexus.testdomain.com/nexus/content/groups/public</url>
  </mirror>

后续执行maven相关命令时候,会从nexus私服地址去进行拉取打包。例如本地项目执行mvn install

Nexus之安全管控

三、安全管控

3.1  产品分析

如何从Nexus源头管控组件的安全呢?  Nexus 官方提供了一个nexus Firewall的产品,其支持早期识别和预警,会自动阻止严重漏洞的组件和可疑组件。根据包的发布时间、受欢迎程度、License等来决定哪些组件进入SDLC流程中。详情如下图Nexus之安全管控当我准备去试用该产品的时候,发现该产品是商业的,且该功能按用户收费,一个用户每月150$+。不死心的我,陆续调研其他解决方案,发现国外有Synk、国内有墨菲都提供了类似解决方案,但都是收费服务。贫穷让我只能看看如何基于Nexus来二次开发。

3.2 技术调研

Nexus提供了Rest API、Webhook、Bundle开发等多种方式,用于拓展。

3.2.1 REST API

Nexus 提供了REST API用于与外部系统集成。为了易于使用,在Nexus 管理界面有Swagger UI,可以在UI界面上直接填写参数并调用查看结果,详细相关API文档可以查看参考链接。Nexus之安全管控

3.2.2 Webhook

Webhook 是一种 HTTP 回调。简单来说,webhook 允许 Nexus 管理员配置基于 HTTP 的回调,以通知外部服务 Nexus  中发生的重要事件。使用 webhook 可以自动化一些工作流程,并与第三方系统与服务集成。Nexus  提供了使用 webhook 进行全局审计、基于存储库的事件以及特定存储库上的事件的能力。

3.2.3 Bundle开发

Nexus 是建立在Apace Karaf的OSGI容器之上,这种结构为开发插件提供了基础。Nexus每个版本的功能特性都是由许多OSGI的bundle构成。这些bundle为后端提供了许多功能,例如 支持新的存储库格式、新的Job任务、新的用户界面组件和修改等。OSGI 和Apache Karaf相关知识可以查看延伸拓展。

四、插件开发

4.1 先决条件

Bundle 开发需要了解Apache Maven 和Java相关知识,如果了解OSGI就更好了。Nexus 3.15.0版本之前和之后开发方式不一样,3.15.0版本及之后版本支持Kar文件,会自动解压和部署。而3.15之前的版本不支持Kar格式,后续开发基于Nexus 3.15.0之后版本。

4.2 编写插件

编写Bundle 需要使用Java和Maven作为构建。Nexus的 公共代码库 可以用作现有Bundle及其源代码的入口。从 nexus-plugins Parent 继承

<parent>
  <groupId>org.sonatype.nexus.plugins</groupId>
  <artifactId>nexus-plugins</artifactId>
  <version>3.15.0-01</version>
</parent>

这里使用的Version是3.15.0,建议该版本与运行的Nexus版本相同。示例代码

public class ScannerHandler implements ContributedHandler {
  private static final Logger LOG = LoggerFactory.getLogger(ScannerHandler.class);

  @Inject
  public ScannerHandler(final ConfigurationHelper configurationHelper,
                        final MavenScanner mavenScanner,
                        ) {
    this.configurationHelper = configurationHelper;
    this.mavenScanner = mavenScanner;

  }

  @Nonnull
  @Override
  public Response handle(@Nonnull Context context) throws Exception {
    Response response = context.proceed();
    ......
    Intercept(ArtifactId)
   
  private void  Intercept(String ArtifactId) {
     throw new RuntimeException(format("Artifact '%s' has vulnerability, details: 'https://sec.shizhuang-inc.com/detail/intercept'", ArtifactId));
  }

执行打包命令,将生成的kar包部署到deploy目录下

mvn clean verify -DskipTests --show-version --batch-mode --errors -PbuildKar -Drevision=0.0.1

五、插件运行 1、System —> Capabilities —> Create capabilityNexus之安全管控

2、选择开发的Bundle插件Security ConfigurationNexus之安全管控

3、配置服务端的检测地址和认证

Nexus之安全管控

4、此时开发者在拉取包的时候,如果服务端检测到包含有严重风险,即可进行阻断,并定义错误信息。

Nexus之安全管控

六、延伸拓展

通过在Nexus源头进行安全管控,确保开发者在日常下载使用的组件经过安全检测,后续服务端可对组件的License许可证、活跃度进行分析,保障公司依赖的开源项目安全性。

6.1 OSGI

OSGi 的体系架构是基于插件式的软件结构,包括一个 OSGi 框架和一系列插件,在 OSGi中,插件称为 Bundle,其中,OSGi 框架规范是 OSGi 规范的核心部分,它提供了一个通用的、安全可管理的 Java 框架,通过这个框架,可以支持 Bundle 服务应用的部署和扩展。Bundle 之间可以通过 Import Package 和 Require-Bundle 来共享 Java 类,在 OSGi 服务平台中,用户通过开发 Bundle 来提供需要的功能,这些 Bundle 可以动态加载和卸载,或者根据需要远程下载和升级。OSGi体系结构如下图:Nexus之安全管控

.2 Apache Karaf

Karaf是Apache旗下的一个开源项目。Karaf同时也是一个基于OSGi的运行环境,Karaf提供了一个轻量级的OSGi容器,可以用于部署各种组件,应用程序。Karaf提供了很多特性用于帮助开发者和用户更加灵活的部署应用,例如:热部署、动态配置、几种日志处理系统、本地系统集成、可编程扩展控制台、ssh远程访问、内置安装认证机制等等。同时Karaf作为一款成熟而且优秀的OSGi运行环境以及容器已经被诸多Apache项目作为基础容器,例如:Apache Geronimo, Apache ServiceMix,Fuse ESB

参考链接:

  • https://snyk.io/reports/open-source-security/
  • https://github.com/sonatype/nexus-public
  • https://www.sonatype.com/products/pricing?hsLang=en-us
  • https://help.sonatype.com/repomanager3/integrations/bundle-development
  • https://help.sonatype.com/repomanager3/integrations/rest-and-integration-api


原文始发于微信公众号(洋洋自语):Nexus之安全管控

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/272875.html

(0)
明月予我的头像明月予我bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!