乐高式扩展:在Seal软件供应链防火墙中轻松集成代码规范工具

上个月,Seal 软件供应链防火墙 v0.2(以下简称“Seal”)正式发布,这一版本实现了可扩展架构,用户可以根据自身需求插件式集成原生或第三方解决方案,灵活扩展扫描能力。

在前一个版本中,Seal 集成了 SCA、SAST 和配置检查等功能,在这一架构中最大的优势是调试方便、调用链路短,但同时也伴随着模块耦合、依赖树深以及扩展困难等问题。因此,在新版本中使用了新的 ⌈插件化框架⌋ 来重构了 SCA、SAST和配置检查的集成,并以此解决上面谈及的扩展性问题。

之前的演示中,我们展示了如何使用 v0.2.0 的插件管理:把IaC 配置检查 ⌈插件⌋,⌈无缝⌋地集成到 Seal 里。本文将介绍插件化框架的底层原理以及演示如何将代码规范工具集成到 Seal软件供应链防火墙中。

插件化框架的工作原理

通常,实现一个框架的插件化,我们需要考虑以下问题:

  1. 降低插件化的成本。
  2. 规范插件调用的输入输出。
  3. 配置(限制)插件调用的权限。
  4. (可选)管理插件调用的状态数据。

Seal 通过让插件的改动最小化来降低插件化的成本,换言之,Seal 可以让插件保留其原有的配置方式,用户仅需适配插件调用的输入输出即可。插件的配置项可以通过 Seal 的策略面板暴露成策略,最终作用到 Seal 的各个拦截点上。

# policies.yaml
- code: # <string>, 策略代码,唯一标识
  category: # <string>, 策略分类,所在的一级组
  type: # <string>, 策略类型,所在的二级组
  name: # <string>, 策略名称(或原有配置项的名称)
  description: # <string>, 策略描述(或原有配置项的描述)
  enabled: # <bool>, 默认启用
  builtIn: # <bool>, 默认内置(内置,是相对于使用插件的使用者而言)
  bindings: # 作用的拦截点
    isAllResource: # <bool>, 作用于源代码仓库
    isAllProxy: # <bool>, 作用于代理
  constraint: {} # 约束,结构化的配置
  expression: "" # 表达式或原配置项
  action: # <string>, 违反该策略后,应该做出的动作
  severity: # <string>, 违反该策略后,应该声明的严重程度
 - code: ...
   category: ...
   ...

然后, Seal 在某个拦截点上运行检查时,会拉取相应的已启用的策略,生成配置文件和拦截点上的状态数据(例如,对于源码仓库的检测,拦截点为源码仓库,状态数据为检测时刻的源代码)作为插件调用的输入。当插件检查完毕后,将结果以 SARIF的格式输出到指定路径。

最后, Seal 将所有插件的 SARIF 输出汇总,并根据策略定义的行为(action)决定实施拦截、通过还是告警。

另外,对于信任(trusted)的插件,Seal 会在插件调用时注入 API Token (SEAL_API_TOKEN),从而允许插件获得 Seal 的能力:风险评估、漏洞数据、合规信息等。

集成代码规范工具

假设,有个 style-checker 的组件,它可以检查源代码的书写规范,支持丰富的风格检查配置。其中,有一条配置项:K&R 风格检查。当源代码中有风格违反配置规则时,style-checker 会输出失败信息。

style-checker \
  --path="/path/to/your/code" \
  --kr-style="true" \
  --msvc-style="false" \
  --... \
  --report="/path/to/record/illegal/result"

首先,需要给 style-checker 做一个包裹器(wrapper-style-checker),这个包裹器是用来接收 Seal 的输入输出。wrapper-style-checker 可以用任何语言编写,在运行时,从环境变量中获取以下内容:

SOURCE_DIR="/path/to/your/code" \
PLUGIN_POLICY_FILENAME="/path/to/receive/configuration" \
PLUGIN_OUTPUT_FILENAME="/path/to/output/sarif_report" \
SEAL_API_TOKEN="" \
SEAL_URL="" \
  wrapper-style-checker

然后,规整 style-checker 的配置项,按照合适的粒度构建出相应的策略。这里,以每个配置项作为一条策略。Seal 会在安装插件的阶段阅读这个策略文件(policies.yaml),把其中的每一项都呈现到 Seal 的策略面板。


# policies.yaml
- code: STYLE-CHECKER-POL-1
  category: sast
  type: style
  name: kr-style
  description: 检查是否严格使用K&R风格编码。
  enabled: true
  builtIn: true
  bindings:
    isAllResource: true
  expression: |
    KRStyle: true
    MSVCStyle: false

