原文はこちら
ようこそ、ここではVaultとOracle Container Engine for Kubernetes(OKE)のインテグレーションのご紹介します。
前書き
まずSecret管理のためにデザインされた包括的なツールであるHashicorp Vaultをご紹介さします。
次に、Kubernetes Service Account Tokenを使ってVaultとの認証を円滑化するために使われるVault Kubernetes Auth Methodの概要をご説明します。この認証のやり方はKubernetesネイティブのIdentityとアクセス管理を活用しつつ、VaultトークンのKubernetes Podへの導入を容易にしています。
最後に、OKE上へのVaultのデプロイメントシナリオの概要をご説明します。そこではVaultがOKEにデプロイされており、さらにVault Kubernetes Auth Methodを使用してVaultがOKEクラスターのコントロールプレーンにインテグレーションされています。このデプロイメントシナリオは、ステップバイステップガイドおよび必要となる設定ファイルを含めて、この作業マニュアルに詳細が記載されています。
Oracle Cloud Infrastructure Container Engine for Kubernetes(多くの場合「OKE」と省略されます)はフルマネージド、スケーラブルで高可用性をもったサービスで、みなさんのコンテナ化されたアプリケーションをクラウドにデプロイするために使えます。みなさんの開発チームがクラウドネイティブアプリケーションを高信頼にビルド、デプロイそして管理するためにOKEを使っていただけます。OKEが使っているKubernetesは、クラスター化されたホストにまたがったコンテナ化されたアプリケーションのデプロイとスケーリング、管理を自動化するオープンソースのシステムです。
Vault
Secret管理はVaultの主要ユースケースのひとつです。ここでSecretというのは何かしら厳密にアクセスを制限したいもの、たとえばAPIキーやパスワード、証明書などです。VaultはこうしたSecretについて種類を問わず統一したインターフェースを提供し、そしてAPIドリヴンフレームワークによる緊密なアクセス制御やバージョン管理、詳細な監査ログなどの重要となる機能も提供しています。
多くの組織で、認証情報をソースコードにハードコーディングしてしまっており、それらはいくつかの設定ファイルや設定管理ツールに散らばっていたり、平文のままバージョン管理ツールやWiki、共有ストレージに保存されてしまっています。Vaultはこうした認証情報を保持するための中心地を提供し、それらが暗号化され、アクセスが監査ログに記録され、資格をもったクライアントのみが見ることができることを確実にします。
ValutはSecret管理、データ保護、Identityベースのアクセス、コラボレーションとオペレーション、ガバナンス、そしてコンプライアンスについての広範な機能を提供しています。
VaultはAcrive DirectoryやLDAP、Kubernetes、そしてクラウドプラットフォームなどの信頼済のIdentityソースに対して認証を行うことで、Secretや暗号鍵へのアクセスを緊密に制御することができます。Vaultにより、ユーザーやアプリケーションにSecretや鍵へのアクセス許可を行ううえでの、細かい粒度での認証が可能になります。
Kubernetes Auth Method
Vaultが用いられている場合、アクターにとって、Secretの格納/取り出しおよび暗号学的な操作に先立って認証の成功が必要となります。Vaultでの認証のコアはトークンです。これはつまり、Secretの利用者はまず有効なトークンを獲得する必要があるということです。Vaultの認証プロセスはクライアントのIdentity(Secretの利用者)を検証し、そしてこのIdentityに紐付いたトークンを生成します。
様々なプラットフォームで稼働するアプリケーションの要件を満たすため、Vaultはいくつかの認証メソッドを提供しています。Kubernetes Auth MethodはOKEのようなKubernetesベースのオーケストレーターとうまく組み合わせることができます。
Kubernetes Auth Methodは、Kubernetes Service Account Tokenを用いてVaultと組み合わせての認証を実現します。このPodのサービスアカウントのためのトークンは、Podが初期化される際にPodの中の`/var/run/secrets/kubernetes.io/serviceaccount/token`に自動的にマウントされます。Kubernetes Auth Methodを用いる場合にVaultに認証用に送られるのはこのトークンです。
Kubernetes TokenReview APIに対してのアクセス権限をもったサービスアカウントとVaultとの設定をしておきます。Vaultは、SecretにアクセスするためにVaultに接続を試みているPodが提示してきたサービスアカウントトークンを検証するために、Kubernetes API Serverに対して認証済のコールを行うためにこのサービスアカウントを利用します。
このVaultデプロイメントシナリオの図は前述の作業マニュアルの中で実装されるソリューションアーキテクチャを説明しています。
オレンジで表されている2番のフローは、Kubernetes Auth Methodを用いて実装される認証フローの概要を示しています。
成功裏に完了すると、Vaultは当該アプリケーションに予め設定されたポリシーをつけてトークンを返します。その後のStep 3以降では、このアプリケーションはこのトークンを使ってVaultのKey/Value SecretエンジンからSecretを取得することができます。
デプロイメントシナリオ
以下は前述のデプロイメントシナリオでプロビジョニングされるコンポーネントの概覧です:
- OKE Kubernetes cluster
- etcdおよびVault Kubernetesオペレーター
- Vaultクラスター
- Kubernetes Auth Methodを使うよう設定されたVault
- Vault Key/Value (KV)ストア `secret/testapp`
- デフォルトネームスペース内のKubernetesサービスアカウント'testapp'に紐付けられたVaultロール'testapp'
- 'testapp'ロールに紐付けられたVaultポリシー'testapp-kv-crud'(`secret/testapp` KVストアへのCRUDアクセスを提供)
- Vaultクラスターのための永続ストレージとして機能するetcdクラスター
- `testapp`サービスアカウントを使用し、(Kubernetes認証を通じて)Vaultと認証されるテストアプリケーション
- Vaultの`secret/testapp` KVストアでSecretを作成/取得するテストアプリケーション
etcd、およびVaultのクラスターはそれぞれのオペレーターによって作成されます。VaultオペレーターはVaultクラスターをKubernetes上にデプロイし、管理します。Vaultオペレーターによって作成されたVaultインスタンスは高い可用性を持ち、自動フェイルオーバとアップグレードをサポートしています。それぞれのVaultクラスターのために、Vaultオペレーターは永続ストレージバックエンドとしてetcdクラスターも作成します。
以下は、作業マニュアルで説明されている、VaultのインストールおよびOKEとのインテグレーションの手順の概観です:
- Vault & etcdオペレーターのデプロイ
- Vault & etcdクラスターのデプロイ
- Vault Kubernetes認証の設定
- Vault Key/Value (KV)ストア、およびテストアプリケーションに紐付けられたポリシーの作成
- テストアプリケーションのデプロイと、Kubernetes認証を使ったVaultへの認証
- KVストアへのSecretの作成、およびストアからの読み取り
この作業マニュアルは、OKEでの高可用デプロイメントについて素早く学び、活用するための素晴らしい方法です。
まとめ
Kubenetes Auth Methodを使ったVaultの認証とKubernetesのインテグレーションにより、Kubernetes Service Account Tokenを使ったVaultクライアントの認証プロセスをシンプルにすることができます。
一方で、カスタムアプリケーションロジックを書くことなく標準的なやりかたでトークンのライフサイクルを管理するためには、いくつかの課題が残っています。Vaultのチームはこれらの課題を解決するため、いくつかの機能を検討しています。
提案されている機構のひとつには、周期的に同期プロセスを実行することによってVaultとKubernetes Secrets機構をインテグレーションするものがあります。他にも、Container Storage Interfaceプラグインによって稼働中のPodにSecretをインジェクトするといったものもあります。さらに、サイドカーコンテナ経由でPodにVault Secretをインジェクトする、というものも。それぞれ、複雑性の解消のためのアプローチとして非常に興味深いです。
Kubernetesとクラウドネイティブの領域はとても動きが速いです。ソリューション、チュートリアル、ベストプラクティスなどを共有し、インスピレーションを得たり、ハンズオンを行ったり、産業のポテンシャルを解放することを支援しながら、この領域の進歩を観察していきたいと思います。