CData Software Blog

クラウド連携のCData Software の技術ブログです。

Exchange Online 基本認証の廃止にあたって対応しないといけないこと:CData Exchange Driver

f:id:sugimomoto:20201217164609p:plain

こんにちは。CData Software Japan リードエンジニアの杉本です。

前回の記事では Dynamics CRMAPIで使用されている「Ws-Trust Authentication」の廃止について触れましたが、今回は CData Exchange Driverで利用されている基本認証についても触れておこうと思います。

www.cdata.com

Exchange Online 基本認証の廃止 について

下記MSDNやExchange Team Blogにある通り、Exchange Onlineの基本認証は2021年後半に廃止されることが決定されています。

Exchange Online の基本認証は、2021 年の後半の廃止に先立ち、複数のプロトコルに対して非推奨となります。 基本認証では、すべての要求に対してユーザー名とパスワード (通常はデバイスに保存されている) の送信が使用されるため、特に TLS 保護が行われていない場合は、攻撃者によってユーザーの資格情報が盗み出されるリスクが高まります。

docs.microsoft.com

techcommunity.microsoft.com

対象となるAPIはCData Exchange Driverでも使用されている「Exchange Web Service」だけでなく

「POP」「SMTP」「IMAP」といった、メッセージングサービスのプロトコルも対象になっています。

実はこう捉えると、かなり影響範囲が広いですよね?

対処方法について

対応はシンプルです。基本認証からOAuth 2.0を用いた認証に切り替えます。

(OAuth は認可プロトコルなんじゃー、というコメントもあるかと思いますが、ここではAPIアクセスの過程を総称して、認証と用いました)

なんだか「レガシー認証」とか「モダン認証」とか「ModernAuth」とか色んな言葉が飛び交っていますが、ID・PWを用いたBasic Authentication(基本認証)から、Azure AD ベースの OAuth 2.0 に変わると捉えて良いでしょう。

なお、上記MDSNでは「まもなく「POP」「SMTP」「IMAP」もOAuth 2.0 で接続できるようになるよー」と書かれていますが、すでにリリースされているみたいですね。

techcommunity.microsoft.com

メールクライアントであれば、最新のOutlookの場合すでにOAuth 2.0による接続がサポートされています。

以前は左側のログインが出てきていたところが、右側のアクセス方式に変わっていると思います。その他のメールクライアントは公式ページなどで対応状況を確認しましょう。

f:id:sugimomoto:20201217164617p:plain

基本認証とは?

せっかくなので、基本認証がどのように動いているかだけ、ちょっと抑えておきましょう。

CData Exchange Driverでは、以下のように「Auth Scheme」で「Basic」を選択し、User・Passwordの項目を入力して接続を行うと、基本認証でExchange Web Serviceに接続されます。

f:id:sugimomoto:20201217164623p:plain

この接続テストをFiddlerでキャプチャすると、以下のようになっていて「Authorization: Basic c3VnaW1vdG9rQGNkYXRhLmNvbTpmc2Rmd2Vmd2Vmd2Vmc2Y=」の部分が基本認証の設定値になります。(ダミーデータです)

POST https://outlook.office365.com/EWS/Exchange.asmx HTTP/1.1
Host: outlook.office365.com
Authorization: Basic c3VnaW1vdG9rQGNkYXRhLmNvbTpmc2Rmd2Vmd2Vmd2Vmc2Y=
Accept-Encoding: gzip, deflate
User-Agent: CData Data Provider Engine - www.cdata.com - Accepts: gzip
Content-Type: text/xml; charset=utf-8
Content-Length: 830

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
               xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
               xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2013_SP1" />
  </soap:Header>
  <soap:Body>
    <m:FindItem Traversal="Shallow">
      <m:ItemShape>
        <t:BaseShape>IdOnly</t:BaseShape>
      </m:ItemShape>
      <m:IndexedPageItemView MaxEntriesReturned="1000" Offset="0" BasePoint="Beginning"/>
      <m:ParentFolderIds>
        <t:DistinguishedFolderId Id="inbox"/>
      </m:ParentFolderIds>
    </m:FindItem>
  </soap:Body>
</soap:Envelope>

これは、UserId:Passwordをコロンで結合して、Base64エンコードして送信しています。

ja.wikipedia.org

CData Exchange Driver で OAuth 2.0 を使って接続する方法

CData Exchange Driverでは最新バージョンだとすでにOAuth 2.0のサポートをしています。

設定は簡単で、「Auth Scheme」で「OAuth」を選択して、接続するだけです。

プロパティ名 備考
Auth Scheme OAuth OAuth 2.0を使って接続します。
Server https://outlook.office365.com/EWS/Exchange.asmx Exchange Onlineに接続する場合は、固定でこの値になります。

f:id:sugimomoto:20201217164631p:plain

この設定で接続テストをクリックすると、ブラウザが立ち上がり、以下のように接続許可を求める画面が表示されます。(必要に応じて対象のアカウントでログインしてください)

あとは承諾をクリックすれば、接続が完了します。

f:id:sugimomoto:20201217164637p:plain

内部のリクエストを見てみると、AuthorizationヘッダーがOAuthの「Bearer」トークンベースに切り替わっていることが確認できます。

POST https://outlook.office365.com/EWS/Exchange.asmx HTTP/1.1
Host: outlook.office365.com
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJub25jZSI6IktoTzVCMHhw....
Accept-Encoding: gzip, deflate
User-Agent: CData Data Provider Engine - www.cdata.com - Accepts: gzip
Content-Type: text/xml; charset=utf-8
Content-Length: 830

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
               xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
               xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2013_SP1" />
  </soap:Header>
  <soap:Body>
    <m:FindItem Traversal="Shallow">
      <m:ItemShape>
        <t:BaseShape>IdOnly</t:BaseShape>
      </m:ItemShape>
      <m:IndexedPageItemView MaxEntriesReturned="1000" Offset="0" BasePoint="Beginning"/>
      <m:ParentFolderIds>
        <t:DistinguishedFolderId Id="inbox"/>
      </m:ParentFolderIds>
    </m:FindItem>
  </soap:Body>
</soap:Envelope>

CData Exchange Driver がサポートしているAPI

最後に少しだけ補足です。

現在CData Exchange DriverはデフォルトでSOAPベースのExhange Web Service(EWS)APIを利用するようになっていますが、Graph API ベースの接続にも切り替えることが可能です。

それぞれAPIの特性に応じてデータモデルが異なるので、ユースケースに併せて選択してください。

cdn.cdata.com

cdn.cdata.com

おそらく将来的にGraphAPIに一本化されるのではないか? とも思われるので、これから試される方はGraphAPIの利用がおすすめです。

もし、Graph APIベースのデータモデルを利用する場合は「Schema」の項目で「MSGraph」を選択して接続を行ってください。

f:id:sugimomoto:20201217164643p:plain