谈谈我对云原生与软件供应链安全的思考

作者:易立

2011 年,互联网技术先驱 Marc Andreessen 宣称,软件正在吞噬世界(Software is eating the world)。由软件驱动的行业创新正在颠覆着传统业务模式,推动着全球经济实现数字化连接。随着互联网的快速发展,数字化转型已经成为每一个企业的关键战略。但是现代软件开发涉及到多方协作,大量应用依赖开源代码或者三方组件。在上游开源软件的安全问题会传递到下游应用方并被放大,有可能给企业造成重大的安全风险和业务损失。

软件生产的过程与传统制造业在很多方面是相似的。软件制造商将自研业务代码和第三方组件组合成完整的软件,构建流程会将这些组件打包成为可部署的软件制品,然后被企业客户部署到生产环境中。这个过程被形象地称为“软件供应链”。而软件供应链安全的目标是保软件从开发到部署的整个生命周期的安全、可信赖。

在这里插入图片描述
在这里插入图片描述

在 Sonatypes’s 2021 State of the Software Supply Chain 调查报告中,2021 年软件供应链攻击事件增长了 650%。

目前,软件供应链安全已经得到行业的高度重视。已经有很多国家出台了相关的政策法规来指导本国的供应链安全管理,以提高供应链安全韧性。2021 年 4 月,美国网络安全与基础设施安全局(CISA)和美国国家标准与技术院(NIST)联合发布《防御软件供应链攻击》报告,首次对软件供应链进行界定,并给出与软件供应链攻击相关的信息、关联风险以及缓解措施。

谷歌也提出了 Supply chain Levels for Software Artifacts - 软件制品的供应链等级,简称为 SLSA。SLSA 是 Google 内部实施的多年的安全流程的开源版本,提供了一个安全框架和一组最佳实践,来预防因为源代码篡改、三方组件漏洞、制品仓库入侵产生的安全威胁。

在这里插入图片描述

SBOM-提升软件构成透明度

软件供应链安全的基础就是透明性。只有理解了应用是如何从代码和依赖组件构建而成,我们才可以对应用的安全风险进行有效的治理。在美国 2021 年颁布的《关于改善国家网络安全的行政命令》行政令中,特别要求政府软件应包含机器可读的软件物料清单(Software Bill Of Materials, SBOM)。SBOM 是包含构建软件使用的各种组件的详细信息和供应链关系的正式记录。

美国国家电信和信息管理局(NITA)在 14028 号政令的要求下,在 2021 年 7 月 12 日发布了《SBOM 的最低要素》,该文档为各开发工具的组织和厂商提供了 SBOM 数据格式的参考。在新一代软件开发工具中,越来越多的软件提供了对 SBOM 的支持。

应用的 SBOM 信息

下面我们以一个 Golang 的 HTTP Server 示例应用为例,了解一下 SBOM 的的概念和使用方式。

$ git clone https://github.com/denverdino/secure-supply-chain-sample
$ cd secure-supply-chain-sample
$ go build .

熟悉 Go 语言的开发者一定对 go 模块概念非常熟悉。应用所依赖的模块,都通过 go.mod 文件声明。go mod tidy 命令可以用来更新 go.mod 文件,并”锁定“所依赖的模块和版本信息,这大大提升了构建的确定性、可重现性和可验证性。为了确保第三方无法篡改所依赖的模块版本, 在 go.sum 文件记录了每个模块依赖的加密哈希值。当利用go命令将模块代码下载到本地时,就会计算其哈希值,如果计算结果与 go.sum 记录的数据不符就意味着存在篡改的风险。更近一步,Google 运营着一个 Go 模块校验数据库服务,它记录了 go 模块版本的加密哈希值,进一步提升了 Go 基础设施的安全性。

更多内容可以阅读:

https://go.dev/blog/supply-chain

对于已编译的应用二进制文件,我们可以通过 go version -m 命令查看应用的构建信息,包括其软件来源,依赖模块,构建参数等等。

