Exchange Online PowerShell とセキュリティ & コンプライアンス PowerShell での無人スクリプトのアプリ専用認証
Microsoft 365 の監査とレポートのシナリオには、多くの場合、PowerShell とセキュリティ & コンプライアンス PowerShell Exchange Online無人スクリプトが含まれます。 以前は、無人サインインでは、ユーザー名とパスワードをローカル ファイルまたは実行時にアクセスされるシークレット コンテナーに格納する必要がありました。 しかし、ご存知のように、ユーザーの資格情報をローカルに格納することは、セキュリティの面で良い方法ではありません。
この記事で説明されているように、証明書ベースの認証 (CBA) またはアプリのみの認証では、Azure AD アプリと自己署名証明書を使用した自動スクリプトと自動化のシナリオがサポートされます。
注:
Azure でマネージド ID を使用して powerShell Exchange Onlineに接続できることをご存知でしたか? 「Azure マネージド ID を使用して PowerShell に接続する」Exchange Online参照してください。
この記事で説明する機能と手順には、次のバージョンの Exchange Online PowerShell モジュールが必要です。
- Exchange Online PowerShell (Connect-ExchangeOnline): バージョン 2.0.3 以降。
- セキュリティ & コンプライアンス PowerShell (Connect-IPPSSession): バージョン 3.0.0 以降。
モジュールをインストールまたは更新する方法については、「Exchange Online PowerShell モジュールのインストールと保守」を参照してください。 Azure Automation でモジュールを使用する方法については、「Azure Automationでモジュールを管理する」を参照してください。
バージョン 2.0.5 以前は、Exchange Online PowerShell V2 モジュール (EXO V2 モジュールと略記) と呼ばれます。 バージョン 3.0.0 以降は、Exchange Online PowerShell V3 モジュール (EXO V3 モジュールと略記) と呼ばれます。
Exchange Online PowerShell では、この記事の手順を次の Microsoft 365 グループ コマンドレットで使用することはできません。
- New-UnifiedGroup
- Remove-UnifiedGroup
- Set-UnifiedGroup
- Remove-UnifiedGroupLinks
- Add-UnifiedGroupLinks
Microsoft Graph を使用して、これらのコマンドレットのほとんどの機能を置き換えることができます。 詳細については、「Microsoft Graph でのグループの操作」を参照してください。
セキュリティ & コンプライアンス PowerShell では、この記事の手順を次のコマンドレットと共に使用することはできません。
委任されたシナリオは、Exchange Onlineでサポートされています。 委任を使用して接続する場合に推奨される方法は、GDAP とアプリの同意を使用することです。 詳細については、「GDAP とアプリの同意を使用して powerShell v3 モジュールをExchange Onlineする」を参照してください。 また、CSP リレーションシップが顧客と作成されていない場合は、マルチテナント アプリケーションを使用することもできます。 マルチテナント アプリケーションを使用するために必要な手順については、この記事の通常の手順で説明します。
この記事の手順がうまくいかない場合は、次のコマンド
Get-InstalledModule PackageManagement -AllVersions; Get-InstalledModule PowerShellGet -AllVersions
を実行して、PackageManagement モジュールまたは PowerShellGet モジュールのベータ版がインストールされていないことを確認します。
どのような仕組みですか?
Exchange Online PowerShell モジュールでは、Active Directory 認証ライブラリを使用して、アプリケーション ID、テナント ID (組織)、証明書の拇印を使用してアプリ専用トークンをフェッチします。 Azure AD 内にプロビジョニングされたアプリケーション オブジェクトには、アクセス トークンで返されるディレクトリ ロールが割り当てられています。 セッションのロール ベースのアクセス制御 (RBAC) は、トークンで使用可能なディレクトリ ロール情報を使用して構成されます。
接続の例
次の例は、アプリ専用認証で Exchange Online PowerShell モジュールを使用する方法を示しています。
重要
次の接続コマンドでは、Organization パラメーターの値として組織のプライマリ .onmicrosoft.com
ドメインを使用します。
次の接続コマンドには、「PowerShell に接続する」および「セキュリティ & コンプライアンスPowerShell に接続する Exchange Online」の説明に従って、同じオプションの多くを使用できます。 例:
EXO V3 モジュールを使用Exchange Online PowerShell では、USERPSSession スイッチを省略するか含め、REST API コマンドレットまたは元のリモート PowerShell コマンドレットを使用できます。 詳細については、「EXO V3 モジュールの更新」を参照してください。
Exchange Online PowerShell でのリモート PowerShell のサポートは非推奨になります。 詳細については、「Exchange Online PowerShell でのリモート PowerShell (RPS) プロトコルの非推奨の発表」を参照してください。
Microsoft 365 GCC High または Microsoft 365 DoD 環境には、次の追加のパラメーターと値が必要です。
- GCC High の Connect-ExchangeOnline:
-ExchangeEnvironmentName O365USGovGCCHigh
。 - GCC High での Connect-IPPSSession:
-ConnectionUri https://ps.compliance.protection.office365.us/powershell-liveid/ -AzureADAuthorizationEndpointUri https://login.microsoftonline.us/common
。 - DoD の Connect-ExchangeOnline:
-ExchangeEnvironmentName O365USGovDoD
。 - DoD の Connect-IPPSSession:
-ConnectionUri https://l5.ps.compliance.protection.office365.us/powershell-liveid/ -AzureADAuthorizationEndpointUri https://login.microsoftonline.us/common
。
- GCC High の Connect-ExchangeOnline:
Connect-IPPSSession コマンドにログイン プロンプトが表示される場合は、Connect-IPPSSession コマンドの前に コマンドを
$Global:IsWindows = $true
実行します。
証明書の拇印を使用して接続します。
コマンドを実行しているコンピューターに証明書をインストールする必要があります。 証明書は、ユーザー証明書ストアにインストールする必要があります。
Exchange Online PowerShell:
Connect-ExchangeOnline -CertificateThumbPrint "012THISISADEMOTHUMBPRINT" -AppID "36ee4c6c-0812-40a2-b820-b22ebd02bce3" -Organization "contosoelectronics.onmicrosoft.com"
セキュリティ & コンプライアンス PowerShell:
Connect-IPPSSession -CertificateThumbPrint "012THISISADEMOTHUMBPRINT" -AppID "36ee4c6c-0812-40a2-b820-b22ebd02bce3" -Organization "contosoelectronics.onmicrosoft.com"
証明書オブジェクトを使用して接続する:
コマンドを実行しているコンピューターに証明書をインストールする必要はありません。 証明書オブジェクトはリモートで格納できます。 スクリプトの実行時に証明書がフェッチされます。
Exchange Online PowerShell:
Connect-ExchangeOnline -Certificate <%X509Certificate2 Object%> -AppID "36ee4c6c-0812-40a2-b820-b22ebd02bce3" -Organization "contosoelectronics.onmicrosoft.com"
セキュリティ & コンプライアンス PowerShell:
Connect-IPPSSession -Certificate <%X509Certificate2 Object%> -AppID "36ee4c6c-0812-40a2-b820-b22ebd02bce3" -Organization "contosoelectronics.onmicrosoft.com"
ローカル証明書を使用して接続する:
注:
ConvertTo-SecureString コマンドを使用して証明書のパスワードをローカルに格納すると、自動化シナリオのセキュリティで保護された接続方法の目的が破られます。 Get-Credential コマンドを使用して証明書のパスワードを安全に要求することは、自動化シナリオには適していません。 つまり、ローカル証明書を使用して接続するための 自動化された安全 な方法はありません。
Exchange Online PowerShell:
Connect-ExchangeOnline -CertificateFilePath "C:\Users\navin\Desktop\automation-cert.pfx" -CertificatePassword (Get-Credential).password -AppID "36ee4c6c-0812-40a2-b820-b22ebd02bce3" -Organization "contosoelectronics.onmicrosoft.com"
セキュリティ & コンプライアンス PowerShell:
Connect-IPPSSession -CertificateFilePath "C:\Users\navin\Desktop\automation-cert.pfx" -CertificatePassword (Get-Credential).password -AppID "36ee4c6c-0812-40a2-b820-b22ebd02bce3" -Organization "contosoelectronics.onmicrosoft.com"
アプリ専用の認証をセットアップする
初期のオンボードは、アプリケーション オブジェクトを使用する認証に必要です。 アプリケーションとサービス プリンシパルは同義に使用されますが、アプリケーションはクラス オブジェクトのようなものであり、サービス プリンシパルはクラスのインスタンスのようなものです。 詳細については、「Azure Active Directory のアプリケーション オブジェクトとサービス プリンシパル オブジェクト」 を参照してください。
Azure AD でのアプリケーションの作成に関する詳しい視覚的フローは、https://aka.ms/azuread-app を参照してください。
-
アプリケーション オブジェクトには、既定のアクセス許可
User.Read
があります。 アプリケーション オブジェクトがリソースにアクセスするには、アプリケーションのアクセス許可Exchange.ManageAsApp
が必要です。 -
Azure AD でのアプリ専用認証の場合、通常は証明書を使用してアクセスを要求します。 証明書とその秘密キーを持つすべてのユーザーは、アプリと、アプリに付与された権限を使用できます。
自己署名された X.509 の証明書を作成して設定します。この証明書は、アプリ専用アクセス トークンを要求しながら Azure AD に対してアプリケーションを認証するために使用されます。
これは、ユーザーアカウントのパスワードを生成するのと似ています。 証明書も自己署名できます。 PowerShell で証明書を生成する手順については、この記事の後半にある 「付録」 セクションを参照してください。
注:
暗号化: 次世代 (CNG) 証明書は、Exchange のアプリ専用の認証ではサポートされていません。 CNG 証明書は、既定では、最新の Windows バージョンで作成されます。 CSP キー プロバイダーからの証明書を使用する必要があります。 「付録」 セクションでは、CSP 証明書を作成するためにサポートされている 2 つの方法について説明します。
-
アプリケーションには、適切な RBAC ロールが割り当てられている必要があります。 アプリは Azure AD でプロビジョニングされるので、サポートされている組み込みのロールのいずれかを使用できます。
ステップ 1: Azure AD にアプリケーションを登録します。
注:
問題が発生した場合は、必要なアクセス許可を確認して、アカウントが ID を作成できることを確認します。
https://portal.azure.com/で Azure AD ポータルを開きます。
ページの上部にある [検索] ボックスに「アプリの登録」と入力し、[サービス] セクションの結果から [アプリの登録] を選択します。
または、アプリの登録 ページに直接移動するには、 を使用https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBladeします。
[アプリの登録] ページで、[新しい登録] をクリックします。
[アプリケーションの登録] ページが開いたら、次の設定を構成します:
名前: 分かりやすい名前を入力します。 たとえば、ExO PowerShell CBA です。
サポートされているアカウントの種類: この組織ディレクトリ内のアカウント (<YourOrganizationName> のみ - 単一テナント) が選択されていることを確認します。
注:
委任されたシナリオExchange Onlineアプリケーションをマルチテナントにするには、任意の組織ディレクトリ (Any Azure AD ディレクトリ - Multitenant) 内の [アカウント] の値を選択します。
URI のリダイレクト (オプション): 最初のボックスで、Web が選択されていることを確認します。 2番目のボックスに、アクセス トークンの送信先 URI を入力します。
注:
自動アプリケーションではその種類を使用できないため、 ネイティブ アプリケーションの資格情報を作成することはできません。
完了したら、[登録] をクリックします。
戻ったアプリ ページを開いたままにします。 次の手順で使用します。
手順 2: アプリケーションに API アクセス許可を割り当てる
注:
このセクションの手順は、新しいアプリ用に自動的に構成された既定のアクセス許可を置き換えます。 アプリには、置き換えられた既定のアクセス許可は必要はありません。
[管理] の下のアプリページで、[マニフェスト] を選択します。
マニフェスト ページが開いたら、
requiredResourceAccess
エントリを見つけます (47 行目またはその前後にあります)。次のコード スニペットに
resourceAppId
resourceAccess id
示すように、およびresourceAccess type
の値を変更します。"requiredResourceAccess": [ { "resourceAppId": "00000002-0000-0ff1-ce00-000000000000", "resourceAccess": [ { "id": "dc50a0fb-09a3-484d-be87-e023b12c6440", "type": "Role" } ] } ],
注:
Microsoft 365 GCC High または DoD 環境では、セキュリティ & コンプライアンス PowerShell にのみアクセスできます。 、、および には、次の
resourceAppId
resourceAccess id
値をresourceAccess type
使用します。"requiredResourceAccess": [ { "resourceAppId": "00000007-0000-0ff1-ce00-000000000000", "resourceAccess": [ { "id": "455e5cd2-84e8-4751-8344-5672145dfa17", "type": "Role" } ] } ],
完了したら、[保存] をクリックします。
引き続きマニフェスト ページの [管理] で、[API権限] を選択します。
開いた [API アクセス許可] ページで、次の手順を実行します。
API / アクセス許可名: 値 Exchange.ManageAsApp が表示されていることを確認します。
注:
必要に応じて、API アクセス許可の要求ページの組織が使用している API にある、Office 365 Exchange を探します。
状態: 現在の不正な値は Organization> に付与<されていないため、この値を変更する必要があります。
[組織>に管理者の同意を<付与する] を選択し、開いた確認ダイアログを読み、[はい] をクリックします。
[状態] の値が [組織>に付与<] になりました。
(ブラウザ タブではなく) 現在の [API アクセス許可] ページを閉じて、[アプリ登録] ページに戻ります。 これらの情報は、次のステップで使用します。
手順 3: 自己署名証明書を生成する
次のいずれかの方法で、自己署名 x.509 証明書を作成します:
(推奨) 昇格した (管理者として実行する) Windows PowerShell セッションで New-SelfSignedCertificate、Export-Certificate、および Export-PfxCertificate コマンドレットを使用して、自己署名証明書を要求し、それを
.cer
および.pfx
(既定では SHA1) にエクスポートします。 例:# Create certificate $mycert = New-SelfSignedCertificate -DnsName "contoso.org" -CertStoreLocation "cert:\CurrentUser\My" -NotAfter (Get-Date).AddYears(1) -KeySpec KeyExchange # Export certificate to .pfx file $mycert | Export-PfxCertificate -FilePath mycert.pfx -Password (Get-Credential).password # Export certificate to .cer file $mycert | Export-Certificate -FilePath mycert.cer
Create-SelfSignedCertificate script スクリプトを使用して、SHA1 証明書を生成します。
.\Create-SelfSignedCertificate.ps1 -CommonName "MyCompanyName" -StartDate 2021-01-06 -EndDate 2022-01-06
手順 4: Azure AD アプリケーションに証明書を添付する
アプリケーションに証明書を登録したら、認証のために秘密鍵 (.pfx
ファイル) または拇印を使用できます。
手順 2 の最後にある [アプリの登録] ページの [所有アプリケーション] タブで、アプリケーションを選択します。
[アプリの登録] ページに戻る必要がある場合は、 を使用してhttps://portal.azure.com/#view/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/~/RegisteredApps、[所有されているアプリケーション] タブが選択されていることを確認し、アプリケーションを選択します。
開いたアプリケーション ページの [ 管理] で、[ 証明書 & シークレット] を選択します。
開いた [ 証明書 & シークレット ] ページで、[ 証明書のアップロード] をクリックします。
開いたダイアログで、手順 3 で作成した自己署名証明書 (
.cer
ファイル) を参照します。完了したら、[追加] をクリックします。
これで、証明書が [証明書] セクションに表示されます。
現在の [証明書&シークレット] ページを閉じ、[アプリの登録] ページを閉じてメイン https://portal.azure.com/ ページに戻ります。 次の手順で使用します。
手順 4b: 委任されたシナリオのみをExchange Onlineする: マルチテナント アプリの管理者の同意を付与する
手順 1 で委任されたシナリオExchange Onlineアプリケーションマルチテナントを作成した場合、アプリケーションが各テナント組織のExchange Onlineでコマンドレットを実行できるように、Exchange.ManageAsApp アクセス許可に管理者の同意を付与する必要があります。 これを行うには、顧客テナントごとに管理者の同意 URL を生成します。 マルチテナント アプリケーションを使用してテナント組織のExchange Onlineに接続する前に、顧客テナントの管理者が次の URL を開く必要があります。
https://login.microsoftonline.com/<tenant-id>/adminconsent?client_id=<client-id>&scope=https://outlook.office365.com/.default
<tenant-id>
は、顧客のテナント ID です。<client-id>
はマルチテナント アプリケーションの ID です。- 既定のスコープは、アプリケーションのアクセス許可を付与するために使用されます。
URL 構文の詳細については、「 ディレクトリ管理者にアクセス許可を要求する」を参照してください。
手順 5: Azure AD のロールをアプリケーションに割り当てる
次の 2 つの方法があります。
- Azure AD ロールをアプリケーションに割り当てる: この方法は、PowerShell とセキュリティ & コンプライアンス PowerShell Exchange Onlineでサポートされています。
- カスタム Exchange Online ロール グループをアプリケーションに割り当てる: 現在、このメソッドは PowerShell Exchange Onlineでのみサポートされており、REST API モードで接続する場合にのみサポートされます (Connect-ExchangeOnline コマンドで UseRPSSession スイッチを使用しないでください)。
注:
両方の方法を組み合わせてアクセス許可を割り当てることもできます。 たとえば、"Exchange 受信者管理者" ロールに Azure AD ロールを使用し、カスタム RBAC ロールを割り当ててアクセス許可を拡張することもできます。
委任されたシナリオExchange Onlineマルチテナント アプリケーションの場合は、各顧客テナントにアクセス許可を割り当てる必要があります。
Azure AD のロールをアプリケーションに割り当てる
サポートされている Azure AD ロールを次の表に示します。
役割 | Exchange Online PowerShell |
セキュリティ & コンプライアンス PowerShell |
---|---|---|
コンプライアンス管理者 | ✔ | ✔ |
Exchange 管理者* | ✔ | |
"Exchange Recipient Administrator/Exchange 受信者管理者" | ✔ | |
グローバル管理者* | ✔ | ✔ |
グローバル閲覧者 | ✔ | ✔ |
ヘルプデスク管理者 | ✔ | |
セキュリティ管理者* | ✔ | ✔ |
セキュリティ閲覧者 | ✔ | ✔ |
*グローバル管理者と Exchange 管理者の役割は、Exchange Online PowerShell のタスクに必要なアクセス許可を提供します。 例:
- 受信者の管理。
- セキュリティと保護機能。 たとえば、スパム対策、マルウェア対策、フィッシング詐欺対策、関連するレポートなどです。
セキュリティ管理者の役割には、同じタスクに必要なアクセス許可がありません。
Azure AD での役割の割り当てに関する一般的な手順については、「Azure Active Directory で管理者ロールを確認し割り当てる」を参照してください。
注:
次の手順は、Exchange Online PowerShell とセキュリティ & コンプライアンス PowerShell では若干異なります。 両方の環境の手順を示します。 両方の環境の役割を構成するには、このセクションの手順を繰り返します。
の Azure AD portal でhttps://portal.azure.com/、ページ上部の [検索] ボックスに「ロールと管理者」と入力し、[サービス] セクションの結果から [Azure AD ロールと管理者] を選択します。
または、 Azure AD ロールと管理者 ページに直接移動するには、 を使用 https://portal.azure.com/#view/Microsoft_AAD_IAM/AllRolesBladeします。
開いた [役割と管理者] ページで、 (チェックボックスではなく) 結果の役割の名前をクリックして、サポートされている役割の 1 つを見つけて選択します。
PowerShell Exchange Online: たとえば、Exchange 管理者ロールを見つけて選択します。
セキュリティ & コンプライアンス PowerShell: たとえば、 コンプライアンス管理者 ロールを見つけて選択します。
開いた [割り当て] ページで、[割り当ての追加] をクリックします。
Exchange Online PowerShell:
セキュリティ & コンプライアンス PowerShell:
開いた [割り当ての追加] フライアウトで、手順 1 で作成したアプリを見つけて選択します。
完了したら、[追加] をクリックします。
[ 割り当て] ページに戻り、ロールがアプリに割り当てられていることを確認します。
Exchange Online PowerShell:
セキュリティ & コンプライアンス PowerShell:
カスタム Exchange Onlineロール グループをアプリケーションに割り当てる
注:
このメソッドは、PowerShell Exchange Onlineでのみサポートされており、REST API モードで接続する場合にのみサポートされます (Connect-ExchangeOnline コマンドで UseRPSSession スイッチを使用しないでください)。
カスタム ロール グループの作成の詳細については、「役割グループの 作成」を参照してください。 アプリケーションに割り当てるカスタム ロール グループには、組み込みロールとカスタム ロールの任意の組み合わせを含めることができます。
カスタム Exchange Onlineロール グループをアプリケーションに割り当てるには、次の手順を実行します。
Azure Active Directory PowerShell for Graph で、次のコマンドを実行して、手順 1 で登録した Azure アプリケーションの詳細を変数に格納します。
$<VariableName1> = Get-AzureADServicePrincipal -SearchString "<AppName>"
例:
$AADApp = Get-AzureADServicePrincipal -SearchString "ExO PowerShell CBA"
構文とパラメーターの詳細については、「 Get-AzureADServicePrincipal」を参照してください。
同じ PowerShell ウィンドウで、Exchange Online PowerShell に接続し、次のコマンドを実行します。
- Azure アプリケーションのExchange Online サービス プリンシパル オブジェクトを作成します。
- サービス プリンシパルの詳細を変数に格納します。
New-ServicePrincipal -AppId $<VariableName1>.AppId -ServiceId $<VariableName1>.ObjectId -DisplayName "<Descriptive Name>" $<VariableName2> = Get-ServicePrincipal -Identity "<Descriptive Name>"
例:
New-ServicePrincipal -AppId $AADApp.AppId -ServiceId $AADApp.ObjectId -DisplayName "SP for Azure App ExO PowerShell CBA" $SP = Get-ServicePrincipal -Identity "SP for Azure App ExO PowerShell CBA"
構文とパラメーターの詳細については、「 New-ServicePrincipal」を参照してください。
PowerShell Exchange Onlineで、次のコマンドを実行して、カスタム ロール グループのメンバーとしてサービス プリンシパルを追加します。
Add-RoleGroupMember -Identity "<CustomRoleGroupName>" -Member <$<VariableName2>.Identity | $<VariableName2>.ServiceId | $<VariableName2>.Id>
例:
Add-RoleGroupMember -Identity "Contoso View-Only Recipients" -Member $SP.Identity
構文およびパラメーターの詳細については、「Add-RoleGroupMember」を参照してください。