202510
security

使用 Infisical API 在容器运行时实现动态 SSH 凭证注入

本文探讨如何集成 Infisical API 实现容器运行时的动态 SSH 密钥注入,结合实时审计日志和撤销钩子,确保零信任访问的安全性。

在容器化部署中,实现零信任访问是确保基础设施安全的关键挑战。传统的静态 SSH 密钥容易导致密钥泄露和访问控制难题,而动态凭证注入可以显著降低这些风险。Infisical 作为开源秘密管理平台,通过其 API 支持发行短寿命 SSH 证书,这为容器运行时提供了理想的解决方案。本文将聚焦于如何利用 Infisical API 实现动态 SSH 密钥注入,同时集成实时审计日志和撤销钩子,实现完整的零信任访问管理。

动态 SSH 凭证注入的核心观点

零信任模型要求所有访问均需验证身份并最小化权限时效。在容器环境中,如 Docker 或 Kubernetes Pod,SSH 访问往往用于调试或临时管理任务。使用 Infisical API,可以在容器启动时动态获取 SSH 证书,避免静态密钥的分发和存储。这种方法的核心优势在于:证书绑定用户身份、主机和时间窗口,过期后自动失效,从而减少攻击面。

证据显示,Infisical SSH 功能专为这种场景设计,它使用证书权威 (CA) 发行 ephemeral 证书,取代传统密钥对。根据官方文档,“Infisical SSH provides a secure, certificate-based solution for managing SSH access to infrastructure.” 这确保了访问的集中管理和可追溯性。在容器运行时集成时,我们可以利用 API 端点如 /v1/ssh/hosts 和 /v1/ssh/certificates 来自动化流程。

实施动态注入的落地步骤

要实现动态注入,首先需要在 Infisical 中配置 SSH 项目。创建项目后,生成机器身份用于认证,例如使用 Universal Auth 方法,获取 Client ID 和 Secret。这一步确保容器内的脚本能安全调用 API。

接下来,在容器镜像中嵌入 Infisical CLI 或 SDK(如 Node.js SDK)。一个典型的 Docker entrypoint 脚本可以如下实现注入:

  1. 认证和证书请求:容器启动时,脚本使用环境变量中的项目 ID 调用 API 登录并请求证书。

    • 示例 API 调用(使用 curl):
      curl -X POST https://api.infisical.com/v1/auth/login \
      -H "Content-Type: application/json" \
      -d '{"clientId": "your-client-id", "clientSecret": "your-secret"}'
      
      获取 token 后,调用 /v1/ssh/certificates/issue 端点,指定主机、用户和 TTL(例如 3600 秒)。
    • 参数设置:证书类型为 user 证书,principals 包括容器内目标用户,validity 为 1 小时。
  2. 注入到 SSH 配置:将获取的证书私钥和公钥写入容器内的 /etc/ssh/ 目录。更新 sshd_config 以信任 Infisical CA,并重载 SSH 服务。

    • 清单:
      • 私钥路径:/etc/ssh/id_ed25519
      • CA 公钥:从 Infisical 下载并放置在 /etc/ssh/infisical_ca.pub
      • 配置行:TrustedUserCAKeys /etc/ssh/infisical_ca.pub
  3. 容器运行时集成:对于 Kubernetes,使用 Infisical Operator 在 Pod spec 中定义 secret sync。Operator 会监听 Pod 事件,自动注入证书。示例 YAML:

    apiVersion: infisical.com/v1alpha1
    kind: SecretSync
    metadata:
      name: ssh-injection
    spec:
      projectId: "your-project-id"
      secrets:
        - name: ssh-cert
          path: "ssh/user-cert"
    

    这确保 Pod 启动时证书可用,支持热重载。

对于 Docker Compose 或 ECS,entrypoint 脚本可在 docker run 时执行 API 调用,确保隔离性。

实时审计日志的集成

审计是零信任的基石。Infisical 提供 /v1/audit-logs 端点,用于查询所有证书发行和访问事件。实时日志可以通过 webhook 或轮询实现。

  • 配置审计钩子:在 Infisical 项目中启用事件通知,指向外部 SIEM 系统如 ELK Stack。每个证书请求都会触发日志,包含用户 ID、主机 IP、时间戳和动作(issue/revoke)。

    • 证据:平台内置审计日志记录“every action taken on the platform”,包括 SSH 访问。
  • 可落地参数

    • 查询间隔:5 分钟轮询 API,避免高负载。
    • 日志字段:action_type="certificate_issue", resource_type="ssh_host", timestamp。
    • 阈值:如果访问超过 10 次/小时,触发警报。

在容器侧,脚本可将本地 SSH 日志(如 /var/log/auth.log)与 Infisical API 日志合并,使用 Fluentd 代理转发到中央日志系统。

撤销钩子的设计与实现

撤销机制确保异常时即时切断访问。Infisical 支持通过 API 撤销证书,使用 /v1/ssh/certificates/revoke 端点,指定证书序列号。

  • 钩子实现:集成到 CI/CD 或监控系统中。例如,使用 Prometheus 监控容器健康,如果 Pod 异常,调用 API 撤销关联证书。同时,支持 CRL (Certificate Revocation List) 分发到主机。

    • 步骤:
      1. 容器启动时记录证书 ID 到共享存储(如 Redis)。
      2. 监控脚本检测事件(如 Pod 终止),触发撤销:
        curl -X POST https://api.infisical.com/v1/ssh/certificates/revoke \
        -H "Authorization: Bearer $TOKEN" \
        -d '{"certificateId": "cert-uuid"}'
        
      3. 更新主机 SSHD 以检查 CRL,每 5 分钟刷新。
  • 风险限制:撤销延迟不超过 30 秒,通过短 TTL 补充。避免过度撤销导致合法访问中断,设置回滚策略:如果 API 失败,fallback 到手动审核。

最佳实践与参数优化

为确保可靠集成,以下是关键参数和清单:

  • 证书参数

    • TTL:默认 3600 秒(1 小时),生产环境不超过 24 小时。
    • 密钥算法:Ed25519,优先高安全性。
    • Principals:限制为特定用户组,如 "container-admin"。
  • 集成清单

    1. 配置 Infisical SSH 项目和主机组。
    2. 部署 Agent/Operator 到集群。
    3. 编写 entrypoint 脚本处理注入和清理。
    4. 设置审计 webhook 和 SIEM 集成。
    5. 测试撤销场景,确保零信任合规。
    6. 监控指标:证书发行率、撤销率、日志延迟。
  • 性能考虑:API 调用超时设为 10 秒,容器启动延迟增加不超过 5 秒。使用缓存代理减少重复请求。

这种集成不仅提升了安全性,还简化了运维。通过 Infisical API 的灵活性,容器运行时可以实现真正的动态访问控制。在实际部署中,建议从小规模测试开始,逐步扩展到生产环境,确保所有组件的兼容性。

(字数统计:约 1050 字)