terraform-provider-helm icon indicating copy to clipboard operation
terraform-provider-helm copied to clipboard

the provider continues to reveal sensitive variables during destroy or update in-place

Open cdtzabra opened this issue 1 year ago • 7 comments

Terraform, Provider, Kubernetes and Helm Versions

Terraform version: v1.6.0
Provider version: 2.11.0
Kubernetes version: 1.26.4

Affected Resource(s)

  • helm_release

Terraform Configuration Files

  • Deploying vsphere-csi chart from https://vsphere-tmm.github.io/helm-charts
resource "helm_release" "vsphere-csi" {
  name             = "csi"

  # https://github.com/vsphere-tmm/helm-charts/tree/master/charts/vsphere-csi
  # https://artifacthub.io/packages/helm/vsphere-tmm/vsphere-csi
  repository       = "https://vsphere-tmm.github.io/helm-charts"
  chart            = "vsphere-csi"
  version          = "3.2.3"
  namespace        = vsphere-csi
  create_namespace = true
  values = [
    templatefile(("${path.module}/files/vsphere-csi-values.yaml.tpl"),
      {
        vcenter_server      = var.vsphere_server
        vcenter_user        = var.vsphere_user   # sensitive variable
        vcenter_password    = var.vsphere_password  # sensitive variable
        vcenter_datacenters = yamlencode(var.vsphere_csi_datacenters)
      })
  ]
}
variable "vsphere_server" {
  type        = string
  description = "The PCC vsphere ID"
}

variable "vsphere_user" {
  type        = string
  description = "PCC user for authentication"
  sensitive   = true
}

variable "vsphere_password" {
  type        = string
  description = "PCC user password"
    sensitive = true
}

variable "vsphere_csi_datacenters" {
  type        = list(string)
  description = "PCC datacenters to use for CSI"
}

files/vsphere-csi-values.yaml.tpl looks like

global:
  config:
    storageClass: thin-csi
    storageclass:
      enabled: false
      expansion: true
      default: false
    vcenter:
      ${vcenter_server}:
          server: ${vcenter_server}
          user: ${vcenter_user}
          password: ${vcenter_password}
          datacenters:
            ${indent(12, vcenter_datacenters)}

controller:
  nodeSelector:
    node-role.kubernetes.io/control-plane: "true"
  tolerations: {}
  config:
    csi-migration: true
    csi-auth-check: true
    online-volume-extend: true
    trigger-csi-fullsync: false
    async-query-volume: true
    block-volume-snapshot: false # changed # to recheck
    csi-windows-support: false # changed
    use-csinode-id: true
    list-volumes: true
    pv-to-backingdiskobjectid-mapping: false
    cnsmgr-suspend-create-volume: true
    topology-preferential-datastores: false
    multi-vcenter-csi-topology: false # changed
    max-pvscsi-targets-per-vm: true
    csi-internal-generated-cluster-id: true
    listview-tasks: false

Debug Output

NOTE: In addition to Terraform debugging, please set HELM_DEBUG=1 to enable debugging info from helm.

Panic Output

