NetScaler Ingress ControllerのためにVaultサーバーに保存されたNetScaler資格情報を使用する

最終公開日 : Oct 02, 2026
ほとんどの組織では、ティア1のNetScaler IngressデバイスとKubernetesクラスターは別々のチームによって管理されています。通常、ネットワーク管理者がティア1のNetScaler Ingressデバイスを管理し、開発者がKubernetesクラスターを管理します。NetScaler Ingress Controllerは、NetScalerを設定するためにNetScalerのユーザー名やパスワードなどのNetScaler資格情報を必要とします。NetScaler Ingress Controllerの仕様の一部としてNetScaler資格情報を指定し、ADC資格情報をKubernetesシークレットとして保存できます。ただし、セキュリティリスクを最小限に抑えるために、NetScaler資格情報をVaultサーバーに保存し、NetScaler Ingress Controllerに資格情報を渡すこともできます。このトピックでは、NetScaler Ingress ControllerのためにVaultサーバーに保存されたNetScaler資格情報を使用する方法について説明します。
次の図は、Vaultサーバーに保存されているNetScaler資格情報をNetScaler Ingress Controllerで使用する手順を説明しています。
ヴォールト自動認証

前提条件

Vaultサーバーをセットアップし、キーバリュー (KV) シークレットストアを有効にしていることを確認してください。詳細については、Vault documentationを参照してください。

NetScaler Ingress ControllerのためにVaultサーバーからNetScaler資格情報を使用する

NetScaler Ingress ControllerのためにVaultサーバーからNetScaler資格情報を使用するには、次のタスクを実行します。

Kubernetes認証用のサービスアカウントを作成する

以下の手順を使用して、Kubernetes認証用のサービスアカウントを作成します。
  1. サービスアカウントcic-k8s-roleを作成し、以下のコマンドを使用してKubernetes TokenReview APIにアクセスするために必要な権限をサービスアカウントに付与します。
    $ kubectl apply -f cic-k8s-role-service-account.yml


    serviceaccount/cic-k8s-role created
    clusterrole.rbac.authorization.k8s.io/cic-k8s-role configured
    clusterrolebinding.rbac.authorization.k8s.io/cic-k8s-role configured
    clusterrolebinding.rbac.authorization.k8s.io/role-tokenreview-binding configured
    以下は、サンプルcic-k8s-role-service-account.ymlファイルの一部です。
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
    name: role-tokenreview-binding
    namespace: default
    roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: ClusterRole
    name: system:auth-delegator
    subjects:
    - kind: ServiceAccount
    name: cic-k8s-role
    namespace: default
  2. VAULT_SA_NAME環境変数を、既に作成したサービスアカウントの名前に設定します。
    export VAULT_SA_NAME=$(kubectl get sa cic-k8s-role -o jsonpath="{.secrets[*]['name']}")
  3. SA_JWT_TOKEN環境変数を、TokenReview APIへのアクセスに使用したサービスアカウントのJWTに設定します。
    export SA_JWT_TOKEN=$(kubectl get secret $VAULT_SA_NAME -o jsonpath="{.data.token}" | base64 --decode; echo)
  4. Kubernetes APIと通信するために、Kubernetes CA署名付き証明書を取得します。
    export SA_CA_CRT=$(kubectl get secret $VAULT_SA_NAME -o jsonpath="{.data['ca\.crt']}" | base64 --decode; echo)

キーボールトシークレットを作成し、VaultサーバーでKubernetes認証を設定する

Vaultサーバーにログインし、次の手順を実行してKey Vaultシークレットを作成し、Kubernetes認証を設定します。
  1. サンプルのVaultポリシーファイルcitrix-adc-kv-ro.hclを確認し、Vaultで読み取り専用ポリシーcitrix-adc-kv-roを作成します。
    $ tee citrix-adc-kv-ro.hcl <<EOF
    # If working with K/V v1
    path "secret/citrix-adc/*"
    {
        capabilities = ["read", "list"]
    }
    # If working with K/V v2
    path "secret/data/citrix-adc/*"
    {
        capabilities = ["read", "list"]
    }
    EOF

    #  Create a policy named citrix-adc-kv-ro
    $  vault policy write citrix-adc-kv-ro citrix-adc-kv-ro.hcl
  2. secret/citrix-adc/パスにNetScalerの資格情報を含むKVシークレットを作成します。
    vault kv put secret/citrix-adc/credential   username='&lt;ADC username>' \
    password='&lt;ADC password>' \
    ttl='30m'
  3. デフォルトパス(auth/kubernetes)でKubernetes認証を有効にします。
    # $ vault auth enable kubernetes
  4. Kubernetesクラスターとの通信方法を指定します。
    $ vault write auth/kubernetes/config \
    token_reviewer_jwt="$SA_JWT_TOKEN" \
    kubernetes_host="https://&lt;K8S_CLUSTER_URL>:&lt;API_SERVER_PORT>" \
    kubernetes_ca_cert="$SA_CA_CRT"
  5. KubernetesサービスアカウントをVaultポリシーとデフォルトのトークンTTLにマッピングするロールを作成します。このロールは、デフォルトの名前空間のcic-k8s-roleサービスアカウントを承認し、サービスアカウントをcitrix-adc-kv-roポリシーにマッピングします。
    $ vault write auth/kubernetes/role/cic-vault-example\
    bound_service_account_names=cic-k8s-role \
    bound_service_account_namespaces=default \
    policies=citrix-adc-kv-ro \
    ttl=24h
    注:
    Kubernetes認証バックエンドによる認証はロールベースです。トークンがログインに使用される前に、ロールの一部として設定する必要があります。

