全 HCP Vault Dedicated1 ユーザの皆さま、こんにちは。

ついに……ついに来ましたよ……。 HCP Vault Dedicated から Azure のプライベート DNS ゾーンを参照できる日が!!!

正直どれだけの人が待っていたかは分かりませんが、この興奮をどうしても伝えたくて、今回のアップデートについて書いています。

「HCP Vault Dedicated から Azure のプライベート DNS ゾーンを参照できる」と言っても、具体的に何ができるようになったか? 簡単に言うと「HashiCorp Vault の目玉機能である動的シークレット (Dynamic Secret) を Azure 環境で使えるようになった」ということです。 その他にも、VSO (Vault Secrets Operator) で Kubernetes 認証が使えるようになるなどの恩恵もあります。

いや、今までも使えたでしょ?という意見もあるかもですが、多くの場合では実質的に使えない状態でした。 それはどういうことで、どうして今回のアップデートでそこまで興奮しているのかを伝えていきます。

Azure サービスにプライベート アクセスしよう

まずは Azure のプライベート アクセスについておさらいです。

Azure のほとんどのサービスにはパブリックなアクセスを拒否して、プライベート ネットワーク経由でのアクセスに制限する機能が備わっています。 プライベート ネットワーク経由でサービスにアクセスすることを実現するために、Azure では「プライベート エンドポイント」という仕組みが提供されています。

プライベート エンドポイントを作成すると、同時にプライベート DNS ゾーンが作られて対象リソースの DNS 名がプライベート DNS ゾーンに登録されます。 対象リソースにアクセスする際には、そのプライベート DNS ゾーンを参照することでパブリック アクセスが制限された Azure リソースにプライベート ネットワーク経由でアクセスできるようになります。 もちろん、クライアントはプライベート エンドポイントがある Azure VNet に繋がっている必要があります。

パブリック アクセスが制限された Azure サービスに利用するには以下の 2 つの条件が必要です。

  1. Azure VNet に繋がっていること
  2. プライベート DNS ゾーンを参照できること

このようなパブリック アクセスが制限された Azure のサービスに対して HCP Vault Dedicated を連携させることを考えます。

HCP Vault Dedicated は HashiCorp Virtual Network (HVN) 2上に構築されています。 HVN の中身は Azure VNet なので、自前の VNet とピアリングできます。 Firewall や NSG を通せる状態になっていれば、簡単に「1. Azure VNet に繋がっていること」という条件はクリアです。

ピアリングできていればネットワーク的にはプライベート エンドポイントに繋がるので、プライベート エンドポイントの IP アドレスベースでは HCP Vault Dedicated から Azure サービスに接続できます。 ただし、FQDN でないと利用できない Azure サービスもあるし、接続先の情報として IP アドレスを使うのは避けたいところです。

そこで「2. プライベート DNS ゾーンを参照できること」の条件が重要になりますが、今まので HCP Vault Dedicated ではプライベート DNS ゾーンを参照できなかったのです。 そのため、HCP Vault Dedicated から名前解決ができず Azure サービスに対してプライベート アクセスできない状態でした。

HashiCorp Vault は動的シークレットでしょ

HCP Vault Dedicated から Azure サービスにプライベート アクセスできないことは分かったけど、そもそも HCP Vault Dedicated から Azure サービスに対して何をしたいんだっけ?って話です。

HCP Vault Dedicated を使う主目的は「シークレット管理」です。 シークレットを HCP Vault Dedicated で一元管理して、シークレットを守りたいわけです。

HCP Vault Dedicated、というより HashiCorp Vault には大きく 2 種類のシークレットがあります。

1 つは「静的シークレット (Static Secret)」です。 静的シークレットは、名前の通りシークレットを HashiCorp Vault に保存して、必要に応じて取り出す仕組みです。 基本的には中長期的に同じシークレット値が使われます。 一定期間でシークレットをローテーションするようにルール化された組織もあるでしょう。

もう 1 つは「動的シークレット (Dynamic Secret)」です。 こちらはシークレットを利用したいタイミングで HashiCorp Vault がシークレットを発行し、一定時間後に自動的に失効させる仕組みです。 静的シークレットと比べるとシークレットの寿命が短く、より安全にシークレットを利用できます。

代表的な動的シークレットの例として、データベースの認証情報があります。 SQL Server や MySQL、PostgreSQL など、HashiCorp Vault は様々なデータベースに対して動的シークレットを使えます。

クライアント(アプリケーション)がデータベースに接続する際、HashiCorp Vault に対して認証情報をリクエストします。 HashiCorp Vault はデータベースに対して一時的なユーザを作成し、その認証情報をクライアントに返します。 クライアントはその認証情報を使ってデータベースに接続します。 一定時間が経過すると、その一時的なユーザは HashiCorp Vault によって削除されます。

クライアントが HashiCorp Vault にリクエストする手間は増えてしまいますが、認証情報が漏洩した場合でも被害を最小限に抑えられるというメリットがあります。 漏洩したその認証情報は既に無効化されていますからね。

これは完全に主観ですが、HCP Vault Dedicated の利用者は Azure のサービスに対して「動的シークレット (Dynamic Secret)」を使いたいわけです。

多くの場合、Azure のサービスはプライベート エンドポイント経由でしかアクセスできないように設定されています。 データベースをパブリックアクセスして使っている組織は少ないでしょう。