terraform destroy or terraform plan --with some changes (update in place)

 ~ resource "helm_release" "vsphere-csi" {
        id                         = "csi"
      ~ metadata                   = [
          - {
              - app_version = "3.0.2"
              - chart       = "vsphere-csi"
              - name        = "csi"
              - namespace   = "infra-vmware-system-csi"
              - revision    = 2
              - values      = jsonencode(
                    {
                      - controller = {
                          - config       = {
                              - async-query-volume                = true
                              - block-volume-snapshot             = false
                              - cnsmgr-suspend-create-volume      = true
                              - csi-auth-check                    = true
                              - csi-internal-generated-cluster-id = true
                              - csi-migration                     = true
                              - csi-windows-support               = false
                              - list-volumes                      = true
                              - listview-tasks                    = false
                              - max-pvscsi-targets-per-vm         = true
                              - multi-vcenter-csi-topology        = false
                              - online-volume-extend              = true
                              - pv-to-backingdiskobjectid-mapping = false
                              - topology-preferential-datastores  = false
                              - trigger-csi-fullsync              = false
                              - use-csinode-id                    = true
                            }
                          - nodeSelector = {
                              - "node-role.kubernetes.io/control-plane" = "true"
                            }
                          - tolerations  = {}
                        }
                      - global     = {
                          - config = {
                              - storageClass = "thin-csi"
                              - storageclass = {
                                  - default   = false
                                  - enabled   = false
                                  - expansion = true
                                }
                              - vcenter      = {
                                  - "xxxxxx" = {
                                      - datacenters = [
                                          - "xxxxxxxx",
                                        ]
                                      - password    = SENSITIVE_VALUE_REVELEAD
                                      - server      = "xxxxx"
                                      - user        = SENSITIVE_VALUE_REVELEAD
                                    }
                                }
                            }
                        }
                    }
                )
              - version     = "3.2.3"
            },
        ] -> (known after apply)
        name                       = "csi"
      ~ values                     = [
          - (sensitive value),
          + (sensitive value),
        ]
        # (26 unchanged attributes hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.

Expected Behavior

Sensitive variable should not be revelead in metatadata field

Issue already reported here: https://github.com/hashicorp/terraform-provider-helm/issues/793 With fix explanations from terraform

Actual Behavior

Sensitive data get display in metadata fields

More info https://github.com/hashicorp/terraform-provider-helm/issues/new?assignees=&labels=bug&projects=&template=bug-report.md&title=

cdtzabra avatar Nov 09 '23 09:11 cdtzabra

It is my understanding that sensitive values should be passed with set_sensitive, not the standard values input... https://registry.terraform.io/providers/hashicorp/helm/latest/docs/resources/release#set_sensitive

daniel-butler-irl avatar Nov 15 '23 13:11 daniel-butler-irl

@daniel-butler-irl interesting, I did not get that impression, but I will test that theory out if I get some time today

lorelei-rupp-imprivata avatar Nov 15 '23 13:11 lorelei-rupp-imprivata

Not sure if it's supposed to work like that, but it's how I handle it. It would be better if it could respect the sensitive field...

daniel-butler-irl avatar Nov 15 '23 13:11 daniel-butler-irl

@daniel-butler-irl

The problem is that this field doesn't work with templatefile. As far as I'm concerned, as soon as a variable is marked as sensitive, the provider should treat it as such everywhere. set_sensitive isn't enough in my opinion, doesn't work when using file/templatefile.

Whereas it's very common to use one values file with Helm rather than a multitude of sets

cdtzabra avatar Nov 15 '23 15:11 cdtzabra

Thank you for bringing this to our attention @cdtzabra, based off of the comment from a previous issue this is more due to how Terraform handles metadata information and thus treats it all as is regardless of whether it's sensitive or not.

The fix for this would be to implement a helm_release data source that still provides metadata info if needed instead of relying on the helm_release resource for it. This will be something to look into to solve this problem.

BBBmau avatar Dec 06 '23 18:12 BBBmau

Hi @BBBmau

Do you know if this issue has been selected for development?

Thank you :pray:

rym-dd avatar Jan 19 '24 15:01 rym-dd

A potential hacky workaround to this is to add metadata to lifecycle ignore_changes, however this will spit out a warning indicating it's decided by the provider and not an argument set so it's redundant. Also unaware of any issues that may come from this if you're outputting anything from the metadata block , and then there's drift going unnoticed.

Before

# helm_release.release will be updated in-place
  ~ resource "helm_release" "release" {
        id                         = "my-chart"
      ~ metadata                   = [
          - {
              - chart       = "my-chart"
              ....
              - values      = jsonencode(
                    {
                      - config           = {
                          - password = <redacted>
                          - name   = "my-config"
                        }
                    }
                )
            },
        ] -> (known after apply)
        name                       = "my-chart-name"
      ~ values                     = [
          - (sensitive value),
          + (sensitive value),
        ]
        # (26 unchanged attributes hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.

After

  lifecycle {
    ignore_changes = [metadata]
  }
Terraform will perform the following actions:

  # helm_release.release will be updated in-place
  ~ resource "helm_release" "release" {
        id                         = "my-chart"
        name                       = "my-chart-name"
      ~ values                     = [
          - (sensitive value),
          + (sensitive value),
        ]
        # (27 unchanged attributes hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.
╷
│ Warning: Redundant ignore_changes element
│
│   on ../../../my_helm_chart/0.1.0/main.tf line 6, in resource "helm_release" "release":
│    6: resource "helm_release" "release" {
│
│ Adding an attribute name to ignore_changes tells Terraform to ignore future changes to the argument in configuration after the object has been created, retaining the value originally configured.
│
│ The attribute metadata is decided by the provider alone and therefore there can be no configured value to compare with. Including this attribute in ignore_changes has no effect. Remove the attribute from
│ ignore_changes to quiet this warning.
╵

ianarsenault avatar Mar 14 '24 20:03 ianarsenault