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 Secrets
や GoDaddy 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
volumes
の custom-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マニフェストファイルに注入
以上、ご参考になれば幸いです。
参考情報
- x-blood/argocd-vault-plugin-example
- argoproj-labs/argocd-vault-plugin: An Argo CD plugin to retrieve secrets from Secret Management tools and inject them into Kubernetes secrets
- Argo CD Vault Plugin