接着,实现 wrapper-style-checker 对策略文件的理解(转换),把 expression 的信息转化成对 style-checker 的调用,并把执行后的结果按 SARIF 格式输出。

# pseudo code
var policies = read(${PLUGIN_POLICY_FILENAME})
var config = parseInput(policies)
var result = call("style-checker") on (${SOURCE_DIR}) with (config)
var sarif = parseOutput(result)
write(${PLUGIN_OUTPUT_FILENAME}) with (sarif)

最后,用元信息文件(metadata.yaml)描述 wrapper-style-checker 插件的信息,包括UI展示,多语言等。

category: sast
format: yaml
resourceKinds: ["repository"]
policies:
- type: style
  conditions: []
locales:
  en:
    "policy.style": "Style Checker"
  zh:
    "policy.style": "风格检查"

插件安装

完成以上步骤后,可以把 wrapper-style-checker(二进制可执行文件) 、策略文件(policies.yaml)和元信息文件(metadata.yaml)打包成一个 tar.gz 包,并通过 Seal 的 ⌈插件管理⌋ 页面进行下载安装,实现开箱即用。

总结

得益于插件化框架的扩展能力,Seal 为用户提供了 IaC 配置检查功能,并且可以快速适应部署环境已有的复杂性。用户也可以根据自身需求利用插件化框架灵活扩展扫描能力,轻松为代码安全提供进一步保障。在后续版本中,Seal 研发团队会持续丰富插件功能,优化插件策略及配置机制,为用户提供丝滑的可插拔体验。

欢迎访问下方链接,申请产品试用,体验灵活的插件化扩展:

https://seal.io/trial

专注软件供应链安全

1 声望
1 粉丝
0 条评论
推荐阅读
我们从 CircleCI 安全事件获得的3个经验教训
CircleCI 作为业内最受欢迎的 CI/CD 平台提供商之一,有超过20万个 DevOps 团队使用其平台。该公司在今年1月在其官网报告了一起安全事件引起客户恐慌。在此事件中,有身份不明的恶意攻击者入侵了一名员工的笔记本...

SEAL安全

拒绝裸奔,为 Elasticsearch 设置账号密码(qbit)
前言2019 年 5 月 21 日,Elastic 官方博客发文称,ES 6.8 和 7.1 免费开放基本的安全功能。包括: {代码...} 铭毅天下解读: Elasticsearch 7.1免费安全功能全景认知阮一鸣《Elasticsearch核心技术与实战》有对...

qbit阅读 6.5k

Linux内存泄露案例分析和内存管理分享
近期我们运维同事接到线上LB(负载均衡)服务内存报警,运维同事反馈说LB集群有部分机器的内存使用率超过80%,有的甚至超过90%,而且内存使用率还再不停的增长。接到内存报警的消息,让整个团队都比较紧张,我们...

京东云开发者2阅读 821

封面图
Answer.dev 走进华师大课堂:Answer 项目开发流程详解
前不久,Answer.dev 开发团队受到华东师范大学 CS4ALL 研究中心邀请,为在读硕士的同学们进行了一次分享,以 Answer.dev 项目开发过程为例,与同学们探讨了项目研发管理、开发流程、DevOps 等相关话题。以下为 An...

AnswerDev2阅读 607

WGCLOUD的指令下发和自定义监控项有什么区别
WGCLOUD监控系统有两个功能模块:指令下发和自定义监控项话说,WGCLOUD确实一款非常优秀的运维监控软件,轻量且性能好言归正传,那么它们两个有什么区别呢1、指令下发指令下发可以执行任何指令或者脚本,由agent...

一往情深1阅读 586

【超详细】Zod 入门教程
Zod 是一个以 TypeScript 为首的模式声明和验证库 ,弥补了 TypeScript 无法在运行时进行校验的问题Zod 既可以用在服务端也可以运行在客户端,以保障 Web Apps 的类型安全接下来会用十个有趣的例子,带你快速入门...

superZidan1阅读 1.1k

封面图
ctf(pwn&reverse)总结
F5/tab 查看伪代码空格 查看汇编代码视图-&gt;打开子视图-&gt;字符串 :查看所有字符串编辑-&gt;修补程序 :修改程序 修改完后点击修补程序应用到输入文件即可保存修改

白风之下阅读 2.7k

专注软件供应链安全

1 声望
1 粉丝
宣传栏