$ go version -m secure-supply-chain-sample
secure-supply-chain-sample: go1.18.3
    path    github.com/denverdino/secure-supply-chain-sample
    mod    github.com/denverdino/secure-supply-chain-sample    (devel)
    dep    github.com/sirupsen/logrus    v1.8.1    h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
    dep    golang.org/x/sys    v0.0.0-20220702020025-31831981b65f    h1:xdsejrW/0Wf2diT5CPp3XmKUNbr7Xvw8kYilQ+6qjRY=
    build    -compiler=gc
    build    CGO_ENABLED=1
    build    CGO_CFLAGS=
    build    CGO_CPPFLAGS=
    build    CGO_CXXFLAGS=
    build    CGO_LDFLAGS=
    build    GOARCH=amd64
    build    GOOS=darwin
    build    GOAMD64=v1
    build    vcs=git
    build    vcs.revision=c630057157df402b658ab97139895337633b5bbc
    build    vcs.time=2022-07-04T01:33:01Z
    build    vcs.modified=false

容器镜像的 SBOM 支持

容器技术重塑了整个软件供应链。容器镜像将应用及其所有依赖项打包,从而使应用可以在不同的计算环境之间快速、可靠地运行。容器镜像已经成为了应用分发的标准,而 Kubernetes 成为了分布式资源调度和编排的事实标准。那么如何保障容器镜像在构建、分发和运行时的完整性、安全性呢?

我们继续以上面的 Golang 应用为例,介绍一下现容器化软件供应链安全的最新实践和工具链。

Ko 是 Google 开源的一个简单、快速的 Go 应用程序容器镜像构建器。今天我们只聚焦于 Ko 在软件供应链的一些设计,大家可以举一反三,应用在自己的语言和项目中。

无需编写 Dockerfile,利用 Ko build 我们可以将一个 Golang 项目构建成为一个 Docker 镜像。

$ cat .ko.yaml
defaultBaseImage: knative-dev-registry.cn-hangzhou.cr.aliyuncs.com/distroless/static:nonroot

$ export KO_DOCKER_REPO=knative-dev-registry.cn-hangzhou.cr.aliyuncs.com/denverdino
$ ko build -B .
2022/07/02 21:05:33 Using base knative-dev-registry.cn-hangzhou.cr.aliyuncs.com/distroless/static:nonroot@sha256:66cd130e90992bebb68b8735a72f8ad154d0cd4a6f3a8b76f1e372467818d1b4 for github.com/denverdino/secure-supply-chain-sample
2022/07/02 21:05:33 Building github.com/denverdino/secure-supply-chain-sample for linux/amd64
2022/07/02 21:05:34 Publishing knative-dev-registry.cn-hangzhou.cr.aliyuncs.com/denverdino/secure-supply-chain-sample:latest
2022/07/02 21:05:35 existing blob: sha256:64ef75a9b8ab92a78ea225f1e707dfee0434dcf7cb0e0b5a8b5020e6b737b791
2022/07/02 21:05:35 existing blob: sha256:3f99978937439fa8ef418c3f36e755f10d175ba218dda5f42846a52b8dca002d
2022/07/02 21:05:35 knative-dev-registry.cn-hangzhou.cr.aliyuncs.com/denverdino/secure-supply-chain-sample:sha256-cd1ac13d65aa8983f6c10317a09b994cd66fa46aceb1ba1eaf2cab4ee2038ec3.sbom: digest: sha256:0500ec91074135a2774c87fe86833c0267713be9e78cc4ea86b86cc42701fd0a size: 368
2022/07/02 21:05:35 Published SBOM knative-dev-registry.cn-hangzhou.cr.aliyuncs.com/denverdino/secure-supply-chain-sample:sha256-cd1ac13d65aa8983f6c10317a09b994cd66fa46aceb1ba1eaf2cab4ee2038ec3.sbom
2022/07/02 21:05:36 existing blob: sha256:7d883a3eb1c556752c73dedf88da2c0d3943b9f5c3f763cdd7a813ca766f5486
2022/07/02 21:05:36 existing blob: sha256:2
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值