Office365での独自ドメインの利用(RocketNet)

Office365で独自ドメインを利用する場合、Lync Onlineで利用するSRVレコードを追加して下さいという指示が来ます。

ただ、世の中を見回してみますとDNSホスティングサービスでSRVレコードを提供している物は少ない…というか殆ど無いというのが現状です。今回は、対応している数少ない事業者さんの中でGMOさんの提供されているRocketNetというサービスを紹介します。

DNSサービスは、ホスティングサービス(”年”額1000円から)を契約するか、扱っているドメインの種別は限定されますが、ドメインを新規で取るか移管を行えば利用できます。

操作は、ロケット操縦席という管理コンソールから行います。

一覧からドメインを選択します。

DNSゾーンのタブを選択

新しいレコードを選択

Office365の認証用のTXTレコードを追加します。

しばらく待って確認が取れるとOffice365で独自ドメインが利用できるようになります。

指示だと、このままNSレコードをOffice365に切り替えるということになりますが、ここは移行のタイムラグが大きい工程なので、事前に現在のDNSにもレコードを登録して影響が最小限になるようにしたいと思います。(なお、プランEの場合はDNSを切り替えなくて良いので、この次の工程までで完了です。)

まずは、登録するべき情報をOffice365で取得します。

続いて、これを先ほどのDNS管理のレコードの追加で登録します。

SRVレコードのみ、追加が少し分かりづらいですが以下の様に入力します。ゾーンの名称は「_sipfederationtls._tcp」になります。

この状態で、ネームサーバーのタブからOffice365のDNSサーバに切り替えを行えば完了です。

ちなみにこちらのサービスですが、DNSの方は上記の通り利用可能なドメインの種別が少ない(同じGMOさんのサービスですが、お名前.comの方が断然多いです)のと、取得したドメインのwhois情報がGMOに固定になる(通常はwhois公開代行と呼ばれている機能)ということで、少し利用可能な環境を選ぶかもしれません。

ただ、Webサービスを購入すればDNS管理も利用できるっぽいので、公開Web用を兼ねて借りても良いかもですね。

Office365 LightningTalk大会

今週の金曜日(5/18)の夜、品川のマイクロソフトにて Office365 LightningTalk大会 という催しが開催されます。

これは、Microsoftの公式のイベントではなく、有志が集まってOffiec365に関する事をしゃべったり情報交換しようという物になりますが、Microsoftの方も最新情報についてということで喋って頂けるそうです。

私も、Office365のアクセス制御(ADFSとOnline Service Gate)について少し話そうと思っています。

Lightning Talk大会と銘打ってはおりますが、別に何も喋らなくてもOKらしいので、お時間のある方は参加されては如何でしょうか?

2012.05.18 追記

参加された方、どうもありがとうございました。MSさんの話ですと、MSなどが主催で無い有志で実施したOffice365のイベントは初と言うことでしたね。

意外とこちらのサイトをご覧になっているという方がいらっしゃって、とても嬉しかったです。当日の資料というかメモを、以下にアップしておきます。
http://www.slideshare.net/genkiw/20120518-o365-lightningtalk

Exchange OnlineのGALに何も表示されない

Office365のExchange Onlineを利用する場合、ネットワーク的に離れているということもあり、キャッシュモードでの利用が推奨され、アドレス帳もオフラインアドレス帳を利用するのが一般的かと思います。ただし、オフラインアドレス帳の更新は1日1回であり、その時間もサービス仕様としては定められておりませんので、環境によってはグローバルアドレス一覧を直接利用したいというニーズもあるかと思います。

今回は、グローバルアドレス一覧を開いた際に発生する事象について紹介したいと思います。まず、アドレス帳を開いて、「グローバルアドレス一覧」をリストから選びます。

すると、通常はアドレス一覧が表示されているはずなのに何も表示されていない状態となります。

