証明書を利用してExchangeOnline Powershellへ接続する

Facebook にシェア
Pocket

Microsoft365管理者にとってExchangeOnlineの管理にPowerShellは欠かせず、膨大な業務を効率的に進めることが可能です。

いままで管理者自身がログインして設定を行うことはできても定時処理などで自動でログインして処理をさせるためには専用のユーザーを作成して基本認証でログインする必要があり、そのセキュリティは脆弱なものでした。

先日ExchangeOnlineでも証明書を利用してサービスプリンシパルオブジェクトからログインすることが可能なPowerShellモジュールが公開されたため、その設定方法を説明します。

※2020/08/07現在 この手順はプレビュー版モジュールを利用しており、今後の更新等で挙動が変わる可能性があります。

2020/10/06更新
ExchangeOnlineManagementモジュールのバージョン2.0.3がCurrentステータスになりました。
プレビュー版に関わる記載は無視頂いて大丈夫です。

プレビュー版PowerShellモジュールの入手

2020/08/07の時点で、証明書でのログインにはExchangeOnlineMangement 2.0.3-Previewモジュールが必要です。
以下のコマンドでプレビュー版のモジュールをインストールします。

Install-Module -Name ExchangeOnlineManagement -AllowPrerelease

PowerShellGetモジュールが古い場合、上記コマンドでは -AllowPrereleaseオプションが存在しないとエラーが出ます。
あらかじめ以下コマンドでPowerShellGetモジュールを更新しましょう。
※管理者権限で実行

Install-Module PowerShellGet -Scope CurrentUser -Force -AllowClobber

参考: PowerShellGetをアップデートしよう

ExchangeOnlineManagement 2.0.3がインストールできれば完了です。

プレビューモジュールをユーザーインストール

自己署名証明書の作成、インストール

証明書の作成

認証に利用する証明書を作成します。
公式ドキュメントからのリンクにPowerShellで自己署名証明書を作成できるスクリプトへのリンクがあるため、そちらを利用させてもらいます。

https://github.com/SharePoint/PnP-Partner-Pack/blob/master/scripts/Create-SelfSignedCertificate.ps1

上記スクリプトをダウンロードし、オプションをつけて実行します。
※管理者権限で実行

.\Create-SelfSignedCertificate.ps1 -CommonName "MyCompanyName" -StartDate 2020-04-01 -EndDate 2022-04-01

あとは証明書のパスフレーズを入力するだけで.cerと.pfxの二つのファイルが作成されます。

有効期限1年の自己署名証明書を作成

証明書のインストール

作成された証明書の.pfxファイルをダブルクリックしてインストールします。
途中で証明書作成時のパスフレーズを入力します。

インストール先は「現在のユーザー」
pfxファイルを選択していることを確認
証明書作成時のパスフレーズを入力
証明書を個人ストアに配置
問題なければ完了

アプリ (サービスプリンシパル) の登録

ユーザーとしてではなくサービスとしてExchangeOnlineにアクセスするためのアプリケーションを登録します。

アプリケーションの作成

接続したいテナントのAzureポータルからAzure ActiveDirectoryへ移動します。

「アプリの登録」から「新規登録」を選択します。

新規登録するアプリケーションの名称を入力して登録します。
アプリケーションのスコープやリダイレクトURLは規定値のままで問題ありません。

証明書のアップロード

作成されたアプリケーションの「証明書とシークレット」から「証明書のアップロード」を選択します。

ポップアップウインドウが表示されるので作成した証明書ファイルのうち、.cerファイルをアップロードします。

証明書の拇印が表示され、有効期限が作成時に指定したものになります。

APIアクセス許可の付与

「APIのアクセス許可」から「アクセス許可の追加」を選択します。

API一覧から「Exchange」を探して選択します。
Microsoft APIの最下段に設置されています。

レガシAPI…

2種類のアクセス許可のうち、「アプリケーションの許可」を選択します。

