PowerShell – Exchange Onlineに証明書を使用して接続する –

こんにちは。サイオステクノロジーの木村です。
今後、Exchange Online の基本認証が廃止されます。(但し、2021/06現在、廃止時期は未定。) スクリプトなどで、以下のようにNew-PSSession コマンドなどを使用して資格情報を渡す方法にて非対話的に接続を行うことがあると思いますが、基本認証が廃止されるとこの方法は使用できなくなります。
(例)基本認証での接続


 $o365user = "test@xxxxx.onmicrosoft.com"
 $password = Get-Content C:\temp\user.pass | ConvertTo-SecureString
 $LiveCred = New-Object System.Management.Automation.PSCredential $o365user,$password
 $script:Session = New-PSSession -ConfigurationName Microsoft.Exchange `
  -ConnectionUri https://ps.outlook.com/powershell/ -Credential $LiveCred -Authentication Basic -AllowRedirection
 Import-PSSession $script:Session -AllowClobber

基本認証廃止後は先進認証での接続が必要になります。
今回は、Exchange Onlineへの非対話的接続を、Exchange Online PowerShell V2 モジュールで証明書を使用して行う方法について記載します。 (先進認証での Exchange Online への接続については以下の記事もご参照ください。  『PowerShell – 先進認証を使用して Exchange Online に接続する –』

Exchange Online PowerShell V2 モジュールのインストール

先進認証で接続するために、Exchange Online PowerShell V2 モジュールを使用します。 PowerShellを管理者で起動し、以下のコマンドを実行してインストールします。


 Install-Module -Name ExchangeOnlineManagement

以下のコマンドを実行してインストールしたモジュールを読み込みます。


 Import-Module ExchangeOnlineManagement

※この手順を省略してモジュールを読み込まずに Connect-ExchangeOnline を実行できる場合があります。

 

アプリケーションの登録

Exchange Online PowerShell V2 モジュールのバージョン2.0.3以降では、ユーザー権限ではなくアプリケーションの権限を使用して Exchange Online へ接続できるようになりました。 アプリケーションの権限を使用して接続するため、以下の手順でAzureADアプリケーションを登録します。

1. Azureポータル(https://portal.azure.com/)にログインします。
2. メニューより「Azure Active Directory」をクリックします。

3. 「アプリの登録」をクリックし「+新規登録」をクリックします。

4. アプリケーションの登録ページで、以下を入力し「登録」をクリックします。

  • 名前:任意の名称
  • サポートされているアカウントの種類:この組織ディレクトリのみに含まれるアカウント
  • リダイレクトURI(省略可能):Web、任意のURI


5. 表示された [アプリケーション (クライアント) ID] の値をメモしておきます。 「管理」の配下に表示されている「マニフェスト」をクリックします。
6. マニフェスト内の “requiredResourceAccess” を以下の値に書き換え、「保存」をクリックします。

    "requiredResourceAccess": [
        {
            "resourceAppId": "00000002-0000-0ff1-ce00-000000000000",
            "resourceAccess": [
                {
                    "id": "dc50a0fb-09a3-484d-be87-e023b12c6440",
                    "type": "Role"
                }
            ]
        }
    ],


7. 「管理」の配下に表示されている「APIのアクセス許可」をクリックします。
8. 「構成されたアクセス許可」に「Exchange.ManageAsApp」が表示されていることを確認します。 状態は、「<テナント名>に付与されていません。」と表示されます。 「+アクセス許可の追加」の右側に表示されている「<テナント名> に管理者の同意を与えます」をクリックします。
9. 「はい」をクリックします。
10. 状態が「<テナント名>に付与されました」と表示されます。 以上でアプリケーションの登録は完了です。

 

自己署名証明書の作成

Windows PowerShellにて自己署名証明書を作成します。PowerShellを起動し、以下のコマンドを実行します。


 #証明書の作成
 $mycert = New-SelfSignedCertificate -Subject "<証明書のSubject>" `
   -CertStoreLocation "<証明書ストア>" -NotAfter <有効期限> `
   -KeySpec KeyExchange

 #エクスポート(PFXファイル)
 $mycert | Export-PfxCertificate -FilePath <PFXファイル名> `
   -Password $(ConvertTo-SecureString -String "<PFXファイルを保護する任意のパスワード>" -AsPlainText -Force)

 #エクスポート(CERファイル)
 $mycert | Export-Certificate -FilePath <CERファイル名>

 #作成した証明書の拇印
 $mycert | Select Thumbprint

