ArgoCD Vault PluginとAWS Secrets Managerを利用してKubernetesのシークレット情報を管理する

  • 2022.02.24
  • AWS
ArgoCD Vault PluginとAWS Secrets Managerを利用してKubernetesのシークレット情報を管理する

周囲でコロナウイルスに感染した方が増えてきており、ますます家に引きこもっております。やっさんでございます。

ArgoCD Vault PluginとAWS Secrets Managerを利用してKubernetesの秘密情報を管理してみましたのでご紹介いたします。

ArgoCD Vault Pluginとは

ArgoCD Vault Plugin はKubernetesのマニフェストファイルに秘密情報を注入するためのArgo CDプラグインです。様々な秘密情報管理ツールに対応しています。

秘密情報管理ツールには、HashiCorp Vault、AWS Secrets Managerなどがあります。

なぜ秘密情報管理ツールが必要か

Kubernetesはデフォルトでシークレットというマニフェストがありまして、秘密情報はシークレットで管理することによりKubectlで参照したとしても秘匿性が維持されます。

よくシークレットについて言われることとしまして、シークレットを管理するyamlファイルのエンコードは base64 であるため、簡単にデコード出来てしまうというのがあります。

上記の理由から、シークレットの base64 エンコードに頼らず、他の秘密情報管理ツールを使う方法が多く提案されています。Argo CD Vault Plugin 以外にも Bitnami Sealed SecretsGoDaddy Kubernetes External Secrets などがあります。

ArgoCD Vault Pluginに着目した点としましては、プラグインによって導入出来るため、新たにポッドを追加する必要がないという点があります。

ArgoCD Valut Pluginの導入

それでは、導入方法についてご紹介していきます。

1. ArgoCDのカスタマイズ

今回はArgoCDのチュートリアルで提供されているセットアップ用のyamlファイルをベースにPluginの設定を記載したyamlファイルを用意しました。

yamlファイルはGitHubで公開しておりますので、よろしければご参照下さい。
変更したyamlファイルについて解説します。

1-1. argocd-repo-serverのdeployment

argocd-repo-server コンテナの volumeMounts に下記を追記しました。

        - mountPath: /usr/local/bin/argocd-vault-plugin
          name: custom-tools
          subPath: argocd-vault-plugin

volumescustom-tools に下記を追記しました。

      - emptyDir: {}
        name: custom-tools

initContainers に下記を追記して、ArgoCD Vault Pluginをインストールするようにしました。

      initContainers:
      - name: download-tools
        image: alpine:3.8
        command: [ sh, -c ]
        args:
          - >-
            wget -O argocd-vault-plugin
            https://github.com/IBM/argocd-vault-plugin/releases/download/v1.1.1/argocd-vault-plugin_1.1.1_linux_amd64 &&
            chmod +x argocd-vault-plugin &&
            mv argocd-vault-plugin /custom-tools/
        volumeMounts:
          - mountPath: /custom-tools
            name: custom-tools

そして、下記のように環境変数を指定し、秘密管理ツールに AWS Secrets Manager を指定するようにしました。

        - name: AVP_TYPE
          value: awssecretsmanager
        - name: AWS_REGION
          value: ap-northeast-1

1-2. arcocd-cmのconfigmap

ArgoCDで利用可能にさせるようにconfigmapに下記のように追記しました。

data:
  configManagementPlugins: |-
    - name: argocd-vault-plugin
      generate:
        command: ["argocd-vault-plugin"]
        args: ["generate", "./"]

1-3. yamlファイルの適用

以下のコマンド例などによって、プラグインをカスタマイズしたArgoCDをデプロイします。

kubectl create namespace argocd
kubectl apply -n argocd -f install.yaml

2. ArgoCD Vault PluginがAWS Secrets ManagerにアクセスするためのSecrets情報を作成

ArgoCDがAWS Secrets Managerの値を参照できるようにIAMポリシーを付与した認証情報をシークレットとして登録する必要があります。

2-1. シークレットの作成

シークレットの例は以下の通りです。ファイル名は secret-avp-credentials.yaml としました。

kind: Secret
apiVersion: v1
metadata:
  name: argocd-vault-plugin-credentials
  namespace: argocd
type: Opaque
stringData:
  AWS_ACCESS_KEY_ID: ***
  AWS_SECRET_ACCESS_KEY: ***

2-2. シークレットの適用

以下のようなコマンド例によって、シークレットを適用します。

kubectl apply -f secret-avp-credentials.yaml

3. AWS Secrets Managerに秘密情報を登録する

AWS Secrets Managerに秘密情報を登録します。今回は項目名を secret_test 、値を hoge としました。

4. Kubernetesのマニフェストファイルを更新しAWS Secrets Managerの秘密情報を参照できるようにする

Kubernetesのマニフェストファイルでは以下のように data の項目を指定することで、AWS Secrets Managerの値を参照することが出来ます。 <> で囲まれた箇所が該当します。

apiVersion: v1
kind: Secret
metadata:
  name: avp-test
  annotations:
    avp.kubernetes.io/path: "argocd_test"
data:
  MY_SECRET: <secret_test | base64encode>

5. ArgoCDのアプリケーション設定でArgoCD Vault Pluginを指定する

ArgoCDのアプリケーション設定でArgoCD Vault Pluginを利用するように設定します。設定方法は簡単で、以下画像のように Plugin の項目で argocd-vault-plugin を指定するだけです。

6. ArgoCDによるデプロイ結果を確認する

項番5で設定したアプリケーションのデプロイが成功した後に、Secret情報を確認して秘密情報が注入されていることを確認します。

まずは、Secret情報を取得します。以下のコマンドを実行することで、base64でエンコードされたSecret情報を取得できました。

## 実行コマンド
$ kubectl get secret avp-test -n argocd-example-app -o jsonpath='{.data}'

## 実行結果
{"MY_SECRET":"aG9nZQ=="}

次に、エンコードされたSecret情報をデコードして確認します。正しい値 hoge が取得でき秘密情報が正しく注入されていることを確認できました。

## 実行コマンド
echo 'aG9nZQ==' | base64 --decode

## 実行結果
hoge

まとめ

ArgoCD Vault Pluginを利用することで以下のことが実現できました。

  • ArgoCDにArgoCD Vault Pluginをインストール
  • 秘密情報をAWS Secrets Managerで管理
  • ArgoCDでAWS Secrets Managerの秘密情報をKubernetesマニフェストファイルに注入

以上、ご参考になれば幸いです。

参考情報