HashiCorp Vault PKIaaSとJetStack Cert-Managerを使ったK8のイングレストラフィックの保護(前半)
今回は、HashiCorp Vault PKIaaSとJetStack Cert-Managerを使ったK8のイングレストラフィックの保護についての記事です。長いので前半と後半の2部に分けて投稿致します。
はじめに
もはや誰にとっても秘密ではなく、セキュリティはすべての企業にとって大きな問題であり、もちろんTLS証明書の管理もその一つです。
しかし、証明書の要求が自動化されることはほとんどなく、PKIを担当するチームに連絡して証明書を生成する必要があることに変わりはありません。通常、これは毎日新しい証明書を要求したくないため、非常に長い有効期間の証明書が発行されることを意味します。
コンテナ化された環境の場合はなおさらですが、定義上非常に揮発性が高く(すぐに変わってしまう)、ゼロトラストネットワークを持つクラウド環境では、これはもはや持続可能なものではないということが問題なのです。
このため、Kubernetesプラットフォームにインストールするワイルドカード証明書を使用することがよくありますが、それは問題を解決するものではなく、問題を隠蔽するだけです。
この記事では、HashiCorp Vault とそのPKIシークレットエンジン、JetStack cert-managerを使って、Kubernetes環境でTLS証明書のライフサイクルの作成と管理を自動化する方法を見ていきます。
シンプルさとデモの再現性を高めるために、JetStack Cert-Managerのデプロイとコンフィグレーション(helmと Kubernetes プロバイダを使用)だけでなく、HashiCorp Vaultのデプロイとコンフィグレーション( Vaultプロバイダを使用)もHashiCorp Terraformを介してほぼすべて自動化されています。
What do we want to achieve ?
我々の目標はなんでしょうか?
ここでは、外部に公開されているすべてのアプリケーションのためのにkubernetes 環境で TLS 証明書の作成とライフサイクル管理を可能にする共通の自動化されたワークフローを構築していきます。
そのためには、Root PKI と Intermediate PKI として動作し、証明書発行のための API エンドポイントを提供する Vault Server をデプロイし、一方では、証明書コントローラマネージャである JetStack Cert-Manager をデプロイしてコンフィギュアし、Vault と統合します。
ワークフローとしては、以下のように記述することができます。
1. Cert-Manager は、証明書オブジェクトレベルで変更が発生したかどうかを確認し、提供された情報を使用して、発行者を通じて Vault にリクエストを送信します。
2. 署名付き証明書を返す前に、Vaultは、Kubernetes認証方式を介してCert-Manager発行者の身元と権限をバリデーションします。アイデンティティが検証されるとすぐに、Vaultは10分間有効な中間CAによって署名された特定の証明書を作成して配布します。
3. 最後に、Cert-Managerは証明書をKubernetesのシークレットとしてETCDに保存し、証明書の有効期間に関しては必要に応じて更新します。
How to prepare your environment for this demo?
このデモのための環境をどのように準備するか?
ここでは、あなたのラップトップ上の前提条件として必要なものがあります(このデモが、管理されたK8sクラスタ上で行われる可能性がある場合でも必要です)。
注:このデモでは、私は私自身が使用するためにフォークされたFruits-Catalogという名前の私の友人Laurent Broudoux氏が作ったJavaアプリケーションを使用します。
1.Clone Repos
まず、非常に明白であっても、このデモで必要なレポをクローンする必要があります。
・Terraformコードのリポジトリをクローンする
$ git clone https://github.com/nehrman/medium-kubernetes-pkiaas
- Java appのリポジトリもクローンする
$ git clone https://github.com/nehrman/secured-fruits-catalog-k8s
2. Minikubeのインストールとコンフィギュア
注意:これは既存のKubernetes環境で行うことができるので、オプションです。
ご自身のノートパソコンにMinikubeをインストールしてコンフィギュアする必要があります。
- そのためには、mac OSの場合、以下のコマンドを起動してminikubeをインストールします。
$ brew cask install minikube
- その後、Nginx Ingress Routerを有効にします。
$ minikube addons enable ingress
- Minikubeをお好みのドライバ(私はVMwareドライバを使用しています)で起動します。必要なすべてのサービスを処理するのに十分なリソースがあります。
$ minikube start — vm-driver vmware — memory 8096 — cpus 4 — disk-size 50GB
最終的にはこんな感じになるはずです。
- あとはHelmをインストールするだけです(バージョン3からはもっと簡単でセキュアになりました)。
$ brew install helm
3. 開発モードでVault Serverを起動する
HashiCorp VaultからPKI Secretエンジンを使用するには、ローカルマシン上でVaultサーバを起動する必要があります。
- HashiCorpのサイトからVaultをダウンロードし、解凍してパスに追加します。
$ curl https://releases.hashicorp.com/vault/1.3.4/vault_1.3.4_darwin_amd64.zip -o vault.zip$ unzip vault.zip$ sudo mv vault /usr/local/bin
- 簡単にするために、ここでは開発者モードでvaultサーバを使用していますが、これはすべてがメモリに保存されることを意味します。もちろん、既存のvaultを使用することもできますし、私たちのリファレンスアーキテクチャを使用して実際のvaultを構築することもできます。
注:開発モードのHashiCorp Vaultサーバは本番用ではなく、開発専用です。
$ vault server -dev -dev-listen-address=”0.0.0.0:8200" -dev-root-token-id=”root”
それでは、すべての前提条件が満たされたので、次に進みます。
How to deploy the Demo?
デモのデプロイの方法とは?
これで、Terraformとコードを使って、証明書管理の自動化のテストとバリデーションに必要なすべてのコードをデプロイしてコンフィギュアする準備が整いました。
注意: この記事では、Terraformのダウンロードとコンフィギュアの方法は説明しません。
しかし、すべてが完全に自動化されていても、コードが何をするのかを把握することには価値があります。
Kubernetes上では
- 2 つのネームスペースを作成します。1 つは Cert-Manager 用、もう 1 つはアプリケーション用に作成します。
- Vault Service AccountとclusterRoleBindingを作成して、VaultがKubernetes APIを介してPodのアイデンティティをバリデーションできるようにします。
- Helmを使ってCert-Managerをデプロイしてコンフィギュアします。
- アプリケーションのネットに Cert-Manager サービス アカウントを作成し、証明書発行者が Vault を通じて認証できるようにします。
- Appのイングレスルートをコンフィギュアします。
- K8s上にMongoDBをデプロイします。
- Application ネームスペース内にアプリケーションに関連する証明書オブジェクトを作成します。
Vault上では
- Cert-Managerがサービスアカウントを使用して認証できるようにKubernetes Authentication Methodをコンフィギュアします。
- ルート証明書のために Vault PKI シークレットエンジンをコンフィギュアします。
- 中間証明書のためにVault PKI シークレットエンジンをコンフィギュアします。
- 証明書をオンデマンドで生成できるようにロールをコンフィギュアします。
- PKIへのアクセスを許可する “fruits-catalog “というポリシーをコンフィギュアすると、要求に署名して証明書を発行することができます。
見た目ほど複雑ではないので安心してくださいね!
それでは、変数をコンフィギュアして terraform を実行して適用してみましょう。
Orangesys.ioでは、kuberneteの運用、DevOps、監視のお手伝いをさせていただいています。ぜひ私たちにおまかせください。