一見すると、グローバルアドレス一覧に接続できていないように見えますが、実際は「その他のフィールド」のラジオボタンにチェックを入れて検索を行うと、検索することが可能です。

この事象ですが、MicrosoftのKBも出ており対策用のFixITも出ているのですが、要約しますと『日本語版のOutlook2007/2010はふりがなによるソートがデフォルトの「名前のみ」の状態で有効になっているが、接続先のExchangeのCASが日本語で無い場合、ふりがなによるインデックス化が行われない為、何も表示されない』ということのようです。(「名前のみ」を解除し、ふりがな以外で検索することは可能)

Outlook 2007 または Outlook 2010 で、Exchange Server 2007 または Exchange Server 2010 の GAL の検索結果が正しく表示されない

オンプレミスの環境であればいかようにでも対策は取れますが、残念ながらOffice365はマルチテナントのサーバであり、かつ日本語以外の環境のテナントも数多く収容されているマルチリンガルなサーバーですので、改修(システム言語を日本語に…)というのは難しい気がします。

という訳で、解決法は大きく2つ

  1. オフラインアドレス帳を普段は利用し、グローバルアドレス一覧は最新の情報を検索する場合にのみ利用する
  2. Outlookを英語版と同じ環境(ふりがなが有効化されていない設定)に変える

という形となります。後者に関しては、Fix ITが出てます。手動でやる場合は、HKEY_CURRENT_USERSoftwareMicrosoftExchangeExchange Provider に DisableGALPhoneticをDWORDで作成し「1」を設定します。

これにより、グローバルアドレス一覧を開いた際にもデフォルトでユーザー一覧が表示されるようになります。(ふりがなの欄は消えてしまいますが)

 

P.S.ちなみに、ふりがな自体はPowerShellのSet-Userコマンドレットで投入することは可能です。

Exchange Online送信時のアドレス表記について

Exchange Onlineでは、Fromのメールアドレスが 表示名 <username@domain.name> の形式でアドレスが表示され、これを自由に変更することはできません。(※SMTP接続で送信している場合のみ、メーラーで設定された形式で表示されます。)

グローバルに展開する企業など、Fromに日本語の文字が混じってしまうことを好ましく思われない場合もございますので、今回はこれをカスタマイズする方法を紹介します。

Exchangeには、マルチバイトが格納可能な表示名(DisplayName)の他に、ASCII文字しか入力できない簡易表示名(SimpleDisplayName)という領域が用意されています。ここに適切な値を入力し、外部送出時にこの値をセットするように設定することで、要件を満たすことができます。

こちらの処理は、GUIでは用意されていませんので、PowerShellから実施する必要があります。Exchange Onlineに接続後にSet-UserコマンドとSet-RemoteDomainコマンドで設定を行ないます。今回は、以下の条件を設定してみます。

  1. admin(表示名は管理者)に「administrator」という簡易表示名を設定する
  2. 外部の全ドメインに送信する際に簡易表示名を利用する
Set-User admin -SimpleDisplayName administrator
Set-RemoteDomain default -UseSimpleDisplayName $true

以前は 管理者 <admin@xxxx.onmicrosoft.com> と表示されていた物が、無事 administrator <admin@xxxxx.onmicrosoft.com> と表示されるようになりました。

ちなみに、この設定の影響を受けるのは外部への配信のみになりますので、内部での配送は今までどおりの 表示名 <username@domain.name>  の形式で行なわれます。

ADFSで監査ログを取得する

Office365のシングルサインオンの為に利用されるADFSは、既定ではクレームルールでアクセスが拒否された場合、アプリケーションとサービスログ-ADFS2.0-Adminのイベントログにエラーレベルで「いつ・誰がアクセス拒否されたか」に続き、情報レベルで「そのユーザーの制御に用いた情報」が記録されます。(クレームのサイズに応じて複数に分割して表示されます)

