​​​Exchange AD Split Permissionsを後悔なく導入する​

メールボックスをすべてクラウドへ移行した組織でも、オンプレミスのExchange Serverは依然として広く残っています。しかもExchangeはActive Directory内で非常に強い権限を持ち続けるため、多くの場合、AD全体、ひいては企業ITの大半を掌握できる強力な攻撃経路が存在します。いわゆる「AD Split Permissions」へ切り替えればこの致命的なアクセス許可は取り除かれます。そして私は、これまで導入を阻んできた欠点を解消するソリューションを設計しました。

​​​Exchange AD Split Permissionsを後悔なく導入する​

TLDR:欠点を取り除いたらどうなるか

Exchangeのユーザー、グループ、連絡先などが置かれている場所で、ADとRBACのアクセス許可を再付与する方法を見つけました。この方法なら管理者にもID管理システムにも運用変更は不要です。私の経験では、その運用変更こそが多くの企業で導入を阻んでいた要因でした。それでいて、ラテラルムーブメントとドメイン侵害に対するセキュリティ上の利点はそのまま得られます。

Active Directory

実現は3つのステップです

  1. AD split permission modelを実装する
  2. 失われたADのアクセス許可を、関連するOUに限定してExchangeサーバーに付与する
  3. 使えなくなったPowerShellコマンドレットを再度有効にするため、Exchange RBACを付与する

いずれもMicrosoftのガイダンス、AD ACL、またはExchange RBACの割り当てによって行います。

なぜ今これが重要なのか

Exchange 2010 SP1で導入されて以来、この仕組みはほとんど見過ごされるか無視されてきました。しかし既定の共有アクセス許可モデルは、Active Directoryを乗っ取られる大きなセキュリティリスクです。ここ数年Exchangeがリモートからの攻撃で悪名高いことと合わせると、いま手を打つべき時期です。
問題の出発点は、ドメインのルートに付与され、ドメイン全体へ継承されていく特権にあります。

  • ユーザーとグループのアクセス許可の変更(実質的にフルアクセス)
  • グループメンバーの変更
  • ユーザーのパスワードリセット
  • ユーザーとグループの作成・削除

アクセス許可

AdminSDHolderプロセス(属性admincount=1)で保護されるのは一部の高特権Tier0ユーザーとグループだけであり、多くの環境には保護されていないユーザーやグループが残ります。それらはドメインやフォレストの侵害につながるか、少なくとも深刻な影響を招く可能性があります。

代表的な例

  • PWHashSyncを使用している場合のEntra Connect Syncアカウント
  • 既定のグループ
  • 保護されていないカスタムグループや管理・サービスアカウント
    • GPOへの書き込みアクセス許可(ドメインコントローラーに適用されるもの)
    • ADバックアップ、バックアップサーバー、PKIテンプレート、ハイパーバイザーなどへのアクセス管理

これら現在および将来の潜在的な経路をすべて後追いで封じ込めるのは非常に困難です。_ADMというカスタムOUであればACLの継承を無効化できますが、既定のオブジェクトの多くは既定のBuiltin OUやUsersコンテナーから移動できず、脆弱なまま残ります。
ルートから強力なアクセス許可を取り除くほうがはるかに良く、それはActive Directory分割アクセス許可モデルを実装することで実現できます。Configure Exchange Server for split permissions | Microsoft Learn
Microsoftも「…Active Directory分割アクセス許可の実装を推奨します」と述べています。Active Directory Hardening Series - Part 7 – Implementing Least Privilege | Microsoft Community Hub

しかし、なぜ誰もやらないのか

分割アクセス許可はExchange 2010 SP1まで利用できず、その頃には誰もが既定の状態を受け入れていました。登場後もセキュリティチームは導入を押し通せなかったように見えます。
さらに、ADで先にユーザーや配布リストを作成し、その後でExchangeから「メール有効化」するなど、管理プロセスとIDMプロセスの変更を強いるものでもありました。