NetScaler Ingress ControllerでVaultエージェントの自動認証を活用する

Vaultの自動認証を活用するには、次の手順を実行します。
  1. 提供されているVault Agent設定ファイルvault-agent-config.hclを確認します。
        exit_after_auth = true
        pid_file = "/home/vault/pidfile"

        auto_auth {
            method "kubernetes" {
                mount_path = "auth/kubernetes"
                config = {
                    role = "cic-vault-example"
                }
            }

            sink "file" {
                config = {
                    path = "/home/vault/.vault-token"
                }
            }
        }
    注記:
    VaultエージェントAuto-Authは、Vaultサーバーのauth/kubernetesパスで有効になっているKubernetes認証方法を使用するように構成されています。Vaultエージェントはcic-vault-exampleロールを使用して認証します。 シンクブロックは、トークンを書き込むディスク上の場所を指定します。Vaultエージェントがトークンを複数の場所に配置するようにしたい場合は、VaultエージェントAuto-Authシンクを複数回構成できます。この例では、シンクは/home/vault/.vault-tokenに設定されています。
  2. Consulテンプレート consul-template-config.hcl ファイルを確認します。
        vault {
            renew_token = false
            vault_agent_token_file = "/home/vault/.vault-token"
            retry {
                backoff = "1s"
            }
        }

        template {
            destination = "/etc/citrix/.env"
            contents = <<EOH
            {{- with secret "secret/citrix-adc/credential" }}
            NS_USER={{ .Data.data.username }}
            NS_PASSWORD={{ .Data.data.password }}
            {{ end }}
            EOH
        }
    このテンプレートは、secret/citrix-adc/credentialパスでシークレットを読み取り、ユーザー名とパスワードの値を設定します。 KVストアバージョン1を使用している場合は、次のテンプレートを使用します。
    template {
        destination = "/etc/citrix/.env"
        contents = <<EOH
        {{- with secret "secret/citrix-adc/credential" }}
        NS_USER={{ .Data.username }}
        NS_PASSWORD={{ .Data.password }}
        {{ end }}
        EOH
            }
  3. vault-agent-config.hclとconsul-template-config.hclからKubernetes ConfigMapを作成します。
    kubectl create configmap example-vault-agent-config --from-file=./vault-agent-config.hcl --form-file=./consul-template-config.hcl
  4. VaultとConsulテンプレートをinitコンテナとして持つNetScaler Ingress Controllerポッドcitrix-k8s-ingress-controller-vault.yamlを作成します。VaultはKubernetes認証方法を使用してトークンをフェッチし、共有ボリューム上に.envファイルを作成するConsulテンプレートに渡します。このトークンは、NetScaler Ingress Controllerがティア1 NetScalerとの認証に使用します。
    kubectl apply citrix-k8s-ingress-controller-vault.yaml
    citrix-k8s-ingress-controller-vault.yamlファイルは次のとおりです。
    apiVersion: v1
    kind: Pod
    metadata:
    annotations:
    name: cic-vault
    namespace: default
    spec:
    containers:
    - args:
        - --ingress-classes tier-1-vpx
        - --feature-node-watch true
        env:
        - name: NS_IP
        value: &lt;Tier 1 ADC IP-ADDRESS>
        - name: EULA
        value: "yes"
        image: in-docker-reg.eng.citrite.net/cpx-dev/kumar-cic:latest
        imagePullPolicy: Always
        name: cic-k8s-ingress-controller
        volumeMounts:
        - mountPath: /etc/citrix
        name: shared-data
    initContainers:
    - args:
        - agent
        - -config=/etc/vault/vault-agent-config.hcl
        - -log-level=debug
        env:
        - name: VAULT_ADDR
        value: &lt;VAULT URL>
        image: vault
        imagePullPolicy: Always
        name: vault-agent-auth
        volumeMounts:
        - mountPath: /etc/vault
        name: config
        - mountPath: /home/vault
        name: vault-token
    - args:
        - -config=/etc/consul-template/consul-template-config.hcl
        - -log-level=debug
        - -once
        env:
        - name: HOME
        value: /home/vault
        - name: VAULT_ADDR
        value: &lt;VAULT_URL>
        image: hashicorp/consul-template:alpine
        imagePullPolicy: Always
        name: consul-template
        volumeMounts:
        - mountPath: /home/vault
        name: vault-token
        - mountPath: /etc/consul-template
        name: config
        - mountPath: /etc/citrix
        name: shared-data
    serviceAccountName: vault-auth
    volumes:
    - emptyDir:
        medium: Memory
        name: vault-token
    - configMap:
        defaultMode: 420
        items:
        - key: vault-agent-config.hcl
            path: vault-agent-config.hcl
        - key: consul-template-config.hcl
    name: example-vault-agent-config
        name: config
    - emptyDir:
        medium: Memory
        name: shared-data
構成が成功すると、Vaultサーバーはトークンをフェッチし、Consulテンプレートコンテナに渡します。Consulテンプレートはトークンを使用してNetScalerの資格情報を読み取り、/etc/citrix/.envパスに環境変数として書き込みます。NetScaler Ingress Controllerは、これらの資格情報を使用してティア1 NetScalerと通信します。
Vaultサーバーからフェッチされた資格情報を使用して、NetScaler Ingress Controllerが正常に実行されていることを確認します。