SLSA 框架与软件供应链安全防护

随着近些年针对软件供应链发起的攻击次数越来越多,Google 发布了一系列指南来确保软件包的完整性,目的是为了防止未经授权的代码修改影响软件供应链。

Google 的 SLSA 框架(Supply-chain Levels for Software Artifacts 软件制品的供应链级别)是通过识别 CI/CD 流水线中的问题并减小影响,为实现更安全的软件开发和部署流程提供建议。

目录

  1. 什么是SLSA
  2. 软件供应链中的问题
    2.1 供应链攻击包括哪些
    2.2 真实世界的例子
  3. SLSA等级
    3.1 详细解释
    3.2 限制
  4. SLSA落地
  5. 其他工具

什么是SLSA

SLSA 全名是 Supply chain Levels for Software Artifacts, or SLSA (发音“salsa”).

SLSA 是一个端到端框架,一个标准和控制的清单确保软件构建和部署过程的安全性,防止篡改源代码、构建平台以及构件仓库而产生的威胁。

软件供应链中的问题

任何软件供应链都可能引入漏洞,随着系统变得越来越复杂,做好最佳实践从而保证交付工件的完整性变得非常重要。如果没有一定的规范和系统发展计划,就很难应对下一次黑客攻击。

供应链攻击包括哪些

Supply Chain Threats

A 提交未经认证的修改
B 泄露源码仓库
C 从被修改源代码构建
D 泄露构建过程
E 使用已泄露的依赖
F 上传被修改的包
G 泄露了包仓库
H 使用已泄露的包

真实世界的例子

完整性威胁 已知例子 SLSA 如何提供帮助
A 提交未经认证的修改 研究人员试图通过邮件列表上的
补丁程序故意将漏洞引入 Linux 内核。
两人审查发现了大部分(但不是全部)漏洞。
B 泄露源码仓库 PHP:攻击者破坏了 PHP 的自托管
git 服务器并注入了两个恶意提交。
一个受到更好保护的源代码平台
将成为攻击者更难攻击的目标。
C 从被修改源代码构建 Webmin:攻击者修改了构建基础设施
以使用与源代码控制不匹配的源文件。
符合 SLSA 标准的构建服务器会生成出处,
以识别实际使用的来源,从而使消费者能够检测到此类篡改。
D 泄露构建过程 SolarWinds:攻击者破坏了构建平台
并安装了在每次构建期间注入恶意行为的植入程序。
更高的 SLSA 级别需要对构建平台进行更强大的安全控制,
这使得妥协和获得持久性变得更加困难。
E 使用已泄露的依赖 event-stream:攻击者添加了一个无害的依赖项,然后更新了该依赖项
以添加恶意行为。更新与提交到 GitHub 的代码不匹配(即攻击 F)。
递归地将 SLSA 应用于所有依赖项会阻止这个特定的向量,因为
出处会表明它不是由适当的构建器构建的,或者源不是来自 GitHub。
F 上传被修改的包 CodeCov:攻击者使用泄露的凭据将恶意工件上传到
Google Cloud Storage(GCS),用户可以从中直接下载。
GCS 中工件的出处表明工件不是以
预期的方式从预期的源代码库中构建的。
G 泄露了包仓库 对包镜像的攻击:研究人员为几个流行的
包存储库运行镜像,这些镜像可能被用来提供恶意包。
与上面的 (F) 类似,恶意工件的来源表明它们不是
按预期构建的,也不是来自预期的源代码库。
H 使用已泄露的包 Browserify typosquatting:攻击者
上传了一个与原始名称相似的恶意包。
SLSA 不直接解决这种威胁,但将出处链接回源代码控制
可以启用和增强其他解决方案。

SLSA等级

Read More

如何在 DevOps 任务中使用 ChatGPT?

随着 DevOps 的流行,越来越多的开发团队正在寻找一些工具来帮助他们更好地完成任务。ChatGPT 是一款基于人工智能的自然语言处理工具,它可以用来帮助开发团队在 DevOps 任务中更加高效地工作。

本文将探讨如何在 DevOps 任务中使用 ChatGPT。

一、ChatGPT 简介

