Azure Key Vault と PowerShell の使用

スクリプト シークレットを Azure Key Vault に安全に格納する

Azure オートメーションの運用手順書を使用して Teams チャネルにメッセージを投稿する方法に関する記事では、受信 Webhook コネクタと Submit-PnpTeamsChannelMessage PnP PowerShell モジュールからのコマンドレット。受信 Webhook コネクタはレポートに関するスニペットを投稿しますが、PnP コマンドレットははるかに大きな本文 (この場合は Azure オートメーション 運用手順書によって作成された HTML 形式のレポート) を投稿できます。

関連記事では、Azure オートメーション アカウントに格納されているアカウント資格情報を使用して認証を行い、SharePoint Online ドキュメント ライブラリにレポートを格納できるようにしたことを説明しました。運用手順書は、同じ資格情報を使用して、Teams チャネルにメッセージを投稿しました。この方法を使用したのは、チーム メンバーの ID を偽装して、チームに属するサイトとチャネルに情報を投稿できるようにする使いやすい方法 (PowerShell で) が見つからなかったためだと説明しました。

Azure Key Vault のセットアップ

何人かの人々が私がアカウントの資格情報をどこか別の場所に保存すべきだと提案しました。 Azure Key Vault、"シークレットを安全に保存およびアクセスするためのクラウドサービス."シークレットには、アカウント名、パスワード、Web サイトの URL など、安全に保存したいものなら何でもかまいません。要点は、シークレットがボルトに入ると、そのボルトへのアクセスが許可されているアカウントまたはアプリによってのみアクセスできるということです。

独自のコンテナーを作成する前に、Azure サブスクリプションが必要です。キー コンテナー。少数のシークレットを格納および取得するためのコストは最小限に抑えられるため、特に既存の Azure サブスクリプションを持つ組織では、これは問題にはなりません。

開始するには、 キー コンテナー セクション をクリックし、新しいコンテナーを作成するオプションを選択します。図 1 に示すように、ここで使用する Azure サブスクリプションを リソース グループ (既存のリソース グループを使用しましたが、新しいリソース グループを作成することもできます)、およびホストしている Azure リージョン (通常は、現在地に最も近いもの) です。Azure が新しいコンテナーを作成するのに数分かかり、シークレットを保存する準備が整いました。

新しいキー コンテナーの作成
図 1: 新しいキー コンテナーの作成

シークレットの保存と管理

運用手順書では、いくつかの変数を使用します。

  • PnP を使用して SharePoint Online にログインするためのアカウント資格情報。
  • PnP への接続に使用するサイトの URL。
  • スクリプトがメッセージを投稿するチャネルをホストするチームのグループ識別子。
  • ターゲット・チャネルのチャネル ID。
  • メッセージを投稿するための受信 Webhook 識別子。

Azure Key Vault では、これらすべてのアイテムをシークレットとして格納できます。図 2 では、SharePoint サイトの URL を格納しています。

Azure Key Vault へのシークレットの格納
図 2: Azure Key Vault へのシークレットの格納

シークレットの保存プロセスに複雑なことは何もなく、運用手順書に必要なシークレットの完全なセットを設定するのにそれほど時間はかかりません (図 3)。

Azure Key Vault の一連のシークレット
図 3: Azure Key Vault のシークレットのセット

シークレットを保存したら、次に行うことは、シークレットを使用するアカウントとアプリへのアクセスを許可することです。Azure Key Vault では、この目的のためにアクセス ポリシーが使用されます。私が使った Azure ロールベースのアクセス制御に基づくポリシーではなく、コンテナー アクセス ポリシー.

各コンテナー アクセス ポリシーによって、アカウントまたはアプリがシークレットで実行できる操作が決まります。私の場合、アプリはシークレット(GET操作)を読み取るだけで済みます。図 4 では、シークレット管理テンプレートに基づいてアクセス ポリシーを作成しています。アクセスポリシーでは、セットをGetだけにトリミングしていないため、7つの秘密のアクセス許可が許可されています。図 4 で重要なことは、実行アカウントに使用されるサービス プリンシパルへのアクセスを許可するように選択したことです。基本的に、これは実行アカウントが認証されると、コンテナー内のシークレットにアクセスできることを意味します。

