進化したKubernetesのシークレット管理「External Secrets Operator」――シークレットを外部ツールで管理してGit上でもセキュアに使おうCloud Nativeチートシート(21)

Kubernetesやクラウドネイティブをより便利に利用する技術やツールの概要、使い方を凝縮して紹介する連載。今回は、外部のシークレット管理ツールと連携して、KubernetesのSecretオブジェクトを管理する「External Secrets Operator」を紹介する。

» 2022年09月29日 05時00分 公開
[眞野将徳, 岡本隆史, 正野勇嗣株式会社NTTデータ]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

 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つが挙げられます。

  1. 機密情報をYAMLに書かなくてよいので、シークレットに関する内容を安全にGitにコミットできる
  2. たくさんのシークレット管理ツールに対応している(「AWS SSMパラメータストア」「AWS Secrets Manager」「GCP Secret Manager」「Azure Key Vault」「GitLab Variable」など)
  3. 構成がシンプルで導入しやすい
  4. 設定ファイル内の特定の箇所(パスワード部分)に取得した内容を埋め込むなど、テンプレート機能を利用できる

 特に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は、下図のような構成になっています。

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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。