進化したKubernetesのシークレット管理「External Secrets Operator」――シークレットを外部ツールで管理してGit上でもセキュアに使おう:Cloud Nativeチートシート(21)
Kubernetesやクラウドネイティブをより便利に利用する技術やツールの概要、使い方を凝縮して紹介する連載。今回は、外部のシークレット管理ツールと連携して、KubernetesのSecretオブジェクトを管理する「External Secrets Operator」を紹介する。
Kubernetesやクラウドネイティブをより便利に利用する技術やツールの概要、使い方を凝縮して紹介する本連載「Cloud Nativeチートシート」。今回は外部のシークレット管理ツールと連携して、KubernetesのSecretオブジェクトを管理する「External Secrets Operator」を紹介します。
External Secrets Operatorを利用すれば、シークレットをGitでセキュアに管理でき、GitOpsとの親和性もバッチリです。
目次
External Secrets Operatorとは?
「External Secrets Operator」は、「AWS Secret」「GitLab Variable」などの外部ツールのシークレットを元にSecretオブジェクトを作成、管理できるフレームワークです。
特徴として、次の4つが挙げられます。
- 機密情報をYAMLに書かなくてよいので、シークレットに関する内容を安全にGitにコミットできる
- たくさんのシークレット管理ツールに対応している(「AWS SSMパラメータストア」「AWS Secrets Manager」「GCP Secret Manager」「Azure Key Vault」「GitLab Variable」など)
- 構成がシンプルで導入しやすい
- 設定ファイル内の特定の箇所(パスワード部分)に取得した内容を埋め込むなど、テンプレート機能を利用できる
特に1番目の特徴は重要です。Kubernetesには「Secret」というパスワードやトークンなどの機密情報を保持するオブジェクトがありますが、Secretのオブジェクト定義において、機密情報は暗号化されているわけではありません。文字列をただ「Base64」でエンコードしたものが記載されているので、オブジェクト定義を見られる人なら誰でも秘密情報の値を知ることができてしまいます。
そのため、シークレットのYAMLファイルは誰でも見られるソースリポジトリには配置することが難しく、例えばGitOpsをしたい場合には、シークレットは別の場所で分けて管理し、デプロイ時に組み合わせるなど作り込みで対応せざるを得ず、その管理、運用が困難でした。
External Secrets Operatorは、そんな課題を解決するために、外部のシークレット管理ツールと連携し、それらに保存されている機密情報を取得してシークレットを自動で作成します。そのため、ユーザーはオブジェクト定義情報に機密情報そのものを記載することなく、機密情報を管理できます。各種クラウドベンダーが提供しているシークレット管理サービスとも連携させることができ、多くの環境で利用可能です。
似たようなツールとして、過去には「Kubernetes External Secrets」(KES)が提供されていました。KES以外にも複数の類似のツールが、それぞれのシークレット管理ツールに合わせて開発されていましたが、それらを統合する動きの中で、JavaScriptで書かれたKESは標準化を進めることが難しく、Go言語で開発されたExternal Secrets Operatorが統合先として選ばれました。今ではKESは開発が止まり、下記リンクのissueにもある通り、External Secrets OperatorはKESの後継として推奨されています。
ここからはExternal Secrets Operatorの使い方を見ていきましょう。
External Secrets Operatorの構成
紹介するExternal Secrets Operatorは、下図のような構成になっています。
基本的には、「SecretStore」「ExternalSecret」の2つのオブジェクトから構成されます。図で色分けしている通り、SecretStoreとExternalSecretは、それぞれシークレット管理ツールとその各パラメーターに対応します。
SecretStoreは、外部のシークレット管理ツールと連携するためのオブジェクトで、例えばAmazon Web Services(AWS)のSSMパラメータストアサービスや、「GitLab」プロジェクトの情報を持ちます。
ExternalSecretは具体的なシークレットと結び付くオブジェクトです。先に説明したSecretStoreと連携して、「どの外部シークレット管理ツールから、どのパラメーターを取得するか」の情報と、それを元に「KubernetesのSecretオブジェクトをどのように作成するか」の情報を持ちます。図のAWS側の絵のように、1つのSecretStoreに複数のExternalSecretが参照することができ、シークレット管理ツールの複数のパラメーターを取り扱えます。
この後、具体的にExternal Secrets Operatorの使い方を説明しますが、この構成を頭の片隅に置きながら読んでいただくと、それらの関係性がより分かりやすいと思います。
External Secrets Operatorを使ってみよう
ここからはExternal Secrets Operatorを使ってみます。本記事では、下記のバージョンで動作を確認しています。
- External Secrets Operator:0.5.9
- Kubernetes(Amazon Elastic Kubernetes Service):1.22
インストール
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- コンテナ実行基盤「Kubernetes」の構成要素とエコシステムを解説――ネットワーク、シークレット管理の仕組み
コンテナオーケストレーションツールとして知られる「Kubernetes」とHashiCorpが提供する「Nomad」を比較検証する本連載。第2回はKubernetesを用いたクラスタ構築の手順やKubernetesの構成要素についてネットワーク、シークレット管理を中心に解説します。 - コンテナを保護するための10のベストプラクティス、InfraCloudが解説
InfraCloudが、アプリケーションコンテナのセキュリティを確保するための10のベストプラクティスを解説した。 - 「マイクロサービスに出遅れた」ところは、先人から何を学べるか
これまでマイクロサービスアーキテクチャに取り組んだ組織の多くは、試行錯誤を重ねて、自らの組織における最適解を見いだしている。いま、マイクロサービスを考える人たちは、先人から何を学べばいいのだろうか。