我们有一个公司/私有maven注册表("artifactory"),我们的项目使用它来解决项目的依赖关系。
这个私有maven注册表还代理maven Central来处理公共依赖项,这意味着内部注册表一开始没有解析的依赖项。
我们希望避免供应链攻击,即有人重载我们在私有/公司maven注册表中使用的自定义依赖项,并在maven Central中使用相同的标识符。例如,在Maven Central中发布一个恶意的依赖工件,其groupId
和artifactId
与内部的相同,但version
更高-然后一个将优先考虑并在我们的系统中造成严重破坏。
在npm中,有一个允许"标记"的机制。对某个私有注册表的依赖(通过scope
)。
Maven中是否有类似的机制,允许某些依赖只从内部工件解析,而防止从Maven Central解析?
我在想artifactory
:
<dependency>
<groupId>org.acme</groupId>
<artifactId>supersecret</artifactId>
<version>3.141</version>
<artifactory>internal_corporate_artifactory_name</artifactory> <!-- as described in settings.xml or Super-Pom -->
</dependency>
你可以用不同的方法解决这个问题。
首先,在您的settings.xml
中定义<mirror>
,以便所有请求都转到您的Artifactory。
在Artifactory中,您为您想要访问的所有外部存储库定义了一个虚拟存储库(它将是您用作镜像的通用虚拟存储库的一部分)。
现在对于虚拟存储库,您可以定义"排除模式"。这允许您告诉Artifactory不要针对外部存储库解析groupIdcom.yourcompany
。
添加到J Fabian Meier的答案-
在镜像Maven Central的远程存储库上使用排除模式,例如,排除与您公司的组ID匹配的工件。
更多信息可在以下链接中找到:
- JFrog知识库:如何使用包括/排除模式?
- JFrog Blog:在远程存储库中使用排除模式的另一个案例:命名空间遮蔽(又名"依赖混淆")攻击
- JFrog Blog:一年的供应链攻击:如何保护您的SDLC
- JFrog Blog:使用Include和Exclude模式优化存储库安全性和性能