これにより、不正なアクセス要求が無いかどうか、ならびに既存のクレームルールの不備は無いかということが判別することができます。クレームルールの検証・新規作成や監査目的など、要求が成功した場合でもこの記録を取りたいというケースが有りますので、今回はその取得方法について紹介します。

これを行うには、ADFSで監査ログを有効にする必要があります。

  1. まず、監査ログを生成できる権限をADFSのサービスアカウントが有しているかどうかを確認します。通常通りのウィザードで展開した場合は、有効になっているはずです。
  2. 次に、auditpol.exeで成功・失敗の監査を有効にします。ただし、KBなどに記載のコマンドをそのまま実行してもエラーが出ます。原因は、サブカテゴリ名が日本語になっているので、そこをコマンド内でも日本語にする必要があるからです。
    auditpol.exe /set /subcategory:”Application Generated” /failure:enable /success:enable

    auditpol.exe /set /subcategory:”生成されたアプリケーション” /failure:enable /success:enable
    参考:サブカテゴリ一覧の出力
    auditpol.exe /list /subcategory:*
  3. 最後に、ADFSの管理で取得するログの種類で成功の監査、失敗の監査を選択します。

これで、イベントログにADFS監査ログが記録されるようになります。

一件のアクセスで大量のログが吐かれますので、適宜ログサイズの確認ならびに最大ログサイズの設定などを行なってください。

Exchange Onlineで転送専用のエイリアスを作成する

Office365で、メールボックスは持たないけど、あるメールアドレス宛のメールを受信したい場合があります。

例えば、

  • ある商品キャンペーンの受付専用でアドレスを持ちたい
  • 問い合わせ窓口などで利用する共有のアドレスを持ちたい
  • 普段はOffice365のメールボックスは利用していないユーザーが、Office365に登録しているメールドメインのアドレスを利用したい

などの場合です。この場合、それを割り当てる先のユーザに応じて、

  • 内部の特定ユーザの場合 ⇒ そのユーザーの電子セカンダリアドレスとして追加する
  • 内部(外部を含めることも可)の複数ユーザーの場合 ⇒ 配布グループを利用する、外部のユーザーに対しては外部の連絡先に追加する

などを利用することもできますが、今回はメールユーザー(メールが有効なユーザー)を作成して、外部からのメールを受け付けて外部に転送することができるアカウントを作成してみたいと思います。

受信するアドレス:forward@example.com
ユーザー名   :forward
パスワード   :P@ssw0rd
転送するアドレス:user01@contoso.com

メールユーザーの作成は、PowerShellからのみ実施することができます。

$LiveCred = Get-Credential (管理者IDとパスワードを入力)
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $LiveCred -Authentication Basic -AllowRedirection
Import-PSSession $Session

として、Exchange Onlineに接続して以下のコマンドを実行します。

New-MailUser -Name forward -MicrosoftOnlineServicesID forward@example.com -Password (ConvertTo-SecureString -String 'P@ssw0rd' -AsPlainText -Force) -ExternalEmailAddress user01@contoso.com

これで、forward@example.com宛に来たメールはuser01@contoso.comに転送されるようになります。

更に、管理者が、Office365ポータルからforward@example.comにサブスクリプションを与えれば、今回指定したID/PASSを利用してSharePoint Onlineに接続することができるようになります。

残念ながら、ポータルで作成した既存のメールボックスが有効で無いユーザの外部メールを有効化するという-UseExistingMicrosoftOnlineServicesIDというコマンドのオプションは現在実装されていないようですので、上記のような利用法をされたいユーザはポータルからではなく、Exchange Online側から作成をする必要があるようです。

また、1点注意事項ですが、今回のメールユーザーでは、外部のアドレス(今回の場合はuser01@contoso.com)を受信可能なアドレスであるProxyAddressesとして保持をしますので、他のキャンペーンのアドレス、例えばcampaign@example.comのアドレスもuser01@contoso.comに転送を行いたいという場合は、新たにメールユーザを作成するのではなく、既存のメールユーザーに内部アドレスを追加するというオペレーションになります。以下、コマンド例です。

