Kubernetes
KeeperシークレットマネージャーのKubernetes統合によるシークレットの動的取得

ほとんどのユースケースでは、Kubernetes外部シークレットオペレータ連携の利用を推奨します。本ドキュメントでは、External Secrets Operatorを使用しない代替の連携方法について取り扱います。
機能
Kubernetes内でKeeperボルトからシークレットを取得
すべてのポッドでKeeperボルトのシークレットにリアルタイムでアクセス
Keeperボルトからローカルファイルシステムへセキュアなファイル添付をコピー
Keeperシークレットマネージャーの機能一覧については、概要をご参照ください。
要件
本ページでは、シークレットマネージャーのKubernetes連携について取り扱います。本連携を利用するには、以下が必要です。
Keeperシークレットマネージャーへのアクセス(クイックスタートガイドをご参照ください)
Keeperのサブスクリプションでシークレットマネージャーアドオンが有効になっていること
シークレットマネージャーポリシーが有効なロールに所属していること
シークレットが共有されているKeeperシークレットマネージャーアプリケーション
アプリケーションの作成手順については、クイックスタートガイドをご参照ください
概要
KeeperシークレットマネージャーをK8sクラスタに統合すると、すべてのポッドでKeeperシークレットにリアルタイムでアクセスできます。
設定
シークレットマネージャー構成を作成
Keeperコマンダーで、Kubernetes用のシークレットマネージャーデバイス構成を作成します。この構成はIPロックされておらず、事前に初期化されている点にご注意ください。
以下のコマンドでKeeperコマンダーに構成を作成します。
secrets-manager client add --app <APP NAME> --unlock-ip --config-init k8s
例:
上記の例では、8行目から14行目をコピーし、secret.yaml というファイルに貼り付けます。次に、kubectl がインストールされたマシンでクラスタにアクセスできる場合は、KSM SDK構成をKubernetesシークレットに追加します。
シークレットマネージャー構成の作成の詳細については、構成ドキュメントをご参照ください。
代替方法: ワンタイムアクセストークンとKSM CLI
または、Keeperコマンダー(またはボルトUI)でワンタイムアクセストークンを生成し、KeeperシークレットマネージャーCLIで以下のように構成を作成できます(XX:XXX はワンタイムアクセストークンに置き換えます)。
kubectl がインストールされたマシンでクラスタにアクセスできる場合は、パラメータ --apply を指定して、KSM SDK構成をKubernetesシークレットに自動追加できます。
トークン引き換えの出力をファイルにリダイレクトし、kubectl で適用できます。以下に例を示します。
KSM構成の利用
KSM構成は、シークレットを使ってK8sコンテナに取り込めます。
実行時、K8sクラスタで動作するKeeperシークレットマネージャーSDKは、環境変数KSM_CONFIGからデバイス構成を取得し、Keeperボルトと通信します。
例
例1 - SDKを使ったカスタムアプリ
以下は、ウェブアプリケーションでデータベースシークレットを表示するデプロイメントとサービスを生成する簡単な例です。本例ではウェブアプリケーションにKeeper PythonシークレットマネージャーSDKを使用します。SDKはKubernetesシークレットから構成を取得し、KeeperボルトからPostgreSQLデータベースレコードの情報を取得します。
Keeperボルトで、以下の情報を使って「データベース」レコードタイプを作成します。

次にウェブアプリケーションを作成します。ウェブページは任意のシークレットマネージャーSDKで作成できます。本例ではPython SDKを使用します。単一エンドポイントを持つシンプルなFlaskアプリケーションが、ボルトレコードのシークレットを含むHTMLを表示します。シークレットはKeeper表記法構文で取得します。
次にDockerfileを作成します。以下のDockerfileはDocker HubのPython Debianイメージをベースにしています。
Python SDKは暗号化モジュール cryptography を使用します。このモジュールのビルドにはRustが必要です。RustがプリインストールされているDocker Hubイメージもあります。
次に、ksm_demo という名前のDockerイメージをビルドします。
Kubernetesクラスタにアクセスできる場合、ワンタイムアクセストークンから構成を生成して自動適用できます。
kubectl get secret を実行すると、シークレットエントリを確認できます。
続いて、ksm_demoDockerイメージ用のデプロイメントとサービスを作成します。本例ではファイル名をksm_demo.yamlとします。
必要なシークレットとSDKの構成は、containers一覧のenvセクションで定義します。このセクションではKSM_CONFIG環境変数に、Kubernetesシークレットksm-configのconfigキーの値を設定します。
その他の環境変数は名前と値のリストです。値にはKeeper表記法を指定し、ウェブアプリケーションがSDKの表記法取得メソッドに渡します。
ksm_demo.yamlの2つ目の定義はServiceです。Kubernetesクラスタに合わせて変更できます。本例では外部IPアドレスを使用します。例として、KubernetesノードのIPアドレス(10.0.1.18)を使用しても問題ありません。
この時点でデプロイメントとサービスを適用できます。
デプロイメントの準備が整うまで待ちます。コマンドラインまたはKubernetesダッシュボードで監視してください。
最後に、ウェブブラウザで外部IPアドレスのポート5000にアクセスすると、Keeperボルトのデータベースレコードのシークレットが表示されます。

例2 - NGINX SSL証明書
本例では、標準のNGINX Dockerイメージと、Keeperボルトから取得したSSL証明書を含むポッドを作成します。
ボルトにログインレコードを作成し、SSL証明書、秘密鍵、証明書パスワードを格納します。

ワンタイムトークンを生成し、Kubernetesシークレットに追加します。
例のウェブサイトは単純なインデックスHTMLページです。HTMLはConfigMapに保存し、ドキュメントルートディレクトリにマウントできます。
default.conf は本例で上書きします。証明書、鍵、パスワードは /etc/keys ディレクトリに配置します。非対話型起動では、NGINXは証明書パスワードをファイルに置き、サーバー構成に ssl_password_file を含める必要があります。
本例のデプロイメントは以下のとおりです。
Dockerイメージ keeper/keeper-secrets-manager-writer は初期化コンテナとして使用します。コンテナはシークレットを取得してディスクに書き込み、NGINXで利用できるようにします。シークレットはポッドのemptyDirボリュームに書き込まれ、/etc/keys にマウントされます。ポッド削除時にこのディレクトリは削除されます。
KeeperシークレットマネージャーWriterのドキュメントはこちらをご参照ください。
メインコンテナもポッドのemptyDirボリュームを /etc/keys にマウントします。さらに default.conf を /etc/nginx/conf.d に、 index.html をサーバーのドキュメントルートにマウントします。
最後に、以下のとおりNGINXにアクセスするサービスを作成します。
httpsで外部IPにアクセスしてサービスをテストできます(例: https://XXX.XXX.XXX.XXX)。アドレスバーの鍵アイコンは証明書が有効であることを示します。

外部シークレット
External Secretsは、外部APIからシークレットを同期してKubernetesに注入するKubernetesオペレータです。KeeperボルトからKubernetesへシークレットを同期するExternal Secretsのセットアップ方法の詳細は、以下をご参照ください。
Kubernetes外部シークレットオペレータ次のステップ
この時点で、シークレットマネージャーSDKのいずれかを使って、KeeperシークレットマネージャーをK8sデプロイメントに統合できます。
最終更新

