Cryptography 为厨师配方文件的部分签名以防止篡改的策略

Cryptography 为厨师配方文件的部分签名以防止篡改的策略,cryptography,code-signing,chef-infra,Cryptography,Code Signing,Chef Infra,我正在寻求社区对解决此问题的最佳方法的建议: 我在git中收集了厨师食谱,定义了一些实验室,例如jenkins CI设置,人们可以根据自己的需要使用这些食谱 然而,我可以预见到有人可能想要在食谱中添加某些不可变的部分的情况,例如防火墙设置 锁定文件的某些部分以验证其未被更改,同时允许在该部分之外进行任意更改,这种策略有什么意义 理想情况下,它还可以解决在需要时混淆部分的问题 我是否会在代码中添加我自己的DSL(每个受保护的块都有一个校验和),在将其传递给chef之前,对其进行预处理以展开和验证

我正在寻求社区对解决此问题的最佳方法的建议:

  • 我在git中收集了厨师食谱,定义了一些实验室,例如jenkins CI设置,人们可以根据自己的需要使用这些食谱

  • 然而,我可以预见到有人可能想要在食谱中添加某些不可变的部分的情况,例如防火墙设置

  • 锁定文件的某些部分以验证其未被更改,同时允许在该部分之外进行任意更改,这种策略有什么意义

  • 理想情况下,它还可以解决在需要时混淆部分的问题

  • 我是否会在代码中添加我自己的DSL(每个受保护的块都有一个校验和),在将其传递给chef之前,对其进行预处理以展开和验证

    e、 我第一次尝试使用一种格式——仍然不能解决人们仅仅删除所有签名部分的问题——除非每个文件都必须签名

    #---SIGNED-FILE SHA-256 507e74380188c07bad2fa66acb8cbbeeb63f84fcee5fd639499575654239cd49
    
    #
    # Cookbook Name:: jenkins
    # Recipe:: default
    #
    
    # https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Ubuntu
    # This is super-simple, compared to the other Chef cookbook I found
    # for Jenkins (https://github.com/fnichol/chef-jenkins).
    #
    # This doesn't include Chef libraries for adding Jenkin's jobs via
    # the command line, but it does get Jenkins up and running.
    
    include_recipe "apt"
    include_recipe "java"
    
    #---SIGNED-SECTION-START SHA-256 e4d3d02f14ee2a6d815a91307c610c3e182979ce8fca92cef05e53ea9c90f5c7
    apt_repository "jenkins" do
      uri "http://pkg.jenkins-ci.org/debian"
      key "http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key"
      components ["binary/"]
      action :add
    end
    #---SIGNED-SECTION-END
    
    #---OBFUSCATED-SECTION-START SHA-256 5f536f2137dc7e2c5817de861d1329ead72b1e9d2dbb9dbe181ec7bc274dddeb
    YXB0X3JlcG9zaXRvcnkgImplbmtpbnMiIGRvCiAgdXJpICJodHRwOi8vcGtnLmplbmtpbnMtY2kub3JnL2RlYmlhbiIKICBrZXkgImh0dHA6Ly9wa2cuamVua2lucy1jaS5vcmcvZGViaWFuL2plbmtpbnMtY2kub3JnLmtleSIKICBjb21wb25lbnRzIFsiYmluYXJ5LyJdCiAgYWN0aW9uIDphZGQKZW5k
    #---OBFUSCATED-SECTION-END
    
    package "jenkins"
    
    service "jenkins" do
      supports [:stop, :start, :restart]
      action [:start, :enable]
    end
    

    如果文件以签名部分开头,描述在整个文件中可以找到的签名实体,那么设计如何呢。然后,您的解析代码需要检查每个实体是否如所述存在,并且没有被删除

    为了防止重播攻击,您需要在每个签名中包含一个时间戳,并在每次更改任何签名部分时重新计算整个文件中的签名。因此,文件仅在以下情况下有效:

    • 文件中存在“标题”中描述的签名实体

    • 每个签名验证并包含相同的时间戳

    • 可选:签名时间戳是否与文件时间戳匹配(在可接受的增量内)

    剩下的风险是有人用以前的版本替换整个文件(即,有效地删除他们不喜欢的新部分)。我不确定您如何能够抵御这种情况,除非您可以像上面建议的那样检查文件时间戳


    注意。我的回答假设了在创建和解析文件时可以实现什么。我可能误解了您环境的限制(我不熟悉git),如果是这样,请不要理我

    文件以签名部分开头的设计如何,描述在整个文件中可以找到的签名实体。然后,您的解析代码需要检查每个实体是否如所述存在,并且没有被删除

    为了防止重播攻击,您需要在每个签名中包含一个时间戳,并在每次更改任何签名部分时重新计算整个文件中的签名。因此,文件仅在以下情况下有效:

    • 文件中存在“标题”中描述的签名实体

    • 每个签名验证并包含相同的时间戳

    • 可选:签名时间戳是否与文件时间戳匹配(在可接受的增量内)

    剩下的风险是有人用以前的版本替换整个文件(即,有效地删除他们不喜欢的新部分)。我不确定您如何能够抵御这种情况,除非您可以像上面建议的那样检查文件时间戳


    注意。我的回答假设了在创建和解析文件时可以实现什么。我可能误解了您环境的限制(我不熟悉git),如果是这样,请不要理我

    我的一位同事的建议提出了一条有趣的探索之路:如果我们试图提供一个人们可以继承的不可变的“基本配方”,那么也许我们可以使用git基类的SHA-1键来确保保留这些部分。我的一位同事的建议提出了一条有趣的探索之路:如果我们试图提供一个人们可以继承的不可变的“基本配方”,那么也许我们可以使用git基类的SHA-1键来确保保留这些部分。我还没有想清楚所有的细节。邓肯-谢谢你的回答。这基本上就是我考虑的策略。目前,我正在现实世界测试中尝试几个不同的场景,以了解操作上的“需要”等。我将在这里发布我的经验更新。邓肯-谢谢你的回答。这基本上就是我考虑的策略。目前,我正在现实世界测试中尝试几个不同的场景,以了解操作上的“需要”等。我将在这里发布我的经验更新。