一、前言
据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

三、安全管控
3.1 产品分析
如何从Nexus源头管控组件的安全呢? Nexus 官方提供了一个nexus Firewall的产品,其支持早期识别和预警,会自动阻止严重漏洞的组件和可疑组件。根据包的发布时间、受欢迎程度、License等来决定哪些组件进入SDLC流程中。详情如下图当我准备去试用该产品的时候,发现该产品是商业的,且该功能按用户收费,一个用户每月150$+。不死心的我,陆续调研其他解决方案,发现国外有Synk、国内有墨菲都提供了类似解决方案,但都是收费服务。贫穷让我只能看看如何基于Nexus来二次开发。
3.2 技术调研
Nexus提供了Rest API、Webhook、Bundle开发等多种方式,用于拓展。
3.2.1 REST API
Nexus 提供了REST API用于与外部系统集成。为了易于使用,在Nexus 管理界面有Swagger UI,可以在UI界面上直接填写参数并调用查看结果,详细相关API文档可以查看参考链接。
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 capability
2、选择开发的Bundle插件Security Configuration
3、配置服务端的检测地址和认证

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

六、延伸拓展
通过在Nexus源头进行安全管控,确保开发者在日常下载使用的组件经过安全检测,后续服务端可对组件的License许可证、活跃度进行分析,保障公司依赖的开源项目安全性。
6.1 OSGI
OSGi 的体系架构是基于插件式的软件结构,包括一个 OSGi 框架和一系列插件,在 OSGi中,插件称为 Bundle,其中,OSGi 框架规范是 OSGi 规范的核心部分,它提供了一个通用的、安全可管理的 Java 框架,通过这个框架,可以支持 Bundle 服务应用的部署和扩展。Bundle 之间可以通过 Import Package 和 Require-Bundle 来共享 Java 类,在 OSGi 服务平台中,用户通过开发 Bundle 来提供需要的功能,这些 Bundle 可以动态加载和卸载,或者根据需要远程下载和升级。OSGi体系结构如下图:
.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