利用できなくなる、または動作しなくなるコマンドレット
Add-DistributionGroupMember, New-DistributionGroup, New-Mailbox, New-MailContact, New-MailUser, New-RemoteMailbox, Remove-DistributionGroup, Remove-DistributionGroupMember, Remove-Mailbox, Remove-MailContact, Remove-MailUser, Remove-RemoteMailbox, Update-DistributionGroupMember, Add-ADPermission, Remove-ADPermission

運用変更の例

  • New-Mailbox(ExchangeがADに書き込む)は次のようになります
    • New-ADUser(adm.jdoeがADに書き込む)
    • Enable-Mailbox
  • SendAs権限のためのAdd-ADPermissionは、Active Directoryユーザーとコンピューターのセキュリティタブから行う必要があり、標準の管理者には追加のADアクセス許可が必要になることも多くなります。

後悔しない方法を紹介します

免責事項:以下のリンクと記事を最後まで読んで理解し、まずテスト環境で実施し、ADのバックアップが最新であることと復旧手順が確立されていることを必ず確認してください。

現在の利用状況を監査する

まず、対象のコマンドレットのどれがどのOUで使われているかを確認してください。
$CsvPath ="C:\temp\SplitPermissionAdminAuditLog.csv"

$Cmdlets = "Add-ADPermission","Remove-ADPermission","New-DistributionGroup","Remove-DistributionGroup","Add-DistributionGroupMember","Update-DistributionGroupMember","Remove-DistributionGroupMember","New-Mailbox","Remove-Mailbox","New-RemoteMailbox","Remove-RemoteMailbox","New-MailUser","Remove-MailUser","New-MailContact","Remove-MailContact"

Search-AdminAuditLog -ResultSize 99000 -Cmdlets $Cmdlets| select RunDate,Caller,ObjectModified,CmdletName,@{Name='CmdletParameters';Expression={[string]::join(",", ($_.CmdletParameters))}},succeeded,error | Export-Csv -Path $CsvPath -Delimiter ";" -Encoding Unicode -NoTypeInformation

呼び出し元とコマンドレットの簡易分析
$CSVs=Import-Csv -Path $CsvPath -Delimiter ";"$CSVs|group Caller$CSVs|group CmdletNameAnalyze the CSV for where AD permissions will be needed. Potentially optimize by moving all Exchange relevant groups into dedicated OUs.

分割アクセス許可モデルを有効にする

Configure Exchange Server for split permissions | Microsoft Learnの「Switch to Active Directory split permissions」の手順に従ってください(RBAC分割アクセス許可ではありません)
実質的には、「Exchange Windows Permissions」グループの危険なアクセス許可が削除され、あわせてExchangeがそのグループのメンバーから外されます。
Setup.exe /IAcceptExchangeServerLicenseTerms_DiagnosticDataOFF /PrepareAD /ActiveDirectorySplitPermissions:true
元に戻すには次を使用します: /ActiveDirectorySplitPermissions:false

ADのアクセス許可を付与する

カスタムADグループを作成し、Exchangeサーバーをそのメンバーにします。
先にOUのパスを調整してください。
New-ADGroup -Name "AD_Custom Exchange Split permissions replacement" -GroupCategory Security -GroupScope DomainLocal -Path "OU=Rights,OU=Groups,OU=T1,OU=_ADM,$((Get-ADDomain).DistinguishedName)" -Description "replaces the permissions lost by split permissions on relevant OUs"

Add-ADGroupMember "AD_Custom Exchange Split permissions replacement" -Members "Exchange Trusted Subsystem"

グループ経由のアクセス許可を有効にするため、Exchangeサーバーを再起動してください
ユースケースごとにADアクセス許可を簡単に委任できるスクリプトを作成しました。

INFO: これらのアクセス許可がないと、ExchangeサーバーはADから“INSUFF_ACCESS_RIGHTS”というエラーを受け取ります。

