You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Docker及Google Cloud Run部署安全管理creds.json文件

安全管理Google服务账号凭据(creds.json)的最佳实践

一、Docker构建与Cloud Run部署的安全方案

1. Docker构建:绝对禁止直接COPY creds.json到镜像

直接用COPY creds.json ./会把敏感文件嵌入镜像层,哪怕后续删除,镜像历史里依然能查到,完全不安全。针对不同场景有两种安全处理方式:

场景1:本地开发/运行容器时需要凭据

  • 先在.dockerignore里添加creds.json,避免构建时意外包含。
  • 运行容器时通过挂载本地文件的方式传递凭据,文件不会进入镜像:
    docker run -v $(pwd)/creds.json:/app/creds.json your-image-name
    

场景2:构建阶段必须用到认证(比如拉取私有Google资源)

用Docker的多阶段构建+构建时Secret,只在构建临时阶段提供凭据,最终镜像不包含任何敏感信息:

# 构建阶段:仅用于安装依赖/拉取资源
FROM python:3.11 as builder
WORKDIR /app
COPY requirements.txt .
# 挂载本地creds.json到构建容器,用完即销毁
RUN --mount=type=secret,id=creds,target=/app/creds.json \
    pip install -r requirements.txt --extra-index-url https://your-private-google-repo.com

# 最终镜像:只包含运行所需的代码和依赖
FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
COPY app.py .
# 运行时通过Cloud Run的Secret Manager或Workload Identity获取凭据

构建命令:

docker build --secret id=creds,src=./creds.json -t your-image-name .

2. Google Cloud Run部署:优先用工作负载身份,其次用Secret Manager

方案A:工作负载身份(推荐,无需管理creds.json)

这是Google Cloud原生的安全方案,Cloud Run会自动为你的服务注入服务账号凭据,完全不需要手动处理creds.json:

  1. 创建一个具备所需权限的服务账号(比如需要访问GCS就给roles/storage.objectViewer)。
  2. 部署Cloud Run时指定该服务账号:
    gcloud run deploy your-service-name \
      --service-account=your-service-account@your-project-id.iam.gserviceaccount.com \
      --image=your-image-name
    
  3. 修改代码使用默认凭据链,替换原来的from_service_account_file:
    from google.auth import default
    
    credentials, project_id = default(scopes=SCOPES)
    
    所有Google客户端库都支持自动读取这个默认凭据,不需要额外配置。

方案B:用Secret Manager挂载creds.json文件(适合无法修改代码的场景)

如果必须保留原代码的from_service_account_file调用,可以把creds.json存到Secret Manager,部署时挂载成文件:

  1. 上传creds.json到Secret Manager:
    gcloud secrets create creds-json --data-file=./creds.json
    
  2. 给Cloud Run的服务账号添加访问该Secret的权限:
    gcloud secrets add-iam-policy-binding creds-json \
      --member=serviceAccount:your-cloud-run-service-account@your-project-id.iam.gserviceaccount.com \
      --role=roles/secretmanager.secretAccessor
    
  3. 部署Cloud Run时挂载Secret为文件:
    gcloud run deploy your-service-name \
      --image=your-image-name \
      --set-secrets=/app/creds.json=creds-json:latest
    
    这样代码里的creds.json路径会指向Cloud Run从Secret Manager挂载的临时文件,不会出现在镜像里。

二、Google云生态推荐的工具与策略

Google官方强烈推荐以下两种方式,完全替代手动管理creds.json:

  1. 工作负载身份(Workload Identity):
    • 无需创建或管理服务账号密钥(creds.json本质就是密钥),Cloud Run自动处理凭据注入。
    • 遵循最小权限原则,给服务账号分配刚好够用的权限即可。
    • 避免了密钥泄露、轮换的麻烦,是最安全的方案。
  2. Secret Manager:
    • 用于存储任何敏感信息(包括creds.json、API密钥等),提供加密存储、访问控制、版本管理和审计日志。
    • 支持在Cloud Run、GKE等服务中挂载为文件或环境变量,无需把敏感信息嵌入镜像。

额外最佳实践

  • 确保.gitignore里包含creds.json,永远不要把它提交到代码仓库。
  • 给服务账号分配最小必要权限,避免使用Owner、Editor这类宽权限角色。
  • 定期审计服务账号的权限,移除不再需要的权限。
  • 如果必须使用服务账号密钥(不推荐),定期轮换密钥并及时删除旧密钥。

内容的提问来源于stack exchange,提问作者Roni Jack Vituli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:00:58