ChatGPT 是一款由 OpenAI 开发的人工智能自然语言处理工具。它可以用于许多不同的应用程序,例如语音识别、自然语言处理、文本生成等。
ChatGPT 使用深度学习技术,可以生成与输入内容相关的文本。它是一款非常强大的工具,可以帮助开发团队更加高效地工作。

二、ChatGPT 在 DevOps 中的应用

在 DevOps 中,开发团队通常需要快速解决问题,并与团队成员和客户进行有效沟通。ChatGPT 可以用来帮助解决这些问题。

  1. 自动化代码审查
    开发团队通常需要花费大量时间来进行代码审查。ChatGPT 可以用来自动化这个过程。它可以根据代码库中的样本代码,生成与样本代码风格相似的代码,并对新代码进行审查。这可以帮助开发团队更快地进行代码审查,并减少人为错误的可能性。

  2. 自动化测试
    测试是 DevOps 中不可或缺的一部分。ChatGPT 可以用来自动化测试。它可以根据测试用例生成相应的测试代码,并对测试结果进行评估。这可以帮助开发团队更快地进行测试,并减少人为错误的可能性。

  3. 自动化部署
    部署是 DevOps 中不可或缺的一部分。ChatGPT 可以用来自动化部署。它可以根据部署规则生成相应的部署代码,并对部署结果进行评估。这可以帮助开发团队更快地进行部署,并减少人为错误的可能性。

  4. 自动化文档生成
    文档是 DevOps 中不可或缺的一部分。ChatGPT 可以用来自动化文档生成。它可以根据项目的代码库和测试用例生成相应的文档,并对文档的质量进行评估。这可以帮助开发团队更快地生成文档,并减少人为错误的可能性。

三、如何使用 ChatGPT

要使用 ChatGPT,开发团队需要进行以下步骤:

Read More

为什么我的 Jenkins Controller 越来越慢?可能犯了这些错误...

就像标题所说的,为什么我的 Jenkins Controller 越来越慢,可能是因为没有遵循 Jenkins pipeline 编写的一些最佳实践。

所以主要介绍 Jenkins pipeline 的一些最佳实践,目的是为了向 pipeline 作者和维护者展示一些他们过去可能并没有意识到的“反模式”。

我会尽量列出所有可能的 Pipeline 最佳实践,并提供一些实践中常见的具体示例。

一般问题

确保在 pipeline 中使用 Groovy 代码作为粘帖剂

使用 Groovy 代码连接一组操作而不是作为 pipeline 的主要功能。

换句话说,与其依赖 pipeline 功能(Groovy 或 pipeline 步骤)来推动构建过程向前发展,不如使用单个步骤(例如 sh)来完成构建的多个部分。

pipeline 随着其复杂性的增加(Groovy 代码量、使用的步骤数等),需要 controller 上的更多资源(CPU、内存、存储)。将 Pipeline 视为完成构建的工具,而不是构建的核心。

示例:使用单个 Maven 构建步骤通过其构建/测试/部署过程来驱动构建。

在 Jenkins pipeline 中运行 shell 脚本

在 Jenkins Pipeline 中使用 shell 脚本可以通过将多个步骤合并到一个阶段来帮助简化构建。shell 脚本还允许用户添加或更新命令,而无需单独修改每个步骤或阶段。

Jenkins Pipeline 中使用 shell 脚本及其提供的好处:

Read More

2022 年终总结

时间过得好快,又过完了一年。

今年想写一些总结回顾一下过去的一年发生在自己身上的重要事件。

由于 2021 年没有写年终总结,2021 年在我的脑海里已经变化模糊,我只能凭着一些照片和日记才想起来的一些事情。看来以后的年终总结不能落下。

Read More

How to implement [skip ci] for Jenkins multi-branch pipeline

When I want to implement [skip ci] or [ci skip] for Jenkins multi-branch pipeline, the existing plugin seems broken.

Read More

How to fix "Temporary Failure in name resolution" in WSL

Problem

I have encountered a problem when I ping google.com failed and return some error like “Temporary failure in name resolution”

How to fix

  1. Inside WSL2, create or append file: /etc/wsl.conf

  2. Put the following lines in the file in order to ensure the your DNS changes do not get blown away

    sudo tee /etc/wsl.conf << EOF
    [network]
    generateResolvConf = false
    EOF

Read More

Restrict others from login your important Linux machine

If you have a critical machine like your team’s CI server that runs on Linux, so you don’t want every members in your group to access it.

