Azure Stack Hub リソースへのアクセス権をアプリに付与する
Azure Resource Manager を通じてリソースのデプロイや構成を行うアプリケーションは、セキュリティ プリンシパルと呼ばれるその ID によって表される必要があります。 ユーザーがユーザー プリンシパルによって表されるように、アプリはサービス プリンシパルで表されます。
ID を使用すると、必要なアクセス許可のみをユーザーまたはアプリに委任することもできます。 たとえば、Azure Resource Manager を使用して Azure リソースのインベントリを作成する構成管理アプリがあります。 アプリは、ディレクトリに登録された後、適切なスコープの "閲覧者" ロールに追加されます。これにより、アプリは読み取り専用アクセスに制限されます。
概要
ユーザーと同様に、アプリでは認証時に資格情報を提示する必要があります。これには 2 つの要素があります。
- アプリケーション ID。クライアント ID と呼ばれることもあります。 Active Directory テナント内でのそのアプリの登録を一意に識別する GUID です。
- シークレット。 クライアント シークレット文字列 (パスワードに似たもの) を生成することも、X509 証明書サムプリント (証明書の公開キーを使用するもの) を指定することもできます。
独自の ID の下でアプリを実行することは、次の理由から、ユーザーの ID の下で実行することより好ましくなります。
- 資格情報の強度が上がる - アプリでは、文字の共有シークレットまたはパスワードの代わりに X509 証明書を利用してサインインできます。
- アクセス許可の制限が増える - 制限の厳しいアクセス許可をアプリに割り当てることができます。 一般的に、このアクセス許可はそのアプリでの実行に必要なものだけに限定され、このことを最小限の特権の原則といいます。
- アプリの場合、ユーザーの資格情報ほど頻繁には資格情報とアクセス許可は変更されません。 たとえば、ユーザーの責務が変わるときや、パスワードの要件で変更が要求されているときや、ユーザーが退職したときです。
開発者は初めに、使用するディレクトリ内に新しいアプリ登録を作成します。これによって、対応するサービス プリンシパル オブジェクトが作成され、これがそのディレクトリの中でアプリの ID を表します。 登録プロセスは、Azure Stack Hub インスタンスで選択したディレクトリによって異なります。
- Microsoft Entra ID: Microsoft Entra ID は、マルチテナント、クラウドベース、ディレクトリ、ID 管理サービスです。 接続された Azure Stack Hub インスタンスでMicrosoft Entra ID を使用できます。 後で示す例では、アプリの登録にAzure portal Microsoft Entra使用します。
- Active Directory フェデレーション サービス (AD FS) : 簡素化されセキュリティで保護された ID フェデレーション機能と Web シングル サインオン (SSO) 機能を備えています。 AD FS は、接続された Azure Stack Hub インスタンスでも、切断された Azure Stack Hub インスタンスでも使用できます。 後で説明する例では、AD FS アプリの登録に Azure Stack Hub PowerShell を使用します。
アプリを登録した後、それをロールに割り当てる方法を学習し、リソースへのアクセスを制限します。
Microsoft Entra アプリを管理する
id 管理サービスとして Microsoft Entra ID を使用して Azure Stack Hub をデプロイした場合は、Azure の場合と同様に、アプリの ID を作成して管理します。 このセクションでは、このことを Azure portal で行う手順を説明します。 アプリを登録するための十分なアクセス許可があることを確認するために、開始する前にアプリの登録に必要なアクセス許可を確認してください。
クライアント シークレット資格情報を使用するアプリ登録を作成する
このセクションでは、Azure portalを使用してMicrosoft Entra テナントにアプリを登録します。 次の例では、クライアント シークレット資格情報を指定しますが、ポータルでは X509 証明書ベースの資格情報もサポートされます。
Azure アカウントを使用して Azure Portal にサインインします。
[MICROSOFT ENTRA IDアプリの登録>新しい登録] を>選択します。
アプリの名前を指定します。
[サポートされているアカウントの種類] で適切なものを選択します。
[リダイレクト URI] で、アプリの種類として [Web] を選択し、このアプリにリダイレクト URI が必要な場合はここで指定します。
値を設定したら、 [登録] を選択します。 アプリ登録が作成されて [概要] ページが表示されます。
アプリ ID をコピーします。この ID をアプリ コードで使用するためです。 この値は、クライアント ID と呼ばれることもあります。
クライアント シークレットを生成するために、 [証明書とシークレット] ページを選択します。 [新しいクライアント シークレット] を選択します。
シークレットの説明と有効期限を指定します。
完了したら、 [追加] をクリックします。
シークレットの値が表示されます。 この値をコピーして別の場所に保存します。後でこの値を取得することはできないからです。 このシークレットは、サインインするときに、クライアント アプリ内でアプリ ID と共に提示します。
「ロールの割り当て」に進み、アプリの ID のロールベースのアクセス制御を確立する方法について確認します。
その他のMicrosoft Entraアプリ管理に関する記事
Microsoft Entra アプリの管理の詳細については、次の Azure の記事を参照してください。
- 証明書資格情報を使用するアプリ登録を作成する方法など、Microsoft Entra アプリの登録の詳細。
- アプリ登録を削除する方法。
- 最近削除されたアプリの登録を復元または削除する方法。
AD FS アプリを管理する
Azure Stack Hub をデプロイするときに AD FS を ID 管理サービスとして選択した場合は、アプリ ID の管理には PowerShell を使用する必要があります。 次の例は、X509 証明書とクライアント シークレット資格情報の両方を示しています。
スクリプトは、管理者特権のある ("管理者として実行") PowerShell コンソールで実行する必要があります。これにより、Azure Stack Hub インスタンスの特権エンドポイントをホストする VM への別のセッションが開きます。 特権エンドポイント セッションが確立した後に、追加のコマンドレットを使用してアプリ登録を作成および管理します。 特権エンドポイントの詳細については、Azure Stack Hub での特権エンドポイントの使用に関する記事を参照してください。
証明書の資格情報を使用するアプリ登録を作成する
証明書資格情報を作成するときは、次の要件を満たす必要があります。
- 運用環境では、証明書は、内部の証明機関または公的証明機関のどちらかから発行されている必要があります。 公的機関を利用している場合は、Microsoft の信頼されたルート機関プログラムの一部としてその機関を基本オペレーティング システム イメージに含める必要があります。 完全な一覧は、「参加者の一覧 - Microsoft の信頼されたルート プログラム」を参照してください。 "自己署名" テスト証明書の作成の例については、後で「証明書資格情報を更新する」でも示しています。
- 暗号化プロバイダーを、Microsoft レガシ暗号化サービス プロバイダー (CSP) のキー プロバイダーとして指定する必要があります。
- 公開キーと秘密キーの両方が必要なため、証明書は PFX ファイル形式である必要があります。 Windows サーバーでは、公開キー ファイル (TLS または SSL 証明書ファイル) と関連付けられている秘密キー ファイルが含まれている .pfx ファイルが使用されます。
- お使いの Azure Stack Hub インフラストラクチャは、証明書において公開されている証明機関の証明書失効リスト (CRL) の場所にネットワークでアクセスできる必要があります。 この CRL は、HTTP エンドポイントである必要があります。
証明書を用意できたら、下記の PowerShell スクリプトを使用してアプリを登録し、アプリの ID を使用してサインインします。 次のプレースホルダーを実際の値で置き換えてください。
プレースホルダー | 説明 | 例 |
---|---|---|
<PepVM> | Azure Stack Hub インスタンス上にある特権エンドポイント VM の名前。 | "AzS-ERCS01" |
<YourCertificateLocation> | ローカル証明書ストア内の X509 証明書の場所。 | "Cert:\CurrentUser\My\AB5A8A3533CC7AA2025BF05120117E06DE407B34" |
<YourAppName> | 新しいアプリ登録のわかりやすい名前。 | "My management tool" |
Windows PowerShell セッションを管理者特権で開き、次のスクリプトを実行します。
# Sign in to PowerShell interactively, using credentials that have access to the VM running the Privileged Endpoint (typically <domain>\cloudadmin) $Creds = Get-Credential # Create a PSSession to the Privileged Endpoint VM $Session = New-PSSession -ComputerName "<PepVm>" -ConfigurationName PrivilegedEndpoint -Credential $Creds -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US) # To use a managed certificate from the certificate store, use the Get-Item cmdlet. # To use a certificate file, use Get-Certificate for a .cer file, or Get-PfxCertificate for a .pfx file. # To use a test certificate, use the New-SelfSignedCertificate cmdlet # See https://video2.skills-academy.com/powershell/module/pki/new-selfsignedcertificate for usage details, including using the -Provider parameter # $Cert = New-SelfSignedCertificate -CertStoreLocation "cert:\CurrentUser\My" -Subject "CN=<YourAppName>" -KeySpec KeyExchange $Cert = Get-Item "<YourCertificateLocation>" # Use the privileged endpoint to create the new app registration $SpObject = Invoke-Command -Session $Session -ScriptBlock {New-GraphApplication -Name "<YourAppName>" -ClientCertificates $using:cert} $AzureStackInfo = Invoke-Command -Session $Session -ScriptBlock {Get-AzureStackStampInformation} $Session | Remove-PSSession # Using the stamp info for your Azure Stack Hub instance, populate the following variables: # - Az endpoint used for Azure Resource Manager operations # - Audience for acquiring an OAuth token used to access Graph API # - GUID of the directory tenant $ArmEndpoint = $AzureStackInfo.TenantExternalEndpoints.TenantResourceManager $GraphAudience = "https://graph." + $AzureStackInfo.ExternalDomainFQDN + "/" $TenantID = $AzureStackInfo.AADTenantID # Register and set an Az environment that targets your Azure Stack Hub instance Add-AzEnvironment -Name "AzureStackUser" -ArmEndpoint $ArmEndpoint # Sign in using the new service principal $SpSignin = Connect-AzAccount -Environment "AzureStackUser" ` -ServicePrincipal ` -CertificateThumbprint $SpObject.Thumbprint ` -ApplicationId $SpObject.ClientId ` -TenantId $TenantID # Output the service principal details $SpObject
スクリプトが完了すると、アプリの登録情報が表示されます。
ClientID
とThumbprint
が認証され、その後、Azure Resource Manager で管理されるリソースへのアクセスが承認されます。ApplicationIdentifier : S-1-5-21-1512385356-3796245103-1243299919-1356 ClientId : 00001111-aaaa-2222-bbbb-3333cccc4444 Thumbprint : 30202C11BE6864437B64CE36C8D988442082A0F1 ApplicationName : Azurestack-MyApp-c30febe7-1311-4fd8-9077-3d869db28342 ClientSecret : PSComputerName : azs-ercs01 RunspaceId : a78c76bb-8cae-4db4-a45a-c1420613e01b
PowerShell コンソール セッションは開いたままにします。ApplicationIdentifier
の値とともに次のセクションで使用するからです。
証明書資格情報を更新する
これで、アプリケーションが登録されました。このセクションでは以下のやり方を説明します。
- 新しい自己署名 X509 証明書をテスト用に生成します。
- アプリケーションの資格情報を更新します。具体的には、Thumbprint プロパティを新しい証明書に合わせて更新します。
PowerShell を使用して証明書資格情報を更新します。次のプレースホルダーを実際の値で置き換えてください。
プレースホルダー | 説明 | 例 |
---|---|---|
<PepVM> | Azure Stack Hub インスタンス上にある特権エンドポイント VM の名前。 | "AzS-ERCS01" |
<YourAppName> | 新しいアプリ登録のわかりやすい名前。 | "My management tool" |
<YourCertificateLocation> | ローカル証明書ストア内の X509 証明書の場所。 | "Cert:\CurrentUser\My\AB5A8A3533CC7AA2025BF05120117E06DE407B34" |
<AppIdentifier> | アプリケーション登録に割り当てられた識別子。 | "S-1-5-21-1512385356-3796245103-1243299919-1356" |
管理者特権のある Windows PowerShell セッションを使用して、次のコマンドレットを実行します。
# Create a PSSession to the PrivilegedEndpoint VM $Session = New-PSSession -ComputerName "<PepVM>" -ConfigurationName PrivilegedEndpoint -Credential $Creds -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US) # Create a self-signed certificate for testing purposes, using the New-SelfSignedCertificate cmdlet # See https://video2.skills-academy.com/powershell/module/pki/new-selfsignedcertificate for usage details, including using the -Provider parameter $NewCert = New-SelfSignedCertificate -CertStoreLocation "cert:\CurrentUser\My" -Subject "CN=<YourAppName>" -KeySpec KeyExchange # In production, use Get-Item to retrieve a managed certificate from the certificate store. # Alteratively, use Get-Certificate for a .cer file, or Get-PfxCertificate for a .pfx file. # $Cert = Get-Item "<YourCertificateLocation>" # Use the privileged endpoint to update the certificate thumbprint, used by <AppIdentifier> $SpObject = Invoke-Command -Session $Session -ScriptBlock {Set-GraphApplication -ApplicationIdentifier "<AppIdentifier>" -ClientCertificates $using:NewCert} $Session | Remove-PSSession # Output the updated service principal details $SpObject
このスクリプトが完了すると、更新後のアプリ登録の情報が表示され、この中に新しい自己署名証明書の拇印の値も含まれます。
ApplicationIdentifier : S-1-5-21-1512385356-3796245103-1243299919-1356 ClientId : Thumbprint : AF22EE716909041055A01FE6C6F5C5CDE78948E9 ApplicationName : Azurestack-MyApp-c30febe7-1311-4fd8-9077-3d869db28342 ClientSecret : PSComputerName : azs-ercs01 RunspaceId : a580f894-8f9b-40ee-aa10-77d4d142b4e5
クライアント シークレット資格情報を使用するアプリ登録を作成する
警告
クライアント シークレットを使用する場合は、X509 証明書資格情報を使用する場合に比べて安全性が低くなります。 認証メカニズムの安全性が低いだけでなく、一般的にはシークレットをクライアント アプリのソース コードに埋め込むことが必要になります。 そのため、運用環境のアプリでは証明書資格情報を使用することを強くお勧めします。
別のアプリ登録を作成しますが、今回はクライアント シークレット資格情報を指定します。 証明書資格情報とは異なり、クライアント シークレット資格情報はディレクトリが生成することができます。 開発者はクライアント シークレットを指定する代わりに、-GenerateClientSecret
スイッチを使用してシークレットの生成を要求できます。 次のプレースホルダーを実際の値で置き換えてください。
プレースホルダー | 説明 | 例 |
---|---|---|
<PepVM> | Azure Stack Hub インスタンス上にある特権エンドポイント VM の名前。 | "AzS-ERCS01" |
<YourAppName> | 新しいアプリ登録のわかりやすい名前。 | "My management tool" |
Windows PowerShell セッションを管理者特権で開き、次のコマンドレットを実行します。
# Sign in to PowerShell interactively, using credentials that have access to the VM running the Privileged Endpoint (typically <domain>\cloudadmin) $Creds = Get-Credential # Create a PSSession to the Privileged Endpoint VM $Session = New-PSSession -ComputerName "<PepVM>" -ConfigurationName PrivilegedEndpoint -Credential $Creds -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US) # Use the privileged endpoint to create the new app registration $SpObject = Invoke-Command -Session $Session -ScriptBlock {New-GraphApplication -Name "<YourAppName>" -GenerateClientSecret} $AzureStackInfo = Invoke-Command -Session $Session -ScriptBlock {Get-AzureStackStampInformation} $Session | Remove-PSSession # Using the stamp info for your Azure Stack Hub instance, populate the following variables: # - Az endpoint used for Azure Resource Manager operations # - Audience for acquiring an OAuth token used to access Graph API # - GUID of the directory tenant $ArmEndpoint = $AzureStackInfo.TenantExternalEndpoints.TenantResourceManager $GraphAudience = "https://graph." + $AzureStackInfo.ExternalDomainFQDN + "/" $TenantID = $AzureStackInfo.AADTenantID # Register and set an Az environment that targets your Azure Stack Hub instance Add-AzEnvironment -Name "AzureStackUser" -ArmEndpoint $ArmEndpoint # Sign in using the new service principal $securePassword = $SpObject.ClientSecret | ConvertTo-SecureString -AsPlainText -Force $credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $SpObject.ClientId, $securePassword $SpSignin = Connect-AzAccount -Environment "AzureStackUser" -ServicePrincipal -Credential $credential -TenantId $TenantID # Output the service principal details $SpObject
スクリプトが完了すると、アプリの登録情報が表示されます。
ClientID
とClientSecret
が認証され、その後、Azure Resource Manager で管理されるリソースへのアクセスが承認されます。ApplicationIdentifier : S-1-5-21-1634563105-1224503876-2692824315-2623 ClientId : 11112222-bbbb-3333-cccc-4444dddd5555 Thumbprint : ApplicationName : Azurestack-YourApp-6967581b-497e-4f5a-87b5-0c8d01a9f146 ClientSecret : 6RUWLRoBw3EebBLgaWGiowCkoko5_j_ujIPjA8dS PSComputerName : azs-ercs01 RunspaceId : 286daaa1-c9a6-4176-a1a8-03f543f90998
PowerShell コンソール セッションは開いたままにします。ApplicationIdentifier
の値とともに次のセクションで使用するからです。
クライアント シークレットの資格情報を更新する
PowerShell を使用してクライアント シークレット資格情報を更新します。ResetClientSecret パラメーターを使用するので、クライアント シークレットが即座に変更されます。 次のプレースホルダーを実際の値で置き換えてください。
プレースホルダー | 説明 | 例 |
---|---|---|
<PepVM> | Azure Stack Hub インスタンス上にある特権エンドポイント VM の名前。 | "AzS-ERCS01" |
<AppIdentifier> | アプリケーション登録に割り当てられた識別子。 | "S-1-5-21-1634563105-1224503876-2692824315-2623" |
管理者特権のある Windows PowerShell セッションを使用して、次のコマンドレットを実行します。
# Create a PSSession to the PrivilegedEndpoint VM $Session = New-PSSession -ComputerName "<PepVM>" -ConfigurationName PrivilegedEndpoint -Credential $Creds -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US) # Use the privileged endpoint to update the client secret, used by <AppIdentifier> $SpObject = Invoke-Command -Session $Session -ScriptBlock {Set-GraphApplication -ApplicationIdentifier "<AppIdentifier>" -ResetClientSecret} $Session | Remove-PSSession # Output the updated service principal details $SpObject
このスクリプトが完了すると、更新後のアプリ登録の情報が表示され、この中に新しく生成されたクライアント シークレットも含まれます。
ApplicationIdentifier : S-1-5-21-1634563105-1224503876-2692824315-2623 ClientId : 11112222-bbbb-3333-cccc-4444dddd5555 Thumbprint : ApplicationName : Azurestack-YourApp-6967581b-497e-4f5a-87b5-0c8d01a9f146 ClientSecret : MKUNzeL6PwmlhWdHB59c25WDDZlJ1A6IWzwgv_Kn PSComputerName : azs-ercs01 RunspaceId : 6ed9f903-f1be-44e3-9fef-e7e0e3f48564
アプリ登録を削除する
ここでは、PowerShell を使用してアプリの登録をディレクトリから削除する方法を説明します。
次のプレースホルダーを実際の値で置き換えてください。
プレースホルダー | 説明 | 例 |
---|---|---|
<PepVM> | Azure Stack Hub インスタンス上にある特権エンドポイント VM の名前。 | "AzS-ERCS01" |
<AppIdentifier> | アプリケーション登録に割り当てられた識別子。 | "S-1-5-21-1634563105-1224503876-2692824315-2623" |
# Sign in to PowerShell interactively, using credentials that have access to the VM running the Privileged Endpoint (typically <domain>\cloudadmin)
$Creds = Get-Credential
# Create a PSSession to the PrivilegedEndpoint VM
$Session = New-PSSession -ComputerName "<PepVM>" -ConfigurationName PrivilegedEndpoint -Credential $Creds -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US)
# OPTIONAL: Use the privileged endpoint to get a list of applications registered in AD FS
$AppList = Invoke-Command -Session $Session -ScriptBlock {Get-GraphApplication}
# Use the privileged endpoint to remove application <AppIdentifier>
Invoke-Command -Session $Session -ScriptBlock {Remove-GraphApplication -ApplicationIdentifier "<AppIdentifier>"}
Remove-GraphApplication コマンドレットを特権エンドポイントに対して呼び出したときに返される出力はありませんが、このコマンドレットの実行中に次のような詳細な確認出力がコンソールに表示されます。
VERBOSE: Deleting graph application with identifier S-1-5-21-1634563105-1224503876-2692824315-2623.
VERBOSE: Remove-GraphApplication : BEGIN on AZS-ADFS01 on ADFSGraphEndpoint
VERBOSE: Application with identifier S-1-5-21-1634563105-1224503876-2692824315-2623 was deleted.
VERBOSE: Remove-GraphApplication : END on AZS-ADFS01 under ADFSGraphEndpoint configuration
ロールの割り当て
ユーザーやアプリによる Azure リソースへのアクセスは、ロールベースのアクセス制御 (RBAC) を通じて承認されます。 自分のサブスクリプションに含まれるリソースにアプリからアクセスできるようにするには、そのサービス プリンシパルを特定の "リソース" に対する "ロール" に "割り当てる" 必要があります。 初めに、どのロールがそのアプリにとって適切な "アクセス許可" を表すかを判断します。 利用可能なロールについては、「Azure リソースの組み込みロール」を参照してください。
選択したリソースの種類に応じて、アプリの "アクセス スコープ" も決まります。 アクセス スコープはサブスクリプション、リソース グループ、またはリソースのレベルで設定できます。 アクセス許可は、スコープの下位レベルに継承されます。 たとえば、アプリをリソース グループの "閲覧者" ロールに追加すると、そのリソース グループと、その中にあるすべてのリソースを読み取ることができることになります。
Azure Stack Hub のインストール時に指定したディレクトリ (Microsoft Entra ID のAzure portal、AD FS 用の Azure Stack Hub ユーザー ポータルなど) に基づいて、適切なポータルにサインインします。 この例では、ユーザーが Azure Stack Hub ユーザー ポータルにサインインしたとします。
注意
リソースに対するロール割り当てを追加するには、この操作を行うユーザー アカウントが属しているロールで
Microsoft.Authorization/roleAssignments/write
の許可が宣言されている必要があります。 この条件を満たすのは、組み込みロールである所有者やユーザー アクセス管理者などです。どのリソースへのアクセスをアプリに許可するかを決定して、そのリソースの場所まで移動します。 この例では、サブスクリプション スコープでアプリをロールに割り当てるため、 [サブスクリプション] を選択してから特定のサブスクリプションを選択します。 代わりに、リソース グループを選択することも、特定のリソース (仮想マシンなど) を選択することもできます。
[アクセス制御 (IAM)] ページを選択します。このページは、RBAC をサポートするすべてのリソースにあります。
[+ 追加] を選択します。
[ロール] の下で、アプリに割り当てるロールを選択します。
[選択] の下で、アプリケーション名の全体または一部を入力してアプリを検索します。 登録中、アプリケーション名は Azurestack-YourAppName-GUID<><> として生成されます。 たとえば、 アプリケーション名として App2 を使用し、GUID 2bbe67d8-3fdb-4b62-87cf-cc41ddd4344ff を割り当てた場合、完全な名前は Azurestack-App2-2bbe67d8-3fdb-4b62-87cf-cc41dd4344ff になります。 検索するときに、この文字列全体を正確に指定することも、その一部分 (たとえば Azurestack や Azurestack-App2) を指定することもできます。
アプリが見つかったら、そのアプリを選択すると [選択したメンバー] に表示されます。
[保存] を選択して、ロールの割り当てを完了します。
完了すると、現在のスコープに割り当てられているプリンシパルの一覧の、指定のロールのセクションにアプリが表示されます。
これでアプリに ID が与えられ、リソース アクセスが承認されたので、スクリプトやコードでサインインし、Azure Stack Hub リソースに安全にアクセスできます。
次のステップ
ユーザー アクセス許可の管理
Microsoft Entraドキュメント
Active Directory フェデレーション サービス (AD FS)