glueckkanjaのGitHubからAdd-ExchangeADSplitPermissionOnOU.ps1をダウンロードしてください
付与できるPermissionTypeは次のとおりです。

  • CreateUserAndContact
    • ユーザーと連絡先に対するCreate/delete、ResetPassword、WriteAllProperties
    • Exchangeコマンドレット: New-Mailbox, New-RemoteMailbox, New-MailUser, New-MailContactと対応するRemove-*
  • GroupManage
    • グループの作成・削除、メンバーの変更
    • Exchangeコマンドレット: New-DistributionGroup, Remove-DistributionGroup, Add-DistributionGroupMember, Update-DistributionGroupMember, Remove-DistributionGroupMember
    • その他のユースケース: ユーザーが自分の所有するDistributionGroupをhttps:///EAC経由で管理する
  • UserSendAs
    • ユーザーのADアクセス許可の変更
    • Exchangeコマンドレット: Add-ADPermission
  • GroupSendAs
    • グループのADアクセス許可の変更
    • Exchangeコマンドレット: Add-ADPermission

スクリプトの使い方

Add-ExchangeADSplitPermissionOnOU.ps1 -TargetOU <OU> -PermissionType <GroupManage|UserSendAs|GroupSendAs|CreateUserAndContact> -Trustee "AD_Custom Exchange Split permissions replacement

例
Add-ExchangeADSplitPermissionOnOU.ps1 -TargetOU "OU=ExchangeGroups,OU=HQ,OU=Alderaan,$((Get-ADDomain).DistinguishedName)" -PermissionType GroupManage -Trustee "AD_Custom Exchange Split permissions replacement"

Add-ExchangeADSplitPermissionOnOU.ps1 -TargetOU "OU=ExchangeGroups,OU=HQ,OU=Alderaan,$((Get-ADDomain).DistinguishedName)" -PermissionType GroupSendAs -Trustee "AD_Custom Exchange Split permissions replacement"

Add-ExchangeADSplitPermissionOnOU.ps1 -TargetOU "OU=Users,OU=HQ,OU=Alderaan,$((Get-ADDomain).DistinguishedName)" -PermissionType UserSendAs -Trustee "AD_Custom Exchange Split permissions replacement"

Add-ExchangeADSplitPermissionOnOU.ps1 -TargetOU "OU=Users,OU=HQ,OU=Alderaan,$((Get-ADDomain).DistinguishedName)" -PermissionType CreateUserAndContact -Trustee "AD_Custom Exchange Split permissions replacement"

Exchange RBACを付与する

Add-DistributionGroupMemberとRemove-DistributionGroupMemberの各コマンドレットで-BypassSecurityGroupManagerCheckパラメーターを再度有効にします
New-RoleGroup -Name "SplitPermission Security Group Creation and Membership" -Roles "Security Group Creation and Membership" -Members "Organization Management","Recipient Management" -Description "Brings back -BypassSecurityGroupManagerCheck to Add-DistributionGroupMember, but also needs AD ACL for Exchange Server on target DLs"

INFO:
これを行わないと "-BypassSecurityGroupManagerCheck parameter is not available" または "You don't have sufficient permissions. This operation can only be performed by a manager of the group" というエラーになります。


New-Mailbox、New-RemoteMailbox、New-MailContact、Remove-... の各コマンドレットを必要なパラメーター付きで再度有効にします
New-RoleGroup -Name "SplitPermission Mail Recipient Creation" -Roles "Mail Recipient Creation" -Members "Organization Management","Recipient Management" -Description "Brings back New-Mailbox, New-RemoteMailbox, New-MailUser, New-MailContact and matching Remove-... cmdlets, but additionally Exchange needs AD ACL for Exchange Server on target OUs"

まとめ

このガイドをきっかけに、Exchange経由のActive Directory侵害を防ぐというこの重要な一歩を踏み出す組織が増えることを願っています。Exchange AD分割アクセス許可モデルと本記事の運用方法をお客様の環境で実装してきましたが、これまで問題に遭遇したことはありません。

現在のオールオアナッシングの方式ではなく、OU単位できめ細かく制御できる仕組みをMicrosoftがネイティブに提供してくれれば、広く採用されるようになるはずです。

ADのTier分離は私が特に大切にしているテーマです。あわせてお願いしたいのは、Exchangeサーバーへドメイン管理者(あるいはTier0の)アカウントでログオンせず、今後はTier1として扱い、できるだけ早くADのTier分離を実装することです。 最初の一歩としては、PingCastleやPurple KnightといったツールでADのセキュリティとコントロールパスを評価することをおすすめします。

関連記事