Set-MailUser -Identity forward -EmailAddresses "SMTP:user01@contoso.com","smtp:forward@example.com","smtp:campaign@example.com"

(参考)メール ユーザーの作成
http://technet.microsoft.com/ja-jp/exchangelabshelp/dd207277

Lync 2010(クライアント)のインストールエラー

検証の間、一時アンインストールしていたのですが、Lync 2010クライアントをOffice365ポータルの「ダウンロード」ページから再度インストールする機会がありました。

すると、インストーラーが動いているはずなのにうんともすんとも言いません。タスクマネージャーを見ると、インストーラーは起動しているものの、1コアをほぼ占有した状態でハングアップしているようです。

以前インストールしたときはこんなことは無かったのですが…。

コミュニティで確認したところ、昨年から出ているインストーラーのバグのようで、インストールする環境(インストールされたプログラムの履歴のレジストリのゴミで起こることも有るらしい)に依存して発生するとのこと。

暫定的な解決策としては古いバージョンのインストーラーをインストールすればインストールして利用が可能とのことで、早速コミュニティの回答に指示された以下のurlからインストールを実施します。

32bit版 http://c2r.microsoft.com/oconline/en-us/7577.280/x86/ja-JP/LyncSetup.exe
64bit版 http://c2r.microsoft.com/oconline/en-us/7577.280/x64/ja-JP/LyncSetup.exe

すると、無事に何ともなくインストール完了しました。

少しバージョンが古い(7577.280)とのことですが、Windows Updateをかけて出てくるKB(Lyncの累積アップデート)は当てることができます。

これで無事最新化(7577.4061)できました。

(4/1追記)
3月末に「ダウンロード」のリンクからダウンロード出来るパッケージが更新されて、4.0.7577.4087になりました。一部の環境では上記エラーが解消されたという話も受けておりますが、私の環境では残念ながら同じようにまだインストーラーが起動できない状態です。

(5/15追記)
4月後半に更新されたパッケージで解消されたそうです。良かった良かった。

ディレクトリ同期のセットアップエラー

最近、環境によってディレクトリ同期のセットアップが「Microsoft Online ServicesサインインアシスタントサービスのインストールによりFAILが返されました」というエラーで失敗するようになりました。

1638のエラーコードで調べても詳細が分からなかったので、状況から考えまてみます。

  • 2ヶ月前に同じ手順でインストールした際は出なかった。
  • サインインアシスタントは既にADFSのセットアップ時にインストールしている。

…バージョンがクサいですかね?

他のサーバからディレクトリ同意ツールのセットアップ時に自動インストールあれるバージョンは7250.4285.0ということがわかります。

対して、現在インストールされていたサインインアシスタントのバージョンを確認したところ7250.4287.0と少し新しい状態でした。というわけで、一度Micrsoft Online Services Sign-in Assistantをアンインストールしてから、再度ディレクトリ同期ツールをセットアップしたところ、無事インストール完了できました。

と言うわけで、Windows PowerShell 用 Microsoft Online Services モジュールやADFSなど、先にサインインアシスタントをインストールした場合はご注意頂ければと思います。(ちなみに、4285から4287はWindows Updateで表示されますが、インストール不要と出ます。)

BlackBerry Business Cloud Servicesリリース

正式リリースから少し時間が経ってしまいましたが、BlackBerryでOffice365を利用するためのRIM社のサービスが、ようやく正式リリースされましたので、早速設定してみました。

まず、管理者権限でOffice365のポータルにログインし、右側のリソースメニュー中の【携帯電話の電子メールを設定する】を選択し、【BlackBerry Business Cloud servicesの有効化】をクリックします。
 

