Citrix ADC ingress controller

Citrix Ingress ControllerのVaultサーバーに保存されているCitrix ADC資格情報を使用する

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

次の図は、Citrix Ingress ControllerとともにVaultサーバーに保存されているCitrix ADC資格情報を使用する手順を説明しています。

vault-auto-authentication

前提条件

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

Citrix Ingress ControllerにVaultサーバーからの Citrix ADC 資格情報を使用する

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

  1. Kubernetes 認証用のサービスアカウントを作成します

  2. Key Vaultシークレットを作成し、Vault サーバで Kubernetes 認証をセットアップします

  3. Vault自動認証機能を利用して、Citrix Ingress ControllerのCitrix ADC資格情報を取得します

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
    

    Following is a part of the sample cic-k8s-role-service-account.yml file.

    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']}")
    <!--NeedCopy-->
    
  3. SA_JWT_TOKEN 環境変数を TokenReview API へのアクセスに使用したサービスアカウントの JWT に設定します。

         export SA_JWT_TOKEN=$(kubectl get secret $VAULT_SA_NAME -o jsonpath="{.data.token}" | base64 --decode; echo)
    <!--NeedCopy-->
    
  4. Kubernetes API と通信するための Kubernetes CA 署名付き証明書を取得します。

         export SA_CA_CRT=$(kubectl get secret $VAULT_SA_NAME -o jsonpath="{.data['ca.crt']}" | base64 --decode; echo)
    <!--NeedCopy-->
    

Key Vaultシークレットを作成し、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/ パスにCitrix ADC資格情報を使用してKVシークレットを作成します。

    vault kv put secret/citrix-adc/credential   username='<ADC username>' \
    password='<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://<K8S_CLUSTER_URL>:<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 認証バックエンドでの承認はロールベースです。トークンをログインに使用する前に、ロールの一部として設定する必要があります。

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

Vault 自動認証を利用するには、次の手順を実行します。

  1. 提供された Vault Agent 設定ファイル [vault-agent-config.hcl] (https://github.com/citrix/citrix-k8s-ingress-controller/blob/master/docs/how-to/examples-yamls/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 Agent はcic-vault-exampleロールを使用して認証を行います。 Sink ブロックは、トークンを書き込むディスク上の場所を指定します。Vault Agent でトークンを複数の場所に配置する場合は、Vault Agent Auto-Auth を複数回設定できます。この例では、Sinkは/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
            NS_USER=
            NS_PASSWORD=
                
            EOH
        }
    

    This template reads secrets at the secret/citrix-adc/credential path and sets the user name and password values. If you are using KV store version 1, use the following template.

        template {
            destination = "/etc/citrix/.env"
            contents = <<EOH
            NS_USER=
            NS_PASSWORD=
                
            EOH
                }
    
  3. vault-agent-config.hclconsul-template-config.hclから Kubernetes config-mapを作成します。

        kubectl create configmap example-vault-agent-config --from-file=./vault-agent-config.hcl --form-file=./consul-template-config.hcl
    
  4. Vaultを使用してCitrix Ingress Controller ポッドを作成し、初期化コンテナーとしてconsulテンプレートcitrix-k8s-ingress-controller-vault.yamlを作成します。Vault は Kubernetes 認証方法を使用してトークンをフェッチし、それを共有ボリューム上に.envを作成する consul テンプレートに渡します。このトークンは、Citrix Ingress Controller がティア1 Citrix ADCでの認証に使用されます。

        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: <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: <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: <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テンプレートはトークンを使用してCitrix ADC資格情報を読み取り、 環境変数として/etc/citrix/.envパスに書き込みます。Citrix Ingress Controller は、Tier 1 Citrix ADCとの通信にこれらの資格情報を使用します。

Vault サーバーから取得した資格情報を使用して、Citrix Ingress Controller が正常に実行されていることを確認します。

Citrix Ingress ControllerのVaultサーバーに保存されているCitrix ADC資格情報を使用する