Modifying this setting /etc/security/access.conf on Linux can do it.

How to setup

I commented out the access settings for TEAM A, and add some user accounts can access.

#+ : (SRV_WW_TEAM_A_CompAdmin) : ALL
+ : shenx, map, xiar : ALL

Read More

C/C++ 代码格式化和静态分析检查的一站式工作流 Cpp Linter

本篇是关于 C/C++ 代码格式化和静态分析检查的实践分享。

目前 C/C++ 语言的代码格式化和检查工具使用的最为广泛的是 LLVM 项目中的 Clang-FormatClang-Tidy

LLVM 项目是模块化和可重用的编译器和工具链技术的集合。

对于 C/C++ 代码格式化和静态分析检查用到是 LLVM 项目中 clang-format 和 clang-tidy,放在一起我们称它为 clang-tools。

虽然我们有了工具,但如何把工具更好的集成到我们的工作流中才是本篇重点要讨论的。

cpp-linter 组织的诞生就是为 C/C++ 代码格式化和静态分析检查提供一站式的工作流,包括:

  1. 方便下载 clang-tools,提供了 Docker images 和 binaries 两种使用方式;
  2. 方便与工作流进行集成,包括与 CI 以及 git hooks 的集成。

下面介绍如何使用 clang-tools 下载工具,以及集成到工作流中。

Read More

How to create GPG keys and add to GitHub

First, List your GPG key

# If folders does not exist will create be related automatically
$ gpg --list-keys
gpg: directory '/home/ubuntu/.gnupg' created
gpg: keybox '/home/ubuntu/.gnupg/pubring.kbx' created
gpg: /home/ubuntu/.gnupg/trustdb.gpg: trustdb created

$ gpg --list-key

Second, generate GPG key

Read More

12 周的陪产假我一刻都没闲着

有幸赶上了公司的政策变化,我有 12 周的陪产假来做全职奶爸,照顾家人的同时希望挤出时间来学习,毕竟在职期间很有有机会能有近 3 个月的假期。

照顾孩子兼顾学习真不是一件轻松的事情,我尽力兼顾了两者,做了如下的流水账记录。

计划

我知道 12 周会很快过去,就在已经快要过去了 2 周时我决定有计划的来完成一些任务,比如:

  • 完成《代码整洁之道》、《重构》以及《动手学习深度学习这三本书》的阅读和豆瓣评论
  • 为 pre-commit 写一个 clang-format 和 clang-tidy 的 cpp-linter-hooks
  • 完成每个月 15 节英语课以及 3~4 的体育锻炼(游泳和足球)
  • 找一个可以作为长期业余参与的开源项目,例如 pytest,tox,pypa。

也就是从休假的第 2 周开始,我开始记录每周的完成的小任务。

Read More

在 Windows 做开发还能这么爽?WSL + VS Code + Docker Desktop 你值得有用

很久以来很多程序员都遇到过在 Windows 做开发的各种不便:

比如设置开发环境不能像 Linux 和 Mac 那样只需要输入一行命令就能安装各种 command 和 package,因此有的程序员从此转到了 Mac 上开发,也有的干脆就使用 Linux 作为开发机,只有那些不得不使用 Windows 作为开发环境程序员还一直留在了 Windows 上继续凑合中。

直到 WSL 的到来,准确来说是 WSL2。

WSL + VS Code + Docker Desktop 这三剑客的组合,开始让我觉得在 Windows 上做开发是一件非常爽的事情。

什么是 WSL

WSL 是 Windows Subsystem for Linux 的缩写,它是 Windows 10 操作系统的一项功能,使你能够在 Windows 上直接运行 Linux 文件系统,以及 Linux 命令行工具和 GUI 应用程序,并与传统的 Windows 桌面和应用程序一起运行。

WSL 的最低版本要求是 Windows 10 version 1903 及更高。

WSL 是专为那些需要使用 Linux 的开发人员所开发的,例如从事网络开发人员、开源项目、以及需要部署到 Linux 服务器环境的开发者。

WSL 适用于喜欢使用 Bash、常用 Linux 工具(sed、awk等)和 Linux 优先框架(Ruby、Python 等),同时也喜欢使用 Windows 作为生产力工具的人。

下面来看看 WSL 和虚拟机相比有哪些优势。

