Kubernetes

Keeper Secrets ManagerのKubernetesへの統合によるシークレットの動的な取得

機能

  • Kubernetes内にKeeperボルトからシークレットを取り込みます

  • すべてのポッドでKeeperボルトのシークレットにリアルタイムにアクセスできます

  • Keeperボルトからローカルファイルシステムにファイル添付を安全にコピーします

Keeper Secrets Manager機能の完全なリストについては、概要をご参照ください。

前提条件

このページでは、Secrets ManagerとKubernetesとの連携について説明します。 この連携を利用するための必要条件は以下のとおりです。

概説

Keeper Secrets ManagerをK8sクラスタに統合して、すべてのポッドでKeeperシークレットにリアルタイムにアクセスできます。

設定

Secrets Managerの設定を作成

Commanderを使用して、Kubernetes用のSecrets Managerデバイスの設定を作成します。この設定はIPが固定されておらず、事前に初期化されていることにご注意ください。

次のコマンドを使用して、Commanderで設定を作成します。

secrets-manager client add --app <APP NAME> --unlock-ip --config-init k8s

例:

上記の例では、8行目から14行目までをコピーし、secret.yamlという名前のファイルに挿入します。 次に、Kubectlがインストールされたマシンを使用していて、クラスタにアクセスできる場合は、KSM SDKの設定をKubernetesシークレットに追加します。

Secrets Mangerの設定の作成について詳しくは、設定のドキュメントをご参照ください。

代替方法:ワンタイムアクセストークンとKSM CLI

または、Commander(もしくはVault UI)でワンタイムアクセストークンを生成し、Keeper Secrets Manager CLIでワンタイムアクセストークンを使用した、以下に示すような設定(XX:XXXは置き換えます)を作成することもできます。

Kubectlがインストールされたマシンを使用していて、クラスタにアクセスできる場合は、--applyパラメータを設定して、KSM SDKの設定をKubernetesシークレットに自動的に追加できます。

トークンの引き換えの出力をファイルにパイプし、Kubectlで適用できます。 以下に例を示します。

KSM設定の使用

KSM設定は、シークレットを使用してK8sコンテナにプルできます。

K8sクラスタで実行されているKeeper Developer SDKは、実行時に環境変数KSM_CONFIGを使用してデバイス設定を取得し、Keeperボルトと通信します。

例1 - SDKを使用したカスタムアプリ

ウェブアプリケーションを使用してデータベースシークレットを表示するデプロイメントとサービスを生成する簡単な例を以下に示します。この例では、ウェブアプリケーション用のKeeper Python Developer SDKを使用します。このSDKでKubernetesシークレットから設定を取得し、KeeperボルトからPostgreSQLデータベース記録の情報を取得します。

Keeperボルトから、以下の情報を使用して「データベース」記録タイプが作成されます。

では、ウェブアプリケーションを作成しましょう。ウェブページは、任意の開発者用SDKを使用して作成できます。この例では、Python SDKを使用します。単一のエンドポイントを指定する単純なFlaskアプリケーションは、ボルトの記録シークレットを含むHTMLを表示します。シークレットは、Keeper表記法構文を使用して取得されます。

次のパートでは、Dockerfileを作成します。以下のDockerfileのベースは、Docker HubのPython Debianイメージです。

Python SDKは、暗号化モジュールを使用します。このモジュールはRust言語をインストールする必要があります。RustがプレインストールされているDocker Hubイメージもあります。

次に、ksm_demoという名前のDockerイメージをビルドします。

Kubernetesクラスタにアクセスできると仮定すると、設定はワンタイムアクセストークンから生成されて、自動的に適用されます。

kubectl get secretと入力すると、シークレットのエントリが表示されます。

これで、ksm_demo Dockerイメージのデプロイメントとサービスを作成できます。この例では、ファイルにksm_demo.yamlという名前を付けます。

必要なシークレットとSDKの設定は、コンテナの一覧のenvセクションで定義します。このセクションでは、KSM_CONFIG環境変数を定義して、ksm-config Kubernetesシークレット、特にシークレットのconfigキーの値を取得します。

他の環境変数は単なる名前/値のリストです。この値はKeeper表記法で、ウェブアプリケーションによってSDKの表記法取得メソッドに送信されます。

ksm_demo.yamlファイルの2番目の記録は、サービスの定義です。これは、Kubernetesクラスタで動作するサービスであれば何にでも変更できます。この例では、外部IPアドレスを使用します。この例では、KubernetesノードのIPアドレスのいずれかを使用するのが安全です。たとえば、10.0.1.18を使用します。

これで、デプロイメントとサービスを適用する準備ができました。

デプロイメントの準備ができるまで待ちます。コマンドラインまたはKubernetesダッシュボードを使用して監視します。

最後に、ウェブブラウザを使用して外部IPアドレスのポート5000にアクセスすると、Keeperボルトのデータベース記録のシークレットが表示されます。

Keeperシークレットを表示するウェブアプリケーションの例

例2 - NGINX SSL証明書

この例では、Keeperボルトから取得したデフォルトのNGINX DockerイメージとSSL証明書を含むポッドが作成されます。

SSL証明書、秘密鍵、証明書のパスワードを格納するログイン記録がボルトに作成されます。

ワンタイムトークンが生成され、KubernetesのConfigMapに追加されます。

例のウェブサイトは、単なるインデックスHTMLページです。このHTMLをConfigMapに保存して、ドキュメントのルートディレクトリにマウントできます。

default.confは、この例によって上書きされます。証明書、鍵、パスワードは、/etc/keysディレクトリに格納されます。非対話型起動の場合、NGINXは証明書のパスワードをファイルに格納し、サーバー設定でssl_password_fileを指定する必要があります。

この例のデプロイメントは以下のようになります。

初期化コンテナには、dockerイメージkeeper/keeper-secrets-manager-writerが使用されます。コンテナはシークレットを取得し、NGINXで使用できるようにディスクに書き込みます。シークレットはポッドのemptyDirボリュームに書き込まれ、/etc/keysにマウントされます。このディレクトリは、ポッドが削除されると削除されます。

Keeper Secrets Manager Writerのドキュメントはこちらで入手できます。

また、メインコンテナは、ポッドのemptyDirボリュームを/etc/keysにマウントします。さらに、default.confを/etc/nginx/conf.dにマウントし、index.htmlファイルをサーバーのドキュメントルートにマウントします。

最後は、以下に示すように、NGINXにアクセスするサービスを作成します。

サービスは、httpsで外部IP(https://XXX.XXX.XXX.XXX)にアクセスしてテストできます。アドレスバーの鍵が証明書が有効であることを示していることにご注意ください。

外部シークレット

外部シークレットは、外部APIからのシークレットを同期してKubernetesに注入するKubernetesオペレータです。KeeperボルトからKubernetesにシークレットを同期するために外部シークレットをセットアップする方法の詳細については、こちらをご参照ください。

次の手順

この時点で、Secrets Manager SDKのいずれかを使用して、Keeper Secrets ManagerをK8sデプロイメントに統合できるようになりました。

最終更新