APIの一覧のうち、「Exchange」-「ExchangeManageAsApp」にチェックをつけて「アクセス許可の追加」を選択します。

登録済みのAPI一覧に戻ります。
追加したExchangeMangeAsAppの項目に注意アイコンがついているので、「<テナント名>に管理者の同意を与えます」を選択します。

確認ダイアログが表示されるので「はい」を選択します。

ExchangeManageAsAppの項目がチェックアイコンに変更したのを確認します。

Exchange管理者ロールの付与

Azure ActiveDirectoryのトップに戻り、「ロールと管理者」から「Exchange管理者」を探して選択します。
※登録するアプリケーションで何をしたいかを確認し、最小の役割を付与しましょう。Exchange管理者を付与するとほぼ全てのことが実行できます。

「割り当ての追加」を選択し、先ほど作成したアプリケーションを検索・登録します。

証明書を利用した接続

これまでの作業で接続に必要なすべての準備が整いました。あとはPowerShellで必要な接続情報を入力すれば証明書を利用したExchangeOnlineへのログインが可能です。
接続時には以下の3つの情報を入力します。

  • Azure ActiveDirectoryに登録したアプリケーションID
  • 証明書の拇印(もしくは証明書+パスフレーズ)
  • 接続先ExchangeOnlineのドメイン名

アプリケーションID

登録したアプリケーションの「概要」欄から確認可能です。

証明書の拇印

登録したアプリケーションの「証明書とシークレット」から確認可能です。

ExchangeOnlineドメイン名

Azure ActiveDirectoryトップの「概要」から確認可能です。

接続コマンド

以下のコマンドを利用して接続します。

Import-Module ExchangeOnlineManagement -Version 2.0.3
Connect-ExchangeOnline -AppId $AppId -CertificateThumbprint $CertificateThumbprint -Organization $Organization
接続に成功し、Get-AcceptedDomainが実行できている

Azure Automationで実行する

ここまでで証明書を利用したサービスプリンシパルからのExchangeOnlineへの接続を記載してきましたが、実際の運用環境においてはユーザーのPC上で定時処理を動かすことはあまり推奨されておらず、なにかの自動化サービス上で実行するのが普通です。

今回はAzure Automation上での実行手順を説明します。
とはいえ、これまでの準備があればPowerShellモジュールのインストールと証明書のアップロードのみで実行可能です。

プレビュー版PowerShellモジュールのインストール

幸いなことにプレビュー版モジュールが公開されているPowerShell Gallery上から直接Azure Automationへのデプロイが可能です。

PowerShell Gallery へ移動し、「Install Option」内の「Azure Automation」から「Deploy to Azure Automation」を選択します。

Azureログイン済みであれば直接Azure Automationのモジュールインポート画面へ遷移するため、実行アカウントを選択して「OK」を選択します。

証明書のアップロード

Azure Automaionの「証明書」から「証明書の追加」を選択します。

登録名と作成した証明書のpfxファイル、パスフレーズを入力し作成します。

Azure Automationでの証明書ログイン

実際に利用するコードを作成しテストを実行します。

テストなので先ほどと同じコード

問題なければ結果が正常に表示されます。

おまけ

AzureADの管理モジュールもサービスプリンシパルを利用して接続できるのですが、そちらの説明はより分かりやすい記事が国井さんのブログに記載されているためこのページでは説明しません。

こちらも併せて活用することでサービスプリンシパルオブジェクトからユーザー作成とライセンス付与、メールボックスの初期設定などをAzure Automation上で一括で設定することも可能です。

まとめ

プレビュー版ではありますが、ようやくExchangeOnlineにサービスプリンシパルからアクセスして管理操作を実施することができるようになりました。

今までは専用の管理ユーザーをパスワード認証で利用する必要がありセキュリティ的に不安な面があったのですがこれで利便性を保ちつつリスクを減らすことが可能になりました。

早いうちにプレビュー版が取れること、「レガシなAPI」とされているExchange APIの代替が来ることを望みます。

Facebook にシェア
Pocket