その後、サービスに関する情報が表示されますので、確認後「はい」にチェックを入れ、OKをクリックすると、管理者トップメニューが変更になり、下部にBlackBerry Business Cloud Servicesのメニューが表示されるようになります。【管理】をクリックして、BlackBerry Business Cloud Servicesのセットアップに移ります。
 

【今すぐサインアップ】を選択し、言語を選択すると、ソフトウェア使用許諾が表示されますので、最後まで確認した後に、同意するにチェックを入れ【続行】をクリックします。
   

これで、BlackBerry Administration Serviceにログインできるようになります。

※この時点で、自動的にBlackBerryを利用するユーザのグループと、システムアカウントへのExchange管理権限が設定されるとのことですが、うまく動作していないように見える場合は、KB28963(RIM)を参照頂き、手動で設定を確認ください。私の検証環境だと試験したタイミングが早すぎたのかもしれませんが、New-ManagementRoleAssignmentの手動実施が必要でした。

ユーザがBlackBerryを利用するには、①ユーザの登録 ②アクティベーション(端末への紐付け)が必要です。設定方法は、上記の管理画面から、【ユーザーを作成】で実施します。Exchange OnlineのGALに対して検索をかけて、そこから登録が可能です。
 

通常、ユーザーは、ユーザIDとアクティベーションパスワードを利用して端末を紐付けします。ここでは、「①管理者が指定したパスワードを設定」「②ランダムパスワードを設定し、メールで送信」「③パスワードなしで作成」が有ります。セキュリティの問題から①か②が、良いと思われます。

検証したところ、作成されたアクティベーションパスワードを利用して実際にアクティベーションができるようになるまで15~30分程度かかることがございました。また、5回失敗するとそのアカウントはロックされます。

このため、上記②でユーザに直接パスワードを飛ばしてしまうと、ユーザが届いたメールを見てすぐに登録を試行→アカウントロック→管理者がパスワードリセットが必要という流れになる可能性がございます。
→可能であれば①で管理者が指定し、1時間程度待ってからユーザに告知というのを推奨します。

小規模な組織であればパスワードを利用するのではなく、この管理画面を表示させているシステム管理者のPCにUSBでBlackBerryを接続してアクティベーションするというのが確実かもしれません。

この作業により、BlackbBerry端末からメール・予定表・連絡帳について利用出来るようになります。また、管理者サイトからExchange ActiveSyncのデバイス(Android等)同様にパスワード強制などのポリシー、リモートワイプがかけられます。その他には、「パスワードを変更してロック」「会社用のデータのみリモートワイプ」という細かい選択が可能です。

また、手順を見てお気づきの方もいらっしゃるかもしれませんが、端末はOffice365に接続するのにID/PASSは必要としません。細かい仕組みについては開示されてませんが、設定内容を見る限り、以下の様な流れで管理アカウントで代行取得をしている物と推察されます。

これに関しては善し悪しだと思うのですが、例えばADFS環境で利用している際に、ADFSやADの障害があってOutlookやOWAの認証が出来なくなったとしても、BlackBerry端末からはその影響を受けずに利用の継続が可能となっているという事かと認識してます。

ということで、他のスマートフォンとは認証プロセスと利用アカウントの運用の部分が異なるという特性を活かしつつ、上手く利用するのが良いかなと思います。

ADFSアクセス制御でのOR条件

Office365のアクセス制御を行なうクレームルールですが、サンプルで記載されているルールを参考に実装をしていくと、少し記載が難しいルールがあることに気がつきます。

それは、ルールの中に「OR条件」を入れられないことです。

例えば、許可する条件が

  • ADFS Proxy経由ではない
  • Active Syncプロトコルによるアクセス
  • Exchange Onlineに接続するグローバルIPが①

を記載する場合、サンプルでは

  • 全てのユーザーを許可
  • 「Proxy経由のアクセス」かつ「プロトコルがActiveSync以外」かつ「Exchange Onlineへの接続元が①以外」のアクセスを拒否

