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

如何在CDKTF输出中隐藏敏感字符串的渲染内容?

解决CDKTF中Helm Values敏感信息泄露问题

问题背景

使用CDKTF管理基础设施,通过Helm部署Chart时采用EJS渲染values.yaml文件,执行cdktf deploy或cdktf diff命令时,包含敏感信息的完整values内容会被打印到标准输出,存在数据泄露风险。

可行解决方案

方案1:标记敏感字段为Terraform敏感值

放弃直接渲染整个YAML字符串,改为在TypeScript中构建结构化的values对象,使用cdktf.sensitive()标记敏感字段,Terraform会自动在diff输出中隐藏这些敏感内容。

修改后的代码示例:

import { Construct } from "constructs";
import { Release } from "../../.gen/providers/helm/release";
import * as cdktf from "cdktf";

export interface VectorConfig {}

export class Atlantis extends Construct {
  constructor(scope: Construct, name: string, _config: VectorConfig) {
    super(scope, name);

    new Release(this, "atlantis", {
      repository: "https://runatlantis.github.io/helm-charts",
      chart: "atlantis",
      name: "atlantis",
      version: "5.4.4",
      values: [
        {
          githubApp: {
            id: 963113,
            installationId: "53537338",
            slug: "atlantis-for-atlantis-goldsky-com",
            secret: cdktf.sensitive(process.env.ATLANTIS_GITHUB_APP_WEBHOOK_SECRET!),
            key: cdktf.sensitive(process.env.ATLANTIS_GITHUB_APP_PRIVATE_KEY!),
          },
          readinessProbe: {
            enabled: true,
            periodSeconds: 5,
            initialDelaySeconds: 5,
            timeoutSeconds: 5,
            successThreshold: 1,
            failureThreshold: 5,
            scheme: "HTTP",
          },
          environment: {
            ATLANTIS_GH_ORG: "goldsky-io",
            ATLANTIS_TFE_TOKEN: cdktf.sensitive(process.env.ATLANTIS_TFE_TOKEN!),
            ATLANTIS_AUTOPLAN_FILE_LIST: "**/*.tf,**/*.tfvars,**/*.tfvars.json,**/cdk.tf.json",
            DOPPLER_TOKEN: cdktf.sensitive(process.env.ATLANTIS_DOPPLER_TOKEN!),
          },
          aws: {
            credentials: cdktf.sensitive(process.env.ATLANTIS_AWS_CREDENTIALS!),
          },
        },
      ],
    });
  }
}

修改后,标记为sensitive()的字段在diff或deploy输出中会被替换为<sensitive>,不会泄露实际敏感数据。

方案2:使用Kubernetes Secret存储敏感数据

将敏感信息存储在Kubernetes Secret中,通过Helm的valuesFrom参数引用该Secret,避免敏感数据出现在Terraform状态或输出中。

步骤1:创建Kubernetes Secret资源

import { Secret } from "../../.gen/providers/kubernetes/secret";

// 在Atlantis构造函数内添加
new Secret(this, "atlantis-secrets", {
  metadata: { name: "atlantis-secrets" },
  stringData: {
    "github-app-secret": process.env.ATLANTIS_GITHUB_APP_WEBHOOK_SECRET!,
    "github-app-key": process.env.ATLANTIS_GITHUB_APP_PRIVATE_KEY!,
    "tfe-token": process.env.ATLANTIS_TFE_TOKEN!,
    "doppler-token": process.env.ATLANTIS_DOPPLER_TOKEN!,
    "aws-credentials": process.env.ATLANTIS_AWS_CREDENTIALS!,
  },
});

步骤2:修改Helm Release配置,引用Secret

new Release(this, "atlantis", {
  repository: "https://runatlantis.github.io/helm-charts",
  chart: "atlantis",
  name: "atlantis",
  version: "5.4.4",
  values: [
    {
      githubApp: {
        id: 963113,
        installationId: "53537338",
        slug: "atlantis-for-atlantis-goldsky-com",
      },
      readinessProbe: {
        enabled: true,
        periodSeconds: 5,
        initialDelaySeconds: 5,
        timeoutSeconds: 5,
        successThreshold: 1,
        failureThreshold: 5,
        scheme: "HTTP",
      },
      environment: {
        ATLANTIS_GH_ORG: "goldsky-io",
        ATLANTIS_AUTOPLAN_FILE_LIST: "**/*.tf,**/*.tfvars,**/*.tfvars.json,**/cdk.tf.json",
      },
    },
  ],
  valuesFrom: [
    {
      secretKeyRef: { name: "atlantis-secrets", key: "github-app-secret", optional: false },
      targetPath: "githubApp.secret",
    },
    {
      secretKeyRef: { name: "atlantis-secrets", key: "github-app-key", optional: false },
      targetPath: "githubApp.key",
    },
    {
      secretKeyRef: { name: "atlantis-secrets", key: "tfe-token", optional: false },
      targetPath: "environment.ATLANTIS_TFE_TOKEN",
    },
    {
      secretKeyRef: { name: "atlantis-secrets", key: "doppler-token", optional: false },
      targetPath: "environment.DOPPLER_TOKEN",
    },
    {
      secretKeyRef: { name: "atlantis-secrets", key: "aws-credentials", optional: false },
      targetPath: "aws.credentials",
    },
  ],
});

此方式下,敏感数据仅存储在Kubernetes集群的Secret中,Terraform状态和输出不会包含敏感内容,安全性更高。

方案3:禁用values的diff输出(不推荐)

若需完全隐藏整个values的diff,可在Helm Release资源中设置lifecycle规则,忽略values字段的变化检测:

new Release(this, "atlantis", {
  repository: "https://runatlantis.github.io/helm-charts",
  chart: "atlantis",
  name: "atlantis",
  version: "5.4.4",
  values: [renderedValues],
  lifecycle: {
    ignoreChanges: ["values"],
  },
});

但该方法会导致Terraform无法检测values的任何变化,可能引发配置漂移,仅适用于特殊场景。


内容的提问来源于stack exchange,提问作者Paymahn Moghadasian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 22:29:59