(例)


 #証明書の作成
 $mycert = New-SelfSignedCertificate -Subject "EXOPowershellApp01" `
   -CertStoreLocation "cert:\CurrentUser\My" -NotAfter (Get-Date).AddYears(1) `
   -KeySpec KeyExchange

 #エクスポート(PFXファイル)
 $mycert | Export-PfxCertificate -FilePath mycert.pfx `
   -Password $(ConvertTo-SecureString -String "P@ssword" -AsPlainText -Force)

 #エクスポート(CERファイル)
 $mycert | Export-Certificate -FilePath mycert.cer

 #作成した証明書の拇印
 $mycert | Select Thumbprint

 

証明書をアプリケーションに登録

作成した証明書をAzureADアプリケーションに登録します。以下の手順で行います。

1. Azureポータルにて、上記『アプリケーションの登録』で登録したアプリケーションを表示します。 「管理」の配下に表示されている「証明書とシークレット」をクリックします。
2. 「証明書のアップロード」をクリックします。
3. 上記『自己署名証明書の作成』にてPowerShellで作成したCERファイルを選択して「追加」をクリックします。
4. 証明書が追加されます。

 

AzureADの役割のアプリケーションへの割り当て

アプリケーションに役割を割り当てます。以下の手順で行います。

1. 管理ポータルにて、メニューより「Azure Active Directory」をクリックします。
2. 「管理」の配下に表示されている「ロールと管理者」をクリックします。
3. 「Exchange管理者」をクリックします。
4. 「+割り当ての追加」をクリックします。
5. 上記『アプリケーションの登録』で作成したアプリケーションを名前で検索し、クリックします。

6. アプリケーションが選択されていることを確認し、「追加」をクリックします。

7. Exchange管理者の役割がアプリケーションに割り当てられます。

 

Exchange Onlineへの接続

現在、Exchange Onlineへ証明書を使用して接続する方法には、以下の3つがあります。

  • ローカル証明書(PFXファイル)を使用する方法
  • 証明書の拇印を使用する方法
  • 証明書オブジェクトを使用する方法

ローカル証明書(PFXファイル)を使用する方法

PFXファイルを読み込んで接続します。 PowerShellを起動し、以下のコマンドを実行します。 (<登録したアプリのアプリケーション (クライアント) ID> は、上記『アプリケーションの登録』の 5. の手順でメモした値です。)


 Connect-ExchangeOnline -CertificateFilePath "<PFXファイルのパス>" `
   -CertificatePassword (ConvertTo-SecureString -String "<PFXファイルのパスワード>" -AsPlainText -Force) `
   -AppID "<登録したアプリのアプリケーション (クライアント) ID >" -Organization "<ドメイン名>"

(例)


 Connect-ExchangeOnline -CertificateFilePath "c:\temp\mycert.pfx" `
   -CertificatePassword (ConvertTo-SecureString -String "P@ssword" -AsPlainText -Force) `
   -AppID "24482569-6d3b-4bf9-9cc5-578955cbb005" -Organization "xxxxx.onmicrosoft.com"

証明書の拇印を使用する方法

証明書の拇印を指定して証明書ストアから読み込んで接続します。コマンドを実行しているコンピューターに証明書がインストールされている必要があります。 PowerShellを起動し、以下のコマンドを実行します。


 Connect-ExchangeOnline -CertificateThumbPrint "<証明書の拇印>" `
   -AppID "<登録したアプリのアプリケーション (クライアント) ID>" -Organization "<ドメイン名>"

(例)


 Connect-ExchangeOnline -CertificateThumbPrint "8C519545D6E5711E476E5432EEF04BE10295C2C3" `
   -AppID "24482569-6d3b-4bf9-9cc5-578955cbb005" -Organization "xxxxx.onmicrosoft.com"

証明書オブジェクトを使用する方法

証明書オブジェクトを指定して接続します。 以下の例では、証明書ストアから証明書を読み込んでいますが、証明書オブジェクトを使用する方法の場合、必ずしもコマンドを実行しているコンピューターに証明書をインストールする必要はありません。証明書オブジェクトがリモートに保存されている場合にも使用できます。 例えば、Azure Key Vault を使用する時などにこちらの方法を使用します。 PowerShellを起動し、以下のコマンドを実行します。


 Connect-ExchangeOnline -Certificate "証明書の X509Certificate2 オブジェクト" `
   -AppID "<登録したアプリのアプリケーション (クライアント) ID>" -Organization "<ドメイン名>"

(例)


 Connect-ExchangeOnline -Certificate (Get-ChildItem  `
   -Path Cert:\CurrentUser\My\8C519545D6E5711E476E5432EEF04BE10295C2C3)  `
   -AppID "24482569-6d3b-4bf9-9cc5-578955cbb005" -Organization "xxxxx.onmicrosoft.com"

 

PowerShell セッションの切断

Exchange Onlineへの接続を行った後、リモート PowerShell セッションを切断するには以下のコマンドを実行します。


 Disconnect-ExchangeOnline

確認プロンプトや通知テキストなしでセッションを切断するには、以下のようにオプションをつけて実行します。


 Disconnect-ExchangeOnline -Confirm:$false -InformationAction Ignore -ErrorAction SilentlyContinue

 

最後に

基本認証で Exchange Online に接続しているという方は、是非証明書での接続方法をお試しください! ※2021.09 追記 Connect-ExchangeOnline コマンドを使用した接続ではメモリリークが発生する可能性があるそうです。詳細はこちらの公式ドキュメントに記載があります。 そのため、メモリの消費量を少なくするために、Connect-ExchangeOnline での接続時に、 CommandName パラメーターを使用することが推奨されています。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です