という記述方法を取っています。

ここで、企業内で拠点ごとにインターネットを利用している場合など、IPアドレスの接続元が複数あることはよくあることです。

また、POP/IMAPのプロトコルをアクセス制御する場合、特定条件のユーザにおいて、IPアドレスの送信元がユーザのIP帯ではなくExchange OnlineのIP帯になってくるので、そちらも許可しないといけないという仕様もございます(当該ユーザのCAS/MBX収容のDCロケーションが分かれてしまった場合に発生するらしいです)。

この場合、上記例でいう許可したいIPが追加されて、「①」から「①または②」に変更しようとして

  • 全てのユーザーを許可
  • 「Proxy経由のアクセス」かつ「プロトコルがActiveSync以外」かつ「Exchange Onlineへの接続元が①または②以外を拒否」

という正規表現内でOR条件を記載した場合、エラーが出てしまい記述できません。

また、例えば許可ルールが

  • 社内からは許可
  • ActiveSyncの外部アクセスはActiveSync_External_Accessグループのメンバのみ許可
  • Outlookの外部アクセスはMAPI_External_Accessグループのメンバのみ許可

を記載しようとした場合、

  • 全てのユーザーを許可
  • 「ActiveSync」かつ「ActiveSync_External_Accessグループ以外のアクセス」または「プロトコルがMAPI」かつ「MAPI_External_Accessグループ以外のアクセス」は拒否

などを記載できれば良いのですが、「&&」は記載できますが「||」という条件のOR記述はできません。

ということで、こういった場合は最初の全許可のルールを削除して、複数個の許可ルールを記載することにより対応できます。今回は、例として以下のサンプルをADFSに登録してみたいと思います。

  1. イントラネットからのADFS Proxyを利用しないアクセスは許可
  2. ActiveSyncは許可
  3. xxx.xxx.xxx.xxxまたはyyy.yyy.yyy.yyyのIPからのアクセスは許可
  4. MAPI_External_Accessグループの外部からのOutlookアクセスは許可
  5. それ以外のアクセスは拒否

承認する為の条件はpermitのクレームが発行され、かつdenyのクレームが発行されていないということになります。また、permitのクレームが複数発行されても動作上は問題ありませんので、デフォルトのルール(全てのユーザーを許可)を削除し、新しく個別に特定条件下にのみpermitのクレームを発行するルールを作成してみることにします。

まず、4)の準備として既存のクレームルールをバックアップしておきます。また、セキュリティグループの制御用に渡されてくる情報はグループ名ではなくSIDなので、そちらも事前に調べておきます。

【ADFSサーバ:PowerShellから実行】

Add-PSSnapin Microsoft.Adfs.PowerShell
(Get-ADFSRelyingPartyTrust -Name "Microsoft Office 365 Identity Platform").IssuanceAuthorizationRules > c:adfs_claim.bak

【ドメインコントローラ:Windows PowerShell用のActive Directoryモジュールから実行】

(Get-ADGroup "MAPI_External_Access").SID.Value

-> S1-2-34-1234567890-1234567890-1234567890-123 であったと仮定します。

そして、ADFSサーバで、PowerShellで以下のコマンドを実行して

$NewRule = @"
@RuleName = "1) accept Internal access to Office365"
NOT exists([Type == "http://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-proxy"])
 => issue(Type = "http://schemas.microsoft.com/authorization/claims/permit", Value = "true");

@RuleName = "2) accept Exchange ActiveSync access to Office365"
exists([Type == "http://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-client-application", Value == "Microsoft.Exchange.ActiveSync"])
 => issue(Type = "http://schemas.microsoft.com/authorization/claims/permit", Value = "true");

@RuleName = "3) accept customer specified IP address to Office365 #1"
exists([Type == "http://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-forwarded-client-ip", Value =~ "xxx.xxx.xxx.xxx"])
 => issue(Type = "http://schemas.microsoft.com/authorization/claims/permit", Value = "true");