前述の通り、今までの HCP Vault Dedicated ではプライベート DNS ゾーンを参照できないので、Azure サービスの FQDN を指定して繋ぐことはできませんでした。 データベースはパブリック アクセスできないし、FQDN を指定してプライベート エンドポイントにも繋がらない。 つまり、HCP Vault Dedicated では Azure サービスに対して動的シークレットを利用できなかったのです。

これがとても歯痒い。 HashiCorp Vault を推している身としては強力なシークレット管理機能である動的シークレットは使っていきたいのに、運用を楽にするために HCP Vault Dedicated を選んでしまうと動的シークレットが使えないジレンマがあったわけですよ。

なんなら AKS にインストールした VSO で Kubernetes 認証ができないという制約もありました。 このことについて登壇したところ、jacopen さんから代わりに JWT 認証が使えるというアドバイスをもらって、プライベート AKS での VSO 利用が実現したという経緯もありました。 あれからもう 2 年か……(遠い目)。


JWT 認証できるならいいじゃんと思うかもしれませんが、それは問屋が卸しませんというもので、最近 JWT 認証と AKS の組み合わせで運用面の課題が出てきて頭を抱えていたところです。

カスタム DNS フォワーディングですべて解決よ!

HCP Vault Dedicated の歯痒さを解決してくれるのが、今回パブリックプレビューとして公開された「カスタム DNS フォワーディング」です。 まだアップデートページでは紹介されていませんが、HCP Vault Dedicated のドキュメントには既に説明が追加されています。

Configure private DNS forwarding | HashiCorp Cloud Platform | HashiCorp Developer

Integrate your private DNS to allow resolution with HCP Vault Dedicated.
icon
developer.hashicorp.com

カスタム DNS フォワーディングは HVN の機能で、特定のドメイン名を特定の DNS サーバに問い合わせるように設定できます。 HVN 上で動く HCP Vault Dedicated はこのカスタム DNS フォワーディングの設定を参照して、Azure のプライベート DNS ゾーンを参照できるようになります。

利用者は Azure にプライベート DNS ゾーンだけでなく、DNS private resolver 3も用意します。

Azure DNS プライベート リゾルバーの概要

Azure DNS プライベート リゾルバーを使用して、Azure 仮想ネットワークとオンプレミス環境の間でセキュリティで保護された DNS 解決を実現する方法について説明します。 機能、利点、および設定オプションを確認します。
icon
learn.microsoft.com

DNS private resolver はインバウンド エンドポイントとアウトバウンド エンドポイントを作れますが、カスタム DNS フォワーディングではインバウンド エンドポイントだけ必要です。 DNS private resolver のインバウンド エンドポイントに対して DNS クエリを投げることで、プライベート DNS ゾーンと仮想ネットワークリンク 4 していない Azure VNet からでも名前解決できるようになります。

カスタム DNS フォワーディングでプライベート DNS ゾーンのドメイン名を DNS private resolver のインバウンド エンドポイントに向けることで、HCP Vault Dedicated から Azure のプライベート DNS ゾーンを参照できるようになって、パブリック アクセスできない Azure のデータベースサービスに対して動的シークレットを利用できるようになる、というわけです。

推測ですが、カスタム DNS フォワーディングを設定すると裏側では HashiCorp 管理の DNS private resolver のアウトバウンド エンドポイントが作られて、条件付きフォワーダーを使える状態になっているのではないかと思います。

DNS private resolver のエンドポイントはそこそこの課金が発生する(個人の感想)のですが、今のところ HCP Vault Dedicated でカスタム DNS フォワーディングを使っても追加料金は発生しません。 追加料金が発生しないのはまだプレビュー中だからで、GA した際には追加料金が必要になるかも?とビクビクしてます。

まとめ

待ちに待った「カスタム DNS フォワーディング」がプレビュー公開されて、HCP Vault Deicated から Azure サービスに対して動的シークレットを使えるようになりました。

今回の投稿ではカスタム DNS フォワーディングを使う設定方法については言及していません。 DNS private resolver を用意して、ドキュメント通りフォワーディング設定するだけで HCP Vault Dedicated から Azure のプライベート DNS ゾーンを参照できるようになります。

どちらかというと HVN とピアリングする Azure VNet に DNS private resolver、プライベート DNS ゾーンがどんな形で作られているか、その組織ごとのネットワーク構成によってつまずきポイントが変わってくるんじゃないでしょうか。

ということで、まだプレビュー中ではあるものの HCP Vault Dedicated から Azure サービスに対して動的シークレットを利用できるようになりました。 GA したらすぐに導入できるように PoC をやるぞ!


  1. HCP Vault Dedicated は HashiCorp Cloud Platform 上で提供されるマネージド HashiCorp Vault サービス。 ↩︎

  2. HVN は HashiCorp 管理のネットワークで、作成時に Azure VNet または AWS VPC を選択できる。今回は Azure を選択したパターンだけ言及する。 ↩︎

  3. DNS private resolver は DNS エンドポイント機能(インバウンド)と条件付きフォワーダー機能(アウトバウンド)を提供するマネージドサービス。 ↩︎

  4. 仮想ネットワークリンクはプライベート DNS ゾーンと特定の Azure VNet を関連付ける機能。関連付けられた VNet からプライベート DNS ゾーンを参照できるようになる。 ↩︎