代码之家  ›  专栏  ›  技术社区  ›  er4z0r

基于maven-pom的自动化构建系统依赖性验证

  •  9
  • er4z0r  · 技术社区  · 15 年前

    我刚才被指了一个非常有趣的 article 关于一个安全问题 交叉构建注入(Xbi)。从本质上讲,这是走私坏代码的花哨名称 在构建时通过自动构建系统(如Ant、Maven或Ivy)进入应用程序。

    这个问题可以通过引入加密签名验证f_¼r依赖项来缓解,因为它目前已经与许多用于下载软件包的操作系统结合在一起。

    说清楚:我是 谈论简单地为工件提供MD5或SHA1哈希。这已经完成了,但是这些散列存储在与工件相同的位置。因此,一旦恶意黑客破坏了存储库并可以替换工件,他们也可以替换散列。

    因此,最迫切需要的是某种pki,它允许开发人员对他们的工件进行签名,并允许Maven验证这些签名。由于签名是使用开发人员的私钥完成的,因此只有存储库受到破坏时,才能对其进行篡改。

    有人知道马文的情况吗?

    4 回复  |  直到 9 年前
        1
  •  4
  •   Pascal Thivent    15 年前

    更新: 下面提到的校验和实际上只用于完整性检查,并且确实与工件一起存储,因此它们不会回答问题。

    实际上,需要使用pgp对工件进行签名,以便将它们上载到与中心同步的存储库(即 Maven GPG Plugin 有助于此步骤)。若要在下载时验证签名,请使用支持此功能的存储库管理器。从 How to Generate PGP Signatures with Maven :

    如果使用下载工具 来自中央马文的文物 存储库,您需要确保 您正在努力验证 这些工件具有有效的PGP 可验证的签名 公钥服务器。如果你不这样做 验证签名,则没有 保证你是什么样的人 下载是原始工件。 验证签名的一种方法 工件将使用存储库 像Nexus职业经理人。在 您可以配置Nexus专业版 采购套件检查 为有效的pgp下载的项目 签名并验证签名 针对公共密钥服务器。

    如果您正在开发软件,请使用 Maven,你应该生成一个pgp 发布的签名。 发布软件有效 签名意味着你的客户 可以验证软件工件 由原始作者生成 它没有被修改 任何过境人员。最大的开源软件 像Apache软件一样伪造 基金会要求所有项目 由发布经理发布 密钥已由其他成员签名 如果你想要的话 同步软件工件 到马文中心,你必须 provide pgp signatures .

    也见


    maven安装插件可以配置为 create integrity checksums (md5,sha-1)并且您可以为每个存储库配置校验和策略(请参见 checksumPolicy )

    Maven存储库管理员也可以/应该能够处理它们。例如,请参见:

        2
  •  5
  •   Community CDub    8 年前

    DR :

    Maven中不存在的验证机制和POM的DSL中缺少的语言结构是严重的安全威胁。直到 MNG-6026 地址,使用 Gradle Witness .

    介绍

    到目前为止提供的所有答案似乎都不能解决这个问题。 签名工件只是第一步 朝着正确的方向。但是,用于签名工件的密钥被认为是可信/有效的条件是非常不透明的。例如:如何 pgpverify-maven-plugin Nexus Professional 实际验证签名对工件有效吗?仅仅从keyserver检索密钥并验证工件是不够的。

    索纳泰克在他们的 blog post :

    PGP签名:另一个级别

    在消费方面,您可以在Nexus专业版中使用采购。 检查签名是否存在,以及在发布端 用pgp签名签署您的发行版并制作pgp签名 在公共密钥服务器上可用将帮助人们重新检查 工件和校验和是一致的。 注:我认为还有更多 创建鼓励使用PGP密钥的工具需要做的工作 更重要的是,给存储库管理员一些控制权 关于哪些密钥值得信任。

    (强调矿山)

    使用信任信息扩展项目对象模型(POM)

    我们需要的是能够从您的项目或工件到声明的依赖项建立信任关系模型。因此,如果所有相关方都声明了这种关系,我们就能够从依赖项的根(例如项目)到最后一个可传递依赖项创建一个“信任链”。这个 Project Object Model (POM) 需要通过依赖项的<验证/>元素进行扩展。

    现状

    现在我们有

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.0</version>
    </dependency>
    

    硬依赖项

    对于硬依赖项,<verification/>可能包括工件的sha256sum及其pom文件:

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.0</version>
      <verification>
        <checksum hash='sha-256'>
          <pom>[sha256 of junit pom file]</pom>
          <artifact>[sha256sum of artifact (junit.jar)]</artifact>
        </checksum>
      </verification>
    </dependency>
    

    软依赖项

    如果使用软依赖或范围依赖,那么我们可以指定用于对工件进行签名的密钥对的公钥(或多个)。

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>[4.0,4.5)</version>
      <verification>
        <openpgp>[secure fingerprint of OpenPGP key]</openpgp>
        <!-- possible further 'openpgp' elements in case the artifacts in the
             specified version range where signed by multiple keys -->
      </verification>
    </dependency>
    

    现在呢?

    多亏了 peter 触发了我,我为ApacheMaven提出了一个特性请求: MNG-6026 . 让我们看看接下来会发生什么。

    其他方法

    年级证人 对Gradle做类似的事情。但它也有一些缺点:

    • 它建在Gradle的顶部(并内置pom)
    • 它只允许硬依赖项,因为它使用哈希。

    这似乎同样适用于 Maven Enforcer Plugin .

    pgpverify-maven-plugin 表面上也遵循这种方法。虽然缺少文档,但 test for a so called keysMap property ,这也 appears in the config file as keysMapLocation .

        3
  •  0
  •   Atilla Ozgur    15 年前

    “可以通过引入加密签名验证f_¼r依赖项来缓解此问题,因为它目前已与许多用于下载软件包的操作系统结合在一起。”

    您要签名的JAR文件。 http://download-llnw.oracle.com/javase/1.3/docs/tooldocs/win32/jarsigner.html

    您需要用适当的措施保护您的私钥。但是,如果你对这样的镇定妄想,你可能需要考虑一下公钥基础设施PKI。

        4
  •  0
  •   Val Blant    11 年前

    现在可以使用此插件验证Maven中的PGP签名: http://www.simplify4u.org/pgpverify-maven-plugin/index.html

    以下是如何在父级中配置它 pom.xml :

    <build>
        <plugins>
    
            <plugin>
                <groupId>com.github.s4u.plugins</groupId>
                <artifactId>pgpverify-maven-plugin</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <pgpKeyServer>https://pgp.mit.edu</pgpKeyServer>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>check</goal>
                        </goals>
                        <phase>install</phase>
                    </execution>
                </executions>
            </plugin>           
    
        </plugins>
    
    </build>
    

    此配置将PGP检查绑定到 install 相位。

    如果不想一直运行检查,请删除 <executions /> 元素并像这样手动运行它:

    mvn com.github.s4u.plugins:pgpverify-maven-plugin:check