みなさん、こんにちは。Key Vault 大好き椎熊です。
今回は、Azure Key Vault によるパスワード管理についてご紹介したいと思います。
ちょうど使ってみようと思った方、これから利用を検討されている方のご参考になりましたら幸いです。
Azure Key Vault(以下 Key Vault)は、キー、証明書、シークレット(パスワードや接続文字列など)の機密情報を Azure 上に安全に保管、利用できるサービスです。
キーコンテナーという入れ物にキー / 証明書 / シークレットを格納します。
イメージとしては以下のとおりです。
キーコンテナーへのアクセスには管理プレーンとデータプレーンという、2つのインターフェースがあります。
それぞれの役割は以下のとおりです。
アクセスポリシーの管理は、Azure Portal、Azure CLI ツール、PowerShell、または Azure Resource Manager REST API を使用することができます。
イメージとしては以下のとおりです。
管理プレーンは RBAC で制御しますので、例えばリソースグループに「共同作成者権限」を持っているユーザーはデータプレーンのアクセスポリシーを設定できてしまいます。
このため Key Vault に対するアクセス制御は慎重に検討する必要があります。
最新の情報は以下を参照いただければと思います。
簡単ですが、実際にキーコンテナーを作成し、Key Vault の動作を確認してみます。
今回は、管理者にてパスワードを生成し、開発者へ渡すといったケースを想定しています。
管理プレーンとデータプレーンのイメージをつかんでいただければ幸いです。
手順は以下のとおりです。
前提条件)管理者用と開発者用のユーザーが作成されていること
3 - 1. キーコンテナーの作成
3 - 2. 作成したキーコンテナーに管理者ユーザーへ RBAC のロール権限を付与する
3 - 3. 管理者ユーザーにて管理者ユーザー自身のアクセスポリシーを設定する
3 - 4. 管理者ユーザーにてパスワードを生成する
3 - 5. 管理者ユーザーにて開発者ユーザーにアクセスポリシーを設定する
3 - 6. 開発者ユーザーにてパスワードを取得する
ここではキーコンテナーを作成できる権限のユーザーで Azure Portal にログインしてください。
[すべてのサービス] - [キーコンテナー]を選択します。
[追加]を選択します。
任意の名前を入力し、任意のサブスクリプション・リソースグループ・場所を選択してください。
価格レベルは[標準]を選択し、[作成]を選択します。
ここでは作成したキーコンテナーに RBAC のロール権限を付与できるユーザーで Azure Portal にログインしてください。
キーコンテナーの画面より、[<任意のキーコンテナー>] - [アクセス制御(IAM)] - [ロールの割り当ての追加]を選択します。
役割は[Key Vault の共同作成者]を選択し、管理者ユーザー[keyvault - admin]を選択します。
選択されたら、[保存]を選択します。
ここからは管理者ユーザーで Azure Portal にログインしてください。
ここでの操作は管理プレーンで行っていることになります。
[すべてのサービス] - [キーコンテナー]を選択します。
キーコンテナーの画面より、[<任意のキーコンテナー>] - [アクセス ポリシー] - [新規追加]を選択します。
管理者ユーザーには各オブジェクトの管理権限を付与します。 以下のとおり選択し、[OK]を選択します。
[保存]を選択します。
次に実際にパスワードを生成し、キーコンテナーへ格納します。
ここでの操作はデータプレーンで行っていることになります。
キーコンテナーの画面より、[<任意のキーコンテナー>] - [シークレット] - [生成/インポート]を選択します。
任意の名前と値にパスワードを入力します。
入力後、[作成]を選択します。
ここでの操作は管理プレーンで行っていることになります。
キーコンテナーの画面より、[<任意のキーコンテナー>] - [アクセス ポリシー] - [新規追加]を選択します。
プリンシパルの選択で開発者ユーザーを選択し、シークレットのアクセス許可で[取得]を選択し、[OK]を選択します。
[保存]を選択します。
これで開発者ユーザーでパスワードのみを取得することができます。
Azure PowerShell を使って、データプレーン経由でパスワードを取得します。
まず、開発者ユーザーで Azure に接続します。
>Login - AzureRmAccount
※接続には、Azure PowerShell が必要となります
※ブラウザが立ち上がり、ユーザー名 / パスワードの入力を求められるので、開発者ユーザーのアカウントでログインします
以下コマンドでシークレットを取得します。
>(Get-AzureKeyVaultSecret - vaultName "keycontainer-blog" - name "keyvault - secret").SecretValueText
“secret”という文字列が設定したパスワードとなります。
イメージは掴んでいただけたでしょうか?
今回のケースでは開発者もパスワードが見えてしまいますが、本番環境ではまた別のキーコンテナーで別シークレットを設定し、アクセスポリシーでアプリケーションにのみ取得権限を付与することで本番環境のパスワードを隠すことができます。
ただし、今回の取得方法では、Key Vault からパスワードを取得する前に Azure AD の認証が必要となります。認証のためのアカウント情報をプログラムに書いておかなければならず、アカウント情報がハードコードされてしまうという問題は解消できません。
この問題を解決する手段として、マネージド ID というサービスと組み合わせて使うことで、よりセキュアな構成をとることができます。マネージド ID についてはまた別の機会にご紹介します。