@RuleName = "3) accept customer specified IP address to Office365 #2"
exists([Type == "http://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-forwarded-client-ip", Value =~ "yyy.yyy.yyy.yyy"])
 => issue(Type = "http://schemas.microsoft.com/authorization/claims/permit", Value = "true");

@RuleName = "4) accept customer specified member to Office365 by MAPI#1"
exists([Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid", Value =~ "S-1-2-34-1234567890-1234567890-1234567890-1234"])
&& exists([Type == "http://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-client-application", Value == "Microsoft.Exchange.Autodiscover"])
 => issue(Type = "http://schemas.microsoft.com/authorization/claims/permit", Value = "true");

@RuleName = "4) accept customer specified member to Office365 by MAPI#2"
exists([Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid", Value =~ "S-1-2-34-1234567890-1234567890-1234567890-1234"])
&& exists([Type == "http://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-client-application", Value == "Microsoft.Exchange.OfflineAddressBook"])
 => issue(Type = "http://schemas.microsoft.com/authorization/claims/permit", Value = "true");

@RuleName = "4) accept customer specified member to Office365 by MAPI#3"
exists([Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid", Value =~ "S-1-2-34-1234567890-1234567890-1234567890-1234"])
&& exists([Type == "http://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-client-application", Value == "Microsoft.Exchange.RPC"])
 => issue(Type = "http://schemas.microsoft.com/authorization/claims/permit", Value = "true");

@RuleName = "4) accept customer specified member to Office365 by MAPI#4"
exists([Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid", Value =~ "S-1-2-34-1234567890-1234567890-1234567890-1234"])
&& exists([Type == "http://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-client-application", Value == "Microsoft.Exchange.WebServices"])
 => issue(Type = "http://schemas.microsoft.com/authorization/claims/permit", Value = "true");
"@

Set-ADFSRelyingPartyTrust -TargetName "Microsoft Office 365 Identity Platform" -IssuanceAuthorizationRules $NewRule

※Rule3 IPアドレスのマッチングは==ではなく、=~で記載します。(同じIPアドレスが複数個渡されてくる場合がある。)
※Rule4 OutlookはMAPI(=RPC)だけではなく、4種類のプロトコルで動作するため、全て記載する必要があります。

また、前提条件の解釈によりますが、本ルールで許容されない通信があります。それは、ホワイトリストのIP帯からのWebによるアクセスになります。これは、例えば「物理的にyyy.yyy.yyy.yyyが別AD組織である場合」「クライアントPCのDNSが外部DNSを参照している場合」などで、ADFS Proxyに対してPassiveフェデレーションを行なう場合に発生します。

この際、ADFS ProxyからADFSサーバにx-ms-proxyの属性は付与されますが、x-ms-forwarded-client-ipの値は渡されてきません。(同値は、あくまでExchange Onlineから折り返してアクセスする際の元のIPアドレスなので) このため、もしこのアクセス制御を実装しようとすると、クレームルールだけでは実装できず、IISのIP制限を組み合わせて実装する必要があります。

  1. ADFS ProxyサーバのIISで、指定IP以外は拒否するIP制限を実装。この際、Exchange OnlineのIP帯を許可リストに加えることを忘れないこと。
  2. ADFSサーバでADFS Proxy経由のWebアクセスを許容するクレームルール作成
@RuleName = "accept Web access to Office365"
exists([Type == "http://schemas.microsoft.com/2012/01/requestcontext/claims/x-ms-endpoint-absolute-path"])
=> issue(Type = "http://schemas.microsoft.com/authorization/claims/permit", Value = "true");

色々あって面倒かもしれませんが、アクセス必要なパターン数はそれほど多くないと思いますので、検証しながら進めていこうかなと思ってます。

「ADFSでこんなアクセス制御はできる?」とかリクエストがあったらコメント頂ければ頑張ってみます。