Azure オートメーション実行アカウントへのアクセスを許可する
図 4: Azure オートメーションの実行アカウントへのアクセスを許可する

運用手順書スクリプトからのシークレットへのアクセス

前述のように、元の運用手順書スクリプトは、Azure オートメーション アカウントに格納されている資格情報を使用します。更新されたスクリプト (GitHub から入手可能) は、その資格情報と他の変数を Azure Key Vault に対するルックアップに置き換えます。Azure に接続してシークレットを取得するために使用されるコードは次のとおりです (Azure に接続するコードは dep です)。スクリプトの前半で確立された他の変数に終止符を打つ)。

$AzConnection = Connect-AzAccount -Tenant $Connection.TenantId -ApplicationId `
   $Connection.ApplicationId -CertificateThumbPrint $Connection.CertificateThumbprint `
  -ServicePrincipal
# Get username and password from Key Vault
$UserName = Get-AzKeyVaultSecret -VaultName "Office365ITPros" -Name "ExoAccountName" -AsPlainText
$UserPassword = Get-AzKeyVaultSecret -VaultName "Office365ITPros" -name "ExoAccountPassword" -AsPlainText
# Create credentials object from the username and password
[securestring]$SecurePassword = ConvertTo-SecureString $UserPassword -AsPlainText -Force
[pscredential]$UserCredentials = New-Object System.Management.Automation.PSCredential ($UserName, $SecurePassword)
# Get Site URL to use with PnP connection
$SiteURL = Get-AzKeyVaultSecret -VaultName "Office365ITPros" -name "SPOSiteURL" -AsPlainText
# Target channel identifier for incoming webhook connector
$TargetChannel = Get-AzKeyVaultSecret -VaultName "Office365ITPros" -name "IncomingWebhookId" -AsPlainText
# Target team and channel in that team to which we post a message containing the report
$TargetTeamId = Get-AzKeyVaultSecret -VaultName "Office365ITPros" -name "TargetTeamId" -AsPlainText
$TargetTeamChannel = Get-AzKeyVaultSecret -VaultName "Office365ITPros" -name "TargetChannelID" -AsPlainText

通常の PowerShell でシークレットを取得する

上記のコードは、運用手順書で実行すると機能します。Azure への接続を調整することで、対話式または “通常の" スクリプトで実行したときに、同じコードが Azure Key Vault からシークレットを取得できます。運用手順書と同様に、前提条件は、コンテナー アクセス ポリシーで、コンテナーへのアクセスに使用するアカウントを許可する必要があることです。ポリシーが設定されている場合は、 Connect-AzAccount コマンドレットを使用してサインインし、同じコードを実行してシークレットを取得します (図 5)。

対話型 PowerShell を使用した Azure Key Vault のシークレットへのアクセス
図 5: 対話型の PowerShell を使用した Azure Key Vault のシークレットへのアクセス

明白な問題

アカウントの資格情報としてユーザー名とパスワードを引き続き使用しています。シークレットが Azure Key Vault に安全に隠されているのは事実ですが、それでも単要素認証です。あいまいな名前と非常に複雑なパスワードを持つアカウントを使用することで、これをいくらか軽減できますが、それはまだ潜在的な弱点です。もう少し研究をする時が来ました。

秘密の安全な場所

Azure Key Vault の私の使い方はシンプルですが効果的です。シークレットを保存してシークレットにアクセスするのがいかに簡単かに満足していました。機密データを保持する安全な場所とは別に、運用手順書スクリプトで使用される変数を簡単に更新できることも意味します。Runbook スクリプトで直接変更を行うことができ、コードの実行は少し速くなりますが、重要な情報をセキュリティで保護できるという考えは気に入っています。Azure Key Vault を試してみて、それがあなたのために働くかどうかを確認してください!


Microsoft 365 テナント管理者が利用できるデータを活用する方法については、 Office 365 for IT プロフェッショナル 電子ブック。私たちは物事がどのように機能するかを理解するのが大好きです。

未分類

Posted by admin