Read More

关于 Docker,containerd,CRI,CRI-O,OCI,runc 的解释以及它们是如何工作在一起的

自 Docker 开启了使用容器的爆发式增长,有越来越多的工具和标准来帮助管理和使用这项容器化技术,与此同时也造成了有很多术语让人感到困惑。

比如 Docker, containerd, CRI, CRI-O, OCI, runc,本篇将介绍这些你听过但并不了解的术语,并解释容器生态系统是如何在一起工作的。

容器生态系统

容器生态系统是由许多令人兴奋的技术、大量的专业术语和大公司相互争斗组成的。

幸运的是,这些公司偶尔会在休战中走到一起合作,商定一些标准,这些标准有助于使这个生态系统在不同的平台和操作系统之间更具互操作性,并减少对单一公司或项目的依赖。

这张图显示了 Docker、Kubernetes、CRI、OCI、containerd 和 runc 在这个生态系统中是如何结合的。

Read More

How to enable, configure and disable Jenkins LDAP

Introduction

In organizations, using LDAP login very common way for users to log in with their credentials.

How to configure LDAP

Preparation: Installed LDAP Jenkins plugin

LDAP plugin

About how to configure it, you can refer to Jenkins LDAP Plugin documentation https://plugins.jenkins.io/ldap/

This is my LDAP configuration just for testing.

Read More

靠谱:在不删除和重建 GitHub 仓库的情况下与父(Fork)仓库分离(Unfork)

背景

有开发者、甚至公司可能会遇到过以下几个问题:

  1. 最开始 Fork 了一个仓库,之后做了大量的修改,从功能到开发语言,已经与父仓库各自发展了
  2. 由于是 Fork 的仓库,在每次提 Pull Request 的默认目标分支是父仓库,一不注意就会提 PR 到父仓库里去了
  3. Fork 的仓库有人贡献并使用了,但不能显示贡献者,以及该项目被哪些其他的项目所使用,这不利于项目的发展

基于这些问题,开发者会考虑与父仓库进行分离,但目前 GitHub 没有提供 Unfork/Detach 的功能。

如果直接删除项目并重建可以达到分离的目的,但这样会丢失一些重要的信息,比如项目中的 Issues,Wikis 以及 Pull Requests 等。

Unfork 跟某节旗下某引擎白嫖 Apache SkyWalking 有本质区别,它更像是 Hudson 和 Jenkins 的分道扬镳。

解决办法

在经过一番调查和测试,目前最可行的办法就是通过 GitHub Support 来处理,具体操作如下:

Read More

在 Jenkins 上用了这么久的 Groovy,是时候认识一下它了

在使用 Jenkins 和 Groovy 越久,我就这样的疑问:

Groovy 到底是什么语言?
Groovy 有哪些特性?
Groovy 和 Java 有什么区别?
Groovy 和 Java 如何选择?
Groovy 在整个开发语言中占什么位置?要不要学?

本篇我的学习结果的分享,希望也能帮助你解答以上的这些问题。

什么是 Groovy

Apache Groovy 是一种强大的、可选类型的动态语言,具有静态类型和静态编译功能,适用于 Java 平台,旨在通过简洁、熟悉且易于学习的语法提高开发人员的工作效率。
它与任何 Java 程序顺利集成,并立即为你的应用程序提供强大的功能,包括脚本功能、特定领域语言创作、运行时和编译时元编程和函数式编程。

Groovy 的特性

翻译官方的说法,Groovy 有以下六大特性。

  1. 平坦的学习曲线 - 简洁、易读且富有表现力的语法,Java 开发人员易于学习
  2. 强大的功能 - 闭包、构建器、运行时和编译时元编程、函数式编程、类型推断和静态编译
  3. 流畅的 Java 集成 - 与 Java 和任何第三方库无缝、透明地集成和互操作
  4. 领域特定语言 - 灵活可延展的语法,先进的集成和定制机制,在你的应用程序中集成可读的业务规则
  5. 充满活力和丰富的生态系统 - Web 开发、响应式应用程序、并发/异步/并行库、测试框架、构建工具、代码分析、GUI 构建
  6. 脚本和测试胶水 - 非常适合编写简洁和可维护的测试,以及所有构建和自动化任务

Groovy 和 Java 的区别

Read More