Framework Scoreboard
Total
Best Practice
ANSSI
BSI
CIS
CISA
NIS2
DISA
Findings
Data Security (18 controls)
EDCA-DATA-001: No expired Exchange certificates
All Exchange service certificates MUST be valid and within their expiry date. Expired certificates cause TLS negotiation failures, breaking client connectivity, mail flow, and hybrid authentication.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | Expired certificates with assigned services: 1 - AABB1122CCDD3344EEFF5566778899001122AABB | Subject=CN=Microsoft Exchange Server Auth Certificate | NotAfter=04/21/2026 23:39:49 | Services=SMTP | |
| ex3 | Expired certificates with assigned services: 2 - AABB1122CCDD3344EEFF5566778899001122AABB | Subject=CN=Microsoft Exchange Server Auth Certificate | NotAfter=04/21/2026 23:39:49 | Services=SMTP - BBCC2233DDEE4455FF0066778899AABB2233BBCC | Subject=CN=mail.fabrikam.com | NotAfter=03/20/2026 23:59:59 | Services=IMAP, POP, SMTP |
Remediation
Replace expired certificates and assign them to Exchange services.
# Diagnose: List Exchange certificates with expiry status
Get-ExchangeCertificate -Server $env:COMPUTERNAME | Select-Object Thumbprint, Subject, NotAfter, Status, Services | Sort-Object NotAfter | Format-Table -AutoSize
# To renew: Import-ExchangeCertificate -FileData ([Byte[]](Get-Content <pfx> -Encoding Byte -ReadCount 0)) -Password (Read-Host -AsSecureString)
# Then enable: Enable-ExchangeCertificate -Thumbprint <thumb> -Services SMTP,IISConsiderations
Certificate renewal on an Exchange server requires updating the certificate on all Services (IIS, SMTP, IMAP, POP3) and removing the expired certificate. If using a third-party CA, plan lead time for certificate issuance (typically 1–5 business days). Internal clients may show SSL warnings until the new certificate is fully propagated via Directory Services.
References
- Microsoft Exchange certificate procedures
- V-259649 Exchange servers must use approved DOD certificates (EX19-MB-000019)
- V-259578 Exchange servers must use approved DOD certificates (EX19-ED-000016)
- ENISA / NIS2 Directive (EU) 2022/2555 - Article 21(2)(h): cryptography and encryption policies - Section 9, 6.7, 6.3, 6.6
- ANSSI - Recommandations de sécurité relatives à TLS (v1.2, 2020)
- BSI APP.5.2.A11 — Absicherung der Kommunikation zwischen Exchange-Systemen
EDCA-DATA-002: Auth certificate baseline
The Exchange OAuth authentication certificate MUST be present in the Exchange certificate store and MUST have at least 30 days remaining before expiry. An expired or missing auth certificate breaks OAuth and hybrid authentication flows.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2.ad.fabrikam.com | Auth certificate CCDD3344EEFF5566001177889900BBCC3344CCDD found in local store; expires 04/12/2031 12:20:22 (1814 days remaining). | |
| ex3.ad.fabrikam.com | Auth certificate CCDD3344EEFF5566001177889900BBCC3344CCDD found in local store; expires 04/12/2031 12:20:22 (1814 days remaining). |
Remediation
Verify the Auth Certificate is valid and present on all Exchange servers. If the primary Auth Certificate was replaced without rerunning the Hybrid Configuration Wizard, re-run the wizard to sync the Auth Certificate with Azure AD.
Get-AuthConfig | Format-List CurrentCertificateThumbprint, PreviousCertificateThumbprintConsiderations
The OAuth authentication certificate is required for hybrid features (free/busy lookup, mail routing to Exchange Online Archive, cross-premises calendar delegation). Replacing the Auth certificate requires coordinated updates on all Exchange servers and a brief interruption to hybrid connectivity. Follow the Microsoft Auth Certificate renewal procedure precisely.
References
EDCA-DATA-003: Internal transport certificate baseline
The Exchange internal transport certificate MUST be present in LocalMachine\My and MUST have at least 30 days remaining before expiry. An expired internal transport certificate breaks server-to-server mail delivery.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | Compliant — internal transport certificate valid; expires 04/21/2031 09:35:48 (1823 days remaining). | |
| ex3 | Compliant — internal transport certificate valid; expires 12/31/2029 11:14:52 (1347 days remaining). |
Remediation
If the Internal Transport Certificate is missing or expired, create a new one using New-ExchangeCertificate with the server NetBIOS name, FQDN, and SMTP service assignment. Run Enable-ExchangeCertificate -Services SMTP after confirming propagation to all Exchange servers.
# Replace the placeholder values with the actual server FQDN and NetBIOS name before running.
# The FQDN is the fully qualified DNS name (e.g. ex1.contoso.com); the NetBIOS name is typically $env:COMPUTERNAME.
$serverFQDN = [System.Net.Dns]::GetHostEntry('').HostName
$serverNetBIOS = $env:COMPUTERNAME
New-ExchangeCertificate -PrivateKeyExportable $false -Services SMTP -SubjectName ('CN=' + $serverFQDN) -DomainName $serverFQDN, $serverNetBIOSConsiderations
The internal transport certificate is used for Exchange-to-Exchange SMTP TLS. Replacing it requires the certificate to be propagated to all Exchange servers in the organization before activation. A brief interruption to inter-server TLS may occur during certificate rollover.
References
EDCA-DATA-004: Serialized data signing baseline
Exchange serialized data signing (EnableSerializationDataSigning registry value) MUST be enabled. Serialized data signing prevents deserialization-based attacks against Exchange endpoint processing. CISA recommends enabling serialized data signing to prevent deserialization attacks.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | SerializedDataSigning is enabled. | |
| ex3 | SerializedDataSigning is enabled. |
Remediation
Ensure PowerShell Serialization Payload Signing is enabled on Exchange 2016 CU23+ or Exchange 2019 CU12+ with January 2023 SU or later installed. Verify the signing certificate is valid and present on all Exchange servers.
# Diagnose: Check serialized data signing SettingOverride status
Get-SettingOverride | Where-Object { $_.ComponentName -eq 'Data' -and $_.SectionName -eq 'EnableSerializationDataSigning' } | Select-Object Name, ComponentName, SectionName, Parameters, Server | Format-List
# Expected: an override with Parameters containing 'Enabled=True' applied globally or to target servers.Considerations
Serialized data signing requires a minimum Exchange Cumulative Update level (Exchange 2019 CU12+ or Exchange SE). Enabling it on an older build that does not fully support the feature may cause issues. Verify supported build version before enabling. After enabling, a brief transport interruption may occur while services restart.
References
EDCA-DATA-005: TLS 1.0 and TLS 1.1 are disabled
Each Exchange server MUST have TLS 1.0 and TLS 1.1 disabled for both the server and client SCHANNEL roles. Legacy TLS versions contain known cryptographic weaknesses and must not be available to clients or outbound connections.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | TLS 1.0 is disabled; TLS 1.1 is disabled. | |
| ex2 | TLS 1.0 is disabled; TLS 1.1 is disabled. | |
| ex3 | TLS 1.0 is disabled; TLS 1.1 is disabled. |
Remediation
Disable TLS 1.0 and TLS 1.1 for both Server and Client sides in SCHANNEL, creating keys if absent and setting DisabledByDefault.
foreach ($ver in 'TLS 1.0', 'TLS 1.1') {
foreach ($side in 'Server', 'Client') {
$path = "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\$ver\$side"
New-Item -Path $path -Force | Out-Null
Set-ItemProperty -Path $path -Name Enabled -Type DWord -Value 0
Set-ItemProperty -Path $path -Name DisabledByDefault -Type DWord -Value 1
}
}Considerations
Disabling TLS 1.0 and TLS 1.1 can break connectivity with legacy clients, monitoring systems, and SMTP relay partners that do not support TLS 1.2. Audit all TLS-dependent applications, relay connectors, and partner connectors before disabling. Monitor Exchange transport logs after enforcement for TLS handshake failures.
References
- Microsoft TLS best practices
- ENISA / NIS2 Directive (EU) 2022/2555 - Article 21(2)(h): cryptography and encryption policies - Section 9, 6.7, 6.3, 6.6
- CIS Microsoft Windows Server Benchmark
- CIS Microsoft Windows Server 2022 Benchmark v3.0.0 (L1): Ensure TLS 1.0 is disabled (Enabled = 0) under HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0
- CIS Microsoft Windows Server 2022 Benchmark v3.0.0 (L1): Ensure TLS 1.1 is disabled (Enabled = 0) under HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1
- V-259646 Exchange must use encryption for Outlook Web App (OWA) access (EX19-MB-000007)
- ANSSI - Recommandations de sécurité relatives à TLS (v1.2, 2020)
- BSI APP.5.2.A11 — Absicherung der Kommunikation zwischen Exchange-Systemen
EDCA-DATA-006: TLS 1.2 is enabled
Each Exchange server MUST have TLS 1.2 enabled for both the server and client SCHANNEL roles. TLS 1.2 is the minimum supported version for all current Exchange client and server communications.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | TLS 1.2 is enabled. | |
| ex2 | TLS 1.2 is enabled. | |
| ex3 | TLS 1.2 is enabled. |
Remediation
Enable TLS 1.2 for both Server and Client sides in SCHANNEL, creating keys if absent and clearing DisabledByDefault.
$path = 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2'
foreach ($side in 'Server', 'Client') {
New-Item -Path "$path\$side" -Force | Out-Null
Set-ItemProperty -Path "$path\$side" -Name Enabled -Type DWord -Value 1
Set-ItemProperty -Path "$path\$side" -Name DisabledByDefault -Type DWord -Value 0
}Considerations
Enabling TLS 1.2 is generally low-risk on modern systems. However, if TLS 1.0 and 1.1 are simultaneously disabled, applications or services that do not support TLS 1.2 will fail. Test dependent systems before disabling older protocol versions alongside enabling TLS 1.2.
References
- Microsoft TLS 1.2 deployment guidance
- CIS Microsoft Windows Server Benchmark
- CIS Microsoft Windows Server 2022 Benchmark v3.0.0 (L1): Ensure TLS 1.2 is enabled (Enabled = 1, DisabledByDefault = 0) under HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2
- DISA STIG EX19-MB-000236 (HIGH): The application must protect the confidentiality and integrity of transmitted information (V-259710)
- ENISA / NIS2 Directive (EU) 2022/2555 - Article 21(2)(h): cryptography and encryption policies - Section 9, 6.7, 6.3, 6.6
- ANSSI - Recommandations de sécurité relatives à TLS (v1.2, 2020)
- BSI APP.5.2.A11 — Absicherung der Kommunikation zwischen Exchange-Systemen
EDCA-DATA-007: TLS 1.3 is disabled for Exchange compatibility
Each Exchange server MUST have TLS 1.3 disabled at the SCHANNEL server level. Exchange Server does not support TLS 1.3 for SMTP transport; enabling it causes transport failures. Microsoft CSS has documented compatibility risks with TLS 1.3 on Exchange servers.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | TLS 1.3 is not disabled; evidence source: Registry; OS version: 10.0.26100; TLS 1.3 supported baseline: build 20348+ | |
| ex2 | TLS 1.3 is not disabled; evidence source: Registry; OS version: 10.0.26100; TLS 1.3 supported baseline: build 20348+ | |
| ex3 | TLS 1.3 is not disabled; evidence source: Registry; OS version: 10.0.26100; TLS 1.3 supported baseline: build 20348+ |
Remediation
Disable TLS 1.3 server protocol in SCHANNEL on supported Windows Server versions for Exchange compatibility.
New-Item -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server' -Force | Out-Null
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server' -Name Enabled -Type DWord -Value 0
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\Server' -Name DisabledByDefault -Type DWord -Value 1Considerations
TLS 1.3 is currently not supported by Exchange Server transport. Enabling TLS 1.3 at the OS Schannel level will not cause Exchange SMTP issues but Exchange will not use it for mail transport. IIS may use TLS 1.3 for HTTPS connections if IIS supports it, which is generally safe on Server 2022. Note (ANSSI tension, Feb 2026): ANSSI's post-quantum TLS transition guidance (Transition-post-quantique-protocole-TLS-1-3, 2026) recommends TLS 1.3 with hybrid post-quantum key exchange (e.g. X25519MLKEM768) as the forward-looking cryptographic baseline. This control reflects Exchange's current compatibility constraint — not an ANSSI recommendation to disable TLS 1.3 broadly. Organizations should monitor Microsoft's Exchange roadmap for native TLS 1.3 support and plan to re-enable it once compatibility is confirmed, particularly to benefit from post-quantum cipher suite support.
References
- TLS registry settings (Windows Server)
- ENISA / NIS2 Directive (EU) 2022/2555 - Article 21(2)(h): cryptography and encryption policies - Section 9, 6.7, 6.3, 6.6
- CIS Microsoft Windows Server Benchmark
- EDPB Guidelines, Recommendations, Best Practices
- ANSSI - Recommandations de sécurité relatives à TLS (v1.2, 2020)
- ANSSI - Transition post-quantique de TLS 1.3 (2026)
- BSI APP.5.2.A11 — Absicherung der Kommunikation zwischen Exchange-Systemen
EDCA-DATA-008: Trusted root certificates baseline
The DisableRootAutoUpdate registry policy MUST NOT be set to 1. When set to 1, the Windows trusted root certificate store cannot update automatically, causing certificate validation failures for TLS and OAuth.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Compliant — automatic root certificate updates use system default behavior. | |
| ex2 | Compliant — automatic root certificate updates use system default behavior. | |
| ex3 | Compliant — automatic root certificate updates use system default behavior. |
Remediation
Enable automatic root certificate updates via Group Policy or manually install required root certificates. Ensure the DigiCert Global Root G2 certificate (thumbprint: DDEE4455FF006677112288990011CCDD4455DDEE) is installed on all Exchange servers to prevent certificate validation failures.
# Diagnose: Check automatic root certificate update policy and presence of DigiCert Global Root G2
$val = (Get-ItemProperty 'HKLM:\SOFTWARE\Policies\Microsoft\SystemCertificates\AuthRoot' -Name DisableRootAutoUpdate -ErrorAction SilentlyContinue).DisableRootAutoUpdate
"DisableRootAutoUpdate: $(if ($null -eq $val) { 'not set (auto-update active)' } else { $val })"
$cert = Get-ChildItem Cert:\LocalMachine\Root | Where-Object { $_.Thumbprint -eq 'DDEE4455FF006677112288990011CCDD4455DDEE' }
"DigiCert Global Root G2: $(if ($cert) { 'Present (expires ' + $cert.NotAfter.ToString('yyyy-MM-dd') + ')' } else { 'NOT FOUND - required for Exchange hybrid and modern auth' })"Considerations
Automatic root certificate updates require outbound HTTPS access to Windows Update. In isolated environments, certificates must be manually distributed. The DigiCert Global Root G2 certificate is required by Microsoft 365 and Azure services; its absence will cause TLS trust chain failures for Exchange hybrid and modern authentication.
References
EDCA-DATA-009: IIS HSTS configuration baseline for Exchange sites
Validate IIS HSTS posture on Exchange-related websites, including unsupported usage on Exchange Back End, redirectHttpToHttps risk, and minimum max-age guidance. CISA recommends enabling HTTP Strict Transport Security (HSTS) on Exchange web virtual directories.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | HSTS is not enabled on evaluated IIS sites (2 total). | |
| ex3 | HSTS is not enabled on evaluated IIS sites (2 total). |
Remediation
Review and correct IIS HSTS configuration for Exchange websites, especially Exchange Back End and redirectHttpToHttps settings.
# Diagnose: Check Strict-Transport-Security header configuration on Exchange IIS sites
Import-Module WebAdministration -ErrorAction SilentlyContinue
Get-Website | Where-Object { $_.Name -match 'Default Web Site|Exchange Back End' } | ForEach-Object { $site = $_.Name; Get-WebConfigurationProperty -PSPath "IIS:\Sites\$site" -Filter 'system.webServer/httpProtocol/customHeaders' -Name '.' | Where-Object { $_.name -eq 'Strict-Transport-Security' } | Select-Object @{N='Site';E={$site}}, name, value }
# HSTS must NOT be applied to Exchange Back End (port 444) - it breaks internal services.Considerations
Enabling HSTS instructs browsers to only connect to Exchange sites over HTTPS. If any IIS HTTP binding is required for any reason (e.g., certificate renewal challenges), HSTS will prevent HTTP connections for the duration of the max-age period. Test all Exchange virtual directories for HTTPS functionality before enabling HSTS.
References
- CSS HSTS guidance
- CISA AA21-062A: Mitigate Microsoft Exchange Server Vulnerabilities - enable HTTP Strict Transport Security (HSTS) on Exchange web virtual directories
- ANSSI - Recommandations de sécurité relatives à TLS (v1.2, 2020)
- BSI APP.5.2.A11 — Absicherung der Kommunikation zwischen Exchange-Systemen
- BSI APP.5.2.A12 — Einsatz von Outlook Anywhere, MAPI over HTTP und Outlook im Web
EDCA-DATA-010: TLS insecure renegotiation values hardened
Each Exchange server MUST have SCHANNEL insecure renegotiation disabled for both client and server roles. Permitting insecure renegotiation allows a man-in-the-middle attacker to inject data into an established TLS session (CVE-2009-3555).
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Compliant — AllowInsecureRenegoClients and AllowInsecureRenegoServers are both 0. | |
| ex2 | Compliant — AllowInsecureRenegoClients and AllowInsecureRenegoServers are both 0. | |
| ex3 | Compliant — AllowInsecureRenegoClients and AllowInsecureRenegoServers are both 0. |
Remediation
Configure TLS versions consistently across Exchange servers. Set Client and Server Enabled and DisabledByDefault DWORD values under HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols for each TLS version. Also configure SystemDefaultTlsVersions and SchUseStrongCrypto in .NET Framework registry paths. TLS 1.2 must be enabled; TLS 1.3 must be disabled for Exchange.
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL' -Name AllowInsecureRenegoClients -Type DWord -Value 0
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL' -Name AllowInsecureRenegoServers -Type DWord -Value 0Considerations
TLS renegotiation settings affect all TLS connections on the server at the Schannel layer. Disabling insecure renegotiation prevents certain downgrade attacks but may break connectivity with clients that require renegotiation for session resumption. Test with monitoring and SMTP partner systems before enforcing.
References
EDCA-DATA-011: Weak Schannel ciphers (NULL, DES, RC4, Triple-DES) are explicitly disabled
Weak SCHANNEL ciphers - NULL, DES 56/56, RC4 (all variants), and Triple DES 168 - MUST be disabled in the Windows registry. These ciphers offer inadequate confidentiality or integrity protection and are prohibited by the NCSC TLS Guidelines (§3.3.4 Bulkversleuteling). NULL provides no encryption; DES and RC4 are cryptographically broken; Triple DES is vulnerable to SWEET32 and other attacks.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | All 7 checked weak ciphers (NULL, DES, RC4, 3DES) are explicitly disabled via SCHANNEL registry. | |
| ex2 | All 7 checked weak ciphers (NULL, DES, RC4, 3DES) are explicitly disabled via SCHANNEL registry. | |
| ex3 | All 7 checked weak ciphers (NULL, DES, RC4, 3DES) are explicitly disabled via SCHANNEL registry. |
Remediation
Explicitly disable each weak cipher by setting the DWORD registry value Enabled=0 under the corresponding SCHANNEL\Ciphers subkey. A system restart is required for the changes to take effect.
# Disable weak SCHANNEL ciphers (NULL, DES, RC4 variants, Triple DES).
# Run on each Exchange / Windows server. Requires a restart to take effect.
$ciphers = @(
'NULL',
'DES 56/56',
'RC4 40/128',
'RC4 56/128',
'RC4 64/128',
'RC4 128/128',
'Triple DES 168'
)
foreach ($cipher in $ciphers) {
$path = "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\$cipher"
if (-not (Test-Path -Path $path)) {
New-Item -Path $path -Force | Out-Null
}
Set-ItemProperty -Path $path -Name 'Enabled' -Type DWord -Value 0
Write-Host "Disabled: $cipher"
}
Write-Host 'Done. Restart the server for the changes to take effect.'Considerations
Disabling weak Schannel ciphers (NULL, DES, RC4, Triple-DES) affects all TLS-dependent applications on the server, not just Exchange. Legacy monitoring agents, SMTP relay partners, or backup agents that only support RC4 or Triple-DES will fail to connect after this change. Audit all TLS consumers before applying. Monitor for connectivity failures after enforcement.
References
- NCSC TLS-Richtlijnen 2025 §3.3.4 - Bulkversleuteling
- Microsoft - How to restrict the use of certain cryptographic algorithms in Schannel
- ENISA / NIS2 Directive (EU) 2022/2555 - Article 21(2)(h): cryptography and encryption policies - Section 9, 6.7, 6.3, 6.6
- ANSSI - Recommandations de sécurité relatives à TLS (v1.2, 2020)
- BSI APP.5.2.A11 — Absicherung der Kommunikation zwischen Exchange-Systemen
EDCA-DATA-012: Weak Schannel hash algorithms (MD5, SHA-1) are explicitly disabled
Weak SCHANNEL hash algorithms - MD5 and SHA-1 - MUST be disabled in the Windows registry. MD5 is cryptographically broken (collision attacks) and is classified as Onvoldoende (insufficient) by the NCSC TLS Guidelines (§3.3.5). SHA-1 is classified as Uit te faseren (to be phased out) due to proven collision attacks and must no longer be used for new deployments.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | All 2 checked weak hash algorithms (MD5, SHA-1) are explicitly disabled via SCHANNEL registry. | |
| ex2 | All 2 checked weak hash algorithms (MD5, SHA-1) are explicitly disabled via SCHANNEL registry. | |
| ex3 | All 2 checked weak hash algorithms (MD5, SHA-1) are explicitly disabled via SCHANNEL registry. |
Remediation
Explicitly disable MD5 and SHA-1 by setting the DWORD registry value Enabled=0 under the corresponding SCHANNEL\Hashes subkey. A system restart is required for the changes to take effect.
# Disable weak SCHANNEL hash algorithms (MD5, SHA-1).
# Run on each Exchange / Windows server. Requires a restart to take effect.
$hashes = @('MD5', 'SHA')
foreach ($hash in $hashes) {
$path = "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Hashes\$hash"
if (-not (Test-Path -Path $path)) {
New-Item -Path $path -Force | Out-Null
}
Set-ItemProperty -Path $path -Name 'Enabled' -Type DWord -Value 0
Write-Host "Disabled: $hash"
}
Write-Host 'Done. Restart the server for the changes to take effect.'Considerations
Disabling MD5 and SHA-1 at the Schannel hash algorithm level affects all TLS handshakes on the server. Some legacy SMTP partners or certificate chains that use SHA-1 signed certificates may fail TLS negotiation. Review active TLS session partner certificate chains before applying. Plan for a short transition period to identify impacted connections.
References
- NCSC TLS-Richtlijnen 2025 §3.3.5 - Hashfuncties
- Microsoft - How to restrict the use of certain cryptographic algorithms in Schannel
- ENISA / NIS2 Directive (EU) 2022/2555 - Article 21(2)(h): cryptography and encryption policies - Section 9, 6.7, 6.3, 6.6
- ANSSI - Recommandations de sécurité relatives à TLS (v1.2, 2020)
- BSI APP.5.2.A11 — Absicherung der Kommunikation zwischen Exchange-Systemen
EDCA-DATA-013: Non-forward-secret key exchange (PKCS / static RSA) is explicitly disabled
The PKCS (static RSA) key exchange algorithm MUST be disabled in the Windows SCHANNEL registry. Static RSA key exchange does not provide forward secrecy: if the server private key is later compromised, all past sessions can be decrypted. The NCSC TLS Guidelines (§3.3.3 Sleuteluitwisseling) require Diffie-Hellman-based (DHE/ECDHE) key exchange to ensure forward secrecy. Disabling PKCS in SCHANNEL forces the use of ephemeral key exchange algorithms.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | All 1 checked non-forward-secret key exchange algorithms (PKCS) are explicitly disabled via SCHANNEL registry. | |
| ex2 | All 1 checked non-forward-secret key exchange algorithms (PKCS) are explicitly disabled via SCHANNEL registry. | |
| ex3 | All 1 checked non-forward-secret key exchange algorithms (PKCS) are explicitly disabled via SCHANNEL registry. |
Remediation
Explicitly disable the PKCS key exchange algorithm by setting the DWORD registry value Enabled=0 under SCHANNEL\KeyExchangeAlgorithms\PKCS. A system restart is required for the changes to take effect.
# Disable the non-forward-secret PKCS (static RSA) key exchange algorithm in SCHANNEL.
# Run on each Exchange / Windows server. Requires a restart to take effect.
$path = 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\PKCS'
if (-not (Test-Path -Path $path)) {
New-Item -Path $path -Force | Out-Null
}
Set-ItemProperty -Path $path -Name 'Enabled' -Type DWord -Value 0
Write-Host 'PKCS key exchange disabled. Restart the server for the changes to take effect.'Considerations
Disabling non-forward-secret key exchange (PKCS/static RSA) removes cipher suites that do not provide forward secrecy from TLS negotiation. This improves security by ensuring session keys cannot be decrypted retroactively if the server private key is compromised. Legacy clients or SMTP partners that only support RSA key exchange may be unable to establish TLS sessions after this change.
References
- NCSC TLS-Richtlijnen 2025 §3.3.3 - Sleuteluitwisseling
- Microsoft - How to restrict the use of certain cryptographic algorithms in Schannel
- ENISA / NIS2 Directive (EU) 2022/2555 - Article 21(2)(h): cryptography and encryption policies - Section 9, 6.7, 6.3, 6.6
- ANSSI - Recommandations de sécurité relatives à TLS (v1.2, 2020)
- BSI APP.5.2.A11 — Absicherung der Kommunikation zwischen Exchange-Systemen
EDCA-DATA-014: S/MIME is enabled for Outlook Web App
The SMimeEnabled property on OWA virtual directories SHOULD be True. Enabling S/MIME in OWA allows users to send and receive digitally signed and encrypted messages through the browser, supporting end-to-end email security. The CIS benchmark requires S/MIME to be enabled for OWA.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | Compliant — S/MIME is enabled on at least one OWA virtual directory on this server. | |
| ex3 | Compliant — S/MIME is enabled on at least one OWA virtual directory on this server. |
Remediation
Enable S/MIME on all OWA virtual directories.
# Enable S/MIME on all OWA virtual directories on this server.
Get-OwaVirtualDirectory -Server $env:COMPUTERNAME | Set-OwaVirtualDirectory -SMIMEEnabled $trueConsiderations
S/MIME requires end-user certificates to be provisioned and users must install the S/MIME control in their browser. Enabling this setting does not automatically configure certificates for users.
References
EDCA-DATA-015: RPC client access connections require encryption
The EncryptionRequired property on the RPC client access service MUST be set to True. Requiring encryption for MAPI/RPC connections protects mailbox data in transit from clients connecting via legacy Outlook profiles. The CIS benchmark requires client MAPI encryption to be enforced.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | Compliant — EncryptionRequired is True for RPC client access on this server. | |
| ex3 | Compliant — EncryptionRequired is True for RPC client access on this server. |
Remediation
Set EncryptionRequired to True on the RPC client access service.
# Require encryption for MAPI/RPC client connections.
Set-RpcClientAccess -Server $env:COMPUTERNAME -EncryptionRequired $trueConsiderations
Enabling encryption required may break older Outlook clients that do not support encrypted MAPI connections. Verify Outlook version compatibility before enforcing this setting.
References
EDCA-DATA-016: AES256-CBC encryption mode is enabled for IRM-protected messages
Exchange Server SHOULD be configured to support AES256-CBC mode encryption for IRM-protected messages. Starting with the October 2023 Security Update, the EnableEncryptionAlgorithmCBC setting override enables Exchange to encrypt messages and attachments using AES256-CBC mode - the more secure successor to AES128-ECB. Organizations using Information Rights Management (IRM) with AD RMS or Azure RMS should enable this setting to align with Microsoft Purview Information Protection defaults and to ensure compatibility with Microsoft 365 Apps which use AES256-CBC by default since August 2023.
Evidence
| Organization | Status | Evidence |
|---|
Remediation
On Exchange 2016 CU23 or Exchange 2019 CU13 with October 2023 SU or later, create the EnableEncryptionAlgorithmCBC setting override to enable AES256-CBC mode encryption. On November 2024 SU or later, MSIPC is enabled by default and only the EnableEncryptionAlgorithmCBC override is required. Refresh VariantConfiguration and restart W3SVC and WAS after applying the override.
New-SettingOverride -Name 'EnableEncryptionAlgorithmCBC' -Parameters @('Enabled=True') -Component Encryption -Reason 'Enable AES256-CBC encryption' -Section EnableEncryptionAlgorithmCBC
Get-ExchangeDiagnosticInfo -Process Microsoft.Exchange.Directory.TopologyService -Component VariantConfiguration -Argument Refresh
Restart-Service -Name W3SVC, WAS -ForceConsiderations
Only applicable when IRM (AD RMS or Azure RMS) is in use. Requires Exchange 2016 CU23 with October 2023 SU or Exchange 2019 CU13 with October 2023 SU, or any later build. In a hybrid Exchange Online environment, additional steps are required to enable AES256-CBC on the Exchange Online side - contact Microsoft Support. In a coexistence environment with Exchange Server 2013 (end of life), enabling AES256-CBC may cause intermittent mail delivery and journaling failures.
References
EDCA-DATA-017: Exchange database/log volumes are BitLocker-protected
All volumes hosting Exchange mailbox database and transaction log files MUST be protected with BitLocker Drive Encryption. BitLocker prevents unauthorized access to Exchange data if physical storage media is removed or stolen.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | 1 of 1 database or log volume(s) are not BitLocker-protected. - C:\ | |
| ex3 | 1 of 1 database or log volume(s) are not BitLocker-protected. - C:\ExchangeDatabases\ |
Remediation
Enable BitLocker Drive Encryption on all volumes that host Exchange database and transaction log files. Use Enable-BitLocker or BitLocker Drive Encryption in the Windows Server GUI. Store recovery keys securely in Active Directory before enabling.
Get-BitLockerVolume | Select-Object MountPoint, VolumeStatus, ProtectionStatus | Format-Table -AutoSizeConsiderations
Enabling BitLocker on an existing Exchange volume requires a recovery key stored in Active Directory or a key management solution. The initial encryption pass increases I/O load but does not require an offline maintenance window for an already-mounted volume.
References
EDCA-DATA-018: TLS 1.2 approved cipher suite allowlist enforces forward secrecy
The TLS 1.2 cipher suite order on Exchange servers MUST include only ANSSI-approved cipher suites that provide forward secrecy (ECDHE or DHE key exchange) and exclude weak options. ANSSI classifies AES-GCM and AES-CCM with ECDHE as recommended, and requires that cipher suites without perfect forward secrecy (PFS) such as static RSA key exchange (already addressed by EDCA-DATA-013) are not used. The Schannel cipher suite order must prioritise ECDHE-based suites over DHE-based suites for performance, and DHE group size must meet minimum strength requirements. ANSSI's TLS guide recommends a minimum 2048-bit DHE group and preference for ECDHE P-256 or P-384.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | All 0 active TLS 1.2 cipher suites provide forward secrecy and ECDHE suites are prioritised over DHE suites. | |
| ex2 | All 0 active TLS 1.2 cipher suites provide forward secrecy and ECDHE suites are prioritised over DHE suites. | |
| ex3 | All 0 active TLS 1.2 cipher suites provide forward secrecy and ECDHE suites are prioritised over DHE suites. |
Remediation
Configure the Schannel cipher suite order via Group Policy (Computer Configuration > Administrative Templates > Network > SSL Configuration Settings > SSL Cipher Suite Order) or via the registry under HKLM\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\00010002. Prioritise ECDHE cipher suites with AES-GCM. Remove or demote cipher suites without forward secrecy. Apply IISCrypto or a custom GPO to set the recommended order.
# Inspect current Schannel cipher suite order
Get-TlsCipherSuite | Select-Object Name, Exchange, Hash, Cipher, KeyLength | Format-Table -AutoSize
# Check for non-forward-secret suites (no ECDHE or DHE in name)
Get-TlsCipherSuite | Where-Object { $_.Name -notmatch 'ECDHE|DHE' } | Select-Object Name | Format-Table -AutoSize
# Recommended ANSSI-aligned TLS 1.2 cipher suites (forward-secret, AES-GCM preferred):
# TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
# TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
# TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
# TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
# TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
# TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
# Example: disable a non-PFS cipher suite
# Disable-TlsCipherSuite -Name 'TLS_RSA_WITH_AES_256_CBC_SHA256'Considerations
Removing cipher suites from the Schannel order affects ALL TLS-dependent applications on the server. SMTP partner systems, monitoring agents, and internal applications must support at least one remaining cipher suite to maintain connectivity. Before enforcing a restrictive cipher suite list, audit all TLS connections using network capture or transport log analysis. The Windows Schannel cipher suite order is controlled by Group Policy; if a GPO already manages this setting, changes must be made through the GPO. Exchange transport uses Schannel for both inbound and outbound SMTP TLS negotiation. If a restricted cipher suite list causes inbound TLS failures, review receive connector logs for TLS handshake errors.
References
EDCA-DATA-019: SchUseStrongCrypto is enabled for .NET Framework
.NET Framework 4.x on each Exchange server MUST have SchUseStrongCrypto set to 1 in both the 64-bit and 32-bit (WoW6432Node) registry hives. Without this setting, .NET client code defaults to weak ciphers and older TLS versions for outbound connections, undermining TLS security enforced at the SCHANNEL layer.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | SchUseStrongCrypto is set to 1 in both the 64-bit and 32-bit (WoW6432Node) .NET Framework v4.0.30319 registry paths. | |
| ex2 | SchUseStrongCrypto is set to 1 in both the 64-bit and 32-bit (WoW6432Node) .NET Framework v4.0.30319 registry paths. | |
| ex3 | SchUseStrongCrypto is set to 1 in both the 64-bit and 32-bit (WoW6432Node) .NET Framework v4.0.30319 registry paths. |
Remediation
Set SchUseStrongCrypto to 1 in both the 64-bit and WoW6432Node .NET Framework v4.0.30319 registry paths.
foreach ($path in @(
'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319',
'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319'
)) {
New-Item -Path $path -Force | Out-Null
Set-ItemProperty -Path $path -Name SchUseStrongCrypto -Type DWord -Value 1
}Considerations
SchUseStrongCrypto affects all .NET applications on the server, not just Exchange. Setting it to 1 restricts .NET code to TLS 1.2+ and strong cipher suites for outbound connections. This may break connectivity with legacy services that do not support TLS 1.2. Test dependent integrations before enforcing.
References
Governance (11 controls)
EDCA-GOV-001: Shared mailbox type consistency
Shared-resource mailboxes MUST be provisioned as RecipientTypeDetails=SharedMailbox (or RoomMailbox or EquipmentMailbox). Mismatched mailbox types can create unintended licensing requirements and security exposure.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | Compliant — no non-user mailboxes with enabled accounts detected. | |
| ex3 | Compliant — no non-user mailboxes with enabled accounts detected. |
Remediation
Disable the Active Directory account for each non-user mailbox that has an enabled account.
# Diagnose: Find non-user mailboxes (Shared, Room, Equipment) with enabled accounts
Get-Mailbox -ResultSize Unlimited | Where-Object { $_.RecipientTypeDetails -ne 'UserMailbox' -and -not $_.AccountDisabled } | Select-Object DisplayName, RecipientTypeDetails, PrimarySmtpAddress | Sort-Object RecipientTypeDetails, DisplayName
# To fix:
# Disable-MailboxAccount -Identity <alias> -Confirm:$falseConsiderations
Disabling the account on a shared or resource mailbox does not affect mailbox access via delegation. Verify that no service accounts, automations, or applications authenticate using the mailbox's AD account before disabling it. In hybrid environments, account state is synchronized from on-premises AD to Entra ID - disabling the account on-premises also disables the cloud identity.
References
EDCA-GOV-002: Exchange product line lifecycle status
Exchange Server SE MUST be the supported production baseline and MUST be kept current on Cumulative Updates. Exchange Server 2016 and 2019 are out of support and represent a lifecycle risk. CISA (KEV Catalog) requires applying patches for known exploited Exchange Server vulnerabilities within mandated timelines.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Running build 15.2.2562.17 is not the latest approved update. Latest known: 15.2.2562.37. | |
| ex2 | Running build 15.2.2562.37 matches or exceeds the latest known approved update (15.2.2562.37). | |
| ex3 | Running build 15.2.2562.37 matches or exceeds the latest known approved update (15.2.2562.37). |
Remediation
Ensure Exchange Server SE is running the latest approved update. If running Exchange 2016 or 2019, plan migration to Exchange Server SE first.
# Diagnose: Check Exchange Server build version against lifecycle dates
Get-ExchangeServer | Select-Object Name, AdminDisplayVersion, Edition, IsEdge | Format-Table -AutoSize
# Compare build numbers at: https://learn.microsoft.com/exchange/new-features/build-numbersConsiderations
Migrating from Exchange 2016 or Exchange 2019 to Exchange SE requires environment planning and coexistence testing. Plan for sufficient coexistence time and test hybrid features, mail flow, and client connectivity before decommissioning older servers.
References
- Exchange Server build numbers, release dates, and support status
- CISA KEV Catalog: Apply patches for known exploited Exchange Server vulnerabilities within required timelines
- ENISA / NIS2 Directive (EU) 2022/2555 - Article 21(2)(e): security in network and information systems maintenance - Section 6.3, 6.4, 9
- BSI APP.5.2.A9 — Sichere Konfiguration von Exchange-Servern
EDCA-GOV-003: EEMS baseline
The Exchange Emergency Mitigation Service (MSExchangeMitigation) MUST be Running with Automatic start mode and mitigations enabled. EEMS enables Microsoft to deliver emergency mitigations for critical Exchange vulnerabilities. CISA recommends enabling the Microsoft Exchange Emergency Mitigation Service.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | Compliant — EEMS service is running, automatic start, mitigations enabled. | |
| ex3 | Compliant — EEMS service is running, automatic start, mitigations enabled. |
Remediation
Ensure the MSExchangeMitigation Windows service is set to Automatic startup and is in a Running state. Verify the server has outbound connectivity to the Office Configuration Service (OCS) mitigation endpoint at officeclient.microsoft.com.
Get-Service MSExchangeMitigation | Format-List Name, Status, StartTypeConsiderations
EEMS automatically applies mitigations from Microsoft without requiring manual patching. If organizational policy requires change control approval before applying any system changes, EEMS may not be appropriate in enforce mode. Review EEMS logs after automatic mitigations are applied to assess impact.
References
EDCA-GOV-004: Exchange Hybrid Application baseline
The Exchange Hybrid Application MUST be correctly configured to support hybrid coexistence between on-premises Exchange and Exchange Online. Microsoft is transitioning hybrid connectivity from Exchange Web Services (EWS) to Microsoft Graph API, requiring a dedicated Hybrid Application registration created by the ConfigureExchangeHybridApplication tool. Without a correctly configured Hybrid Application, hybrid mail flow, free/busy lookups, and cross-premises mailbox moves will fail. EDCA validates AuthServer and IntraOrganizationConnector configuration to detect missing or misconfigured hybrid application entries.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | OAuth hybrid detected: True; EvoSTS auth servers: 1; ACS auth servers: 1; Exchange Online partner app enabled: True; dedicated-hybrid-app override count: 3; dedicated-app auth server count: 1; shared-app auth server count: 0; EvoSTS IsDefaultAuthorizationEndpoint: True; modern auth type: HMA; default auth server URL: https://login.windows.net/fabrikam.onmicrosoft.com/federationmetadata/2007-06/federationmetadata.xml |
Remediation
Deploy a dedicated Exchange Hybrid Application using the ConfigureExchangeHybridApplication tool to support the transition from EWS to Microsoft Graph API for hybrid functionality.
# Diagnose: Check Hybrid AuthServer and IntraOrganization Connector configuration
Get-AuthServer | Where-Object { $_.Type -eq 'AzureAD' } | Select-Object Name, Enabled, ApplicationIdentifier, DomainName | Format-List
Get-IntraOrganizationConnector | Select-Object Name, Enabled, TargetAddressDomains, DiscoveryEndpoint | Format-ListConsiderations
The Exchange Hybrid Application is used by Exchange Online to communicate with on-premises Exchange. Removing or changing the hybrid application configuration will disrupt hybrid mail flow, free/busy lookups, and cross-premises mailbox moves. Any reconfiguration must be coordinated with Exchange Online and verified in the Exchange Admin Center.
References
EDCA-GOV-005: Mailbox database issue-warning quota is configured
The IssueWarningQuota property of each mailbox database SHOULD be set to a specific value rather than Unlimited. Configuring a warning threshold ensures users are notified before their mailbox reaches capacity, reducing the risk of mail delivery failures. The CIS benchmark requires this quota to be configured.
Evidence
| Server | Status | Evidence |
|---|---|---|
| MDB2 | IssueWarningQuota is configured (not Unlimited) — compliant. | |
| MDB3 | IssueWarningQuota is configured (not Unlimited) — compliant. |
Remediation
Set IssueWarningQuota on each mailbox database to a defined quota value.
# Set issue-warning quota on a specific mailbox database (adjust name and size as needed).
# To target a specific database: replace 'DatabaseName' with the actual database name.
Set-MailboxDatabase -Identity 'DatabaseName' -IssueWarningQuota 1.9GB -UseDatabaseQuotaDefaults $trueConsiderations
The appropriate quota size depends on mailbox storage capacity. Ensure that the configured value aligns with your organisation's mailbox retention and storage policies.
References
EDCA-GOV-006: Mailbox database prohibit-send-receive quota is configured
The ProhibitSendReceiveQuota property of each mailbox database SHOULD be set to a specific value rather than Unlimited. Configuring this hard limit prevents oversized mailboxes from consuming unrestricted storage. The CIS benchmark requires this quota to be configured.
Evidence
| Server | Status | Evidence |
|---|---|---|
| MDB2 | ProhibitSendReceiveQuota is configured (not Unlimited) — compliant. | |
| MDB3 | ProhibitSendReceiveQuota is configured (not Unlimited) — compliant. |
Remediation
Set ProhibitSendReceiveQuota on each mailbox database to a defined quota value.
# Set prohibit-send-receive quota on a specific mailbox database (adjust name and size as needed).
# To target a specific database: replace 'DatabaseName' with the actual database name.
Set-MailboxDatabase -Identity 'DatabaseName' -ProhibitSendReceiveQuota 2GBConsiderations
Ensure the prohibit-send-receive quota is set higher than the prohibit-send quota and the issue-warning quota. Coordinate with your storage and capacity planning team before adjusting.
References
EDCA-GOV-007: Mailbox database prohibit-send quota is configured
The ProhibitSendQuota property of each mailbox database SHOULD be set to a specific value rather than Unlimited. Configuring this limit prevents users from sending new mail when their mailbox is near capacity. The CIS benchmark requires this quota to be configured.
Evidence
| Server | Status | Evidence |
|---|---|---|
| MDB2 | ProhibitSendQuota is configured (not Unlimited) — compliant. | |
| MDB3 | ProhibitSendQuota is configured (not Unlimited) — compliant. |
Remediation
Set ProhibitSendQuota on each mailbox database to a defined quota value.
# Set prohibit-send quota on a specific mailbox database (adjust name and size as needed).
# To target a specific database: replace 'DatabaseName' with the actual database name.
Set-MailboxDatabase -Identity 'DatabaseName' -ProhibitSendQuota 1.95GBConsiderations
Set this value between the issue-warning quota and the prohibit-send-receive quota. Review impacts on users with large mailboxes before applying.
References
EDCA-GOV-008: Exchange Send Fatal Errors to Microsoft is disabled
Exchange Send Fatal Errors to Microsoft MUST be disabled. The error reporting feature transmits diagnostic data to Microsoft, which may include server configuration and operational details. This must be disabled on DoD/government networks where external data transmission must be controlled.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | ErrorReportingEnabled=False — compliant (disabled). | |
| ex2 | ErrorReportingEnabled=False — compliant (disabled). | |
| ex3 | ErrorReportingEnabled=False — compliant (disabled). |
Remediation
Run Set-ExchangeServer -Identity <ServerName> -ErrorReportingEnabled $false for each non-compliant Exchange server.
Set-ExchangeServer -Identity '<ServerName>' -ErrorReportingEnabled $falseConsiderations
Disabling error reporting reduces Microsoft's ability to diagnose critical Exchange failures. If this setting is mandatory for compliance, compensate with internal diagnostic tooling (e.g., CSS-Exchange Health Checker, SCOM, or equivalent).
References
EDCA-GOV-009: Exchange Customer Experience Improvement Program (CEIP) is disabled
Exchange MUST NOT send customer experience reports to Microsoft. The Customer Experience Improvement Program (CEIP) transmits usage data to Microsoft, which may violate network data-flow restrictions on DoD/government systems. CEIP must be disabled.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | CustomerFeedbackEnabled=False — compliant (False). |
Remediation
Run Set-OrganizationConfig -CustomerFeedbackEnabled $false to disable the Customer Experience Improvement Program.
Set-OrganizationConfig -CustomerFeedbackEnabled $falseConsiderations
CEIP data is asynchronously batched and transmitted. Disabling it has no operational impact on Exchange functionality. Apply via Group Policy in domain-joined environments to ensure it is not re-enabled after updates.
References
EDCA-GOV-010: Exchange mail quota settings do not block mail flow
Exchange mail quota settings MUST NOT prevent users from sending or receiving mail. ProhibitSend and ProhibitSendReceive quotas must not be configured so restrictively that they block legitimate message flow under normal operational conditions -- overly tight quotas constitute an operational denial-of-service. The send quota requirement is a formal DISA STIG rule for Exchange 2019 and Exchange SE; Exchange 2016 has an exception in that the 2016 STIG only mandates receive quota checks (/320), but the principle of not blocking outbound mail applies to all versions.
Evidence
| Server | Status | Evidence |
|---|---|---|
| MDB2 | Send and receive quotas are configured (not Unlimited). | |
| MDB3 | Send and receive quotas are configured (not Unlimited). |
Remediation
Review and adjust ProhibitSend and ProhibitSendReceive quota settings on mailbox databases and individual mailboxes to ensure they do not block legitimate mail flow.
# Review mailbox database quota settings
Get-MailboxDatabase | Select-Object Name, ProhibitSendQuota, ProhibitSendReceiveQuota, IssueWarningQuota
# Review individual mailbox quota overrides
Get-Mailbox -ResultSize Unlimited | Where-Object { $_.UseDatabaseQuotaDefaults -eq $false } |
Select-Object DisplayName, ProhibitSendQuota, ProhibitSendReceiveQuotaConsiderations
Quota values must accommodate normal business mailbox usage. Exchange 2016 DISA STIG explicitly addresses receive quotas (/320). The send quota requirement is a formal STIG rule for Exchange 2019 and Exchange SE; the principle applies to Exchange 2016 as well, but there is no corresponding formal 2016 STIG rule for send quotas.
References
EDCA-GOV-011: Exchange software baseline is documented and monitored for unauthorized changes
An Exchange software baseline copy MUST exist, and Exchange software MUST be monitored for unauthorized changes. A software baseline enables rapid detection of unauthorized modifications to Exchange binaries, configuration files, or DLLs. File integrity monitoring must be in place to alert on deviations from the baseline.
Evidence
| Organization | Status | Evidence |
|---|
Remediation
Create and maintain a documented software baseline, and implement file integrity monitoring for the Exchange installation directory.
# Document Exchange binary baseline hashes. Run from EMS on each Exchange server.
$exchPath = $exinstall
Get-ChildItem $exchPath -Recurse -File -ErrorAction SilentlyContinue | Get-FileHash -Algorithm SHA256 | Select-Object Hash, Path | Export-Csv ($env:COMPUTERNAME + '-ExchangeBaseline.csv') -NoTypeInformation
Write-Host ('Baseline written to ' + $env:COMPUTERNAME + '-ExchangeBaseline.csv')Considerations
File integrity monitoring solutions (e.g., Microsoft Defender for Endpoint, Tripwire, AIDE) are typically required to meet this control in an automated fashion. Store baselines in a write-protected location. Refresh the baseline after each Exchange Cumulative Update.
References
EDCA-GOV-012: Exchange services are documented and unnecessary services are disabled
Exchange services MUST be documented, and unnecessary services MUST be removed or disabled. Only services required for the installed Exchange server role and configured features must be active. Unnecessary services expand the attack surface and must be disabled to minimize exposure.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | 2 unnecessary service(s) are not disabled. - MSExchangePOP3: StartType=Manual, Status=Stopped — must be Disabled and not Running - MSExchangeIMAP4: StartType=Manual, Status=Stopped — must be Disabled and not Running | |
| ex3 | POP3, IMAP4 and UM services are disabled or not present. - MSExchangePOP3: StartType=Disabled, Status=Stopped - MSExchangeIMAP4: StartType=Disabled, Status=Stopped |
Remediation
Enumerate all running services on Exchange servers and document required services. Disable any non-essential services. POP3 and IMAP4 are disabled by default in Exchange and should remain disabled unless explicitly required. If not in use, set both the back-end and front-end service instances to Disabled and stop any running instances.
# List all Exchange-related services and their startup types
Get-Service -DisplayName 'Microsoft Exchange*' | Select-Object DisplayName, Status, StartType | Sort-Object DisplayName
# Diagnose: Check POP3 and IMAP4 service state
Get-Service -Name MSExchangePOP3, MSExchangePOP3BE, MSExchangeIMAP4, MSExchangeIMAP4BE -ErrorAction SilentlyContinue | Select-Object Name, DisplayName, Status, StartType
# To disable POP3 (frontend + backend):
# Set-Service -Name MSExchangePOP3 -StartupType Disabled
# Set-Service -Name MSExchangePOP3BE -StartupType Disabled
# Stop-Service -Name MSExchangePOP3, MSExchangePOP3BE -Force -ErrorAction SilentlyContinue
# To disable IMAP4 (frontend + backend):
# Set-Service -Name MSExchangeIMAP4 -StartupType Disabled
# Set-Service -Name MSExchangeIMAP4BE -StartupType Disabled
# Stop-Service -Name MSExchangeIMAP4, MSExchangeIMAP4BE -Force -ErrorAction SilentlyContinueConsiderations
Disabling Exchange services without understanding their role can cause mail flow, client connectivity, or high-availability failures. Consult the Exchange service documentation before disabling any service. Test changes in a non-production environment. Before disabling POP3 or IMAP4, confirm that no mail clients, monitoring systems, or legacy integrations depend on those protocols. Disabling POP3/IMAP4 services does not affect MAPI, EWS, ActiveSync, or SMTP connectivity.
References
- V-259702 Exchange services must be documented and unnecessary services must be removed or disabled (EX19-MB-000198)
- V-259635 Exchange services must be documented and unnecessary services must be removed or disabled (EX19-ED-000198)
- Exchange services reference
- ANSSI - Mise en œuvre sécurisée d'un serveur Windows membre AD DS (2025)
- BSI SYS.1.1.A6 — Deaktivierung nicht benötigter Dienste
Identity and Access Control (26 controls)
EDCA-IAC-001: UPN matches primary SMTP address
Each user mailbox UserPrincipalName MUST match the primary SMTP address. Mismatches cause authentication failures with modern authentication and Entra ID (Azure AD) synchronization. This check applies to UserMailbox recipients only; shared, room, and equipment mailboxes are excluded.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | Compliant — no UPN/Primary SMTP mismatches detected. |
Remediation
Align UPN values and primary SMTP addresses according to identity policy. Use IdFix (https://github.com/microsoft/idfix) to identify and remediate UPN and format errors before synchronizing with Entra ID. Where aligning UPNs is not feasible, configure Alternate Login ID via AD FS or the Entra ID email sign-in feature as a compensating control.
# Diagnose: Find user mailboxes where UserPrincipalName differs from primary SMTP address
Get-Mailbox -ResultSize Unlimited -RecipientTypeDetails UserMailbox | Where-Object { $_.UserPrincipalName -ne $_.WindowsEmailAddress.ToString() } | Select-Object DisplayName, UserPrincipalName, WindowsEmailAddress | Sort-Object DisplayNameConsiderations
Updating a user principal name (UPN) in Active Directory affects the login identity used by Modern Authentication. Changes must be coordinated with the identity team and may temporarily disrupt SSO. Email addresses remain unaffected unless also updated. If UPN alignment is not possible due to organisational constraints (e.g. corporate UPN suffix differs from mail domain), configure Alternate Login ID in AD FS or enable email sign-in in Entra ID as a compensating control rather than leaving mismatches unaddressed.
References
EDCA-IAC-002: Exchange computer membership baseline
The Exchange server computer account MUST be a member of the Exchange Servers and Exchange Trusted Subsystem Active Directory security groups. Missing group membership causes permission failures across Exchange management operations.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | Computer account membership includes Exchange Trusted Subsystem and Exchange Servers. | |
| ex3 | Computer account membership includes Exchange Trusted Subsystem and Exchange Servers. |
Remediation
Add the Exchange server's computer object to both the Exchange Trusted Subsystem and Exchange Servers universal security groups in Active Directory. Perform an IISReset after updating group membership.
# Diagnose: Check Exchange server computer account AD group membership
$groups = (Get-ADComputer $env:COMPUTERNAME -Properties MemberOf -ErrorAction SilentlyContinue).MemberOf
$groups | ForEach-Object { (Get-ADGroup $_ -ErrorAction SilentlyContinue).Name } | Where-Object { $_ } | Sort-Object
# Expected: 'Exchange Servers', 'Exchange Trusted Subsystem', 'Exchange Windows Permissions'Considerations
Exchange Server computer accounts must be members of the Exchange Servers universal security group for correct service operation. Removing Exchange from this group will break Exchange service functionality. This control is informational - remediation should only be performed if the membership was accidentally altered.
References
EDCA-IAC-003: NTLMv2 authentication enforcement baseline
LAN Manager authentication level and NTLM minimum session security MUST be configured together to enforce NTLMv2 only and refuse LM/NTLM. Applicability: Exchange 2016/2019/SE with modern clients. Exception: validated legacy interoperability requirements must be risk accepted. The CIS benchmark requires 'Network security: LAN Manager authentication level' to be set to 'Send NTLMv2 response only. Refuse LM & NTLM' (LmCompatibilityLevel = 5). The CIS benchmark requires minimum session security for both NTLM SSP clients and servers to be set to 'Require NTLMv2 session security, Require 128-bit encryption' (NtlmMinClientSec and NtlmMinServerSec = 537395200).
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Compliant — NTLMv2 enforcement baseline configured. LmCompatibilityLevel: 5; NtlmMinClientSec: 536870912; NtlmMinServerSec: 536870912 | |
| ex2 | Compliant — NTLMv2 enforcement baseline configured. LmCompatibilityLevel: 5; NtlmMinClientSec: 536870912; NtlmMinServerSec: 536870912 | |
| ex3 | Compliant — NTLMv2 enforcement baseline configured. LmCompatibilityLevel: 5; NtlmMinClientSec: 536870912; NtlmMinServerSec: 536870912 |
Remediation
Set LmCompatibilityLevel to 5 (refuse LM and NTLM, send NTLMv2), and set NtlmMinClientSec and NtlmMinServerSec to require NTLMv2 session security with 128-bit encryption.
# Enforce NTLMv2 only - refuse LM and NTLM (CIS 2.3.11.7)
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa' -Name LmCompatibilityLevel -Type DWord -Value 5
# Require NTLMv2 session security + 128-bit encryption for NTLM SSP clients (CIS 2.3.11.10)
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0' -Name NtlmMinClientSec -Type DWord -Value 537395200
# Require NTLMv2 session security + 128-bit encryption for NTLM SSP servers (CIS 2.3.11.11)
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0' -Name NtlmMinServerSec -Type DWord -Value 537395200Considerations
Setting LAN Manager authentication level to NTLMv2-only will break authentication for legacy clients and systems that only support LM or NTLM authentication. Requiring NTLM 128-bit session encryption drops connections from legacy clients that only support 56-bit encryption (pre-Windows 2000). Verify all clients, servers, and services that authenticate against Exchange or AD support NTLMv2 and 128-bit session security before enforcing these policies. Test against any legacy NTLM-dependent services before applying.
References
- CIS Microsoft Windows Server Benchmark
- Network security: LAN Manager authentication level
- CIS 2.3.11.7 (L1): Ensure 'Network security: LAN Manager authentication level' is set to 'Send NTLMv2 response only. Refuse LM & NTLM'
- Network security: minimum session security for NTLM SSP based clients and servers
- CIS 2.3.11.10 (L1): Ensure 'Network security: Minimum session security for NTLM SSP based (including secure RPC) clients' is set to 'Require NTLMv2 session security, Require 128-bit encryption'
- CIS 2.3.11.11 (L1): Ensure 'Network security: Minimum session security for NTLM SSP based (including secure RPC) servers' is set to 'Require NTLMv2 session security, Require 128-bit encryption'
- ANSSI - Mise en œuvre sécurisée d'un serveur Windows membre AD DS (2025)
- BSI APP.2.2.A9 — Schutz der Authentisierung beim Einsatz von AD DS
- BSI SYS.1.2.3.A5 — Sichere Authentisierung und Autorisierung in Windows Server
EDCA-IAC-004: Modern Authentication is configured
Modern Authentication (OAuth 2.0) MUST be configured on Exchange for clients to use token-based authentication rather than Basic Authentication. Two on-premises configurations are supported:
• Hybrid Modern Authentication (HMA) - uses Microsoft Entra ID (Azure AD / EvoSTS) as the Security Token Service. Requires Classic Full Hybrid (Hybrid Configuration Wizard). Supported on Exchange 2013 CU19+, Exchange 2016 CU8+, Exchange 2019 RTM+, Exchange SE RTM+. The auth server AuthMetadataUrl points to https://login.windows.net/<tenant>/federationmetadata/2007-06/federationmetadata.xml.
• AD FS Modern Authentication - uses an on-premises Active Directory Federation Services (AD FS 2019 or later) server as the Security Token Service. Does not require Exchange Hybrid or Entra ID. Supported on Exchange 2019 CU13+ and Exchange SE only (Exchange 2016 and 2013 are not supported). The auth server AuthMetadataUrl points to https://<adfs-fqdn>/FederationMetadata/2007-06/FederationMetadata.xml.
EDCA verifies the following prerequisites (applicable to both methods):
• OAuth2ClientProfileEnabled = True (Set-OrganizationConfig)
• An auth server has IsDefaultAuthorizationEndpoint = True with a configured AuthMetadataUrl - the URL pattern identifies the method (Entra/HMA vs AD FS)
• SSL Offloading is disabled on Outlook Anywhere connectors (incompatible with Modern Authentication)
• OAuthAuthentication = True on EWS and Autodiscover virtual directories (Set-MapiVirtualDirectory and Set-ActiveSyncVirtualDirectory do not expose this parameter)
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | Modern Authentication prerequisites satisfied: OAuth2ClientProfileEnabled = True, HMA (Entra/Azure AD) authorization endpoint configured (AuthMetadataUrl: https://login.windows.net/fabrikam.onmicrosoft.com/federationmetadata/2007-06/federationmetadata.xml), SSL Offloading disabled, OAuth enabled on all 4 checked virtual directory(s). |
Remediation
Enable all Modern Authentication prerequisites on-premises. Additional AD FS or Azure AD / Exchange Online configuration steps must be completed separately.
# === DIAGNOSTICS ===
# Check OAuth2ClientProfileEnabled
Get-OrganizationConfig | Select-Object OAuth2ClientProfileEnabled
# Check auth servers (Type, IsDefaultAuthorizationEndpoint, AuthMetadataUrl)
Get-AuthServer | Select-Object Name, Type, Enabled, IsDefaultAuthorizationEndpoint, AuthMetadataUrl | Format-List
# Check SSL Offloading on Outlook Anywhere connectors
Get-OutlookAnywhere | Select-Object Identity, SSLOffloading
# Check OAuthAuthentication on virtual directories
Get-MapiVirtualDirectory | Select-Object Identity, OAuthAuthentication
Get-WebServicesVirtualDirectory | Select-Object Identity, OAuthAuthentication
Get-ActiveSyncVirtualDirectory | Select-Object Identity, OAuthAuthentication
Get-AutodiscoverVirtualDirectory | Select-Object Identity, OAuthAuthentication
# === REMEDIATION — Common steps (both HMA and AD FS) ===
# 1. Enable Modern Authentication at the organization level
Set-OrganizationConfig -OAuth2ClientProfileEnabled $true
# 2. Disable SSL Offloading on Outlook Anywhere connectors
Get-OutlookAnywhere | Set-OutlookAnywhere -SSLOffloading $false
# 3. Enable OAuth on virtual directories that support the parameter
# NOTE: Set-MapiVirtualDirectory and Set-ActiveSyncVirtualDirectory do not expose -OAuthAuthentication.
Get-WebServicesVirtualDirectory | Set-WebServicesVirtualDirectory -OAuthAuthentication $true
Get-AutodiscoverVirtualDirectory | Set-AutodiscoverVirtualDirectory -OAuthAuthentication $true
# 4. Restart IIS to apply virtual directory changes
IISReset /noforce
# === FOR HMA (Entra/Azure AD) — Requires Classic Full Hybrid ===
# Set EvoSTS as the default authorization endpoint (replace 'EvoSts' if named differently):
Set-AuthServer -Identity 'EvoSts' -IsDefaultAuthorizationEndpoint $true
# NOTE: Full HMA setup requires running the Hybrid Configuration Wizard and Azure AD steps. See:
# https://learn.microsoft.com/microsoft-365/enterprise/configure-exchange-server-for-hybrid-modern-authentication
# === FOR AD FS — Requires Exchange 2019 CU13+ or Exchange SE, and AD FS 2019+ ===
# Create an auth server pointing to the AD FS federation metadata URL:
New-AuthServer -Type ADFS -Name 'MyADFSServer' -AuthMetadataUrl 'https://<adfs-fqdn>/FederationMetadata/2007-06/FederationMetadata.xml'
Set-AuthServer -Identity 'MyADFSServer' -IsDefaultAuthorizationEndpoint $true
# NOTE: Full AD FS setup requires configuring ADFS application groups, scopes, and client policies. See:
# https://learn.microsoft.com/en-us/exchange/plan-and-deploy/post-installation-tasks/enable-modern-auth-in-exchange-server-on-premisesConsiderations
• HMA (Entra/Azure AD): requires Classic Full Hybrid configuration (Hybrid Configuration Wizard with Full option). Modern Hybrid (Hybrid Agent) does not support HMA. Minimum Exchange versions: 2013 CU19, 2016 CU8, 2019 RTM, SE RTM.
• AD FS Modern Authentication: does not require Exchange Hybrid or Entra ID. Supported only on Exchange 2019 CU13+ and Exchange SE. Exchange 2016 and 2013 are not supported for AD FS modern auth. Requires AD FS on Windows Server 2019 or later. AD FS cannot be installed on the Exchange server.
• The AuthMetadataUrl of the default auth server identifies the method: URLs containing login.windows.net or login.microsoftonline.com indicate HMA; on-premises FQDN URLs indicate AD FS.
• SSL Offloading is incompatible with Modern Authentication: disabling SSL Offloading changes how Outlook Anywhere authenticates and may require reconfiguring load balancer TLS termination to SSL Bridging.
• Disabling SSL Offloading and enabling Extended Protection should be coordinated - see EDCA-SEC-014.
• IISReset briefly interrupts OWA, ECP, EWS, and Autodiscover. Schedule during a maintenance window.
• For AD FS, Outlook for Windows requires build 16327.20200 or later (Outlook 365 Current Channel 2304+). Outlook 2021 Volume License and Outlook 2016/2019 (any version) do not support AD FS modern auth.
• Pilot with a subset of users before enabling Modern Authentication broadly. Use authentication policies (New-AuthenticationPolicy) to selectively enable or block Modern Auth per user.
• Rolling back Modern Auth requires setting OAuth2ClientProfileEnabled back to $false, resetting the auth server IsDefaultAuthorizationEndpoint, then restarting IIS.
References
EDCA-IAC-005: RDP requires Network Level Authentication
Each Exchange server MUST require Network Level Authentication (NLA) for all Remote Desktop connections. NLA authenticates users before establishing a full desktop session, reducing the RDP attack surface. The CIS benchmark requires 'Require user authentication for remote connections by using Network Level Authentication' to be set to 'Enabled'.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | RDP NLA is required; OS version: 10.0.26100; build: 26100 | |
| ex2 | RDP NLA is required; OS version: 10.0.26100; build: 26100 | |
| ex3 | RDP NLA is required; OS version: 10.0.26100; build: 26100 |
Remediation
Require NLA for RDP-Tcp endpoint.
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name UserAuthentication -Type DWord -Value 1Considerations
Enabling Network Level Authentication (NLA) for RDP requires that connecting clients support CredSSP authentication. Very old RDP clients (pre-Vista) may not connect. Some RDP proxy solutions may require configuration updates. Test admin connectivity after enabling NLA before applying broadly.
References
- CIS Microsoft Windows Server 2019/2022/2025 Benchmarks
- NLA for Remote Desktop
- CIS 18.10.28.3.8 (L1): Ensure 'Require user authentication for remote connections by using Network Level Authentication' is set to 'Enabled'
- ANSSI - Mise en œuvre sécurisée d'un serveur Windows membre AD DS (2025)
- BSI SYS.1.2.3.A6 — Sicherheit beim Fernzugriff über RDP
EDCA-IAC-006: WDigest UseLogonCredential disabled
Each Exchange server MUST have WDigest credential caching disabled (UseLogonCredential set to 0). WDigest authentication stores clear-text credentials in LSASS memory, enabling credential theft via memory dump. The CIS benchmark requires 'MSS: (UseLogonCredential) WDigest Authentication' to be set to 'Disabled'.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Compliant — WDigest UseLogonCredential not present (secure default). | |
| ex2 | Compliant — WDigest UseLogonCredential not present (secure default). | |
| ex3 | Compliant — WDigest UseLogonCredential not present (secure default). |
Remediation
Disable WDigest credential caching by setting UseLogonCredential to 0.
New-Item -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' -Force | Out-Null
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' -Name UseLogonCredential -Type DWord -Value 0Considerations
Disabling WDigest UseLogonCredential prevents cleartext password caching in LSASS memory, which is a common credential harvesting technique. There is no operational impact on Exchange functionality from disabling this setting. A reboot may be required for the change to take full effect.
References
- CIS Microsoft Windows Server 2019/2022/2025 Benchmarks
- UseLogonCredential security guidance
- CIS 18.3.7 (L1): Ensure 'MSS: (UseLogonCredential) WDigest Authentication' (UseLogonCredential registry value) is set to 'Disabled'
- ANSSI - Mise en œuvre sécurisée d'un serveur Windows membre AD DS (2025)
- BSI APP.2.2.A9 — Schutz der Authentisierung beim Einsatz von AD DS
- BSI SYS.1.2.3.A5 — Sichere Authentisierung und Autorisierung in Windows Server
EDCA-IAC-007: Alternate Service Account (ASA) usage follows Kerberos best practice
Detect whether an Alternate Service Account credential is configured for Client Access Kerberos and validate baseline hygiene for credential rollover and server consistency. CISA recommends using Kerberos (Alternate Service Account) rather than NTLM for load-balanced Client Access authentication.
Evidence
| Server | Status | Evidence |
|---|
Remediation
If ASA is required, use a dedicated account, keep credentials synchronized across Client Access servers, and rotate with RollAlternateServiceAccountPassword.ps1; otherwise remove ASA credentials.
# Diagnose: Check Alternate Service Account credential status on Client Access servers
Get-ClientAccessServer -IncludeAlternateServiceAccountCredentialStatus | Select-Object Name, AlternateServiceAccountConfiguration | Format-List
# Review for stale or multiple credential entries. Only the current ASA password should be active.
# To initially assign an ASA credential to Client Access services (run once per server):
# Set-ClientAccessService -Identity $env:COMPUTERNAME -AlternateServiceAccountCredential (Get-Credential)
# To rotate the ASA password across all Client Access servers using the built-in Exchange rollover script:
$rollScript = Join-Path $exinstall 'Scripts' | Join-Path -ChildPath 'RollAlternateServiceAccountPassword.ps1'
# & $rollScript -ToEntireForest -GenerateNewPasswordFor 'DOMAIN\ASAAccountName' -VerboseConsiderations
The Kerberos Alternate Service Account (ASA) must be configured identically on all load-balanced Exchange Client Access servers. The ASA password must be periodically rotated and kept consistent across all servers. Misconfiguration will break Kerberos authentication and fall back to NTLM, which may be blocked by other security policies.
References
- Configure Kerberos authentication for load-balanced Client Access services
- Get-ClientAccessService cmdlet
- ASA rollout and verification guidance
- CISA AA21-062A: Mitigate Microsoft Exchange Server Vulnerabilities - use Kerberos (Alternate Service Account) rather than NTLM for load-balanced Client Access authentication
EDCA-IAC-008: Exchange split permissions are enabled
Exchange split permissions SHOULD be enabled to separate Active Directory and Exchange administration duties and reduce over-privileged access. CISA recommends enabling Exchange split permissions to limit Exchange Server's Active Directory write access.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | Split permission organization setting unavailable. |
Remediation
Enable Exchange AD Split Permissions by re-running Exchange Setup with /PrepareAD /ActiveDirectorySplitPermissions:true. This cannot be applied via a PowerShell cmdlet post-installation.
# Diagnose: Check if Exchange role groups currently hold mail recipient and security group creation rights
Get-ManagementRoleAssignment | Where-Object { $_.Role -match 'Mail Recipient Creation|Security Group Creation' } | Select-Object Role, RoleAssignee, RoleAssigneeType | Format-Table -AutoSize
# If Exchange role groups appear above, AD split permissions are NOT currently enabled.
# To enable (IRREVERSIBLE without re-running /PrepareAD - plan carefully):
# .\Setup.exe /PrepareAD /ActiveDirectorySplitPermissions:true /IAcceptExchangeServerLicenseTermsConsiderations
Enabling Exchange split permissions removes Exchange administrators ability to directly modify Active Directory user and group objects. This is an organizational change requiring coordination with the Active Directory team. After enabling, Exchange provisioning workflows must be updated to use AD admin procedures for security group management.
References
EDCA-IAC-009: Basic Authentication is disabled after Modern Authentication rollout
The Exchange organization MUST have Basic Authentication disabled across all tracked protocols after Modern Authentication is confirmed as operational. This control evaluates the AllowBasicAuth* properties of the authentication policy referenced by Get-OrganizationConfig DefaultAuthenticationPolicy. All 13 tracked protocol properties must be set to $false (blocking enabled) for the control to pass. CISA recommends disabling Basic Authentication after Modern Authentication is fully deployed.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | Default authentication policy data unavailable. Either no authentication policy is configured, collection ran against an Edge Transport server only, or data collection failed. |
Remediation
Create or update the organization's default authentication policy to block Basic Authentication for all tracked protocols (ActiveSync, Autodiscover, IMAP, MAPI, OfflineAddressBook, OutlookService, POP, ReportingWebServices, REST, RPC, SMTP, WebServices, WindowsLiveId). Validate that Modern Authentication (EX-BP-049) is fully functional for all clients before blocking Basic Authentication to prevent access outages.
# Check the current default authentication policy
$orgConfig = Get-OrganizationConfig
$policyName = [string]$orgConfig.DefaultAuthenticationPolicy
$params = @{
AllowBasicAuthActiveSync = $false
AllowBasicAuthAutodiscover = $false
AllowBasicAuthImap = $false
AllowBasicAuthMapi = $false
AllowBasicAuthOfflineAddressBook = $false
AllowBasicAuthOutlookService = $false
AllowBasicAuthPop = $false
AllowBasicAuthReportingWebServices = $false
AllowBasicAuthRest = $false
AllowBasicAuthRpc = $false
AllowBasicAuthSmtp = $false
AllowBasicAuthWebServices = $false
AllowBasicAuthWindowsLiveId = $false
}
if (-not [string]::IsNullOrWhiteSpace($policyName)) {
# Update the existing default policy to block Basic Auth for all tracked protocols
Set-AuthenticationPolicy -Identity $policyName @params
} else {
# No default policy exists: create one that blocks all Basic Auth and assign it as the org default
New-AuthenticationPolicy -Name 'Block Basic Auth' @params
Set-OrganizationConfig -DefaultAuthenticationPolicy 'Block Basic Auth'
}Considerations
Disabling Basic Authentication will immediately break any client or application still using Basic Auth for SMTP, EWS, WebDAV, or remote PowerShell connections. Perform a comprehensive audit of all application authentication methods before disabling. Applications that cannot be migrated to Modern Authentication require alternative integration approaches.
References
- Enable Modern Authentication in Exchange on-premises
- Disabling Legacy Authentication in Exchange Server 2019
- CISA AA21-062A: Mitigate Microsoft Exchange Server Vulnerabilities - disable Basic Authentication after Modern Authentication is fully deployed
- BSI APP.5.2.A3 — Berechtigungsmanagement und Zugriffsrechte
EDCA-IAC-010: Administrative access to EAC and remote PowerShell is restricted
Administrative access to the Exchange Admin Center (EAC) and remote PowerShell MUST be restricted to authorized management workstations and paths. This control evaluates two automated checks: (1) whether Client Access Rules are configured that explicitly restrict access to the RemotePowerShell or ExchangeAdminCenter protocol, and (2) whether any non-Exchange-administrative users (users without Exchange RBAC role group membership) have RemotePowerShellEnabled set to $true on their Exchange user object. (DISA STIG V-259698; CISA AA21-062A)
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | Client Access Rules: No Client Access Rules are configured. Access to the Exchange Admin Center and remote PowerShell is unrestricted by rule. Remote PowerShell access: Non-Exchange-admin remote PowerShell user data unavailable. |
Remediation
Create Client Access Rules to restrict EAC and remote PowerShell access to authorized source IP ranges, and disable RemotePowerShellEnabled for all users who are not Exchange administrators.
# --- Check 1: Client Access Rules ---
# Review existing rules; look for rules covering RemotePowerShell and ExchangeAdminCenter protocols.
Get-ClientAccessRule | Select-Object Name, Action, AnyOfProtocols, AnyOfClientIPAddressesOrRanges, Priority, Enabled | Sort-Object Priority | Format-Table -AutoSize
# Create a rule to allow only trusted management IP ranges for remote PowerShell and EAC
# (replace 10.0.0.0/8 with your actual management IP range)
New-ClientAccessRule -Name 'Allow PS and EAC from management range' -Action AllowAccess -AnyOfProtocols RemotePowerShell, ExchangeAdminCenter -AnyOfClientIPAddressesOrRanges 10.0.0.0/8 -Priority 1
New-ClientAccessRule -Name 'Block PS and EAC from all other sources' -Action DenyAccess -AnyOfProtocols RemotePowerShell, ExchangeAdminCenter -AnyOfClientIPAddressesOrRanges 0.0.0.0-255.255.255.255 -Priority 2
# --- Check 2: Non-Exchange-admin users with RemotePowerShellEnabled ---
# Find Exchange RBAC role group members (Exchange admins):
$adminSams = [System.Collections.Generic.HashSet[string]]::new([System.StringComparer]::OrdinalIgnoreCase)
Get-RoleGroup | ForEach-Object {
Get-RoleGroupMember -Identity $_.Name -ErrorAction SilentlyContinue |
ForEach-Object { $null = $adminSams.Add($_.SamAccountName) }
}
# Find non-admin users with RemotePowerShellEnabled = $true and disable it:
Get-User -Filter {RemotePowerShellEnabled -eq $true} -ResultSize Unlimited |
Where-Object { -not $adminSams.Contains($_.SamAccountName) } |
ForEach-Object {
Write-Host "Disabling RemotePowerShellEnabled for $($_.Name) ($($_.SamAccountName))"
Set-User -Identity $_.Identity -RemotePowerShellEnabled $false
}Considerations
Restricting EAC and remote PowerShell access to specific client access rules may lock out administrators working from unregistered IP addresses. Ensure VPN or jump server access is available for administrative operations. Changes to Client Access Rules take effect immediately and can lock out the current session.
References
- Client Access Rules in Exchange
- Network ports for clients and mail flow in Exchange
- CISA AA21-062A: Mitigate Microsoft Exchange Server Vulnerabilities - restrict administrative access to Exchange Admin Center and remote PowerShell
- V-259698 Role-Based Access Control must be defined for privileged and nonprivileged users (EX19-MB-000173)
- V-259655 The RBAC role for audit log management must be defined and restricted (EX19-MB-000034)
- BSI APP.5.2.A3 — Berechtigungsmanagement und Zugriffsrechte
- BSI APP.2.2.A17 — Anmelderestriktionen für hochprivilegierte Konten der Gesamtstruktur auf Clients und Servern
EDCA-IAC-011: Dedicated hybrid app is used by EvoSTS AuthServer
When hybrid OAuth configuration is detected, the EvoSTS AuthServer MUST use the dedicated Exchange hybrid application app ID and MUST NOT use the shared Exchange Online first-party app ID 00000002-0000-0ff1-ce00-000000000000. CISA recommends using a dedicated hybrid application identity to avoid over-privileged EvoSTS AuthServer configurations.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | Dedicated hybrid app configured: True; override count: 3; dedicated-app auth server count: 1; shared-app auth server count: 0. - OAuth hybrid detected: True; EvoSTS auth servers: 1; ACS auth servers: 1; Exchange Online partner app enabled: True; dedicated-hybrid-app override count: 3; dedicated-app auth server count: 1; shared-app auth server count: 0; EvoSTS IsDefaultAuthorizationEndpoint: True; modern auth type: HMA; default auth server URL: https://login.windows.net/fabrikam.onmicrosoft.com/federationmetadata/2007-06/federationmetadata.xml |
Remediation
Deploy a dedicated Exchange Hybrid Application using the ConfigureExchangeHybridApplication tool to support the transition from EWS to Microsoft Graph API for hybrid functionality.
# Diagnose: Check EvoSTS AuthServer ApplicationIdentifier for dedicated hybrid app configuration
Get-AuthServer | Where-Object { $_.Type -eq 'AzureAD' } | Select-Object Name, Enabled, ApplicationIdentifier, DomainName | Format-List
# Default (non-dedicated) app ApplicationIdentifier: 48af08dc-f6d2-435f-b2a7-069abd99c086
# A dedicated hybrid app will show a different GUID provisioned via the Hybrid Configuration Wizard.Considerations
Transitioning from a shared to a dedicated hybrid application requires creating a new dedicated application in Azure AD and re-registering the EvoSTS AuthServer in Exchange. During the transition period, hybrid connectivity (free/busy, mail routing, mailbox moves) may be briefly interrupted. Test hybrid features after completing the migration.
References
EDCA-IAC-012: Windows Integrated Authentication (NTLM/Negotiate) is present on Exchange virtual directories
NTLM and Negotiate (Windows Integrated Authentication) MUST remain present in the authentication methods of Exchange virtual directories (MAPI, OWA, ECP, EWS, Autodiscover). Removing these is an unsupported configuration that breaks internal client connectivity for Outlook, Autodiscover, and web services clients.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | Evaluated 5 virtual directories; missing Windows Integrated Authentication (NTLM/Negotiate): 2. - Get-OwaVirtualDirectory | EX2\owa (Default Web Site) | InternalAuthenticationMethods=Basic Fba - Get-EcpVirtualDirectory | EX2\ecp (Default Web Site) | InternalAuthenticationMethods=Basic Fba | |
| ex3 | Evaluated 5 virtual directories; missing Windows Integrated Authentication (NTLM/Negotiate): 2. - Get-OwaVirtualDirectory | EX3\owa (Default Web Site) | InternalAuthenticationMethods=Basic Fba - Get-EcpVirtualDirectory | EX3\ecp (Default Web Site) | InternalAuthenticationMethods=Basic Fba |
Remediation
Restore NTLM and WindowsIntegrated (Negotiate) to the authentication methods of the affected virtual directories. For MAPI, restore Ntlm and Negotiate in IISAuthenticationMethods. For all other virtual directories, restore Ntlm and WindowsIntegrated in InternalAuthenticationMethods.
# Restore Windows Integrated Authentication on affected virtual directories.
# Replace <Server> with the actual server name and adjust the site name if needed.
# Run only the line(s) that correspond to the affected virtual directory.
# MAPI virtual directory
Set-MapiVirtualDirectory -Identity '<Server>\mapi (Default Web Site)' -IISAuthenticationMethods Ntlm,Negotiate,OAuth
# OWA virtual directory
Set-OwaVirtualDirectory -Identity '<Server>\owa (Default Web Site)' -InternalAuthenticationMethods WindowsIntegrated,Basic,Fba
# ECP virtual directory
Set-EcpVirtualDirectory -Identity '<Server>\ecp (Default Web Site)' -InternalAuthenticationMethods WindowsIntegrated,Basic,Fba
# EWS virtual directory
Set-WebServicesVirtualDirectory -Identity '<Server>\EWS (Default Web Site)' -InternalAuthenticationMethods Ntlm,WindowsIntegrated,WSSecurity,OAuth
# Autodiscover virtual directory
Set-AutodiscoverVirtualDirectory -Identity '<Server>\Autodiscover (Default Web Site)' -InternalAuthenticationMethods Ntlm,WindowsIntegrated
# After restoring, run iisreset /noforce on the Exchange server to apply the changes.Considerations
Windows Integrated Authentication (NTLM/Negotiate) is required for internal Outlook clients using MAPI over HTTPS on some configurations. Removing it without enabling Modern Authentication as a replacement will break internal Outlook connectivity. This control verifies presence, not absence - the authentication method should be preserved alongside other authentication methods.
References
- Default authentication settings for Exchange virtual directories
- Set-OwaVirtualDirectory
- Set-WebServicesVirtualDirectory
- V-259650 Exchange must have authenticated access set to integrated Windows authentication only (EX19-MB-000020)
- V-259703 Exchange Outlook Anywhere clients must use NTLM authentication to access email (EX19-MB-000203)
EDCA-IAC-013: OWA forms-based authentication is configured per version requirements
Exchange MUST have forms-based authentication (FBA) configured as defined for the installed Exchange version on OWA virtual directories. For Exchange 2019 and Exchange SE, FBA must be ENABLED so that users authenticate through a secure logon form rather than relying on browser-level Basic or Integrated Windows Authentication. Exception: Exchange 2016 requires FBA to be DISABLED; Integrated Windows Authentication or another approved method must be used instead.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | Compliant — all 1 OWA virtual director(ies) have forms-based authentication enabled (Exchange 2019/SE). | |
| ex3 | Compliant — all 1 OWA virtual director(ies) have forms-based authentication enabled (Exchange 2019/SE). |
Remediation
Enable forms-based authentication on Exchange 2019 and Exchange SE OWA virtual directories. On Exchange 2016, disable forms-based authentication.
# Exchange 2019 and Exchange SE: enable forms-based authentication
Get-OwaVirtualDirectory -Server $env:COMPUTERNAME | Set-OwaVirtualDirectory -FormsAuthentication $true -LogonFormat UserName -DefaultDomain $env:USERDNSDOMAIN
# Exchange 2016 exception: disable forms-based authentication
# Get-OwaVirtualDirectory -Server $env:COMPUTERNAME | Set-OwaVirtualDirectory -FormsAuthentication $falseConsiderations
Exchange 2019 and Exchange SE require forms-based authentication enabled (DISA STIG ). Exchange 2016 is the exception: the DISA STIG requires FBA disabled. These requirements are directly opposed between versions -- verify the installed Exchange version before applying.
References
EDCA-IAC-014: Mobile device mailbox policy does not allow simple passwords
The AllowSimplePassword property on the default mobile device mailbox policy MUST be False. Allowing simple passwords (such as sequential or repeated digits) reduces the security of mobile device PIN codes, making them easier to guess. The CIS benchmark requires simple passwords to be disallowed.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | Compliant — AllowSimplePassword is False on the default mobile device mailbox policy. |
Remediation
Disable simple passwords in the default mobile device mailbox policy.
# Disallow simple passwords in the default mobile device mailbox policy.
Set-MobileDeviceMailboxPolicy -Identity Default -AllowSimplePassword $falseConsiderations
Disabling simple passwords requires users to set a more complex PIN or password on their devices. End-user communication may be required before enforcing this change.
References
EDCA-IAC-015: Mobile device mailbox policy does not allow unmanaged devices
The AllowNonProvisionableDevices property on the default mobile device mailbox policy MUST be False. Allowing unmanaged devices permits devices that cannot enforce the policy to connect, undermining mobile security controls. The CIS benchmark requires unmanaged devices to be blocked.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | Compliant — AllowNonProvisionableDevices is False on the default mobile device mailbox policy. |
Remediation
Block unmanaged devices in the default mobile device mailbox policy.
# Block unmanaged (non-provisionable) devices in the default mobile device mailbox policy.
Set-MobileDeviceMailboxPolicy -Identity Default -AllowNonProvisionableDevices $falseConsiderations
Blocking non-provisionable devices will prevent some older devices from synchronising. Evaluate the device inventory before enforcing this setting.
References
EDCA-IAC-016: Mobile device mailbox policy enforces password history of 4 or more
The PasswordHistory property on the default mobile device mailbox policy MUST be 4 or greater. Enforcing a password history prevents users from reusing recent PINs or passwords, increasing resistance to credential reuse attacks. The CIS benchmark requires a password history of at least 4.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | PasswordHistory is 4 on the default mobile device mailbox policy. |
Remediation
Set password history to 4 or more in the default mobile device mailbox policy.
# Enforce a password history of 4 in the default mobile device mailbox policy.
Set-MobileDeviceMailboxPolicy -Identity Default -PasswordHistory 4Considerations
Password history enforcement requires devices to track previous passwords. Most modern smartphones support this feature.
References
EDCA-IAC-017: Mobile device mailbox policy requires a minimum password length of 4 or more
The MinPasswordLength property on the default mobile device mailbox policy MUST be 4 or greater. Setting a minimum password length reduces the likelihood of brute-force attacks against device PINs or passwords. The CIS benchmark requires a minimum password length of at least 4.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | MinPasswordLength is 4 on the default mobile device mailbox policy. |
Remediation
Set minimum password length to 4 or more in the default mobile device mailbox policy.
# Require a minimum password length of 4 in the default mobile device mailbox policy.
Set-MobileDeviceMailboxPolicy -Identity Default -MinPasswordLength 4Considerations
Setting a minimum password length together with alphanumeric password requirements provides stronger protection than PIN-only policies.
References
EDCA-IAC-018: Mobile device mailbox policy limits maximum failed password attempts to 10 or fewer
The MaxPasswordFailedAttempts property on the default mobile device mailbox policy MUST be 10 or less. Limiting the number of failed attempts before device wipe or lockout reduces the risk of brute-force attacks against mobile device credentials. The CIS benchmark requires a maximum of 10 failed attempts.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | MaxPasswordFailedAttempts is 10 on the default mobile device mailbox policy. |
Remediation
Set maximum failed password attempts to 10 in the default mobile device mailbox policy.
# Limit failed password attempts to 10 in the default mobile device mailbox policy.
Set-MobileDeviceMailboxPolicy -Identity Default -MaxPasswordFailedAttempts 10Considerations
Setting a low value (e.g., 4-5) may result in accidental device wipes. A value of 10 balances security and usability. Ensure users are aware of the wipe policy.
References
EDCA-IAC-019: Mobile device mailbox policy requires password expiration of 365 days or less
The PasswordExpiration property on the default mobile device mailbox policy MUST be 365 days or less. Periodic password expiration limits the window of opportunity for an attacker using a compromised credential. The CIS benchmark requires password expiration to be set to 365 days or fewer.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | PasswordExpiration is 365 days on the default mobile device mailbox policy. |
Remediation
Set password expiration to 365 days or fewer in the default mobile device mailbox policy.
# Set password expiration to 365 days in the default mobile device mailbox policy.
Set-MobileDeviceMailboxPolicy -Identity Default -PasswordExpiration 365Considerations
Frequent password expiration can cause user friction and may lead to weaker passwords being chosen. Consider balancing expiration frequency with other compensating controls.
References
EDCA-IAC-020: Mobile device mailbox policy refresh interval is 1 day or less
The DevicePolicyRefreshInterval property on the default mobile device mailbox policy MUST be 1 day or less. A short refresh interval ensures devices re-apply the latest security policy promptly, reducing the risk of policy drift. The CIS benchmark requires the refresh interval to be 1 day or fewer.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | DevicePolicyRefreshInterval is 24 hours on the default mobile device mailbox policy. |
Remediation
Set the device policy refresh interval to 1 day in the default mobile device mailbox policy.
# Set the policy refresh interval to 1 day in the default mobile device mailbox policy.
Set-MobileDeviceMailboxPolicy -Identity Default -DevicePolicyRefreshInterval 1.00:00:00Considerations
A refresh interval of 1 day is a reasonable baseline. More frequent intervals increase server-side load. The value is expressed as a TimeSpan.
References
EDCA-IAC-021: Mobile device mailbox policy requires an alphanumeric password
The AlphanumericPasswordRequired property on the default mobile device mailbox policy MUST be True. Requiring alphanumeric (mixed letters and digits) passwords is more secure than numeric-only PINs and reduces brute-force risk. The CIS benchmark requires alphanumeric passwords.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | Compliant — AlphanumericPasswordRequired is True on the default mobile device mailbox policy. |
Remediation
Require alphanumeric passwords in the default mobile device mailbox policy.
# Require alphanumeric passwords in the default mobile device mailbox policy.
Set-MobileDeviceMailboxPolicy -Identity Default -AlphanumericPasswordRequired $trueConsiderations
Alphanumeric passwords must be combined with a minimum password length requirement to be effective. Note that some devices may display a full keyboard rather than a numeric PIN pad when this is enabled.
References
EDCA-IAC-022: Mobile device mailbox policy requires device encryption
The RequireDeviceEncryption property on the default mobile device mailbox policy MUST be True. Requiring device-level encryption ensures that data stored on the device is protected if the device is lost or stolen. The CIS benchmark requires device encryption to be enforced.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | Compliant — RequireDeviceEncryption is True on the default mobile device mailbox policy. |
Remediation
Require device encryption in the default mobile device mailbox policy.
# Require device encryption in the default mobile device mailbox policy.
Set-MobileDeviceMailboxPolicy -Identity Default -RequireDeviceEncryption $trueConsiderations
Some older devices do not support device encryption and will be blocked if this setting is enabled together with AllowNonProvisionableDevices $false. Review the device inventory before enforcing.
References
EDCA-IAC-023: Mobile device mailbox policy requires a device password
The PasswordEnabled property on the default mobile device mailbox policy MUST be True. Requiring a password prevents unauthorised access to the device and the Exchange mailbox data on it. The CIS benchmark requires device passwords to be mandatory.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | Compliant — PasswordEnabled is True on the default mobile device mailbox policy. |
Remediation
Require a device password in the default mobile device mailbox policy.
# Require a device password in the default mobile device mailbox policy.
Set-MobileDeviceMailboxPolicy -Identity Default -PasswordEnabled $trueConsiderations
Requiring a password on mobile devices may cause friction for users who previously had no PIN. Communicate this change in advance and provide instructions for setting a compliant password.
References
EDCA-IAC-024: Mobile device mailbox policy locks after 15 minutes of inactivity
The MaxInactivityTimeLock property on the default mobile device mailbox policy MUST be 15 minutes or less. Locking the device after a period of inactivity reduces the risk of unauthorised access if a device is left unattended. The CIS benchmark requires a maximum inactivity lock time of 15 minutes.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | MaxInactivityTimeLock is 15 minutes on the default mobile device mailbox policy. |
Remediation
Set the inactivity lock timeout to 15 minutes or less in the default mobile device mailbox policy.
# Set the inactivity lock to 15 minutes in the default mobile device mailbox policy.
Set-MobileDeviceMailboxPolicy -Identity Default -MaxInactivityTimeLock 00:15:00Considerations
A shorter inactivity timeout provides more security but may be inconvenient for users. A 15-minute limit is broadly accepted as a good balance. Consider shorter timeouts for high-security environments.
References
EDCA-IAC-026: Kerberos AES encryption is enforced; RC4 and DES are disabled
The Exchange server's Kerberos supported encryption types MUST be restricted to AES128-CTS-HMAC-SHA1-96 and AES256-CTS-HMAC-SHA1-96 (SupportedEncryptionTypes=24). RC4-HMAC and DES encryption types must be disabled. RC4-based Kerberos tickets are vulnerable to offline brute-force and Kerberoasting attacks because RC4 session keys are derived from NT password hashes, enabling hash-equivalent attacks against service accounts. ANSSI prohibits RC4 and DES Kerberos encryption on all member servers. The registry value 24 (binary 11000) enables AES128 (bit 3, value 8) and AES256 (bit 4, value 16) only.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | SupportedEncryptionTypes=24: AES128 and AES256 are enabled; DES and RC4 are not set. | |
| ex2 | SupportedEncryptionTypes=24: AES128 and AES256 are enabled; DES and RC4 are not set. | |
| ex3 | SupportedEncryptionTypes=24: AES128 and AES256 are enabled; DES and RC4 are not set. |
Remediation
Set SupportedEncryptionTypes to 24 (AES128 + AES256 only) under HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Kerberos\Parameters via Group Policy (Computer Configuration > Windows Settings > Security Settings > Local Policies > Security Options: 'Network security: Configure encryption types allowed for Kerberos'). A reboot is required for the change to take full effect.
# Check current Kerberos supported encryption types
$kerbPath = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Kerberos\Parameters'
$val = (Get-ItemProperty $kerbPath -Name SupportedEncryptionTypes -ErrorAction SilentlyContinue).SupportedEncryptionTypes
if ($null -eq $val) {
"SupportedEncryptionTypes: not set (system default - RC4 is included)"
} else {
$types = @()
if ($val -band 1) { $types += 'DES-CBC-CRC' }
if ($val -band 2) { $types += 'DES-CBC-MD5' }
if ($val -band 4) { $types += 'RC4-HMAC' }
if ($val -band 8) { $types += 'AES128-CTS-HMAC-SHA1' }
if ($val -band 16) { $types += 'AES256-CTS-HMAC-SHA1' }
"SupportedEncryptionTypes: $val - Enabled: $($types -join ', ')"
}
# Set AES128 + AES256 only (24 = 8 + 16)
New-Item -Path $kerbPath -Force | Out-Null
Set-ItemProperty -Path $kerbPath -Name SupportedEncryptionTypes -Type DWord -Value 24
Write-Host 'Kerberos SupportedEncryptionTypes set to 24 (AES128 + AES256 only). A reboot is required.'Considerations
Disabling RC4 Kerberos requires that all Kerberos service principals the Exchange server authenticates against also have AES keys. Domain controllers on Windows Server 2008 R2 and later support AES Kerberos by default. Service accounts that have never had their password changed since AES support was introduced in the domain may only have RC4 keys in their msDS-SupportedEncryptionTypes attribute; those accounts must have their passwords reset before AES-only is enforced. Before setting SupportedEncryptionTypes=24 on Exchange servers, verify that all domain controllers in the AD site list AES in their computer account msDS-SupportedEncryptionTypes. After the change, reboot the Exchange server and monitor for Kerberos failures (Event ID 4769 failure code 0x17 = KDC_ERR_ETYPE_NOSUPP) in the Security event log.
References
EDCA-IAC-027: Exchange computer accounts do not have unconstrained Kerberos delegation
Exchange server computer accounts in Active Directory SHOULD NOT have the TRUSTED_FOR_DELEGATION flag set in userAccountControl (bit 19, value 0x80000). Unconstrained Kerberos delegation permits the Exchange server to impersonate any authenticated user against any Kerberos service in the domain. If an Exchange server with unconstrained delegation is compromised, all Kerberos TGTs presented to it can be captured and replayed, enabling full domain compromise via Pass-the-Ticket attacks. ANSSI prohibits unconstrained delegation on member servers. Exchange 2016, 2019, and Exchange SE do not require unconstrained delegation for any current functionality.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | Unconstrained Kerberos delegation is not enabled (TRUSTED_FOR_DELEGATION flag not set). | |
| ex3 | Unconstrained Kerberos delegation is not enabled (TRUSTED_FOR_DELEGATION flag not set). |
Remediation
Remove the TRUSTED_FOR_DELEGATION flag from Exchange computer accounts in Active Directory using Set-ADComputer or the Active Directory Users and Computers console (Account tab: clear 'Trust this computer for delegation to any service (Kerberos only)'). If delegation is required for a specific integration, configure constrained delegation targeting only the required SPNs.
# Check if this Exchange server's computer account has unconstrained Kerberos delegation
try {
$computer = Get-ADComputer -Identity $env:COMPUTERNAME -Properties userAccountControl, TrustedForDelegation -ErrorAction Stop
$unconstrained = $computer.TrustedForDelegation
"Computer: $($computer.Name)"
"TrustedForDelegation (unconstrained): $unconstrained"
if ($unconstrained) {
Write-Warning 'UNCONSTRAINED delegation is ENABLED - this is a HIGH severity finding.'
} else {
Write-Host 'TrustedForDelegation is not set - compliant.'
}
} catch {
"Unable to query Active Directory: $($_.Exception.Message)"
"Ensure the ActiveDirectory PowerShell module is available (RSAT or AD DS role)."
}
# To remediate (requires Domain Admin or delegated rights on the computer object):
# Set-ADComputer -Identity $env:COMPUTERNAME -TrustedForDelegation $falseConsiderations
Exchange Server does not require unconstrained delegation for Exchange 2016, 2019, or Exchange SE mail flow, client connectivity, or DAG operations. If unconstrained delegation is found enabled, it is likely a historical misconfiguration or was set during an older Exchange setup process. Remediation (removing TrustedForDelegation) does not affect Exchange functionality. If a specific third-party integration requires Kerberos delegation, configure resource-based constrained delegation (RBCD) or S4U2Proxy constrained delegation scoped to the specific service SPNs instead.
References
EDCA-IAC-028: Domain object DACL WriteDACL ACEs carry the Inherit-Only flag
The two Access Control Entries (ACEs) granted to the Exchange Windows Permissions (EWP) group on the Active Directory domain root object MUST either carry the Inherit-Only (IO) propagation flag or be absent from the DACL entirely. When an ACE is present without the Inherit-Only flag, the WriteDACL right applies to the domain object itself rather than only to descendant user and inetOrgPerson objects. Any principal in the EWP group can exploit this to write Ds-Replication-Get-Changes-All extended rights onto the domain object and perform a DCSync attack, yielding all domain password hashes and Kerberos keys. On Exchange 2016 and later, the corresponding Allow ACE that grants EWP WriteDACL on the AdminSDHolder object for the Group inherited object type MUST also be removed. The fix requires running Setup /PrepareAD followed by Setup /PrepareDomain in every domain of the forest after installing the qualifying cumulative update. Note: the Exchange WriteDACL ACEs carry ObjectType = all-zeros and the target class GUID (User or inetOrgPerson) in the InheritedObjectType field.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | EWP WriteDACL User ACE: present, Inherit-Only flag set; EWP WriteDACL inetOrgPerson ACE: present, Inherit-Only flag set, ETS WriteDACL Group ACE on AdminSDHolder: absent. |
Remediation
Install the minimum qualifying cumulative update for your Exchange version (Exchange 2016 CU12 / Exchange 2019 CU1 or later, or any Exchange SE build), then run Setup /PrepareAD as a member of Enterprise Admins. Run Setup /PrepareDomain in every domain of the forest as a member of Domain Admins for each domain. The /PrepareAD operation automatically runs /PrepareDomain for the domain in which it is executed, but not for other domains in the forest.
# Diagnose domain object DACL WriteDACL ACE state
# Run from any domain-joined machine; requires read access to AD (no elevated rights needed for diagnosis)
param(
[string]$Domain = ([System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().Name)
)
# The Exchange WriteDACL ACEs use ObjectType = all-zeros (applies to all object types)
# and carry the target class GUID in InheritedObjectType.
$userClassGuid = [Guid]'bf967aba-0de6-11d0-a285-00aa003049e2' # User
$inetOrgPersonClassGuid = [Guid]'4828cc14-1437-45bc-9b07-ad6f015e5f28' # inetOrgPerson
$groupClassGuid = [Guid]'bf967a9c-0de6-11d0-a285-00aa003049e2' # Group (AdminSDHolder, Exchange 2016+)
$writeDaclRight = [System.DirectoryServices.ActiveDirectoryRights]::WriteDacl
try {
$domainDN = ('DC=' + ($Domain -replace '\.', ',DC='))
$domainEntry = [System.DirectoryServices.DirectoryEntry]"LDAP://$domainDN"
$domainAcl = $domainEntry.get_objectSecurity()
$ewpSid = (New-Object System.Security.Principal.NTAccount 'Exchange Windows Permissions').Translate([System.Security.Principal.SecurityIdentifier]).Value
$rules = @($domainAcl.GetAccessRules($true, $true, [System.Security.Principal.SecurityIdentifier]))
foreach ($guid in @($userClassGuid, $inetOrgPersonClassGuid)) {
$ace = $rules | Where-Object {
$_.IdentityReference.Value -eq $ewpSid -and
$_.ActiveDirectoryRights -band $writeDaclRight -and
$_.ObjectType -eq [Guid]::Empty -and
$_.InheritedObjectType -eq $guid
} | Select-Object -First 1
if ($null -eq $ace) {
Write-Host "COMPLIANT: InheritedObjectType $guid — ACE absent (Exchange Windows Permissions holds no WriteDACL on the domain object for this class)."
} elseif ($ace.PropagationFlags -band [System.Security.AccessControl.PropagationFlags]::InheritOnly) {
Write-Host "COMPLIANT: InheritedObjectType $guid — ACE present, Inherit-Only flag is SET."
} else {
Write-Warning "NON-COMPLIANT: InheritedObjectType $guid — ACE present, Inherit-Only flag is MISSING. WriteDACL applies to the domain object itself."
}
}
} catch {
Write-Error "Failed to read domain object DACL: $($_.Exception.Message)"
Write-Host "Ensure LDAP access to the domain and that the 'Exchange Windows Permissions' group exists."
}
# Remediation: install qualifying CU, then from the Exchange setup directory:
# .\Setup.exe /PrepareAD /IAcceptExchangeServerLicenseTerms_DiagnosticDataON
# In each additional domain in the forest:
# .\Setup.exe /PrepareDomain /IAcceptExchangeServerLicenseTerms_DiagnosticDataONConsiderations
This control applies only when Exchange runs in the Shared Permissions model (the default). When AD Split Permissions is enabled, Exchange does not hold WriteDACL rights on the domain object and the control is not applicable. The fix requires Setup /PrepareAD plus Setup /PrepareDomain in every domain of the forest; /PrepareDomain does not run automatically for domains other than the one in which /PrepareAD is executed. The control is satisfied when the ACEs are absent from the domain object DACL as well as when they carry the Inherit-Only flag; both states mean Exchange Windows Permissions holds no effective WriteDACL right on the domain object itself. ExchangeSE builds always meet the minimum build requirement; however, compliance still requires that Setup /PrepareAD has been run — which is done automatically during initial Exchange setup. The control reports Warning rather than Fail when no installed Exchange build meets the minimum required version (Exchange 2016 CU12 or Exchange 2019 CU1), indicating that the qualifying cumulative update must be installed before /PrepareAD can apply the fix.
References
Monitoring (14 controls)
EDCA-MON-001: Admin audit logging enabled and configured
Admin audit logging (AdminAuditLogEnabled) MUST be enabled for the Exchange organization and audit record parameters MUST be set. The audit log configuration must specify the minimum cmdlet parameters to be audited, minimum log age, and a defined log path to ensure a complete audit trail. Ensures all Exchange cmdlet executions are recorded, supporting accountability and incident response. The CIS benchmark requires 'AdminAuditLogEnabled' to be set to 'True'.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | AdminAuditLogEnabled is True. |
Remediation
Enable Exchange admin audit logging and configure audit record parameters including age limit.
Set-AdminAuditLogConfig -AdminAuditLogEnabled $true -AdminAuditLogAgeLimit 90.00:00:00Considerations
Admin audit logging generates storage overhead in the arbitration mailbox over time. The default 90-day retention period should be reviewed against organizational compliance requirements; it may be insufficient for regulatory requirements. Ensure the log mailbox (arbitration mailbox) has adequate space. Enabling verbose logging significantly increases log volume and should be used selectively.
References
- Admin audit logging in Exchange
- CIS Microsoft Exchange Server Benchmark
- CIS 1.1.1 (L1): Ensure 'AdminAuditLogEnabled' is set to 'True'
- V-259648 Exchange must have administrator audit logging enabled (EX19-MB-000016)
- V-259654 Exchange audit record parameters must be set (EX19-MB-000033)
- Set-AdminAuditLogConfig cmdlet
- ENISA / NIS2 Directive (EU) 2022/2555 - Article 21(2)(b): incident handling and audit logging - Section 3.2-3.6, 7, 2.2-2.3
- ANSSI - Sécuriser la journalisation dans un environnement Microsoft Active Directory (2022)
- BSI SYS.1.1.A10 — Protokollierung
- BSI APP.2.2.A7 — Umsetzung sicherer Verwaltungsmethoden für Active Directory
EDCA-MON-002: PowerShell Script Block Logging enabled
Each Exchange server MUST have PowerShell Script Block Logging enabled. Script Block Logging captures PowerShell commands and scripts for detection and audit purposes. The CIS benchmark requires 'Turn on PowerShell Script Block Logging' to be set to 'Enabled'.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | PowerShell Script Block Logging is enabled; OS version: 10.0.26100; build: 26100 | |
| ex2 | PowerShell Script Block Logging is enabled; OS version: 10.0.26100; build: 26100 | |
| ex3 | PowerShell Script Block Logging is enabled; OS version: 10.0.26100; build: 26100 |
Remediation
Enable Script Block Logging via PowerShell policy registry.
New-Item -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging' -Force | Out-Null
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging' -Name EnableScriptBlockLogging -Type DWord -Value 1Considerations
Enabling PowerShell Script Block Logging generates detailed logs of all executed script blocks in the Security and Windows PowerShell event logs. This can produce high log volume on active systems. Ensure log retention and collection capacity are adequate before enabling on production Exchange servers.
References
- CIS Microsoft Windows Server 2019 Benchmark v3.0.0
- PowerShell Group Policy settings
- CIS 18.9.104.1.2 (L1): Ensure 'Turn on PowerShell Script Block Logging' is set to 'Enabled'
- ANSSI - Sécuriser la journalisation dans un environnement Microsoft Active Directory (2022)
- BSI SYS.1.2.3.A7 — Verwendung der Windows PowerShell
EDCA-MON-003: Server pending reboot cleared
Each Exchange server MUST have no pending reboot indicators in the registry (pending file rename operations, Windows Update pending reboot, or Component-Based Servicing pending keys). Pending reboots block Exchange cumulative update installation.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | No pending reboot indicators detected. | |
| ex2 | No pending reboot indicators detected. | |
| ex3 | No pending reboot indicators detected. |
Remediation
Reboot the server to clear pending reboot flags. If registry keys persist after the reboot, manually delete them from the indicated registry locations. Always back up the registry before making manual edits.
# Diagnose: Check for pending reboot indicators in registry
@{ 'CBS RebootPending'='HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending'; 'WU RebootRequired'='HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired'; 'PFRO PendingRename'='HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager' }.GetEnumerator() | ForEach-Object { "$($_.Key): $(if (Test-Path $_.Value) { 'REBOOT PENDING' } else { 'clear' })" }
# Plan an approved maintenance window to reboot the server to clear all pending indicators.Considerations
Clearing a pending reboot clears only the state flag - the actual rebooted state is required for changes (such as software updates or service changes) to take effect. Schedule a maintenance window with DAG failover for the reboot. Verify all DAG members are in a healthy state before rebooting any member.
References
EDCA-MON-004: Transport connectivity logging is enabled
Each Exchange server MUST have transport connectivity logging enabled. Connectivity logs record SMTP connection details for both outbound send and inbound receive, supporting troubleshooting and audit trail requirements.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | ConnectivityLogEnabled is enabled. | |
| ex2 | ConnectivityLogEnabled is enabled. | |
| ex3 | ConnectivityLogEnabled is enabled. |
Remediation
Enable transport connectivity logging.
Set-TransportService -Identity $env:COMPUTERNAME -ConnectivityLogEnabled $trueConsiderations
Transport connectivity logging generates log files that can grow rapidly on high-traffic servers. Ensure the connectivity log volume has adequate capacity and that log cleanup is configured. Connectivity logs may be required for support investigations into mail flow issues.
References
EDCA-MON-005: Transport message tracking logging is enabled
Each Exchange server MUST have transport message tracking logging enabled. Message tracking logs record per-message routing events and support incident response, compliance, and delivery troubleshooting.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | MessageTrackingLogEnabled is enabled. | |
| ex2 | MessageTrackingLogEnabled is enabled. | |
| ex3 | MessageTrackingLogEnabled is enabled. |
Remediation
Enable message tracking logging on transport service.
Set-TransportService -Identity $env:COMPUTERNAME -MessageTrackingLogEnabled $trueConsiderations
Message tracking logs contain metadata about every message processed by Transport. On high-traffic servers these logs can consume substantial disk space. Ensure log rotation and disk capacity are appropriate. Message tracking logs may contain sensitive information about internal communication patterns.
References
EDCA-MON-006: Transport message subject logging is disabled
Each Exchange server MUST have message tracking subject logging disabled. Storing message subjects in transport logs may expose sensitive information; subject logging is disabled by default and must remain so.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | MessageTrackingLogSubjectLoggingEnabled is disabled. | |
| ex2 | MessageTrackingLogSubjectLoggingEnabled is disabled. | |
| ex3 | MessageTrackingLogSubjectLoggingEnabled is disabled. |
Remediation
Disable message tracking subject logging.
Set-TransportService -Identity $env:COMPUTERNAME -MessageTrackingLogSubjectLoggingEnabled $falseConsiderations
Enabling message subject logging can expose sensitive information in log files. This setting should be disabled in security-sensitive environments. Forensic investigations may require temporary enabling of subject logging with appropriate data governance controls in place.
References
EDCA-MON-007: Receive connector protocol logging is set to Verbose
Each Exchange server MUST have ProtocolLoggingLevel set to Verbose on all receive connectors. Verbose SMTP transaction logging supports security investigations, compliance auditing, and post-incident forensics. The CIS benchmark requires Verbose logging on all receive connectors.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | 1 of 1 receive connector(s) do not have Verbose protocol logging. - ex1\Default internal receive connector EX1: ProtocolLoggingLevel=None (expected Verbose) | |
| ex2 | 3 of 5 receive connector(s) do not have Verbose protocol logging. - EX2\Default EX2: ProtocolLoggingLevel=None (expected Verbose) - EX2\Client Proxy EX2: ProtocolLoggingLevel=None (expected Verbose) - EX2\Client Frontend EX2: ProtocolLoggingLevel=None (expected Verbose) | |
| ex3 | 3 of 5 receive connector(s) do not have Verbose protocol logging. - EX3\Default EX3: ProtocolLoggingLevel=None (expected Verbose) - EX3\Client Proxy EX3: ProtocolLoggingLevel=None (expected Verbose) - EX3\Client Frontend EX3: ProtocolLoggingLevel=None (expected Verbose) |
Remediation
Set ProtocolLoggingLevel to Verbose on all receive connectors.
# Enable verbose protocol logging on all receive connectors of this server.
Get-ReceiveConnector -Server $env:COMPUTERNAME | Set-ReceiveConnector -ProtocolLoggingLevel VerboseConsiderations
Verbose protocol logging generates significant disk I/O on high-volume servers. Ensure that adequate disk space and a log rotation / archival policy are in place. Review log paths via Get-TransportService.
References
- CIS 4.1 (L1): Ensure ProtocolLoggingLevel is set to Verbose on Receive Connectors
- Configure protocol logging in Exchange Server
- V-259682 The Exchange global inbound message size must be controlled (EX19-MB-000129)
- ANSSI - Sécuriser la journalisation dans un environnement Microsoft Active Directory (2022)
EDCA-MON-008: Send connector protocol logging is set to Verbose
Each Exchange server MUST have ProtocolLoggingLevel set to Verbose on all send connectors. Verbose SMTP transaction logging captures outbound mail flow details for all outbound connections. The CIS benchmark requires Verbose logging on all send connectors to support security investigations and compliance auditing.
Evidence
| Connector | Status | Evidence |
|---|---|---|
| EdgeSync - Inbound to Default-First-Site-Name | ProtocolLoggingLevel: None. | |
| Outbound to Office 365 - a46fac84-50d1-4953-8e4c-c924f33dfa5b | ProtocolLoggingLevel: None. | |
| EdgeSync - Default-First-Site-Name to Internet | ProtocolLoggingLevel: None. |
Remediation
Set ProtocolLoggingLevel to Verbose on all send connectors.
# Enable verbose protocol logging on all send connectors.
Get-SendConnector | Set-SendConnector -ProtocolLoggingLevel VerboseConsiderations
Same storage and rotation considerations as receive connector protocol logging. Coordinate log archival so that verbose logs are retained for at least 90 days for forensic purposes.
References
EDCA-MON-009: Exchange transport queue monitoring is configured
Exchange transport back pressure configuration MUST be present and active. Back pressure in Exchange monitors disk space utilization to protect transport service availability - queue growth is disk-bounded, not message-count-bounded. Message retention in queues is time-bounded by message priority: normal-priority messages expire after NormalPriorityMessageExpirationTimeout (default: 2 days) and critical-priority messages expire after CriticalPriorityMessageExpirationTimeout (default: 4 hours). Critical messages are time-limited, not size-limited. Transport flood protection relies entirely on back pressure: if the back pressure thresholds are breached, Exchange defers inbound connections to prevent disk exhaustion. Configuration is stored in $ExInstall\Bin\EdgeTransport.exe.config under the appSettings section.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Back pressure active (EdgeTransport.exe.config present). Queue growth is disk-bounded via back pressure, not message-count-bounded. Message expiration is time-bounded by priority. NormalPriorityMessageExpirationTimeout : 2.00:00:00 CriticalPriorityMessageExpirationTimeout: 0.04:00:00 (default) | |
| ex2 | Back pressure active (EdgeTransport.exe.config present). Queue growth is disk-bounded via back pressure, not message-count-bounded. Message expiration is time-bounded by priority. NormalPriorityMessageExpirationTimeout : 2.00:00:00 CriticalPriorityMessageExpirationTimeout: 0.04:00:00 (default) | |
| ex3 | Back pressure active (EdgeTransport.exe.config present). Queue growth is disk-bounded via back pressure, not message-count-bounded. Message expiration is time-bounded by priority. NormalPriorityMessageExpirationTimeout : 2.00:00:00 CriticalPriorityMessageExpirationTimeout: 0.04:00:00 (default) |
Remediation
Ensure EdgeTransport.exe.config is present at $ExInstall\Bin\EdgeTransport.exe.config. To customize message expiration timeouts, add or update the NormalPriorityMessageExpirationTimeout and CriticalPriorityMessageExpirationTimeout keys in the appSettings section. Restart the Microsoft Exchange Transport service after any changes.
# Back pressure settings are in $ExInstall\Bin\EdgeTransport.exe.config
# Example appSettings entries (add inside <appSettings>):
# <add key="NormalPriorityMessageExpirationTimeout" value="2.00:00:00" />
# <add key="CriticalPriorityMessageExpirationTimeout" value="0.04:00:00" />
# Restart the transport service after editing:
Restart-Service MSExchangeTransportConsiderations
Exchange SMTP queue growth is disk-bounded: back pressure monitors disk space percentage and database checkpoint depth, not message count. When disk pressure thresholds are reached, Exchange defers inbound SMTP connections. Message expiration is time-bounded by priority - normal messages default to 2 days, critical messages default to 4 hours. These timeouts are enforced even when queues are near-full; critical messages are not protected by size limits. If NormalPriorityMessageExpirationTimeout or CriticalPriorityMessageExpirationTimeout are absent from EdgeTransport.exe.config, Exchange uses built-in compiled defaults (2.00:00:00 and 0.04:00:00 respectively). Changes to EdgeTransport.exe.config require a restart of the Microsoft Exchange Transport service. Use care when modifying back-pressure thresholds as overly aggressive settings may cause unnecessary mail deferral.
References
EDCA-MON-010: Exchange audit data is protected from unauthorized access
Exchange MUST protect audit data against unauthorized read access, unauthorized access, and unauthorized deletion. Audit data (logs, mailbox audit logs, admin audit logs) must have file-level and RBAC-level access controls applied to prevent tampering or unauthorized disclosure.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | Audit log directory (C:\Program Files\Microsoft\Exchange Server\V15\Logging) ACL contains only standard principals with appropriate permissions. | |
| ex3 | Audit log directory (C:\Program Files\Microsoft\Exchange Server\V15\Logging) ACL contains only standard principals with appropriate permissions. |
Remediation
Restrict NTFS permissions on Exchange log directories and limit RBAC access to audit management roles.
# Review NTFS permissions on exchange log directories and restrict to Exchange Admin and SYSTEM only.Considerations
Audit log protection requires both file-system (NTFS) and RBAC controls. Overly restrictive permissions may interfere with Exchange service accounts that must write to log directories. Review default Exchange service account permissions before making changes. Admin audit entries are recorded in the AuditLog system mailbox; verify its existence and accessibility with: Get-Mailbox -AuditLog.
References
- V-259660 Exchange must protect audit data against unauthorized read access (EX19-MB-000052)
- V-259661 Exchange must protect audit data against unauthorized access (EX19-MB-000053)
- V-259662 Exchange must protect audit data against unauthorized deletion (EX19-MB-000054)
- Audit logging in Exchange Server
- ANSSI - Sécuriser la journalisation dans un environnement Microsoft Active Directory (2022)
EDCA-MON-011: Exchange audit data resides on a separate partition
Exchange audit data MUST be on separate partitions. Placing audit logs on a dedicated volume ensures that audit data is not lost due to system volume exhaustion and provides isolation from the operating system and Exchange application files, which is required for DISA compliance.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | AuditLogPath=C:\Program Files\Microsoft\Exchange Server\V15\Logging shares volume C:\ with: OS system volume (C:\); Exchange binaries volume (C:\, C:\Program Files\Microsoft\Exchange Server\V15\). | |
| ex3 | AuditLogPath=C:\Program Files\Microsoft\Exchange Server\V15\Logging shares volume C:\ with: OS system volume (C:\); Exchange binaries volume (C:\, C:\Program Files\Microsoft\Exchange Server\V15\). |
Remediation
Move Exchange audit log paths to a dedicated volume separate from the OS and Exchange application volumes.
# Verify audit log paths are on dedicated volumes.Considerations
Moving log paths requires downtime and reconfiguration of the Transport service and audit log configuration. Plan for a maintenance window and ensure the target volume has adequate capacity for log growth.
References
EDCA-MON-012: Exchange diagnostic event log levels are set to Lowest
All Exchange diagnostic event log categories MUST be configured at the Lowest logging level. Setting diagnostic categories above Lowest causes excessive logging which can fill disk space and degrade server performance. The DISA Exchange STIG requires all Get-EventLogLevel categories to be set to Lowest.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | All 110 Exchange event log categories are set to Lowest. | |
| ex2 | All 183 Exchange event log categories are set to Lowest. | |
| ex3 | All 183 Exchange event log categories are set to Lowest. |
Remediation
Set all Exchange diagnostic event log categories to Lowest.
Get-EventLogLevel | Set-EventLogLevel -Level LowestConsiderations
Setting all categories to Lowest reduces diagnostic logging granularity. If an issue is actively being investigated, consider temporarily raising specific category levels during the investigation period and returning them to Lowest afterwards.
References
- V-259653 Exchange diagnostic event-log must be configured to the minimum level (EX19-MB-000032)
- V-259581 Exchange email diagnostic log level must be set to the lowest level (EX19-ED-000032)
- V-228358 Exchange diagnostic event-log must be configured to the minimum level (EX16-MB-000050)
- Set-EventLogLevel cmdlet
EDCA-MON-013: Windows Advanced Audit Policy is configured
Windows Advanced Audit Policy subcategories MUST be configured on Exchange servers to capture security-relevant events. The following subcategories must be set to Success and/or Failure logging: Logon (Success/Failure), Account Logon (Success/Failure), Account Management (Success/Failure), Special Logon (Success), and Process Creation (Success). ANSSI recommends activating Windows advanced audit policy subcategories rather than relying on legacy basic audit settings.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Control evaluator not implemented. | |
| ex2 | Control evaluator not implemented. | |
| ex3 | Control evaluator not implemented. |
Remediation
Configure Advanced Audit Policy subcategories using auditpol or Group Policy to ensure Logon, Account Logon, Account Management, Special Logon, and Process Creation events are audited.
# Check current Advanced Audit Policy subcategory settings
auditpol /get /category:"Logon/Logoff","Account Logon","Account Management","Detailed Tracking" 2>&1
# Apply recommended subcategory settings (Success/Failure where appropriate)
# Logon
auditpol /set /subcategory:"Logon" /success:enable /failure:enable
# Account Logon
auditpol /set /subcategory:"Credential Validation" /success:enable /failure:enable
# Account Management
auditpol /set /subcategory:"User Account Management" /success:enable /failure:enable
auditpol /set /subcategory:"Security Group Management" /success:enable /failure:enable
# Special Logon
auditpol /set /subcategory:"Special Logon" /success:enable
# Process Creation
auditpol /set /subcategory:"Process Creation" /success:enableConsiderations
Enabling advanced audit subcategories increases Security event log volume on Exchange servers. Ensure the event log size and retention policy (Security log maximum size and Archive policy) are set appropriately before enabling. In environments using Group Policy for audit settings, ensure the 'Audit: Force audit policy subcategory settings' policy is enabled so that subcategory settings override legacy category settings. High-volume servers may require a SIEM or log forwarding pipeline to handle the increased event rate.
References
EDCA-MON-014: PowerShell Module Logging is enabled
PowerShell Module Logging MUST be enabled to capture the full pipeline execution details of all PowerShell commands and functions, including parameters and outputs. Module Logging complements Script Block Logging (EDCA-MON-002) by recording the invocation of each command in a module pipeline. ANSSI recommends enabling PowerShell Module Logging on all member servers as part of a comprehensive logging strategy. The CIS benchmark also requires Module Logging to be enabled.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | PowerShell Module Logging policy registry key is absent — EnableModuleLogging is not configured. OS version: 10.0.26100; build: 26100 | |
| ex2 | PowerShell Module Logging policy registry key is absent — EnableModuleLogging is not configured. OS version: 10.0.26100; build: 26100 | |
| ex3 | PowerShell Module Logging policy registry key is absent — EnableModuleLogging is not configured. OS version: 10.0.26100; build: 26100 |
Remediation
Enable PowerShell Module Logging via registry or Group Policy. Set EnableModuleLogging to 1 under the ModuleLogging key and configure the ModuleNames value to '*' to log all modules.
# Check current Module Logging state
$modLogPath = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging'
$val = (Get-ItemProperty $modLogPath -Name EnableModuleLogging -ErrorAction SilentlyContinue).EnableModuleLogging
"EnableModuleLogging: $(if ($null -eq $val) { 'not set (disabled)' } else { $val })"
# Enable Module Logging and log all modules
New-Item -Path $modLogPath -Force | Out-Null
Set-ItemProperty -Path $modLogPath -Name EnableModuleLogging -Type DWord -Value 1
$modNamesPath = "$modLogPath\ModuleNames"
New-Item -Path $modNamesPath -Force | Out-Null
Set-ItemProperty -Path $modNamesPath -Name '*' -Type String -Value '*'
Write-Host 'PowerShell Module Logging enabled for all modules.'Considerations
Enabling PowerShell Module Logging generates verbose log entries in the Windows PowerShell event log (Microsoft-Windows-PowerShell/Operational) for every PowerShell pipeline execution. On Exchange servers running frequent scheduled tasks or automation, this can generate high log volume. Ensure adequate event log size and a log collection or archival policy before enabling. Module Logging and Script Block Logging are complementary; together they provide complete PowerShell visibility. Module Logging captures invocation details while Script Block Logging captures the script content. Both should be enabled for comprehensive coverage.
References
Performance (13 controls)
EDCA-PERF-001: CTS processor affinity baseline
CtsProcessorAffinityPercentage MUST be set to 0 (Exchange baseline). Any value above 0 restricts Exchange search/CTS to a subset of processors, degrading search performance and indexing throughput.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | CtsProcessorAffinityPercentage is not configured (baseline default is 0). | |
| ex2 | CtsProcessorAffinityPercentage is not configured (baseline default is 0). | |
| ex3 | CtsProcessorAffinityPercentage is not configured (baseline default is 0). |
Remediation
Remove or reset the CtsProcessorAffinityPercentage DWORD value to 0 under HKLM\SOFTWARE\Microsoft\ExchangeServer\V15\Search\SystemParameters. This setting limits search performance and should not be used as a long-term fix.
Remove-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\ExchangeServer\V15\Search\SystemParameters' -Name CtsProcessorAffinityPercentage -ErrorAction SilentlyContinueConsiderations
Changing the CTS processor affinity can reduce throughput on servers with many concurrent connections. This setting is rarely needed and should only be changed based on Microsoft support guidance. Incorrect configuration can degrade search performance.
References
EDCA-PERF-002: High Performance power plan is active
Exchange servers SHOULD use the High Performance power plan to avoid CPU throttling and performance degradation.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Compliant — High Performance power plan is active. | |
| ex2 | Compliant — High Performance power plan is active. | |
| ex3 | Compliant — High Performance power plan is active. |
Remediation
Set active power plan to High Performance.
powercfg /SETACTIVE 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635cConsiderations
Changing the power plan to High Performance increases power consumption on physical hosts. On virtual machines, the hypervisor controls CPU frequency and this setting has limited effect. Verify that your data center or cloud infrastructure supports and benefits from this configuration.
References
EDCA-PERF-003: Hyper-Threading/SMT not enabled
Hyper-Threading (SMT) MUST be disabled: logical processor count MUST equal physical core count. Exchange does not support Hyper-Threading and its presence can degrade performance.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Cores: 4; Logical processors: 8 — Hyper-Threading detected. | |
| ex2 | Cores: 4; Logical processors: 8 — Hyper-Threading detected. | |
| ex3 | Cores: 4; Logical processors: 8 — Hyper-Threading detected. |
Remediation
Review BIOS/host settings for SMT/Hyper-Threading and disable per performance policy where approved.
# Diagnose: Check Hyper-Threading/SMT state (LogicalProcessors > Cores indicates HT is enabled)
Get-WmiObject -Class Win32_Processor | Select-Object Name, NumberOfCores, NumberOfLogicalProcessors | ForEach-Object { "$($_.Name): $($_.NumberOfCores) cores / $($_.NumberOfLogicalProcessors) logical - HT: $(if ($_.NumberOfLogicalProcessors -gt $_.NumberOfCores) {'ENABLED'} else {'disabled'})" }
# If HT/SMT is enabled, disable it in BIOS firmware. Verify Exchange sizing after the change.Considerations
Disabling Hyper-Threading/SMT is a mitigation for CPU side-channel vulnerabilities (MDS, TAA, Spectre). The performance reduction can be up to 30%. Only apply this if regulatory requirements or your threat model mandate it. This change requires a reboot and coordination with production scheduling.
References
EDCA-PERF-004: NodeRunner memory limit baseline
NodeRunner process memory limit (memoryLimitMegabytes in noderunner.exe.config) MUST be set to 0. Non-zero values restrict Exchange search memory allocation and can cause search index failures.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | NodeRunner memoryLimitMegabytes is set to 0 (baseline). | |
| ex3 | NodeRunner memoryLimitMegabytes is set to 0 (baseline). |
Remediation
Set memoryLimitMegabytes to 0 in the noderunner.exe configuration file for optimal performance. Only apply a non-zero limit as a temporary workaround if the noderunner process is causing measurable server impact.
# Diagnose: Check NodeRunner.exe.config memory limit setting
$exchPath = $exinstall
$cfg = Join-Path $exchPath 'Bin\Search\Ceres\Runtime\1.0\noderunner.exe.config'
if (Test-Path $cfg) { ([xml](Get-Content $cfg)).configuration.noderunner.memorySettings } else { "Config not found: $cfg" }Considerations
Adjusting the NodeRunner memory limit affects Exchange content indexing and search performance. Setting the limit too low can cause content index to lag or fail. The change takes effect after a service restart and should be tested against search responsiveness.
References
EDCA-PERF-005: NUMA BIOS baseline
BIOS/boot NUMA group size optimization MUST be set to 0 (flat/clustered NUMA). Non-zero values (node interleaving) degrade Exchange memory access performance across NUMA nodes.
Evidence
| Server | Status | Evidence |
|---|
Remediation
Verify BIOS NUMA settings are configured so the OS can detect all processor cores. If only half the logical cores are visible to the OS, consult your server or OS vendor to correct the NUMA BIOS configuration.
# Diagnose: Check NUMA node and processor visibility from the OS
Get-WmiObject -Class Win32_Processor | Select-Object Name, NumberOfCores, NumberOfLogicalProcessors, NumberOfEnabledCore
"OS-visible logical processor count: $([System.Environment]::ProcessorCount)"
# Uneven core distribution across sockets or mismatched totals may indicate a NUMA misconfiguration - verify BIOS settings.Considerations
BIOS-level NUMA configuration changes require server restart and must be coordinated with the hardware vendor. Incorrect NUMA configuration can degrade memory access performance on multi-socket systems.
References
EDCA-PERF-006: Processor socket count and logical core baseline
Exchange servers MUST NOT exceed the recommended processor socket and logical core limits. No more than 2 physical processor sockets are recommended; logical processor count must not exceed 24 for Exchange 2016 or 48 for Exchange 2019/SE. Exceeding these thresholds can cause unexpected performance degradation.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Compliant — 8 logical processors, within the ExchangeSE baseline of 48. | |
| ex2 | Compliant — 8 logical processors, within the ExchangeSE baseline of 48. | |
| ex3 | Compliant — 8 logical processors, within the ExchangeSE baseline of 48. |
Remediation
Reduce the number of processor sockets to no more than 2, or reduce logical processors to within the supported maximum (24 for Exchange 2016, 48 for Exchange 2019/SE). If the CPU is throttled, verify the Power Plan is set to High Performance and change it immediately if not.
# Diagnose: Check processor socket count, clock speeds, and logical processor counts
Get-WmiObject -Class Win32_Processor | Select-Object Name, MaxClockSpeed, CurrentClockSpeed, NumberOfCores, NumberOfLogicalProcessors
"Total sockets: $((Get-WmiObject -Class Win32_Processor | Measure-Object).Count)"
"Total logical processors: $([System.Environment]::ProcessorCount)"
# If CurrentClockSpeed is significantly below MaxClockSpeed, review BIOS power and performance settings.Considerations
Processor socket count and logical core limits are a hardware sizing concern addressed at deployment time. On VMware, the socket count maps to vCPU socket configuration rather than physical sockets; reducing vCPU sockets requires a VM power-off. On physical hardware, reducing socket count requires hardware maintenance. Processor replacement or configuration changes require hardware maintenance windows and potential load redistribution across the DAG.
References
EDCA-PERF-007: Receive Side Scaling (RSS) enabled
Receive Side Scaling (RSS) MUST be enabled on active network adapters. RSS distributes network receive processing across multiple processor cores, improving throughput for Exchange workloads.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Compliant — 1 of 1 active adapters have RSS enabled. | |
| ex2 | Compliant — 1 of 1 active adapters have RSS enabled. | |
| ex3 | Compliant — 1 of 1 active adapters have RSS enabled. |
Remediation
Enable RSS on adapters where supported.
Get-NetAdapterRss | Where-Object { -not $_.Enabled } | ForEach-Object { Enable-NetAdapterRss -Name $_.Name -Confirm:$false }Considerations
Enabling or reconfiguring RSS settings may require a network adapter driver update and a server reboot. Changes to RSS may briefly interrupt network connectivity. Verify that the network adapter firmware supports the target RSS configuration.
References
EDCA-PERF-008: Single page file configuration
Multiple configured page files can impact Exchange performance consistency. A single managed page file entry is recommended.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Compliant — single page file configured. | |
| ex2 | Compliant — single page file configured. | |
| ex3 | Compliant — single page file configured. |
Remediation
Review and standardize page file settings through approved OS baseline controls.
# Manual remediation recommended: align page file configuration with Exchange server baseline.Considerations
Exchange has specific page file sizing recommendations based on installed RAM. Changing page file settings requires a reboot. Placing the page file on the Exchange database volume is not recommended. Follow CSS and Microsoft guidance for page file placement and size.
References
EDCA-PERF-009: Sleepy NIC baseline
NIC power management sleep/power-down settings MUST be disabled on all active adapters. Adapter power-down under low traffic causes intermittent connectivity interruptions for Exchange clients.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Sleepy NIC warnings on 1 of 1 adapter(s). - Ethernet | PnPCapabilities= | |
| ex2 | Sleepy NIC warnings on 1 of 1 adapter(s). - Ethernet | PnPCapabilities= | |
| ex3 | Sleepy NIC warnings on 1 of 1 adapter(s). - Ethernet | PnPCapabilities= |
Remediation
Disable NIC power-saving by setting the PnPCapabilities DWORD value to 24 or 280 under HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318} for each affected network adapter.
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}\NNNN' -Name PnPCapabilities -Value 24 -Type DWordConsiderations
Disabling sleep and power-saving settings on network adapters prevents idle disconnects but may marginally increase power consumption. This setting is almost always the correct configuration for production Exchange servers. Requires testing after changing NIC advanced settings.
References
EDCA-PERF-010: TCP/IP settings baseline
TCP KeepAliveTime registry value MUST be within the recommended exchange range of 900000 to 1800000 ms (15 to 30 minutes). Values outside this range (including the OS default 2-hour value) allow stale TCP connections to persist.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | TCP KeepAliveTime is 900000, within the recommended 900000-1800000 ms range. | |
| ex2 | TCP KeepAliveTime is 900000, within the recommended 900000-1800000 ms range. | |
| ex3 | TCP KeepAliveTime is 900000, within the recommended 900000-1800000 ms range. |
Remediation
Set the KeepAliveTime DWORD value under HKLM\SYSTEM\CurrentControlSet\Services\TcpIp\Parameters to between 900000 and 1800000 milliseconds (15 to 30 minutes) to prevent idle TCP connections from being dropped prematurely.
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters' -Name KeepAliveTime -Value 900000 -Type DWordConsiderations
TCP/IP stack changes (Chimney Offload, Large Send Offload, etc.) affect all network traffic on the server, not just Exchange. Some settings require a reboot. Verify that the current NIC driver supports the target configuration. Changes should be tested in a staging environment first.
References
EDCA-PERF-011: VMXNET3 adapter health baseline (ESX)
For VMware ESX-hosted Exchange servers using VMXNET3 virtual NICs, the PacketsReceivedDiscarded counter MUST be zero. A non-zero value indicates the guest OS is dropping inbound packets due to insufficient receive buffer space, which causes retransmits and degrades Exchange performance. The HealthChecker evaluation criteria are: Pass is no discards; Warning is 1–999 discards; Fail is 1000 or more discards (Fail). This counter is cumulative from the last reboot or NIC driver reset, so even a non-zero value that is not increasing warrants investigation. Two key VMXNET3 advanced driver properties govern receive buffer capacity: Small Rx Buffers (recommended maximum: 8192) and Rx Ring #1 Size (recommended maximum: 4096). Values below the recommended maximum increase the risk of buffer exhaustion under high-traffic bursts. In addition, the 'adaptive rx ring sizing' feature can cause random interface resets when it dynamically resizes the ring - disabling it is recommended if intermittent resets are observed. Note: this counter is a cumulative accumulation since last reboot or NIC driver reset, so even an idle adapter can report a non-zero value from historical activity.
Evidence
| Server | Status | Evidence |
|---|
Remediation
When PacketsReceivedDiscarded is non-zero on a VMXNET3 adapter, increase the receive buffer settings to their maximum values to reduce the risk of buffer exhaustion: set Small Rx Buffers to 8192 and Rx Ring #1 Size to 4096 via the adapter Advanced Properties in Device Manager. If random interface resets are observed alongside packet loss, also disable the 'adaptive rx ring sizing' advanced property. No reboot is required, but existing TCP sessions (including RDP) may be disrupted when the driver reloads the new configuration - use a vSphere console to make changes where possible.
# Diagnose: Show VMXNET3 adapters, packet loss counter, and current ring/buffer settings
$vmxnet = @(Get-NetAdapter | Where-Object { $_.InterfaceDescription -like '*VMXNET3*' })
if ($vmxnet.Count -eq 0) { Write-Host 'No VMXNET3 adapters found.'; return }
foreach ($nic in $vmxnet) {
Write-Host ('--- Adapter: {0} ({1}) ---' -f $nic.Name, $nic.InterfaceDescription)
# Packet loss counter (Good=0, Warning<1000, Error>=1000)
$stats = Get-NetAdapterStatistics -Name $nic.Name -ErrorAction SilentlyContinue
if ($null -ne $stats) {
$discards = ($stats.PSObject.Properties | Where-Object { $_.Name -match 'Discard' } | Measure-Object -Property Value -Sum).Sum
Write-Host (' PacketsReceivedDiscarded : {0} (Good=0 / Warning<1000 / Error>=1000)' -f $discards)
}
# Current advanced driver properties (ring size and buffer settings)
$advProps = Get-NetAdapterAdvancedProperty -Name $nic.Name -ErrorAction SilentlyContinue
$ring1 = $advProps | Where-Object { $_.DisplayName -match 'Rx Ring.*#?\s*1|Ring.*#?\s*1' } | Select-Object -First 1
$smallRx = $advProps | Where-Object { $_.DisplayName -match 'Small' } | Select-Object -First 1
$adaptive = $advProps | Where-Object { $_.DisplayName -match 'adaptive' } | Select-Object -First 1
Write-Host (' Rx Ring #1 Size : {0} (recommended: 4096)' -f $(if ($ring1) { $ring1.DisplayValue } else { 'not found' }))
Write-Host (' Small Rx Buffers : {0} (recommended: 8192)' -f $(if ($smallRx) { $smallRx.DisplayValue } else { 'not found' }))
if ($adaptive) { Write-Host (' Adaptive Rx Ring Sizing : {0} (recommended: Disabled)' -f $adaptive.DisplayValue) }
}
# To update: open Device Manager -> Network Adapters -> right-click VMXNET3 adapter
# -> Properties -> Advanced tab -> set Rx Ring #1 Size = 4096, Small Rx Buffers = 8192
# Alternatively, use Set-NetAdapterAdvancedProperty (name may vary by driver version):
# Set-NetAdapterAdvancedProperty -Name 'Ethernet0' -DisplayName 'Rx Ring #1 Size' -DisplayValue '4096'
# Set-NetAdapterAdvancedProperty -Name 'Ethernet0' -DisplayName 'Small Rx Buffers' -DisplayValue '8192'Considerations
Only applicable in VMware environments with VMXNET3 virtual NICs. The PacketsReceivedDiscarded counter accumulates from the last reboot or NIC driver reset, so a non-zero value may reflect historical activity rather than an active issue. Increasing Small Rx Buffers and Rx Ring #1 Size allocates more memory for the virtual NIC receive path, which increases memory overhead on both the VM and the ESXi host. Increase values gradually when host memory resources are near capacity, and monitor host memory balloon activity after changes. No reboot is required to apply ring/buffer changes, but the driver will momentarily reset the adapter, which will disconnect active TCP sessions - including RDP and Exchange client connections. Perform changes during a maintenance window or via vSphere console to avoid disruption. The Small Rx Buffers and Rx Ring #1 Size settings affect non-jumbo frame traffic only. On hosts running VMware Tools 10.4.0 or later, adaptive rx ring sizing is disabled by default.
References
EDCA-PERF-012: Exchange-to-DC/GC processor core ratio does not exceed 8:1
For every eight Exchange Server processor cores in an Active Directory site there MUST be at least one Global Catalog (GC) processor core in the same site. An insufficient number of GC cores relative to Exchange load causes increased LDAP lookup latency, resulting in degraded client responsiveness and potential service disruptions. Recommendation is a maximum 8:1 ratio of Exchange cores to DC/GC cores.
Evidence
| Organization | Status | Evidence |
|---|
Remediation
Add additional Global Catalog servers (or promote existing DCs to GC role) in the Exchange AD site to bring the ratio to 8:1 or better. Alternatively, reduce the number of Exchange processor cores by adjusting the virtual machine configuration or decommissioning servers.
# STEP 1: Discover GC-enabled domain controllers per AD site
$gcsBySite = @{}
Get-ADDomainController -Filter { IsGlobalCatalog -eq $true } | ForEach-Object {
$siteName = $_.Site
if (-not $gcsBySite.ContainsKey($siteName)) { $gcsBySite[$siteName] = @() }
$gcsBySite[$siteName] += $_.HostName
}
# STEP 2: Exchange server core counts per site
$exchangeBySite = @{}
Get-ExchangeServer | Where-Object { $_.ServerRole -notlike '*Edge*' } | ForEach-Object {
$siteName = (([string]$_.Site -split '/')[-1]).Trim()
$srvName = [string]$_.Name
$cores = (@(Get-CimInstance -ComputerName $srvName -ClassName Win32_Processor -ErrorAction SilentlyContinue) | Measure-Object -Property NumberOfCores -Sum).Sum
[PSCustomObject]@{ Server = $srvName; Site = $siteName; Cores = if ($null -ne $cores) { $cores } else { 'N/A' } }
if (-not $exchangeBySite.ContainsKey($siteName)) { $exchangeBySite[$siteName] = 0 }
if ($null -ne $cores) { $exchangeBySite[$siteName] += $cores }
} | Format-Table Server, Site, Cores -AutoSize
# STEP 3: GC core counts per site + ratio
foreach ($site in ($exchangeBySite.Keys | Sort-Object)) {
$exCores = $exchangeBySite[$site]
$gcNames = if ($gcsBySite.ContainsKey($site)) { $gcsBySite[$site] } else { @() }
if ($gcNames.Count -eq 0) { Write-Warning ('No GC found in site ' + $site); continue }
$totalGcCores = 0
foreach ($dcName in $gcNames) {
$dcCores = (@(Get-CimInstance -ComputerName $dcName -ClassName Win32_Processor -ErrorAction SilentlyContinue) | Measure-Object -Property NumberOfCores -Sum).Sum
[PSCustomObject]@{ DC = $dcName; Site = $site; Cores = if ($null -ne $dcCores) { $dcCores } else { 'N/A' } }
if ($null -ne $dcCores) { $totalGcCores += $dcCores }
}
if ($totalGcCores -gt 0) {
$ratio = [math]::Round($exCores / $totalGcCores, 2)
$status = if ($ratio -le 8) { 'PASS' } else { 'FAIL' }
Write-Host ($status + ': Site=' + $site + ' Exchange=' + $exCores + ' cores GC=' + $totalGcCores + ' cores Ratio=' + $ratio + ':1 (limit 8:1)')
}
}Considerations
When the Exchange-to-DC/GC core ratio exceeds 8:1 in an Active Directory site, Exchange Server cannot service LDAP lookup requests at the required rate. This manifests as increased LDAP query latency, causing slow mailbox logons, delayed Free/Busy lookups, and sluggish recipient resolution in Outlook. Under sustained load, GC servers experience elevated CPU utilization that can cascade into authentication failures and client disconnections. During peak periods, transport components may time out waiting for LDAP responses, resulting in delivery delays or NDRs. In severe cases, Exchange Managed Availability health probes fail, causing the frontend service to be disabled and users to lose access entirely. The impact is site-scoped - sites where the ratio is within limits remain unaffected while non-compliant sites degrade independently.
References
EDCA-PERF-013: Page file initial and maximum size match Exchange version baseline
Exchange Server requires a fixed-size page file with equal Initial and Maximum values. A dynamic page file (InitialSize ≠ MaximumSize) causes fragmentation and degrades performance under memory pressure.
• Exchange 2016: both values = RAM in MB + 10, capped at 32778 MB for servers with 32 GB or more RAM
• Exchange 2019 / Exchange SE: both values = 25% of total RAM, rounded up to the nearest MB
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Compliant — page file is fixed-size at 4096 MB (target: 4096 MB) on C:\pagefile.sys. | |
| ex2 | Compliant — page file is fixed-size at 4096 MB (target: 4096 MB) on C:\pagefile.sys. | |
| ex3 | Non-compliant: Size is 3057 MB (expected 4096 MB); location: C:\pagefile.sys. |
Remediation
Set the page file to a fixed size equal to the Exchange version target. For Exchange 2016: if total RAM is 32 GB or more, set Initial and Maximum to 32778 MB; otherwise set both to RAM in MB + 10. For Exchange 2019 / Exchange SE: set both to 25% of total RAM rounded up to the nearest MB. After changing the page file size a reboot is required for the new values to take effect.
# Inspect current page file configuration
$cs = Get-CimInstance Win32_ComputerSystem
$pfCfg = Get-CimInstance Win32_PageFileSetting
$ramGB = [math]::Round($cs.TotalPhysicalMemory / 1GB, 2)
$ramMB = [int][math]::Round($ramGB * 1024)
Write-Host ('Total RAM: {0} GB ({1} MB)' -f $ramGB, $ramMB)
$pfCfg | Format-Table Name, InitialSize, MaximumSize -AutoSize
# Determine target based on Exchange version
$adminDisplayVersion = (Get-ExchangeServer -Identity $env:COMPUTERNAME).AdminDisplayVersion
if ($adminDisplayVersion -match 'Version 15\.1') {
$targetMB = if ($ramMB -ge 32768) { 32778 } else { $ramMB + 10 }
} else {
# Exchange 2019 / Exchange SE: 25% of RAM
$targetMB = [int][math]::Ceiling($ramMB * 0.25)
}
Write-Host ('Target page file size: {0} MB' -f $targetMB)
# Disable automatic page file management if currently enabled
if ($cs.AutomaticManagedPagefile) {
Set-CimInstance -InputObject $cs -Property @{ AutomaticManagedPagefile = $false }
Write-Host 'Automatic page file management disabled.'
}
# Apply fixed size (uncomment to execute -- requires reboot)
# $pfCfg | Set-CimInstance -Property @{ InitialSize = $targetMB; MaximumSize = $targetMB }
# Write-Host ('Page file set to {0} MB fixed. Reboot required.' -f $targetMB)
# Restart-Computer -ForceConsiderations
Applying this change requires a reboot; schedule during a maintenance window. If Windows Automatic Managed Page File is enabled, disable it before setting explicit values - the InitialSize and MaximumSize values in Win32_PageFileSetting are disregarded while automatic management is active. The 32778 MB cap for Exchange 2016 applies regardless of how much additional RAM is installed beyond 32 GB. For Exchange 2019 and Exchange SE the 25% rule scales with RAM; verify the system drive has sufficient free space before applying, particularly on high-memory servers. On virtual machines, an oversized page file consumes datastore capacity without a performance benefit; review available storage alongside any planned RAM changes.
References
EDCA-PERF-014: Memory meets Exchange version and role requirements
Exchange Server has published minimum and maximum memory requirements by version and role. Falling below the minimum results in an unsupported configuration with degraded performance and risk of service failure under load. Exceeding the maximum is outside the tested configuration envelope.
Requirements:
• Exchange 2016 Mailbox: minimum 8 GB, maximum 192 GB
• Exchange 2016 Edge Transport: minimum 4 GB
• Exchange 2019 / Exchange SE Mailbox: minimum 32 GB, maximum 256 GB
• Exchange 2019 / Exchange SE Edge Transport: minimum 8 GB
On virtual hosts, the full RAM allocation must be statically reserved; memory overcommit, oversubscription, and dynamic memory features such as Hyper-V Dynamic Memory or VMware memory ballooning are not supported.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Compliant — 16 GB RAM installed on Edge Transport server (ExchangeSE); supported range: minimum 8 GB. | |
| ex2 | RAM (16 GB) is below the 32 GB minimum for ExchangeSE Mailbox. | |
| ex3 | RAM (16 GB) is below the 32 GB minimum for ExchangeSE Mailbox. |
Remediation
Add physical or virtual memory until the server meets the minimum for its Exchange version and role. For virtual machines, ensure the hypervisor memory reservation equals the full vRAM allocation and that dynamic memory / memory ballooning is disabled. Use the Exchange Server role requirements calculator (https://aka.ms/Exchange2019Calc) to size Mailbox servers based on actual mailbox count, message profile, and availability requirements before provisioning.
# Report current installed memory and evaluate against Exchange requirements
$cs = Get-CimInstance Win32_ComputerSystem
$ramGB = [math]::Round($cs.TotalPhysicalMemory / 1GB, 2)
Write-Host ('Installed RAM: {0} GB' -f $ramGB)
$exSrv = Get-ExchangeServer -Identity $env:COMPUTERNAME -ErrorAction SilentlyContinue
$ver = if ($null -ne $exSrv) { [string]$exSrv.AdminDisplayVersion } else { 'Unknown' }
$isEdge = ($null -ne $exSrv) -and ([string]$exSrv.ServerRole -like '*Edge*')
Write-Host ('Version: {0}' -f $ver)
Write-Host ('Role : {0}' -f (if ($isEdge) { 'Edge Transport' } else { 'Mailbox' }))
# Requirements table
$minGB = 0; $maxGB = $null
if ($ver -match 'Version 15\.1') {
$minGB = if ($isEdge) { 4 } else { 8 }
$maxGB = if ($isEdge) { $null } else { 192 }
} elseif ($ver -match 'Version 15\.2') {
$minGB = if ($isEdge) { 8 } else { 32 }
$maxGB = if ($isEdge) { $null } else { 256 }
}
if ($ramGB -lt $minGB) { Write-Warning ('RAM {0} GB is below the {1} GB minimum.' -f $ramGB, $minGB) }
elseif ($null -ne $maxGB -and $ramGB -gt $maxGB) { Write-Warning ('RAM {0} GB exceeds the {1} GB maximum.' -f $ramGB, $maxGB) }
else { Write-Host 'RAM is within the supported range.' }Considerations
Adding physical memory to a server requires downtime; plan capacity changes in advance using the Exchange Server role requirements calculator (https://aka.ms/Exchange2019Calc). On virtual machines, increasing vRAM typically requires powering off the VM; enabling a 100% hypervisor memory reservation may prevent the hypervisor from overcommitting memory to other guests - coordinate with the platform team before making changes. Disabling dynamic memory features (Hyper-V Dynamic Memory or VMware memory ballooning) may require a reboot to take full effect. Note that memory overcommit at the hypervisor layer can cause the guest OS to report a higher RAM total than is actually guaranteed, resulting in a falsely compliant assessment; verify hypervisor-level reservations alongside any reported values. The maximum RAM limits for Mailbox servers (192 GB for Exchange 2016, 256 GB for Exchange 2019/SE) represent the upper boundary of Microsoft’s tested configurations; address larger mailbox populations by adding servers rather than exceeding the documented ceiling.
References
EDCA-PERF-015: Processor cores meet Exchange version and role requirements
Exchange Server has a published maximum physical core count per server:
• Exchange 2016: maximum 24 cores
• Exchange 2019 / Exchange SE: maximum 48 cores
Exceeding the limit is unsupported and can cause scheduling inefficiencies in the Exchange worker process thread pool. On virtual hosts, the supported vCPU-to-physical-core ratio is:
• Maximum: 2:1
• Recommended: 1:1
Over-allocation causes CPU ready time in the hypervisor scheduler and latency spikes under load.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Compliant — 4 physical cores on Edge Transport server (ExchangeSE); maximum: 48. vCPU:pCore ratio: 2:1. | |
| ex2 | Compliant — 4 physical cores on Mailbox server (ExchangeSE); maximum: 48. vCPU:pCore ratio: 2:1. | |
| ex3 | Compliant — 4 physical cores on Mailbox server (ExchangeSE); maximum: 48. vCPU:pCore ratio: 2:1. |
Remediation
Reduce the number of physical cores (or assigned vCPUs on virtual machines) to the supported maximum for the Exchange version. For virtual machines, also ensure the vCPU count does not exceed twice the number of physical processor cores available on the host. Use the Exchange Server role requirements calculator (https://aka.ms/Exchange2019Calc) to determine the optimal core count based on mailbox count and message profile before resizing.
# Report current processor topology and evaluate against Exchange requirements
$cs = Get-CimInstance Win32_ComputerSystem
$cores = (@(Get-CimInstance Win32_Processor) | Measure-Object -Property NumberOfCores -Sum).Sum
$logical = [int]$cs.NumberOfLogicalProcessors
Write-Host ('Physical cores : {0}' -f $cores)
Write-Host ('Logical procs : {0}' -f $logical)
Write-Host ('vCPU:pCore ratio: {0}:1' -f [math]::Round($logical / $cores, 2))
$exSrv = Get-ExchangeServer -Identity $env:COMPUTERNAME -ErrorAction SilentlyContinue
$ver = if ($null -ne $exSrv) { [string]$exSrv.AdminDisplayVersion } else { 'Unknown' }
Write-Host ('Exchange version: {0}' -f $ver)
$maxCores = $null
if ($ver -match 'Version 15\.1') { $maxCores = 24 }
elseif ($ver -match 'Version 15\.2') { $maxCores = 48 }
if ($null -ne $maxCores -and $cores -gt $maxCores) {
Write-Warning ('Physical core count ({0}) exceeds the {1}-core maximum.' -f $cores, $maxCores)
} else { Write-Host 'Core count is within the supported range.' }
$ratio = [math]::Round($logical / $cores, 2)
if ($ratio -gt 2) {
Write-Warning ('vCPU:pCore ratio {0}:1 exceeds the supported 2:1 maximum.' -f $ratio)
} elseif ($ratio -gt 1) {
Write-Warning ('vCPU:pCore ratio {0}:1 is above the recommended 1:1 ratio.' -f $ratio)
} else { Write-Host 'vCPU:pCore ratio is compliant.' }Considerations
• Assigning more cores than the supported maximum does not improve Exchange throughput; the worker process thread pool is tuned for the documented core counts and excess cores introduce additional scheduling latency.
• On virtual machines, a vCPU:pCore ratio above 2:1 causes CPU ready time in the hypervisor scheduler, manifesting as unpredictable latency spikes in Exchange processing. Even the 2:1 ratio is an upper bound; a 1:1 ratio is recommended for production Mailbox workloads.
• Reducing the vCPU count on a virtual machine requires a reboot before Exchange processes observe the new topology; schedule during a maintenance window.
• Use the Exchange Server role requirements calculator (https://aka.ms/Exchange2019Calc) to determine the optimal core count before making changes.
References
EDCA-PERF-016: TcpAckFrequency is at its default value on all IP-enabled network adapters
The Windows TCP/IP stack uses a delayed acknowledgement (delayed ACK) algorithm by default. Rather than sending an ACK for every segment received, it sends one ACK per two segments or after a 200 ms timeout — whichever comes first. This keeps ACK traffic low and is the correct behaviour for Exchange workloads. The registry entry TcpAckFrequency, configured per network adapter under HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\<GUID>, controls this threshold. The default value is 2, and Microsoft states it should not be changed without careful study of the environment.
Third-party troubleshooting articles recommend setting TcpAckFrequency=1 to resolve Outlook Online mode latency. This advice is incorrect — setting it to 1 is bad practice and introduces its own performance problems (see Considerations). The actual cause of the 200 ms delay pattern in VMware environments is the NSX Guest Introspection network driver (vnetflt); the correct fix is to remove that driver (see EDCA-PERF-017).
This control evaluates as Warning when TcpAckFrequency=1 (delayed ACK disabled), as Risk when the value is 3 or above (delayed ACK extended beyond default), and as Pass when the key is absent or set to 2.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | TcpAckFrequency is at the default on all 1 IP-enabled adapter(s): Microsoft Hyper-V Network Adapter (not set). | |
| ex2 | TcpAckFrequency is at the default on all 1 IP-enabled adapter(s): Microsoft Hyper-V Network Adapter (not set). | |
| ex3 | TcpAckFrequency is at the default on all 1 IP-enabled adapter(s): Microsoft Hyper-V Network Adapter (not set). |
Remediation
Remove the TcpAckFrequency registry value from each IP-enabled network adapter to restore the Windows delayed ACK default. Removing the value is preferred over setting it to 2 — an absent key and the value 2 are equivalent, and removing it avoids a stale override. No reboot is required; the change takes effect for new TCP connections immediately.
# Restore default delayed ACK behaviour by removing TcpAckFrequency override
$nicConfigs = @(Get-CimInstance -ClassName Win32_NetworkAdapterConfiguration | Where-Object { $_.IPEnabled })
foreach ($nic in $nicConfigs) {
$guid = [string]$nic.SettingID
$regPath = 'HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\' + $guid
if (Test-Path -Path $regPath) {
$val = (Get-ItemProperty -Path $regPath -Name TcpAckFrequency -ErrorAction SilentlyContinue).TcpAckFrequency
if ($null -ne $val -and [int]$val -ne 2) {
Remove-ItemProperty -Path $regPath -Name TcpAckFrequency -Force
Write-Host ('Removed TcpAckFrequency={2} from adapter: {0} ({1})' -f $nic.Description, $guid, $val)
} else {
$display = if ($null -eq $val) { 'not set (default)' } else { [string]$val }
Write-Host ('TcpAckFrequency={2} on adapter: {0} ({1}); no action needed.' -f $nic.Description, $guid, $display)
}
} else {
Write-Warning ('Registry path not found for adapter: {0} ({1})' -f $nic.Description, $guid)
}
}
Write-Host 'Done. No reboot required; existing connections resume correct behaviour after reconnection.'Considerations
Setting TcpAckFrequency = 1 turns off delayed ACKs, so the system sends an ACK for every single TCP segment. That creates a lot of tiny packets, drives up NIC interrupts, and increases CPU load on both Exchange and the clients. And because it applies to the whole adapter, the extra noise affects all TCP traffic, not just MAPI.
It also doesn't solve Outlook latency issues. The well-known 200 ms delay—especially in certain VMware environments—comes from the NSX vnetflt introspection driver pausing packets, not from delayed ACK. Changing TcpAckFrequency just adds overhead without fixing the real problem. The proper fix is documented in EDCA-PERF-017.
Going the other direction isn't better. Values 3 or higher hold ACKs even longer than the default 200 ms, which slows down interactive protocols like MAPI and makes Outlook feel less responsive.
And there's no point setting it to 2. According to Microsoft, "missing key," "0," and "2" all behave the same. The cleanest option is simply to remove the key entirely.
Microsoft does not recommend configuring this unless you've studied the environment very carefully.
References
EDCA-PERF-017: VMware NSX Introspection drivers are not running
VMware Tools includes two kernel-mode filter drivers that are installed as part of the NSX Guest Introspection feature:
• vsepflt — file system introspection driver (intercepts file I/O)
• vnetflt — network introspection driver (intercepts network packets)
When these drivers are active they insert themselves into the I/O path and introduce latency on every network packet and file operation. The network introspection driver (vnetflt) is harmful for Exchange: on high-throughput Mailbox servers the cumulative per-packet delay can reproduce the same 200 ms latency pattern caused by delayed ACK, severely degrading Outlook Online mode client response times.
On Exchange servers that are not running a third-party endpoint security product requiring NSX introspection, these drivers must be stopped and disabled.
Evidence
| Server | Status | Evidence |
|---|
Remediation
Stop and disable the vsepflt and/or vnetflt services on the Exchange server. Verify with the security team that no endpoint security product (such as VMware Carbon Black or a third-party NGAV integrated with NSX) relies on these drivers before disabling them. A reboot is not required to stop the services, but disabling them prevents them from starting on the next boot.
# Stop and disable VMware NSX Introspection drivers
foreach ($svcName in @('vsepflt', 'vnetflt')) {
$svc = Get-Service -Name $svcName -ErrorAction SilentlyContinue
if ($null -eq $svc) {
Write-Host "Service '$svcName' not found; skipping."
continue
}
if ($svc.Status -eq 'Running') {
Stop-Service -Name $svcName -Force -ErrorAction SilentlyContinue
Write-Host "Stopped service: $svcName"
} else {
Write-Host "Service '$svcName' is already stopped (Status: $($svc.Status))."
}
Set-Service -Name $svcName -StartupType Disabled -ErrorAction SilentlyContinue
Write-Host "Disabled service: $svcName"
}
Write-Host 'Done. Reboot is not required to take effect.'Considerations
• Before disabling the introspection drivers, confirm with the security team that no endpoint protection product installed on the server requires NSX Guest Introspection. Disabling the drivers while a third-party security product depends on them may leave the server unprotected without raising an obvious alert.
• The vsepflt and vnetflt drivers are installed automatically when VMware Tools is installed with the NSX components option. Upgrading VMware Tools may re-enable disabled services; verify the drivers remain disabled after any VMware Tools update.
• If the introspection capability is required for security compliance, consider whether the Exchange server should be moved to a host or cluster segment where the NSX policy does not apply, rather than disabling drivers on a per-VM basis.
• The performance impact of vnetflt is most visible under high connection rates (large numbers of Outlook Online mode clients or active MAPI connections). Environments with a predominantly cached-mode Outlook client population or smaller mailbox counts may observe less pronounced latency improvement after disabling the driver.
References
Platform Security (42 controls)
EDCA-SEC-001: MAPI over HTTP is enabled
MAPI over HTTP (MapiHttpEnabled) MUST be enabled on all Exchange servers. Required for Outlook 2013+ and Exchange 2016+ connectivity; MAPI/RPC over TCP is deprecated and no longer supported in modern configurations.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | MAPI over HTTP is enabled. | |
| ex3 | MAPI over HTTP is enabled. |
Remediation
Enable and validate MAPI over HTTP configuration for applicable virtual directories and clients.
# Diagnose: Check MAPI over HTTP status
Get-OrganizationConfig | Select-Object MapiHttpEnabled
Get-MapiVirtualDirectory -Server $env:COMPUTERNAME | Select-Object Server, Name, InternalUrl, ExternalUrl, IISAuthenticationMethodsConsiderations
If MAPI over HTTP is enabled for the first time in an existing environment, connected Outlook clients may require a profile restart or re-creation. Test with a pilot group before rolling out to all users. Ensure no client access rules are blocking MAPI over HTTP before enabling.
References
EDCA-SEC-002: .NET Framework version compatible with Exchange
Exchange Server 2016, 2019, and SE all require .NET Framework 4.8 as a minimum. Running Exchange on an older .NET Framework version is unsupported and may cause stability and security issues.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Compliant — .NET Framework 4.8.1 installed; meets minimum requirement of 4.8. | |
| ex2 | Compliant — .NET Framework 4.8.1 installed; meets minimum requirement of 4.8. | |
| ex3 | Compliant — .NET Framework 4.8.1 installed; meets minimum requirement of 4.8. |
Remediation
Update .NET Framework to at least version 4.8 following Exchange-specific guidance to sequence the upgrade correctly relative to Exchange CU installation.
# Diagnose: Check installed .NET Framework release key (528040+ required for 4.8)
Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' | Select-Object Release, VersionConsiderations
Upgrading Exchange Server to a newer Cumulative Update (CU) requires scheduled downtime and thorough regression testing, particularly for hybrid configurations and third-party integrations. Follow the upgrade readiness checklist and verify all coexistence prerequisites before proceeding.
References
EDCA-SEC-003: AD Domain functional level compatible with Exchange
Exchange Server requires minimum AD Domain functional level based on installed version:
• Exchange 2016: Windows Server 2008 R2 (level 4)
• Exchange 2019: Windows Server 2012 R2 (level 6)
• Exchange SE: Windows Server 2016 (level 7)
Running Exchange in a domain with an insufficient functional level is unsupported.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | Compliant — AD Domain functional level is Windows Server 2016 (level 7). |
Remediation
Raise the AD Domain functional level to the minimum required for the installed Exchange version. All domain controllers in the domain must be running the corresponding Windows Server version before raising the domain functional level.
# Check current domain functional level and raise if required:
# Set-ADDomainMode -Identity <DomainFQDN> -DomainMode Windows2012R2DomainConsiderations
Raising the AD domain functional level is irreversible without a full forest recovery. Ensure all domain controllers in the domain are running the required Windows Server version before raising the functional level. Test in a non-production environment first. Coordinate with the Active Directory team, as the change affects all services in the domain — not only Exchange.
References
EDCA-SEC-004: AD Forest functional level compatible with Exchange
Exchange Server requires minimum AD Forest functional level based on installed version:
• Exchange 2016: Windows Server 2008 R2 (level 4)
• Exchange 2019: Windows Server 2012 R2 (level 6)
• Exchange SE: Windows Server 2016 (level 7)
Running Exchange in a forest with an insufficient functional level is unsupported.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | Compliant — AD Forest functional level is Windows Server 2016 (level 7). |
Remediation
Raise the AD Forest functional level to the minimum required for the installed Exchange version. All domain controllers in the forest must be running the corresponding Windows Server version before raising the forest functional level.
# Check current forest functional level and raise if required:
# Set-ADForestMode -Identity <ForestFQDN> -ForestMode Windows2012R2ForestConsiderations
Raising the AD forest functional level requires all domain controllers in all domains in the forest to be running the required Windows Server version. The change is irreversible without a full forest recovery. Coordinate with all domain administrators in the forest before proceeding, as the impact spans every domain and every service relying on AD in the entire forest.
References
EDCA-SEC-005: AD site count baseline
Total AD site count MUST be below Exchange performance warning thresholds: >= 750 sites is a warning, >= 1000 sites is a critical performance risk that degrades Exchange directory service lookups.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | Compliant — AD site count is 1, below the warning threshold. |
Remediation
Reduce the number of AD sites. As a workaround, increase the topology cache lifetime to 24 hours by changing ExchangeTopologyCacheLifetime to 1.00:00:00,00:20:00 in %ExchangeInstallPath%\Bin\Microsoft.Exchange.Directory.TopologyService.exe.config.
# Diagnose: List all AD sites visible in the current forest
$forest = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()
"Total AD sites: $(($forest.Sites | Measure-Object).Count)"
$forest.Sites | Select-Object Name | Sort-Object NameConsiderations
Reducing the number of AD sites requires Active Directory topology changes that must be coordinated with the Active Directory team. Unnecessary sites may remain without functional impact but add administrative overhead.
References
EDCA-SEC-006: Setting overrides baseline
Active Exchange setting overrides MUST NOT exist unless the override has been formally approved and documented. Active overrides can suppress critical security or functionality controls.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | 6 setting override(s) detected; all within expected baseline. | |
| ex3 | 6 setting override(s) detected; all within expected baseline. |
Remediation
Remove problematic Setting Overrides using Remove-SettingOverride. Review existing overrides with Get-SettingOverride and remove those flagged by the check. Only modify overrides as directed by Microsoft documentation or CSS support - incorrect usage can cause serious Exchange damage.
Get-SettingOverride | Format-List Name, ComponentName, SectionName, StatusConsiderations
Setting overrides are typically applied by Microsoft support to mitigate specific issues. Removing an override can re-expose the condition that originally required it. Review the purpose of each override with Microsoft before removing it.
The following overrides are expected and should not be treated as an issue:
• EnableSigningVerification: automatically set by Exchange when serialized data signing (EX-BP-054) is enabled.
• EnableExchangeHybrid3PAppFeature and FlightingServiceOverride_<ServerName>_F1.1[.x] (one per server): expected when the dedicated Exchange hybrid application is configured.
• EnableAMSIBodyScan* (e.g., EnableAMSIBodyScanAllProtocols, EnableAMSIBodyScanForEcp, EnableAMSIBodyScanForEws, EnableAMSIBodyScanForOwa, EnableAMSIBodyScanForEcpEwsOwaPS): expected when AMSI body scanning is enabled per-protocol or globally.
• EnableEncryptionAlgorithmCBC: enables AES256-CBC encryption mode for IRM-protected messages (EX-BP-153).
References
EDCA-SEC-007: Visual C++ redistributable version baseline
Visual C++ 2012 x64 and Visual C++ 2013 x64 redistributable runtimes MUST both be installed. Both are required by Exchange components; missing runtimes cause Exchange search and transport failures.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Compliant — Visual C++ 2012 x64 and 2013 x64 redistributables are present. | |
| ex2 | Compliant — Visual C++ 2012 x64 and 2013 x64 redistributables are present. | |
| ex3 | Compliant — Visual C++ 2012 x64 and 2013 x64 redistributables are present. |
Remediation
Install the latest Visual C++ Redistributable version required for the installed Exchange server role from the Microsoft Visual C++ Redistributable Latest Supported Downloads page.
# Diagnose: List installed Visual C++ Redistributable versions
@('HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*','HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*') | ForEach-Object { Get-ItemProperty $_ -ErrorAction SilentlyContinue } | Where-Object { $_.DisplayName -like '*Visual C++*' } | Select-Object DisplayName, DisplayVersion | Sort-Object DisplayNameConsiderations
Updating Visual C++ redistributables typically does not require downtime but may require a server reboot. Only install versions validated by the Exchange Cumulative Update prerequisites documentation for the installed Exchange build.
References
EDCA-SEC-008: Exchange database/log volume block size is 64KB
Volumes hosting Exchange mailbox database and log files SHOULD use 64KB allocation unit size (block size) per the Exchange storage configuration guidelines.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | Database/log volume block size should be 65536 (64KB). - C:\: block size 4096 | |
| ex3 | Database/log volume block size should be 65536 (64KB). - C:\ExchangeDatabases\: block size 4096 |
Remediation
Use 64KB allocation unit size on volumes that host Exchange database/log paths.
# Diagnose: Identify volumes hosting Exchange databases and logs for block size verification
Get-MailboxDatabase -Server $env:COMPUTERNAME | Select-Object Name, EdbFilePath, LogFolderPath
# For each volume run: fsutil fsinfo ntfsinfo <DriveLetter>:
# 'Bytes Per Cluster' should be 65536 (64 KB). Smaller values require reformatting and database migration.Considerations
Changing the block size of existing volumes requires reformatting - all data must be migrated to temporary storage, volumes reformatted, and data restored. This requires a planned maintenance window with database failovers. New volumes should be formatted with 64 KB blocks before use.
References
EDCA-SEC-009: Exchange database/log volumes use NTFS or ReFS
Volumes hosting Exchange mailbox database and log paths SHOULD use supported filesystems NTFS or ReFS.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | Database/log drives validated on supported filesystems (NTFS/ReFS): C: | |
| ex3 | Database/log drives validated on supported filesystems (NTFS/ReFS): C: |
Remediation
Move Exchange database/log files to NTFS or ReFS-formatted volumes.
# Diagnose: Check filesystem type on Exchange-related volumes
Get-WmiObject -Class Win32_Volume | Where-Object { $_.DriveType -eq 3 -and $_.FileSystem -ne 'NTFS' -and $_.FileSystem -ne 'ReFS' } | Select-Object Name, FileSystem
Get-MailboxDatabase -Server $env:COMPUTERNAME | Select-Object Name, EdbFilePath, LogFolderPathConsiderations
Converting an existing FAT32 volume to NTFS or ReFS requires data migration and reformatting if in-place conversion is not supported. ReFS offers resilience advantages but some Exchange administrators prefer NTFS for its wider tool compatibility. Verify ReFS is supported for the Exchange version before using it for database volumes.
References
EDCA-SEC-010: OS volume filesystem is NTFS
The operating system volume SHOULD use NTFS for Exchange server operating system supportability and baseline consistency.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Compliant — system drive C: is NTFS. | |
| ex2 | Compliant — system drive C: is NTFS. | |
| ex3 | Compliant — system drive C: is NTFS. |
Remediation
Use NTFS for the OS volume on Exchange servers.
# Diagnose: Check filesystem type of the boot/OS volume
Get-WmiObject -Class Win32_Volume -Filter 'BootVolume = True' | Select-Object Name, FileSystem, BlockSize
# Exchange is supported only on NTFS OS volumes. ReFS is not supported for the OS drive.Considerations
The OS volume filesystem cannot be changed on a live server without reinstalling the operating system. This control is an environmental prerequisite when provisioning new Exchange servers.
References
EDCA-SEC-011: RPC minimum connection timeout baseline
Exchange RPC minimum connection timeout (RpcMinConnectionTimeout registry value) MUST be non-negative. A value of 0 is treated as not configured; a negative value is an invalid setting.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | Compliant — RPC minimum connection timeout is configured. | |
| ex3 | Compliant — RPC minimum connection timeout is configured. |
Remediation
Adjust the RPC MinConnectionTimeout registry setting to a more aggressive value than the OS defaults if network devices are dropping idle connections before the Exchange timeout triggers.
# Diagnose: Check RPC MinimumConnectionTimeout registry value
$val = (Get-ItemProperty 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\RPC' -Name MinimumConnectionTimeout -ErrorAction SilentlyContinue).MinimumConnectionTimeout
"MinimumConnectionTimeout: $(if ($null -eq $val) { 'not set (OS default)' } else { "$val seconds" })"
# Exchange recommended: 120 seconds. Set: New-ItemProperty 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\RPC' -Name MinimumConnectionTimeout -Value 120 -PropertyType DWord -ForceConsiderations
Adjusting the RPC minimum connection timeout can affect Outlook MAPI connectivity behavior. Changes should be tested against Outlook profile connect/reconnect timing before applying to all servers.
References
EDCA-SEC-012: AMSI integration baseline
At least one AMSI (Antimalware Scan Interface) provider MUST be registered and AMSI MUST NOT be disabled by Exchange setting override. AMSI enables real-time scanning of Exchange HTTP requests against antimalware engines. CISA recommends enabling AMSI integration to detect and block malicious scripts.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | Compliant — 1 AMSI provider(s) registered. | |
| ex3 | Compliant — 1 AMSI provider(s) registered. |
Remediation
Ensure AMSI integration is enabled and no Setting Overrides exist that disable it. If Body Scanning is enabled, verify it is supported on the installed Exchange build version.
Get-SettingOverride | Where-Object { $_.SectionName -like '*AMSI*' } | Format-ListConsiderations
Some third-party antivirus products that replace the Windows Defender AMSI provider may not register an AMSI provider even when active. Verify AMSI integration compatibility with your antivirus vendor before enforcing this control. Incorrectly disabling AMSI can leave Exchange endpoints exposed to script-based attacks.
References
EDCA-SEC-013: Credential Guard disabled on Exchange servers
Each Exchange server MUST have Credential Guard (Virtualization-Based Security) disabled. Microsoft does not support Credential Guard on Exchange servers; enabling it interferes with Exchange service authentication and introduces a performance impact from VBS overhead. Applicability: Windows Server 2019/2022/2025 (build 17763 and later), including Windows Server 2025 where Credential Guard may be active by default.
Note — framework conflict: ANSSI (Recommandations pour l'administration sécurisée des SI reposant sur AD, 2023) and BSI (SYS.1.2.3.A8 — Nutzung des Virtual Secure Mode) recommend enabling Credential Guard on member servers that handle privileged credentials. This recommendation does not apply to Exchange Server because Microsoft states it is unsupported. Organizations subject to ANSSI or BSI compliance must treat Exchange servers as an exception to the Credential Guard enablement requirement and document that exception in their risk register.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Credential Guard is not disabled; OS version: 10.0.26100; build: 26100 | |
| ex2 | Credential Guard is not disabled; OS version: 10.0.26100; build: 26100 | |
| ex3 | Credential Guard is not disabled; OS version: 10.0.26100; build: 26100 |
Remediation
Disable Credential Guard via Windows Defender Credential Guard Group Policy or by setting LsaCfgFlags to 0 under HKLM\SYSTEM\CurrentControlSet\Control\Lsa and EnableVirtualizationBasedSecurity to 0 under HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard. A reboot is required.
# Diagnose: Check whether Credential Guard / VBS is currently enabled
$lsa = Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa' -Name LsaCfgFlags -ErrorAction SilentlyContinue
$dg = Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuard' -Name EnableVirtualizationBasedSecurity -ErrorAction SilentlyContinue
"LsaCfgFlags: $(if ($null -ne $lsa) { $lsa.LsaCfgFlags } else { 'not set' }) (0=disabled, 1=enabled with UEFI lock, 2=enabled without lock)"
"EnableVirtualizationBasedSecurity: $(if ($null -ne $dg) { $dg.EnableVirtualizationBasedSecurity } else { 'not set' }) (0=disabled, 1=enabled)"
# Fix: disable Credential Guard. A reboot is required after making these changes.
# Option 1: via registry (requires reboot)
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa' -Name LsaCfgFlags -Type DWord -Value 0
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuard' -Name EnableVirtualizationBasedSecurity -Type DWord -Value 0
Write-Host 'Credential Guard registry settings cleared. Reboot required to complete deactivation.'
# Option 2: via Group Policy (preferred for domain members)
# Computer Configuration > Administrative Templates > System > Device Guard
# Turn On Virtualization Based Security = DisabledConsiderations
Credential Guard is not supported on Exchange servers because it can interfere with Exchange service authentication. This control documents the required state (disabled). Do not enable Credential Guard on Exchange hosts without explicit Microsoft support guidance.
ANSSI and BSI both recommend Credential Guard on member servers handling privileged credentials (ANSSI AD admin guide 2023; BSI SYS.1.2.3.A8). Exchange servers are an explicit exception to this recommendation due to Microsoft's unsupported-configuration statement. Document this exception in your organization's risk register and reference this control as the formal exception basis.
References
EDCA-SEC-014: Extended Protection enabled on Exchange virtual directories
Each Exchange server MUST have Extended Protection for Authentication (EPA) enabled on all Exchange IIS virtual directories where supported. CISA requires enabling Extended Protection for Authentication on all Exchange virtual directories.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | 1 virtual directory non-compliant. - EX2\Autodiscover (Default Web Site) | |
| ex3 | 1 virtual directory non-compliant. - EX3\Autodiscover (Default Web Site) |
Remediation
Use the ExchangeExtendedProtectionManagement.ps1 script from the CSS-Exchange toolkit (https://microsoft.github.io/CSS-Exchange/Security/ExchangeExtendedProtectionManagement/) from an elevated Exchange Management Shell (EMS) with Organization Management permissions. Before enabling, disable SSL Offloading for Outlook Anywhere if applicable (Exchange 2019 CU14+ does this automatically). Use -ShowExtendedProtection to view current configuration, -PrerequisitesCheckOnly to validate prerequisites, or run without arguments to enable on all servers.
# Download latest script:
# Invoke-WebRequest -Uri 'https://github.com/microsoft/CSS-Exchange/releases/latest/download/ExchangeExtendedProtectionManagement.ps1' -OutFile '.\ExchangeExtendedProtectionManagement.ps1'
# View current Extended Protection configuration:
.\ExchangeExtendedProtectionManagement.ps1 -ShowExtendedProtection
# Check prerequisites without making changes:
.\ExchangeExtendedProtectionManagement.ps1 -PrerequisitesCheckOnly
# Enable Extended Protection on all Exchange servers (recommended):
.\ExchangeExtendedProtectionManagement.ps1
# Enable on specific servers only:
.\ExchangeExtendedProtectionManagement.ps1 -ExchangeServerNames Server1, Server2
# Modern Hybrid (skip EWS Front End on Hybrid Agent servers):
.\ExchangeExtendedProtectionManagement.ps1 -ExchangeServerNames HybridServer1 -ExcludeVirtualDirectories EWSFrontEnd
# Before enabling, disable SSL Offloading for Outlook Anywhere if applicable:
Set-OutlookAnywhere -Identity 'Server\Rpc (Default Web Site)' -SSLOffloading $false -InternalClientAuthenticationMethod NTLM -ExternalClientAuthenticationMethod NTLMConsiderations
• Enabling Extended Protection can break Outlook connectivity in some older hybrid configurations and may require configuration changes to specific virtual directories (e.g., EWS, AutoDiscover). Microsoft recommends thorough testing in a non-production environment first. Some older Outlook clients and third-party EWS integrations may not be compatible with Extended Protection.
• SSL Offloading is incompatible with Extended Protection: if a load balancer terminates TLS and forwards plain HTTP to Exchange (SSL Offloading), the Channel Binding Token check will fail and all client connections will be blocked after Extended Protection is enabled. SSL Offloading must be disabled before enabling Extended Protection. SSL Bridging (re-encrypt at the load balancer using the same certificate as Exchange) is supported. Exchange 2019 CU14 and later automatically disables SSL Offloading for Outlook Anywhere during setup.
• Extended Protection is incompatible with NTLMv1: Channel Binding Tokens (CBT) used by Extended Protection are not supported by NTLMv1. Any client or Exchange server configured to use NTLMv1 will receive repeated password prompts with no way to authenticate successfully once Extended Protection is enabled. Before enabling Extended Protection, ensure NTLMv1 is disabled on all clients and Exchange servers by setting the LmCompatibilityLevel registry value (HKLM\System\CurrentControlSet\Control\Lsa) to at least 3 (Send NTLMv2 response only); the recommended value is 5 (Send NTLMv2 response only. Refuse LM & NTLM). This can be managed centrally via Group Policy (Computer Configuration > Windows Settings > Security Settings > Local Policies > Security Options > Network security: LAN Manager authentication level). See EDCA-SEC-047 for the related NTLMv1 disabled control.
References
- Microsoft Exchange Extended Protection guidance
- ENISA / NIS2 Directive (EU) 2022/2555 - Article 21(2)(i)(j): access control and multi-factor authentication - Section 11.5-11.7, 11.3, 10, 2.2
- CIS Microsoft Exchange Server Benchmark
- CIS Microsoft Exchange Server 2019 Benchmark v1.0.0: Ensure Extended Protection is Enabled on Exchange virtual directories
- CISA AA21-062A: Mitigate Microsoft Exchange Server Vulnerabilities - enable Extended Protection for Authentication on all Exchange virtual directories
- BSI APP.5.2.A9 — Sichere Konfiguration von Exchange-Servern
- BSI APP.5.2.A12 — Einsatz von Outlook Anywhere, MAPI over HTTP und Outlook im Web
EDCA-SEC-015: FIP-FS baseline
FIP-FS engine version folders MUST NOT contain known-problematic version markers. Known-problematic FIP-FS engine versions cause Exchange transport queue failures and mail flow stoppage.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | FIP-FS engine folders do not include known problematic version markers. | |
| ex3 | FIP-FS engine folders do not include known problematic version markers. |
Remediation
Run Reset-ScanEngineVersion.ps1 from the CSS-Exchange toolkit to remove the problematic FIP-FS scan engine version folder (2201010000 or higher). On fixed Exchange builds, delete the folder manually or restart the Transport service.
# Diagnose: Check FIP-FS scan engine version (versions >= 2201010000 caused the Y2K22 bug on unpatched Exchange)
$exchPath = $exinstall
Get-ChildItem (Join-Path $exchPath 'FIP-FS\Data\Engines\amd64\Microsoft') -Directory -ErrorAction SilentlyContinue | Select-Object Name, LastWriteTime | Sort-Object Name
Get-Service MSExchangeTransport | Select-Object Name, StatusConsiderations
FIP-FS (File Inspection for Filtering) is used by the Exchange transport pipeline for content filtering. FIP-FS failures typically indicate scan engine issues. Repair or reinstallation of the scan engine may temporarily disable content filtering. Review impact on transport rules and malware filtering before proceeding.
References
EDCA-SEC-016: IIS web.config baseline
All Exchange IIS web.config files MUST be present and contain valid XML. Missing or corrupt web.config files cause failures in virtual directories including OWA, ECP, EWS, and Autodiscover.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | Compliant — all 8 IIS web.config files are present and valid. | |
| ex3 | Compliant — all 8 IIS web.config files are present and valid. |
Remediation
Replace all %ExchangeInstallDir% placeholder tokens in Exchange web.config and SharedWebConfig.config files with the actual Exchange installation path.
# Diagnose: Scan for unresolved %ExchangeInstallDir% placeholder tokens in Exchange web.config files
$exchPath = $exinstall
Get-ChildItem $exchPath -Filter 'web.config' -Recurse -ErrorAction SilentlyContinue | Select-String '%ExchangeInstallDir%' | Select-Object Path, LineNumber, Line | Format-Table -AutoSizeConsiderations
Modifying IIS web.config files for Exchange virtual directories can break authentication, HTTPS bindings, or client connectivity. Only apply changes that are explicitly documented in Exchange configuration guidance. Back up web.config files before making any manual changes.
References
EDCA-SEC-017: IPv6 enabled baseline
IPv6 MUST NOT be fully disabled (DisabledComponents registry value MUST NOT be 255 = 0xFF). Exchange 2013 and later require IPv6 for internal communication; fully disabling IPv6 causes transport and directory failures.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | IPv6 disabled-components policy is not set (IPv6 enabled baseline by default). | |
| ex2 | IPv6 disabled-components policy is not set (IPv6 enabled baseline by default). | |
| ex3 | IPv6 disabled-components policy is not set (IPv6 enabled baseline by default). |
Remediation
If disabling IPv6, disable it consistently both on the NIC adapters and in the registry under HKLM\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters (DisabledComponents). Partial disabling causes more problems than leaving IPv6 enabled.
# Diagnose: Check IPv6 DisabledComponents registry value and adapter binding state
$val = (Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters' -Name DisabledComponents -ErrorAction SilentlyContinue).DisabledComponents
"DisabledComponents: $(if ($null -eq $val) { 'not set (IPv6 fully enabled - default)' } else { '0x{0:X2} ({0})' -f $val })"
Get-NetAdapterBinding -ComponentID 'ms_tcpip6' | Select-Object Name, EnabledConsiderations
Completely disabling IPv6 at the OS level is not recommended by Microsoft and can cause issues with Windows Server networking stack and Active Directory on Server 2019 and later. Use the Exchange CSS guidance - which configures specific IPv6 bindings - rather than disabling IPv6 entirely. Exchange Server itself does not require IPv6 but the Windows stack does.
References
EDCA-SEC-018: LLMNR disabled by policy
Each Exchange server MUST have LLMNR (Link-Local Multicast Name Resolution) disabled. LLMNR enables spoofing and NTLM downgrade attacks against domain-joined hosts. The CIS benchmark requires the Group Policy setting 'Turn off multicast name resolution' (LLMNR) to be set to 'Enabled'.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | LLMNR policy value not configured. | |
| ex2 | LLMNR policy value not configured. | |
| ex3 | LLMNR policy value not configured. |
Remediation
Disable LLMNR using DNS client policy registry key.
# Group Policy equivalent:
# Computer Configuration > Administrative Templates > Network > DNS Client
# Turn off Multicast Name Resolution = Enabled
#
New-Item -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\DNSClient' -Force | Out-Null; Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\DNSClient' -Name EnableMulticast -Type DWord -Value 0Considerations
Disabling LLMNR requires a Group Policy change. This affects all Windows name resolution on the network segment, not just Exchange. LLMNR is commonly exploited in NTLM relay attack scenarios (e.g., Responder). Disabling LLMNR is low-risk for environments with properly configured DNS.
References
EDCA-SEC-019: Microsoft Defender antivirus exclusions configured for Exchange
When Microsoft Defender real-time protection is active on an Exchange server, the recommended folder and process exclusions MUST be configured to prevent Defender from interfering with Exchange databases, transport queues, and critical processes. The following folder exclusions are checked (per Microsoft documentation and CSS-Exchange Set-ExchAVExclusions.ps1):
• \Mailbox
• \ClientAccess\OAB
• \FIP-FS
• \GroupMetrics
• \Logging
• \TransportRoles\Data\Queue
• \TransportRoles\Data\SenderReputation
• \TransportRoles\Data\Temp
• \TransportRoles\Logs
• \Working\OleConverter
Exchange 2016 additionally requires:
• \UnifiedMessaging\Grammars
• \UnifiedMessaging\Prompts
• \UnifiedMessaging\Temp
• \UnifiedMessaging\Voicemail
CISA recommends configuring Microsoft Defender antivirus with the correct Exchange-specific exclusions.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Compliant — all expected Exchange Defender exclusion paths and processes are configured. | |
| ex2 | Compliant — all expected Exchange Defender exclusion paths and processes are configured. | |
| ex3 | Compliant — all expected Exchange Defender exclusion paths and processes are configured. |
Remediation
Use the CSS-Exchange Set-ExchAVExclusions.ps1 script to automatically configure all required Microsoft Defender exclusions for the installed Exchange version. Run from an elevated Exchange Management Shell on each Exchange server: .\Set-ExchAVExclusions.ps1 The script auto-detects the Exchange install path and version and sets all recommended folder and process exclusions. To list all expected exclusions without applying them, use the -ListRecommendedExclusions switch: .\Set-ExchAVExclusions.ps1 -ListRecommendedExclusions To test whether exclusions are correctly applied, use the separate Test-ExchAVExclusions.ps1 script (https://microsoft.github.io/CSS-Exchange/Diagnostics/Test-ExchAVExclusions/). The script is available from https://aka.ms/ExchAVExclusions. Alternatively, add exclusions manually using Set-MpPreference or Add-MpPreference - verify paths match the Exchange install path for the installed version.
# Download and run Set-ExchAVExclusions.ps1 (requires elevated Exchange Management Shell)
# https://aka.ms/ExchAVExclusions
# List all expected exclusions without applying them:
# .\Set-ExchAVExclusions.ps1 -ListRecommendedExclusions
# Test whether exclusions are properly applied (separate script):
# .\Test-ExchAVExclusions.ps1 # https://microsoft.github.io/CSS-Exchange/Diagnostics/Test-ExchAVExclusions/
# Apply all recommended exclusions:
# .\Set-ExchAVExclusions.ps1
# Review currently configured exclusions:
Get-MpPreference | Select-Object -ExpandProperty ExclusionPath
Get-MpPreference | Select-Object -ExpandProperty ExclusionProcessConsiderations
Microsoft Defender antivirus exclusions for Exchange must be kept current as Exchange paths evolve across Cumulative Updates. EDCA checks the specific folder paths listed in the Microsoft documentation; a parent-folder exclusion (e.g. excluding the entire \TransportRoles tree) is treated as covering all required subdirectories. The CSS-Exchange Set-ExchAVExclusions.ps1 script resolves individual database and log paths dynamically, so running that script on a server with default database locations will satisfy the \Mailbox check. Exclusions should be validated against the current Microsoft-recommended list for the installed Exchange version.
References
- Running Windows antivirus software on Exchange servers
- CISA AA21-062A: Mitigate Microsoft Exchange Server Vulnerabilities - configure Microsoft Defender antivirus with correct Exchange-specific exclusions
- DISA STIG EX19-MB-000134 (HIGH): Exchange servers must have an approved DOD email-aware virus protection software installed (V-259686)
- CSS-Exchange Set-ExchAVExclusions script
- BSI SYS.1.1.A9 — Einsatz von Virenschutz-Programmen auf Servern
- BSI APP.5.2.A9 — Sichere Konfiguration von Exchange-Servern
EDCA-SEC-020: OWA Download Domains configured
OWA Download Domains (ExternalDownloadHostName) MUST be configured. Without a separate download domain, OWA attachment rendering shares origin with ECP/OWA, creating cross-site scripting (XSS) attack surface. CISA recommends configuring OWA Download Domains to prevent NTLM relay attacks. When Hybrid Modern Authentication (HMA) is active, the OAuthIdentityCacheFixForDownloadDomains setting override must also be configured to ensure OWA HMA token caching functions with Download Domains.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | OWA Download Domains are not configured. | |
| ex3 | OWA Download Domains are not configured. |
Remediation
Configure OWA download domains according to Exchange security best practices. If Hybrid Modern Authentication is active, also apply the OWA HMA Download Domain Support setting override.
# Diagnose: Check OWA virtual directory DownloadDomains configuration
Get-OwaVirtualDirectory -Server $env:COMPUTERNAME | Select-Object Server, Name, DownloadDomains, ExternalUrl, InternalUrl | Format-List
# Diagnose: Check if the OWA HMA Download Domain Support override is configured
Get-SettingOverride | Where-Object { $_.ComponentName -eq 'OAuth' -and $_.SectionName -eq 'OAuthIdentityCacheFixForDownloadDomains' }
# If Hybrid Modern Authentication is active and the override is missing, configure it:
New-SettingOverride -Name "OWA HMA Download Domain Support" -Component "OAuth" -Section "OAuthIdentityCacheFixForDownloadDomains" -Parameters ("Enabled=true") -Reason "Enable support for OWA HMA when Download Domains are in use"
Get-ExchangeDiagnosticInfo -Process Microsoft.Exchange.Directory.TopologyService -Component VariantConfiguration -Argument Refresh
Restart-Service -Name W3SVC, WAS -ForceConsiderations
Configuring OWA Download Domains creates a separate subdomain (e.g., attachments.domain.com) for serving attachment content. This requires DNS configuration and possibly additional SSL certificate coverage for the new subdomain. After configuration, browser clients will be redirected to the attachment domain when downloading from OWA. When HMA is active, the OAuthIdentityCacheFixForDownloadDomains setting override ensures OWA HMA token identity caching is compatible with Download Domains. Restart-Service on W3SVC and WAS will briefly interrupt web services - schedule during a maintenance window.
References
EDCA-SEC-021: POP3 and IMAP services disabled unless explicitly required
Each Exchange server MUST have POP3 and IMAP4 services disabled unless the organization has a documented requirement for their use. The CIS benchmark requires the POP3 and IMAP4 Windows services to be set to 'Disabled'.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | Compliant — POP3 and IMAP4 services are not running. | |
| ex3 | Compliant — POP3 and IMAP4 services are not running. |
Remediation
Disable POP3 and IMAP4 Exchange services when not required.
Set-Service -Name MSExchangePOP3 -StartupType Disabled
Stop-Service -Name MSExchangePOP3 -ErrorAction SilentlyContinue
Set-Service -Name MSExchangePOP3BE -StartupType Disabled
Stop-Service -Name MSExchangePOP3BE -ErrorAction SilentlyContinue
Set-Service -Name MSExchangeIMAP4 -StartupType Disabled
Stop-Service -Name MSExchangeIMAP4 -ErrorAction SilentlyContinue
Set-Service -Name MSExchangeIMAP4BE -StartupType Disabled
Stop-Service -Name MSExchangeIMAP4BE -ErrorAction SilentlyContinueConsiderations
If POP3 or IMAP4 services are actively used by clients (mobile devices, legacy mail clients, monitoring systems), disabling them will cause connectivity failures. Audit client usage before disabling these services. If these services are required, ensure they are explicitly permitted and secured with TLS.
References
- Exchange POP3 and IMAP4 service management
- CIS Microsoft Exchange Server Benchmark
- CIS 2.4.1 (L1): Ensure 'POP3' Windows services are set to 'Disabled'
- CIS 2.4.2 (L1): Ensure 'IMAP4' Windows services are set to 'Disabled'
- V-259667 The Exchange IMAP4 service must be disabled (EX19-MB-000065)
- V-259668 The Exchange POP3 service must be disabled (EX19-MB-000066)
- BSI SYS.1.1.A6 — Deaktivierung nicht benötigter Dienste
- BSI APP.5.2.A9 — Sichere Konfiguration von Exchange-Servern
EDCA-SEC-022: PowerShell execution policy is not unrestricted
PowerShell execution policy MUST NOT be set to Unrestricted or Bypass on Exchange servers. Permissive execution policies allow unsigned scripts to run freely, increasing risk of malicious script execution.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Compliant — execution policy is RemoteSigned. | |
| ex2 | Compliant — execution policy is RemoteSigned. | |
| ex3 | Compliant — execution policy is RemoteSigned. |
Remediation
Set local machine execution policy to RemoteSigned.
# Group Policy equivalent:
# Computer Configuration > Administrative Templates > Windows Components > Windows PowerShell
# Turn on Script Execution = Enabled (Allow only signed scripts / Allow local scripts and remote signed scripts)
#
Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy RemoteSigned -ForceConsiderations
Changing the PowerShell execution policy to AllSigned or RemoteSigned will prevent unsigned scripts from running. Audit all scripts used for Exchange management and automation before enforcing a restrictive policy. Scripts used by monitoring tools or automation systems may fail if not properly signed.
References
- V-259664 Exchange local machine policy must require signed scripts (EX19-MB-000061)
- ENISA / NIS2 Directive (EU) 2022/2555 - Article 21(2)(i)(j): access control and multi-factor authentication - Section 11.5-11.7, 11.3, 10, 2.2
- ANSSI - Mise en œuvre sécurisée d'un serveur Windows membre AD DS (2025)
- BSI SYS.1.2.3.A7 — Verwendung der Windows PowerShell
- about_Execution_Policies
EDCA-SEC-023: SMBv1 server protocol is disabled
Each Exchange server MUST have SMBv1 disabled and the SMBv1 Windows feature removed. SMBv1 is obsolete and is the propagation mechanism for WannaCry and NotPetya. The CIS benchmark requires 'Configure SMBv1 Server' to be 'Disabled'.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | SMB1 registry value not present (treated as disabled by default baseline). | |
| ex2 | SMB1 registry value not present (treated as disabled by default baseline). | |
| ex3 | SMB1 registry value not present (treated as disabled by default baseline). |
Remediation
Disable SMBv1 using the SMB server configuration cmdlet and remove the Windows optional feature.
# Group Policy equivalent (requires MS Security Guide ADMX templates):
# Computer Configuration > Administrative Templates > MS Security Guide
# Configure SMBv1 Server = Disabled
# Configure SMBv1 client driver = Enabled (Disable driver)
#
Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force
Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -NoRestartConsiderations
Disabling SMBv1 will prevent file sharing with Windows XP and Windows Server 2003 clients or servers. In modern environments this is typically safe. Verify there are no legacy systems (e.g., old printers, NAS devices, or monitoring appliances) on the network that require SMBv1 before disabling.
References
- CIS Microsoft Windows Server Benchmark
- SMB security hardening guidance
- CIS 4.8 (IG1): Uninstall or Disable Unnecessary Services on Enterprise Assets and Software
- ANSSI - Mise en œuvre sécurisée d'un serveur Windows membre AD DS (2025)
- BSI SYS.1.2.3.A4 — Schutz vor Ausnutzung von Schwachstellen in Anwendungen
EDCA-SEC-024: Vulnerability baseline
Exchange version MUST be at Exchange SE lifecycle baseline. Exchange 2016 and Exchange 2019 reached end of mainstream support and represent lifecycle-based vulnerability exposure that requires migration to Exchange SE.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Exchange SE detected. Dedicated vulnerability report data is not available in this run; maintain Security Update currency. | |
| ex2 | Exchange SE detected. Dedicated vulnerability report data is not available in this run; maintain Security Update currency. | |
| ex3 | Exchange SE detected. Dedicated vulnerability report data is not available in this run; maintain Security Update currency. |
Remediation
Apply the latest Exchange security updates to remediate known vulnerabilities. Address specific CVEs flagged by the check including SMBv3 (CVE-2020-0796), .NET (CVE-2020-1147), and download domain issues (CVE-2021-1730).
# Diagnose: Check Exchange build version and SMBv1 status
Get-ExchangeServer | Select-Object Name, AdminDisplayVersion, Edition | Format-Table -AutoSize
# Compare build numbers at: https://learn.microsoft.com/exchange/new-features/build-numbers
Get-SmbServerConfiguration | Select-Object EnableSMB1Protocol
# SMBv1 should be disabled - Exchange does not require it.Considerations
Applying Exchange security patches requires scheduled downtime and thorough regression testing. Patches may change default configuration, IIS bindings, or service behavior. Use DAG maintenance mode and test mail flow and client connectivity after each patch.
References
EDCA-SEC-025: Windows Firewall enabled for all profiles
Each Exchange server MUST have Windows Firewall enabled for all three profiles (Domain, Private, and Public). Disabled firewall profiles expose Exchange ports to unfiltered network access. CIS (Sections 9.1.1, 9.2.1, and 9.3.1 L1) requires Windows Firewall to be enabled for all three profiles.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | All firewall profiles are enabled. - Domain:enabled - Private:enabled - Public:enabled | |
| ex2 | All firewall profiles are enabled. - Domain:enabled - Private:enabled - Public:enabled | |
| ex3 | All firewall profiles are enabled. - Domain:enabled - Private:enabled - Public:enabled |
Remediation
Enable all Windows Firewall profiles.
# Group Policy equivalent:
# Computer Configuration > Windows Settings > Security Settings
# Windows Defender Firewall with Advanced Security
# Domain / Private / Public Profile > Firewall state = On
#
Set-NetFirewallProfile -Profile Domain,Private,Public -Enabled TrueConsiderations
The Windows Firewall must include all Exchange-required inbound and outbound port rules before enabling. Missing rules will block SMTP transport, client access, or management traffic. Review Exchange port requirements for all installed roles before enabling the firewall. Monitor event logs for blocked connections after enforcement.
References
- CIS Microsoft Windows Server Benchmark
- Windows Defender Firewall with Advanced Security
- CIS 9.1.1 (L1): Ensure 'Windows Firewall: Domain: Firewall state' is set to 'On'
- CIS 9.2.1 (L1): Ensure 'Windows Firewall: Private: Firewall state' is set to 'On'
- CIS 9.3.1 (L1): Ensure 'Windows Firewall: Public: Firewall state' is set to 'On'
- ENISA / NIS2 Directive (EU) 2022/2555 - Article 21(2)(e): network and information systems security - Section 6.3, 6.4, 3.2-3.4
- ANSSI - Mise en œuvre sécurisée d'un serveur Windows membre AD DS (2025)
- BSI SYS.1.1.A19 — Einrichtung lokaler Paketfilter
EDCA-SEC-026: Microsoft Defender real-time protection enabled
Each Exchange server MUST have Microsoft Defender Antivirus real-time protection enabled when Defender is the active antivirus solution. CIS Controls v8 requires deploying and maintaining anti-malware software.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Defender real-time protection is enabled; OS version: 10.0.26100; build: 26100 | |
| ex2 | Defender real-time protection is enabled; OS version: 10.0.26100; build: 26100 | |
| ex3 | Defender real-time protection is enabled; OS version: 10.0.26100; build: 26100 |
Remediation
Enable Defender real-time monitoring.
# Group Policy equivalent:
# Computer Configuration > Administrative Templates > Windows Components > Microsoft Defender Antivirus > Real-time Protection
# Turn off real-time protection = Disabled (Disabled policy = real-time protection ON)
#
Set-MpPreference -DisableRealtimeMonitoring $falseConsiderations
Microsoft Defender real-time protection on Exchange servers must be configured with correct Exchange-specific exclusions to avoid false positives and performance degradation. Enabling real-time protection without the correct exclusions can cause database corruption or transport stalls. Verify all Microsoft-recommended exclusions are in place before enabling.
References
EDCA-SEC-027: IIS loaded modules are signed and trusted
Detect unsigned or untrusted IIS modules that can represent security risk on Exchange hosts.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | IIS modules analyzed. Unsigned=0; Non-Microsoft signed=0; Invalid signatures=0. | |
| ex3 | IIS modules analyzed. Unsigned=0; Non-Microsoft signed=0; Invalid signatures=0. |
Remediation
Remove or replace unsigned/untrusted IIS modules and validate module chain-of-trust.
# Diagnose: List IIS global modules and check Authenticode signature status
Import-Module WebAdministration -ErrorAction SilentlyContinue
Get-WebConfiguration 'system.webServer/globalModules/*' | Select-Object Name, Image | ForEach-Object { $sig = Get-AuthenticodeSignature $_.Image -ErrorAction SilentlyContinue; [PSCustomObject]@{ Name=$_.Name; SignatureStatus=$sig.Status; SignedBy=$sig.SignerCertificate.Subject } }Considerations
Unsigned or untrusted IIS modules in Exchange virtual directories may have been installed by Exchange patches or third-party products. Removing a module required by Exchange or a legitimate third-party product will break the associated Exchange functionality. Verify the purpose of each flagged module before removal.
References
EDCA-SEC-028: Dynamic memory disabled for virtualized Exchange hosts
Virtualized Exchange hosts MUST NOT use dynamic memory allocation. Dynamic memory causes unpredictable memory pressure on the Exchange JET database cache (store.exe) and the transport service, which can trigger out-of-memory crashes, transport stalls, and inconsistent client response times. Exchange sizing guidance always specifies static memory allocation sized to the calculated user and mailbox load.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Dynamic memory not detected. Counter reports 16 GB and physical memory is 16 GB. | |
| ex2 | Dynamic memory not detected. Counter reports 16 GB and physical memory is 16 GB. | |
| ex3 | Dynamic memory not detected. Counter reports 16 GB and physical memory is 16 GB. |
Remediation
Disable dynamic memory for Exchange virtual machines and align reserved/maximum memory with sizing guidance.
# Diagnose: Check virtualization platform and physical memory configuration
Get-WmiObject -Class Win32_ComputerSystem | Select-Object Manufacturer, Model, @{N='TotalRAMGB';E={[math]::Round($_.TotalPhysicalMemory/1GB,2)}}
# If hosted on Hyper-V, check on the host: Get-VM -Name $env:COMPUTERNAME | Select-Object DynamicMemoryEnabled
# Dynamic memory must be disabled in hypervisor settings to prevent Exchange memory pressure.Considerations
Dynamic memory for Exchange VMs creates unpredictable memory pressure that can cause Exchange process crashes and transport stalls. If dynamic memory is currently enabled, disabling it requires coordination with the virtualization team and a VM reboot. The VM should be sized with static memory according to Exchange sizing guidelines.
References
EDCA-SEC-029: MSMQ feature not installed on Exchange hosts
Each Exchange server MUST have MSMQ-related Windows features removed. MSMQ is not required for Exchange 2016, 2019, or Exchange SE and increases the attack surface without operational benefit.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | MSMQ-related Windows features are not installed. | |
| ex2 | MSMQ-related Windows features are not installed. | |
| ex3 | MSMQ-related Windows features are not installed. |
Remediation
Review dependency impact and remove MSMQ-related Windows features if not explicitly required.
# Diagnose: Check if MSMQ Windows feature is installed
Get-WindowsFeature MSMQ* | Select-Object Name, DisplayName, Installed
# MSMQ is not required by Exchange. Uninstall if no other workload depends on it:
# Uninstall-WindowsFeature MSMQConsiderations
MSMQ on Exchange servers is not typically required and can introduce attack surface. Removing the MSMQ Windows feature requires a server reboot. Verify no Exchange services or third-party products depend on MSMQ before removing it.
References
EDCA-SEC-030: DisableAsyncNotification reset to baseline
The DisableAsyncNotification registry value MUST be set to 0 on each Exchange server. A value of 1 was a temporary mitigation for a specific Exchange vulnerability and must be restored to 0 to avoid degraded push notification performance.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | DisableAsyncNotification is not configured (baseline default behavior). | |
| ex3 | DisableAsyncNotification is not configured (baseline default behavior). |
Remediation
Reset DisableAsyncNotification to 0 in Exchange registry root.
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\ExchangeServer\v15' -Name DisableAsyncNotification -Type DWord -Value 0Considerations
The DisableAsyncNotification registry value was introduced as a mitigation for a specific Exchange issue. If it is set incorrectly it can affect push notification delivery for OWA and Outlook. Only reset this value if it has drifted from the baseline without explicit support guidance.
References
EDCA-SEC-031: TokenCacheModule loaded status reviewed
The IIS TokenCacheModule MUST be present on all Exchange servers running builds that include the August 2023 Security Update or later. Microsoft added TokenCacheModule to Exchange IIS configuration as the permanent remediation for CVE-2023-21709 (privilege escalation via elevation of service account) and CVE-2023-36434. Its presence on a fully-patched Exchange build is expected and correct. Absence of the module on a patched server indicates it was accidentally removed or the security update was rolled back, leaving the server exposed to both CVEs.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | TokenCacheModule is loaded in IIS global modules. | |
| ex3 | TokenCacheModule is loaded in IIS global modules. |
Remediation
If TokenCacheModule is present, no action is required — this is the expected state on a patched server. If TokenCacheModule is absent on a server running Exchange 2019 CU13 or later (or Exchange SE), re-run Exchange Setup /Mode:Upgrade to restore the module, or re-apply the August 2023 Security Update. Do not manually remove TokenCacheModule from IIS; doing so re-exposes the server to CVE-2023-21709 and CVE-2023-36434.
# Diagnose: Check if TokenCacheModule is loaded in IIS global modules
Import-Module WebAdministration -ErrorAction SilentlyContinue
Get-WebConfiguration 'system.webServer/globalModules/*' | Where-Object { $_.Name -eq 'TokenCacheModule' } | Select-Object Name, Image
Get-ExchangeServer $env:COMPUTERNAME | Select-Object Name, AdminDisplayVersion
# If TokenCacheModule is present on November 2021-patched Exchange, apply KB5008631 rollback guidance.Considerations
The TokenCacheModule mitigates CVE-2023-21709 and CVE-2023-36434. Removing it would re-expose the server to these vulnerabilities. If the module is not present after patching, check whether the rollback procedure was applied and re-apply the Exchange patch that includes the module.
References
EDCA-SEC-032: P2 FROM header manipulation detection is not disabled
The Exchange P2 FROM header manipulation detection MUST remain enabled and MUST NOT be suppressed through setting overrides. CISA recommends enabling P2 FROM header manipulation detection to reduce spoofing risk.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | No P2 FROM detection disabling overrides detected in Exchange setting overrides. |
Remediation
Remove Exchange setting overrides that disable P2 FROM detection disclaimer/header actions.
Get-SettingOverride | Where-Object { $_.Name -match 'DisableP2FromRegexMatch' } | Remove-SettingOverride -Confirm:$false
Get-ExchangeDiagnosticInfo -Process Microsoft.Exchange.Directory.TopologyService -Component VariantConfiguration -Argument Refresh
Restart-Service -Name MSExchangeTransportConsiderations
Enabling P2 FROM header detection may cause some forwarded messages or messages from systems that rewrite headers to be rejected. Test with monitoring enabled (log-only mode if supported) before enforcement. This control reduces spoofing risk but must be validated against legitimate internal forwarding scenarios.
References
EDCA-SEC-033: Transport pickup directory path is not configured
The PickupDirectoryPath property of the Transport service MUST be empty (not set). A configured pickup directory allows local processes to inject mail without authentication by dropping files into a folder. The CIS benchmark requires the pickup directory path to be cleared.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | PickupDirectoryPath is configured on this server: C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\Pickup | |
| ex3 | PickupDirectoryPath is configured on this server: C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\Pickup |
Remediation
Clear the PickupDirectoryPath on each transport service instance.
# Clear the pickup directory path on the local transport service.
Set-TransportService -Identity $env:COMPUTERNAME -PickupDirectoryPath $nullConsiderations
Clearing the pickup directory disables the file-based mail injection mechanism. Ensure no legitimate applications or scripts rely on this path before making the change.
References
EDCA-SEC-034: Exchange anti-spam filtering is installed, enabled, and configured
Exchange MUST have anti-spam filtering installed, enabled, and configured. Four transport agents are required: Content Filter Agent (controlled via Get-/Set-ContentFilterConfig), Sender Filter Agent (Get-/Set-SenderFilterConfig), Sender Id Agent (Get-/Set-SenderIdConfig), and Protocol Analysis Agent (Get-/Set-SenderReputationConfig). On Mailbox servers these agents are not installed by default and must be added by running the Install-AntiSpamAgents.ps1 script included with Exchange. On Edge Transport servers all four agents are present from initial installation. Each agent must be present, enabled at the transport layer (Enable-TransportAgent), and have filtering enabled in its corresponding configuration.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | All required anti-spam agents (Content Filter, Sender Filter, Sender ID, Protocol Analysis) are present, enabled, and configured. | |
| ex2 | All required anti-spam agents (Content Filter, Sender Filter, Sender ID, Protocol Analysis) are present, enabled, and configured. | |
| ex3 | All required anti-spam agents (Content Filter, Sender Filter, Sender ID, Protocol Analysis) are present, enabled, and configured. |
Remediation
On Mailbox servers, run the Install-AntiSpamAgents.ps1 script provided with Exchange to install the anti-spam transport agents, then restart the Microsoft Exchange Transport service. Enable each agent using Enable-TransportAgent and verify filtering is enabled using the corresponding configuration cmdlet: Set-ContentFilterConfig -Enabled $true, Set-SenderFilterConfig -Enabled $true, Set-SenderIdConfig -Enabled $true, Set-SenderReputationConfig -Enabled $true. On Edge Transport servers the agents are installed by default; only the enabled state needs verification.
# Check transport agent state
Get-TransportAgent | Where-Object { $_.Identity -in 'Content Filter Agent', 'Sender Filter Agent', 'Sender Id Agent', 'Protocol Analysis Agent' } | Select-Object Identity, Enabled
# Check config-level enabled state for each agent
Get-ContentFilterConfig | Select-Object Enabled
Get-SenderFilterConfig | Select-Object Enabled
Get-SenderIdConfig | Select-Object Enabled
Get-SenderReputationConfig | Select-Object Enabled
# Install anti-spam agents on a Mailbox server (not required on Edge Transport — agents are present by default)
# Run Install-AntiSpamAgents.ps1 from the Exchange Management Shell on the Mailbox server
# Restart the transport service after installation
Restart-Service MSExchangeTransport
# Enable each required anti-spam agent at the transport layer
Enable-TransportAgent -Identity 'Content Filter Agent'
Enable-TransportAgent -Identity 'Sender Filter Agent'
Enable-TransportAgent -Identity 'Sender Id Agent'
Enable-TransportAgent -Identity 'Protocol Analysis Agent'
# Enable filtering at the configuration level
Set-ContentFilterConfig -Enabled $true
Set-SenderFilterConfig -Enabled $true
Set-SenderIdConfig -Enabled $true
Set-SenderReputationConfig -Enabled $true
# Example: specify internal SMTP relay servers that should bypass spam filtering
# Set-TransportConfig -InternalSMTPServers @{Add = '10.0.0.1', '10.0.0.2'}Considerations
Anti-spam agents are not installed by default on Mailbox servers. In hybrid deployments using EOP or Defender for Office 365 for cloud-based spam filtering, on-premises anti-spam may be intentionally disabled. Document the anti-spam technology in use and ensure it meets DISA requirements if these agents are not used.
References
- V-259689 Exchange must have anti-spam filtering installed (EX19-MB-000137)
- V-259690 Exchange must have anti-spam filtering enabled (EX19-MB-000138)
- V-259691 Exchange must have anti-spam filtering configured (EX19-MB-000139)
- Anti-spam protection in Exchange Server
- BSI APP.5.2.A9 — Sichere Konfiguration von Exchange-Servern
EDCA-SEC-035: Exchange application directory is protected from unauthorized access
The Exchange application directory MUST be protected from unauthorized access. NTFS ACLs on the Exchange installation directory must restrict write access to privileged accounts (Exchange trusted subsystem, local administrators, SYSTEM). Overly permissive file system permissions allow attackers to replace Exchange binaries or configuration files, compromising the entire email platform.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Exchange install directory (C:\Program Files\Microsoft\Exchange Server\V15\) ACL contains only standard principals with appropriate permissions. | |
| ex2 | Exchange install directory (C:\Program Files\Microsoft\Exchange Server\V15\) ACL contains only standard principals with appropriate permissions. | |
| ex3 | Exchange install directory (C:\Program Files\Microsoft\Exchange Server\V15\) ACL contains only standard principals with appropriate permissions. |
Remediation
Review and tighten NTFS ACLs on the Exchange installation directory (default: %ExchangeInstallPath%).
# Diagnose: Review NTFS ACLs on the Exchange installation directory.
(Get-Acl $exinstall).Access | Select-Object IdentityReference, FileSystemRights, AccessControlType, IsInherited | Sort-Object IdentityReference | Format-Table -AutoSize
# Verify that only privileged principals (SYSTEM, Administrators, Exchange Trusted Subsystem) have Write or FullControl.
# Unexpected Write or FullControl entries should be investigated and removed.Considerations
Changing Exchange directory ACLs may break Exchange services or update processes. Only remove permissions that are explicitly not required. Test ACL changes in a non-production environment and verify that all Exchange services start successfully after changes.
References
EDCA-SEC-036: Exchange email application does not share a partition with another application
The Exchange email application MUST NOT share a partition with another application. Installing Exchange on a volume that also hosts other server applications creates resource contention and increases the risk that another application's failure will impact Exchange availability. Exchange binaries must reside on a dedicated partition.
Evidence
| Organization | Status | Evidence |
|---|
Remediation
Ensure Exchange is installed on a volume not shared with other application binaries. Review installed applications on Exchange servers.
# Diagnose: Identify the Exchange install drive and list top-level directories not part of Exchange or Windows.
$exchDrive = Split-Path $exinstall -Qualifier
Get-ChildItem $exchDrive -Directory -ErrorAction SilentlyContinue |
Where-Object { $_.Name -notin @('Exchange', 'ExchangeSetupLogs', 'Program Files', 'Program Files (x86)', 'Windows', 'Users', 'PerfLogs', 'inetpub') } |
Select-Object FullName
# Unexpected directories on the Exchange volume may indicate other applications are co-located.Considerations
Migrating Exchange to a different volume is a complex operation that may require reinstallation. In many environments this is a planning concern addressed at deployment time. Document deviations with a risk acceptance if remediation is not feasible.
References
EDCA-SEC-037: LDAP client signing is set to require signing
The LDAP client on the Exchange server MUST be configured to require signing (LdapClientIntegrity=2) for all LDAP connections to Active Directory domain controllers. Without LDAP signing, Exchange LDAP queries to AD are transmitted without cryptographic integrity protection and are susceptible to man-in-the-middle interception and LDAP relay attacks. Exchange performs extensive LDAP queries for recipient resolution, GAL lookups, send connector validation, and distribution group expansion, all of which traverse the AD LDAP channel. ANSSI requires LDAP signing to be set to Require on all member servers.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | LDAP client signing is set to negotiate (LdapClientIntegrity=1). Signing is requested but not enforced — servers that do not require signing will receive unsigned LDAP binds. Set LdapClientIntegrity=2 to require signing on all connections. | |
| ex2 | LDAP client signing is set to negotiate (LdapClientIntegrity=1). Signing is requested but not enforced — servers that do not require signing will receive unsigned LDAP binds. Set LdapClientIntegrity=2 to require signing on all connections. | |
| ex3 | LDAP client signing is set to negotiate (LdapClientIntegrity=1). Signing is requested but not enforced — servers that do not require signing will receive unsigned LDAP binds. Set LdapClientIntegrity=2 to require signing on all connections. |
Remediation
Set LdapClientIntegrity to 2 (Require signing) under HKLM\SYSTEM\CurrentControlSet\Services\LDAP via Group Policy (Computer Configuration > Windows Settings > Security Settings > Local Policies > Security Options: 'Network security: LDAP client signing requirements' → 'Require signing') or directly via registry. Values: 0 = None, 1 = Negotiate signing, 2 = Require signing.
# Group Policy equivalent:
# Computer Configuration > Windows Settings > Security Settings > Local Policies > Security Options
# Network security: LDAP client signing requirements = Require signing
#
# Check current LDAP client signing setting
$ldapPath = 'HKLM:\SYSTEM\CurrentControlSet\Services\LDAP'
$val = (Get-ItemProperty $ldapPath -Name LdapClientIntegrity -ErrorAction SilentlyContinue).LdapClientIntegrity
$status = switch ($val) {
0 { 'None - unsigned LDAP allowed (non-compliant)' }
1 { 'Negotiate signing' }
2 { 'Require signing (compliant)' }
$null { 'Not set - defaults to Negotiate (1)' }
default { "Unknown ($val)" }
}
"LdapClientIntegrity: $(if ($null -eq $val) { 'not set' } else { $val }) - $status"
# Set LDAP client to require signing (2)
Set-ItemProperty -Path $ldapPath -Name LdapClientIntegrity -Type DWord -Value 2
Write-Host 'LDAP client signing set to Require (2). No restart required.'Considerations
Setting LdapClientIntegrity=2 requires that all outbound LDAP connections from this server use signed LDAP. Active Directory domain controllers on Windows Server 2008 and later support LDAP signing universally. If LDAPS (port 636 with TLS) is already in use for Exchange LDAP queries, LDAPS provides both integrity and confidentiality, making LdapClientIntegrity complementary for any remaining plaintext LDAP (port 389) connections. After setting LdapClientIntegrity=2, monitor for LDAP error 81 (LDAP_SERVER_DOWN) or authentication failures in the Exchange application log that may indicate a domain controller refusing unsigned LDAP. If any non-Windows LDAP server is queried from this Exchange server, verify it supports LDAP signing (SASL integrity protection) before enforcing.
References
EDCA-SEC-038: Exchange has the most current approved update installed
Exchange MUST have the most current, approved Cumulative Update installed. Running an outdated build exposes the server to known, published security vulnerabilities. Exchange Cumulative Updates must be applied within the DoD-defined timeframe after release. This applies to Exchange 2019, Exchange SE, and Exchange 2016. Note: Exchange 2016 reached end of mainstream support in October 2025, with CU23 as the terminal build; Exchange 2016 organizations must have CU23 installed and should plan migration to Exchange 2019, Exchange SE, or Exchange Online.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Running build 15.2.2562.17 is not the latest approved update. Latest known: 15.2.2562.37. | |
| ex2 | Running build 15.2.2562.37 matches or exceeds the latest known approved update (15.2.2562.37). | |
| ex3 | Running build 15.2.2562.37 matches or exceeds the latest known approved update (15.2.2562.37). |
Remediation
Install the latest approved Cumulative Update for the installed Exchange Server version.
# Check current Exchange build for all servers
Get-ExchangeServer | Select-Object Name, AdminDisplayVersion, EditionConsiderations
Always test Cumulative Update installations in a non-production environment first. Review the Microsoft Exchange Team Blog for known issues before applying. Exchange 2016 reached end of mainstream support in October 2025; CU23 is the final build -- Exchange 2016 organizations should prioritize migration.
References
EDCA-SEC-039: Exchange built-in Malware Agent is properly configured for the Exchange version
The Exchange built-in malware agent MUST be configured as defined for the installed Exchange version. For Exchange 2019 and Exchange SE, the FIP-FS malware scanning agent must be ENABLED and configured for automatic signature updates to detect and block malicious content in transport. Exception: For Exchange 2016, the DISA STIG requires the built-in malware agent to be DISABLED when an approved third-party or enterprise antimalware solution is protecting Exchange transport.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | Compliant — Malware Agent is present and enabled. | |
| ex3 | Compliant — Malware Agent is present and enabled. |
Remediation
Enable and configure the malware filtering agent on Exchange 2019 and Exchange SE. On Exchange 2016, disable the built-in agent only when a compliant third-party antimalware solution is actively protecting Exchange transport.
# Exchange 2019 and Exchange SE: enable malware filtering agent
# Enable-TransportAgent -Identity 'Malware Agent'
# Set-MalwareFilteringServer $env:COMPUTERNAME -BypassFiltering $false
# & "$env:ExchangeInstallPath\Scripts\Enable-AntimalwareScanning.ps1"
# Exchange 2016 exception: disable built-in agent when third-party AV covers Exchange transport
# & "$env:ExchangeInstallPath\Scripts\Disable-AntimalwareScanning.ps1"Considerations
For Exchange 2019 and Exchange SE, verify the FIP-FS engine is healthy before enabling automatic updates -- see EX-BP-042 for engine version health checks. For Exchange 2016, do NOT disable the malware agent unless a compliant third-party solution is actively protecting Exchange transport; disabling without a replacement leaves mail flow unprotected.
References
- V-259694 Exchange antimalware agent must be enabled and configured (EX19-MB-000146)
- V-259695 The Exchange malware scanning agent must be configured for automatic updates (EX19-MB-000147)
- Malware protection in Exchange Server
- BSI SYS.1.1.A9 — Einsatz von Virenschutz-Programmen auf Servern
- BSI APP.5.2.A9 — Sichere Konfiguration von Exchange-Servern
EDCA-SEC-040: Exchange database/log volumes are formatted with ReFS
All volumes hosting Exchange mailbox database and transaction log files SHOULD be formatted with ReFS (Resilient File System). ReFS provides improved resiliency, integrity, and performance for Exchange workloads compared to NTFS and is required by the Microsoft Preferred Architecture.
Evidence
| Server | Status | Evidence |
|---|---|---|
| ex2 | 1 of 1 database or log volume(s) are not formatted with ReFS. - C:\: NTFS | |
| ex3 | All 1 database and log volume(s) are formatted with ReFS. - C:\ExchangeDatabases\ |
Remediation
Format Exchange database and transaction log volumes with ReFS. ReFS cannot be applied in-place; volumes must be re-initialized. Plan a database move to an alternate DAG copy, reformat the volume with ReFS, and move the database back.
Get-Volume | Where-Object { $_.DriveType -eq 'Fixed' } | Select-Object DriveLetter, FileSystem, FileSystemLabel | Format-Table -AutoSizeConsiderations
Converting an existing NTFS Exchange volume to ReFS requires offline reformatting and a planned database failover. NTFS remains a supported filesystem (see EX-BP-016); this control enforces the stricter Preferred Architecture recommendation. For new deployments, format all Exchange data volumes with ReFS during initial volume preparation before database creation.
References
EDCA-SEC-041: LAPS is deployed for local administrator accounts
Local Administrator Password Solution (LAPS) MUST be deployed on Exchange servers to ensure unique, rotated local administrator passwords. Without LAPS, a compromised local administrator password on one server can be used for lateral movement to all servers sharing the same credential. Windows LAPS (built into Windows Server 2019+) stores passwords in the msLAPS-Password AD attribute; legacy LAPS stores them in ms-Mcs-AdmPwd. ANSSI recommends deploying LAPS on all member servers to mitigate lateral movement risk from shared local credentials.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | LAPS registry policy keys not found — re-run collection with the current EDCA build to evaluate this control. | |
| ex2 | LAPS registry policy keys not found — re-run collection with the current EDCA build to evaluate this control. | |
| ex3 | LAPS registry policy keys not found — re-run collection with the current EDCA build to evaluate this control. |
Remediation
Deploy Windows LAPS (Windows Server 2019+) or legacy Microsoft LAPS. For Windows LAPS: ensure the Active Directory schema is updated and configure LAPS policy via Group Policy (Computer Configuration > Administrative Templates > System > LAPS). For legacy LAPS: install the LAPS MSI and configure via LAPS Group Policy extension.
# Group Policy equivalent:
# Computer Configuration > Administrative Templates > System > LAPS
# Enable local admin password management = Enabled
# (For legacy LAPS: Computer Configuration > Administrative Templates > LAPS)
#
# Check if Windows LAPS attribute is present (Windows Server 2019+)
try {
$attr = Get-ADComputer -Identity $env:COMPUTERNAME -Properties 'msLAPS-Password','msLAPS-PasswordExpirationTime' -ErrorAction Stop
if ($null -ne $attr.'msLAPS-Password') {
"Windows LAPS: attribute msLAPS-Password is populated"
} else {
"Windows LAPS: msLAPS-Password attribute exists but is empty - LAPS may not yet have generated a password"
}
} catch {
"Windows LAPS: msLAPS-Password attribute not found - LAPS may not be configured or schema not extended"
}
# Check for legacy LAPS (ms-Mcs-AdmPwd attribute)
try {
$legacyAttr = Get-ADComputer -Identity $env:COMPUTERNAME -Properties 'ms-Mcs-AdmPwd' -ErrorAction Stop
if ($null -ne $legacyAttr.'ms-Mcs-AdmPwd') {
"Legacy LAPS: ms-Mcs-AdmPwd attribute is populated"
}
} catch {
"Legacy LAPS: ms-Mcs-AdmPwd attribute not present"
}Considerations
LAPS manages the local administrator account (built-in SID S-1-5-21-*-500 or a named account) and requires Active Directory schema extensions. In environments that use Windows Server 2019 and later, prefer Windows LAPS over legacy LAPS as it is built into the OS and supports Azure AD and enhanced encryption. If the Exchange server has a custom local administrator account name (not 'Administrator'), configure LAPS to target that account name explicitly. LAPS password storage in AD requires appropriate ACLs to prevent unauthorized read access to the msLAPS-Password attribute.
References
EDCA-SEC-042: NetBIOS over TCP/IP is disabled on all network interfaces
NetBIOS over TCP/IP (NetBT) MUST be disabled on all network interfaces on Exchange servers. NetBIOS name resolution is a legacy protocol that exposes servers to NBNS poisoning, NTLM relay via NBT-NS spoofing, and unnecessary broadcast-based service discovery. On domain-joined servers, DNS provides all required name resolution. ANSSI recommends disabling NetBIOS over TCP/IP on all member server interfaces as part of attack surface reduction.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | 2 of 2 interface(s) do not have NetBIOS over TCP/IP disabled. - Tcpip_{e3c597d2-408c-4bbb-8b02-15076c35b61a}: NetbiosOptions=DHCP-controlled (0) - Tcpip_{f275c72f-7c3b-4315-85d5-33155447381d}: NetbiosOptions=DHCP-controlled (0) | |
| ex2 | 2 of 2 interface(s) do not have NetBIOS over TCP/IP disabled. - Tcpip_{f275c72f-7c3b-4315-85d5-33155447381d}: NetbiosOptions=DHCP-controlled (0) - Tcpip_{f3252c74-e415-4227-b0b9-a9726cb8946c}: NetbiosOptions=DHCP-controlled (0) | |
| ex3 | 2 of 2 interface(s) do not have NetBIOS over TCP/IP disabled. - Tcpip_{c23b6451-2bd8-426b-8b56-2bb30c029ddf}: NetbiosOptions=DHCP-controlled (0) - Tcpip_{f275c72f-7c3b-4315-85d5-33155447381d}: NetbiosOptions=DHCP-controlled (0) |
Remediation
Disable NetBIOS over TCP/IP on all network adapters by setting the NetbiosOptions registry value to 2 (disabled) under each interface GUID key in HKLM\SYSTEM\CurrentControlSet\Services\NetBT\Parameters\Interfaces. Alternatively, configure via Group Policy using a startup script or use the Network Adapter advanced properties in the GUI.
# Group Policy equivalent:
# Computer Configuration > Preferences > Windows Settings > Registry
# Key: HKLM\SYSTEM\CurrentControlSet\Services\NetBT\Parameters\Interfaces\Tcpip_{GUID}
# Value: NetbiosOptions = 2 (DWORD) — Disabled
#
# Check current NetBIOS over TCP/IP setting per interface
$interfacesPath = 'HKLM:\SYSTEM\CurrentControlSet\Services\NetBT\Parameters\Interfaces'
Get-ChildItem $interfacesPath | ForEach-Object {
$val = (Get-ItemProperty $_.PSPath -Name NetbiosOptions -ErrorAction SilentlyContinue).NetbiosOptions
$status = switch ($val) { 0 { 'Default (use DHCP)' } 1 { 'Enabled' } 2 { 'Disabled' } default { "Unknown ($val)" } }
[PSCustomObject]@{ Interface = $_.PSChildName; NetbiosOptions = $val; Status = $status }
} | Format-Table -AutoSize
# Disable NetBIOS on all interfaces (set to 2 = disabled)
Get-ChildItem $interfacesPath | ForEach-Object {
Set-ItemProperty -Path $_.PSPath -Name NetbiosOptions -Type DWord -Value 2
Write-Host "Disabled NetBIOS on interface: $($_.PSChildName)"
}
Write-Host 'Done. Changes take effect immediately (no reboot required).'Considerations
Disabling NetBIOS over TCP/IP on Exchange servers is safe in modern Active Directory environments where DNS provides all name resolution. Verify that no legacy applications, backup agents, or monitoring tools rely on NetBIOS name resolution before disabling. In environments with very old Windows clients (pre-Windows 2000) or legacy SMB-dependent systems, NetBIOS may still be required on specific segments. If the server hosts any application that broadcasts NetBIOS names (e.g., legacy file sharing over NBT), connectivity to those shares from NetBIOS-dependent clients will be lost. After disabling, monitor for any connectivity failures, particularly from older SMTP relay devices that use NetBIOS for host lookup.
References
EDCA-SEC-043: SMB packet signing is required on server and client
SMB packet signing MUST be required (not merely enabled) on both the SMB server service (LanmanServer) and the SMB client service (LanmanWorkstation) on Exchange servers. Without mandatory SMB signing, an attacker performing a man-in-the-middle attack can intercept and modify SMB traffic including DAG log shipping, file share witness access, and SYSVOL/NETLOGON traversal, enabling NTLM relay attacks. ANSSI and the CIS Benchmark require SMB signing to be enforced. Setting RequireSecuritySignature=1 ensures that connections that cannot negotiate signing are rejected.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | SMB packet signing is not enforced: SMB client signing not required. - SMB server (LanmanServer): RequireSecuritySignature=1 (required) - SMB client (LanmanWorkstation): RequireSecuritySignature=not set (default 0) | |
| ex2 | SMB packet signing is not enforced: SMB client signing not required. - SMB server (LanmanServer): RequireSecuritySignature=1 (required) - SMB client (LanmanWorkstation): RequireSecuritySignature=not set (default 0) | |
| ex3 | SMB packet signing is not enforced: SMB client signing not required. - SMB server (LanmanServer): RequireSecuritySignature=1 (required) - SMB client (LanmanWorkstation): RequireSecuritySignature=not set (default 0) |
Remediation
Set RequireSecuritySignature=1 for both LanmanServer (SMB server) and LanmanWorkstation (SMB client) via registry or Group Policy (Security Options: 'Microsoft network server: Digitally sign communications (always)' and 'Microsoft network client: Digitally sign communications (always)').
# Group Policy equivalent:
# Computer Configuration > Windows Settings > Security Settings > Local Policies > Security Options
# Microsoft network server: Digitally sign communications (always) = Enabled
# Microsoft network client: Digitally sign communications (always) = Enabled
#
# Check SMB server signing (LanmanServer)
$serverPath = 'HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters'
$serverReq = (Get-ItemProperty $serverPath -Name RequireSecuritySignature -ErrorAction SilentlyContinue).RequireSecuritySignature
"SMB Server RequireSecuritySignature: $(if ($null -eq $serverReq) { 'not set (default: 0 - not required)' } else { $serverReq })"
# Check SMB client signing (LanmanWorkstation)
$clientPath = 'HKLM:\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters'
$clientReq = (Get-ItemProperty $clientPath -Name RequireSecuritySignature -ErrorAction SilentlyContinue).RequireSecuritySignature
"SMB Client RequireSecuritySignature: $(if ($null -eq $clientReq) { 'not set (default: 0 - not required)' } else { $clientReq })"
# Require SMB signing on server and client (1 = required)
Set-ItemProperty -Path $serverPath -Name RequireSecuritySignature -Type DWord -Value 1
Set-ItemProperty -Path $clientPath -Name RequireSecuritySignature -Type DWord -Value 1
Write-Host 'SMB signing required on server and client. No restart required; applies to new connections.'Considerations
Requiring SMB signing affects all SMB connections on the Exchange server: DAG log file replication, file share witness connections, administrative share access, and SYSVOL/NETLOGON traversal. All supported Windows SMB clients negotiate signing automatically — modern Windows versions (Vista and later) all support SMB signing. Requiring signing on the SMB client (LanmanWorkstation) means this Exchange server will refuse to connect to SMB targets that do not offer signing; verify that all SMB targets (file share witnesses, backup targets) support signing before enforcing the client setting. This control is complementary to EDCA-SEC-023 (SMBv1 disabled) — SMBv1 does not support mandatory signing and should already be disabled.
References
- Overview of Server Message Block signing
- Configure SMB signing with confidence
- ANSSI - Recommandations pour l'administration sécurisée des SI reposant sur AD (2023)
- BSI SYS.1.2.3.A5 — Sichere Authentisierung und Autorisierung in Windows Server
- CIS Microsoft Windows Server 2019/2022/2025 Benchmarks — 2.3.8/2.3.9 SMB signing
Resilience (10 controls)
EDCA-RES-001: Core Exchange services are running
All required Exchange Windows services (transport, information store, and helper services) MUST be in the Running state. Non-running required services cause mail flow interruptions and degraded functionality.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Compliant — all required Exchange services are running. | |
| ex2 | Compliant — all required Exchange services are running. | |
| ex3 | Compliant — all required Exchange services are running. |
Remediation
Run Test-ServiceHealth to identify required Exchange services that are not running, then start them.
# Diagnose: Check which required Exchange services are not running
Test-ServiceHealth | Where-Object { -not $_.RequiredServicesRunning } | Select-Object Role, ServicesNotRunning
# Remediate: Start services that are not running
Test-ServiceHealth | Where-Object { -not $_.RequiredServicesRunning } | ForEach-Object { $_.ServicesNotRunning | ForEach-Object { Start-Service -Name $_ -ErrorAction SilentlyContinue } }Considerations
Restarting Exchange services disrupts active client sessions and mail flow. Always use DAG maintenance mode or scheduled maintenance windows when restarting services on production servers.
References
EDCA-RES-002: Unified content cleanup baseline
The Exchange UnifiedContent temporary store cleanup MUST be configured. Misconfigured cleanup causes progressive disk space accumulation in UnifiedContent folders under ExchangeTransport working directories.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Expected cleanup path: C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\data\Temp\UnifiedContent | |
| ex2 | Expected cleanup path: C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\data\Temp\UnifiedContent | |
| ex3 | Expected cleanup path: C:\Program Files\Microsoft\Exchange Server\V15\TransportRoles\data\Temp\UnifiedContent |
Remediation
Add the correct UnifiedContent temp path to %ExchangeInstallPath%\Bin\Monitoring\Config\AntiMalware.xml to enable the monitoring probe to automatically clean up temp files from the EdgeTransport process.
# Diagnose: Check UnifiedContent temp directory for stale file accumulation
$exchPath = $exinstall
Get-ChildItem (Join-Path $exchPath 'TransportRoles\data\Temp\UnifiedContent') -Recurse -ErrorAction SilentlyContinue | Measure-Object Length -Sum | Select-Object Count, @{N='TotalMB';E={[math]::Round($_.Sum/1MB,2)}}Considerations
The Unified Content Cleanup task temporarily increases I/O load on the transport database volume when running. Schedule cleanup tasks during low-traffic periods. Cleaning a large accumulated backlog may take extended time.
References
EDCA-RES-003: Replication health checks pass
When a DAG is deployed, all replication health checks MUST pass. Replication failures indicate log shipping, seeding, or network problems that increase the risk of data loss during a failover.
Evidence
| Server | Status | Evidence |
|---|
Remediation
Investigate and resolve failed DAG replication checks.
# Diagnose: Run DAG replication health checks and review database copy status
Test-ReplicationHealth -Server $env:COMPUTERNAME | Sort-Object CheckDescription | Format-Table CheckDescription, Result, Error -AutoSize
Get-MailboxDatabaseCopyStatus -Server $env:COMPUTERNAME | Select-Object Name, Status, CopyQueueLength, ReplayQueueLength, ContentIndexState | Format-Table -AutoSizeConsiderations
Replication failures may have causes beyond configuration - including storage latency, network connectivity, or witness server unavailability. Do not make DAG configuration changes during active failovers or when the DAG is already in a degraded state. Follow the resolution steps appropriate for each specific replication health check failure.
References
EDCA-RES-004: Mailbox database deleted item retention is at least 14 days
The DeletedItemRetention on each mailbox database controls how long deleted items are retained in the dumpster before permanent removal. The CIS benchmark recommends a minimum of 14 days so that accidentally deleted items can be recovered without requiring a backup restore.
Evidence
| Server | Status | Evidence |
|---|---|---|
| MDB2 | ItemRetentionDays=14 — compliant (>= 14 days). | |
| MDB3 | ItemRetentionDays=14 — compliant (>= 14 days). |
Remediation
Set DeletedItemRetention to at least 14 days on every mailbox database.
# Set deleted item retention to 14 days on a specific mailbox database.
# To target a specific database: replace 'DatabaseName' with the actual database name.
Set-MailboxDatabase -Identity 'DatabaseName' -DeletedItemRetention 14.00:00:00Considerations
Increasing the retention period will consume additional storage in the Recoverable Items folder. Review mailbox database storage capacity before extending the retention period significantly beyond the recommended minimum.
References
EDCA-RES-005: Mailbox database deleted mailbox retention is at least 30 days
The MailboxRetention on each mailbox database controls how long a soft-deleted mailbox is retained after it is removed from Active Directory. The CIS benchmark recommends retaining deleted mailboxes for at least 30 days to support accidental deletion recovery without a full backup restore.
Evidence
| Server | Status | Evidence |
|---|---|---|
| MDB2 | MailboxRetentionDays=30 — compliant (>= 30 days). | |
| MDB3 | MailboxRetentionDays=30 — compliant (>= 30 days). |
Remediation
Set MailboxRetention to at least 30 days on every mailbox database.
# Set deleted mailbox retention to 30 days on a specific mailbox database.
# To target a specific database: replace 'DatabaseName' with the actual database name.
Set-MailboxDatabase -Identity 'DatabaseName' -MailboxRetention 30.00:00:00Considerations
Soft-deleted mailboxes consume database storage until permanently purged. Check available storage prior to extending the retention period.
References
EDCA-RES-006: Mailbox database is not permanently deleted until it has been backed up
The RetainDeletedItemsUntilBackup flag on a mailbox database instructs Exchange not to permanently purge deleted mailbox data until the database has been backed up. The CIS benchmark requires this to be enabled so that items purged from the Recoverable Items folder remain recoverable via backup until the backup cycle completes.
Evidence
| Server | Status | Evidence |
|---|---|---|
| MDB2 | RetainDeletedItemsUntilBackup=False — non-compliant (expected True). | |
| MDB3 | RetainDeletedItemsUntilBackup=False — non-compliant (expected True). |
Remediation
Enable the RetainDeletedItemsUntilBackup flag on every mailbox database.
# Ensure mailbox database items are not permanently deleted before backup.
# To target a specific database: replace 'DatabaseName' with the actual database name.
Set-MailboxDatabase -Identity 'DatabaseName' -RetainDeletedItemsUntilBackup $trueConsiderations
Enabling this setting requires a functioning and regularly executed backup solution. Without a backup program, Exchange will defer purging indefinitely and the Recoverable Items folder may grow without bound, consuming storage.
References
EDCA-RES-007: Exchange circular logging is disabled
Exchange circular logging MUST be disabled. Circular logging overwrites transaction log files, destroying data required for point-in-time recovery and full backup restore operations. Disabling circular logging ensures all transaction logs are retained until a successful backup has been completed.
Evidence
| Server | Status | Evidence |
|---|---|---|
| MDB2 | CircularLoggingEnabled=False — compliant. | |
| MDB3 | CircularLoggingEnabled=False — compliant. |
Remediation
Disable circular logging on all mailbox databases.
# Disable circular logging on a specific mailbox database.
# To target a specific database: replace 'DatabaseName' with the actual database name.
Set-MailboxDatabase -Identity 'DatabaseName' -CircularLoggingEnabled $falseConsiderations
Disabling circular logging requires a dedicated storage allocation for transaction logs. Ensure log volumes have adequate capacity and log backup processes are in place. For DAG members, circular logging changes require a database dismount and remount.
References
EDCA-RES-008: Exchange mailbox databases reside on a dedicated partition
Exchange Mailbox databases MUST reside on a dedicated partition. Locating mailbox database files on their own dedicated volume isolates them from OS files, Exchange application files, and log files. This prevents disk contention, contains the impact of volume exhaustion, and satisfies data isolation requirements for DISA compliance.
Evidence
| Server | Status | Evidence |
|---|---|---|
| MDB2 | EdbFilePath=C:\ExchangeDatabases\MDB2\DB\MDB2.edb shares volume C:\ with: OS system volume (C:\); Exchange binaries volume (C:\, C:\Program Files\Microsoft\Exchange Server\V15\). | |
| MDB3 | EdbFilePath=C:\ExchangeDatabases\MDB3\DB\MDB3.edb is on dedicated volume C:\ExchangeDatabases\, separate from OS and Exchange binaries. |
Remediation
Move mailbox database files to a dedicated volume separate from OS, Exchange binaries, and transaction logs.
# Verify mailbox database paths are on dedicated volumes.Considerations
Moving mailbox databases requires a database portability operation or backup-restore cycle. Plan a maintenance window. Ensure the target volume is formatted with 64KB allocation unit size as required by Exchange.
References
EDCA-RES-009: Exchange mailbox stores mount at startup
Exchange mailbox stores MUST mount at startup. If a mailbox database is set not to mount automatically, it will remain offline after a server restart, causing service disruption. All production mailbox databases must be configured to auto-mount to ensure continuity of email service.
Evidence
| Server | Status | Evidence |
|---|---|---|
| MDB2 | MountAtStartup=True — compliant. | |
| MDB3 | MountAtStartup=True — compliant. |
Remediation
Set all mailbox databases to mount at startup.
Get-MailboxDatabase | Set-MailboxDatabase -MountAtStartup $trueConsiderations
In some disaster recovery scenarios, databases are intentionally left set not to mount automatically. Verify that no databases used for DR or archival purposes should remain unmounted before applying this setting globally.
References
EDCA-RES-010: Exchange mailbox databases are in a highly available and redundant configuration
Exchange MUST provide mailbox databases in a highly available and redundant configuration. Exchange Database Availability Groups (DAGs) provide continuous replication of mailbox database copies across multiple servers. At least one additional database copy must exist to satisfy DISA high-availability requirements and to protect against server failure data loss.
Evidence
| Server | Status | Evidence |
|---|---|---|
| MDB2 | DatabaseCopiesCount=1 — non-compliant (expected >= 2 copies for high availability). | |
| MDB3 | DatabaseCopiesCount=1 — non-compliant (expected >= 2 copies for high availability). |
Remediation
Configure a Database Availability Group with at least two mailbox database copies across different servers.
# Check mailbox database copy status.Considerations
DAG deployment requires at least two Exchange Mailbox servers and a witness server (file share witness or Azure cloud witness). Planning DAG deployment involves network, storage, and licensing considerations. This is a significant infrastructure change requiring careful planning.
References
EDCA-RES-011: Single Item Recovery enabled on user mailboxes
Single Item Recovery (SingleItemRecoveryEnabled) MUST be enabled on all user mailboxes. When enabled, items permanently deleted from the Recoverable Items folder are retained for the deleted-item retention period, protecting against accidental or malicious deletion.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | 1 user mailbox(es) have Single Item Recovery disabled. |
Remediation
Enable Single Item Recovery on all user mailboxes where it is currently disabled.
Get-Mailbox -ResultSize Unlimited -RecipientTypeDetails UserMailbox | Where-Object { -not $_.SingleItemRecoveryEnabled } | Set-Mailbox -SingleItemRecoveryEnabled $trueConsiderations
Enabling Single Item Recovery increases Recoverable Items folder storage usage because purged items are retained beyond the normal dumpster expiry for the full deleted-item retention period. Ensure adequate mailbox database storage capacity before enabling globally. Single Item Recovery is superseded by In-Place Hold or Litigation Hold when a hold is active on the mailbox.
References
EDCA-RES-012: DAG members span at least two Active Directory sites
Each Database Availability Group (DAG) MUST have member servers distributed across at least two Active Directory sites. Multi-site DAG placement ensures that a complete site failure does not result in loss of mailbox service or data.
Evidence
| Organization | Status | Evidence |
|---|
Remediation
Extend the DAG by adding member servers in a second Active Directory site. Configure Active Manager for site-aware failover and place the file share witness appropriately for the resulting quorum model.
# Diagnose: Show DAG membership and AD site per Exchange server
Get-ExchangeServer | Select-Object Name, MemberOfDAG, Site | Format-Table -AutoSizeConsiderations
Deploying DAG members across multiple AD sites requires inter-site network connectivity with sufficient bandwidth for continuous database replication. A file share witness or alternate witness server must be placed correctly for the resulting quorum model. In single-site lab or small environments where site resilience is not a requirement, this control may not be applicable.
References
Transport Security (48 controls)
EDCA-TLS-001: Receive connector internal and external relay patterns are separated
Receive connectors SHOULD follow clear internal versus external relay/authentication patterns and avoid broad anonymous relay exposure.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Compliant — external relay connector pattern detected (1 connectors). Internal relay pattern not required on Edge Transport. | |
| ex2 | Compliant — external and internal relay connector patterns detected (5 connectors). | |
| ex3 | Compliant — external and internal relay connector patterns detected (5 connectors). |
Remediation
Review and redesign receive connectors to separate internal and external relay/auth patterns.
# Diagnose: Audit receive connector relay scopes and authentication settings
Get-ReceiveConnector -Server $env:COMPUTERNAME | Select-Object Name, Bindings, RemoteIPRanges, PermissionGroups, AuthMechanism, TlsEnabled | Format-List
# Connectors with 'AnonymousUsers' in PermissionGroups and open RemoteIPRanges (0.0.0.0-255.255.255.255) are open relays.Considerations
Restricting or reconfiguring receive connectors can block legitimate SMTP relay from applications and devices. Carefully audit all SMTP relay sources before changing connector permissions or authentication settings. Test mail flow from all relay sources after applying changes.
References
EDCA-TLS-002: Transport retry configuration baseline
Transport retry settings MUST meet recommended thresholds: MaxPerDomainOutboundConnections >= 40 and MessageRetryInterval <= 5 minutes. Below-minimum connection limits and long retry intervals cause mail delivery delays to high-volume domains.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Compliant — transport retry settings are within recommended thresholds. | |
| ex2 | Compliant — transport retry settings are within recommended thresholds. | |
| ex3 | Compliant — transport retry settings are within recommended thresholds. |
Remediation
Use Set-TransportService to set MaxPerDomainOutboundConnections to 40 or higher and MessageRetryInterval to 5 minutes or less to prevent mail queue buildup during delivery retries.
Set-TransportService -Identity $env:COMPUTERNAME -MaxPerDomainOutboundConnections 40 -MessageRetryInterval 00:05:00Considerations
Adjusting transport retry configuration can affect how quickly Exchange requeues messages after a transient failure. Changes to retry intervals impact end-user mail delivery experience during disruptions. Follow Microsoft guidance for retry values - overly aggressive retries increase load on target servers.
References
EDCA-TLS-003: Hybrid send connector TLS integrity
Validate hybrid/EXO send connector TLS settings (TlsAuthLevel, RequireTLS, TlsCertificateName, and TlsDomain) to reduce mail flow risk.
Evidence
| Connector | Status | Evidence |
|---|---|---|
| Outbound to Office 365 - a46fac84-50d1-4953-8e4c-c924f33dfa5b | RequireTLS: True TlsAuthLevel: DomainValidation TlsDomain: mail.protection.outlook.com TlsCertificateName: <I>CN=GeoTrust TLS RSA CA G1, OU=www.digicert.com, O=DigiCert Inc, C=US<S>CN=mail.fabrikam.com |
Remediation
Correct hybrid send connector TLS settings and certificate bindings to match Exchange hybrid best practices.
# Diagnose: Inspect send connector TLS configuration for hybrid mail flow
Get-SendConnector | Select-Object Name, Enabled, RequireTLS, TlsAuthLevel, TlsCertificateName, TlsDomain, CloudServicesMailEnabled | Format-List
# Hybrid send connector should have: RequireTLS=True, TlsAuthLevel=DomainValidation, TlsDomain=*.mail.protection.outlook.comConsiderations
Hybrid send connector TLS settings affect mail routing to Exchange Online. Weakening TLS requirements may allow plaintext transport to Exchange Online. Verify the connector certificate is trusted by Exchange Online before changing TLS settings. Test hybrid mail flow after any connector certificate changes.
References
EDCA-TLS-004: Automatic forwarding to all remote domains is disabled
The AutoForwardEnabled property MUST be set to False on all remote domain entries, including the default domain entry ('*'). Enabling auto-forward on remote domains allows data exfiltration via client-side forwarding rules. The CIS benchmark requires AutoForwardEnabled to be set to False.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | All 1 applicable remote domain(s) have AutoForwardEnabled set to False (2 onmicrosoft.com domain(s) excluded from check). |
Remediation
Set AutoForwardEnabled to False on all remote domains, especially the default domain.
# Disable automatic forwarding to all remote domains.
Get-RemoteDomain | Set-RemoteDomain -AutoForwardEnabled $falseConsiderations
Disabling auto-forward breaks any legitimate auto-forward rules users have configured to external addresses. Communicate the change in advance and provide an alternative (e.g., distribution groups or consent-based forwarding via Transport Rules).
References
- CIS 2.3.4 (L1): Ensure AutoForwardEnabled is set to False
- Control automatic external email forwarding in Microsoft 365 and Exchange
- V-259651 Exchange auto-forwarding email to remote domains must be disabled or restricted (EX19-MB-000021)
- V-259672 Exchange email forwarding must be restricted (EX19-MB-000116)
- V-259673 Exchange email-forwarding SMTP domains must be restricted (EX19-MB-000117)
EDCA-TLS-005: Automatic replies to remote domains are disabled
The AutoReplyEnabled property MUST be set to False on all remote domain entries. Sending automatic replies to external recipients discloses internal presence information and increases spam risk. The CIS benchmark requires AutoReplyEnabled to be set to False.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | All 1 applicable remote domain(s) have AutoReplyEnabled set to False (2 onmicrosoft.com domain(s) excluded from check). |
Remediation
Set AutoReplyEnabled to False on all remote domains.
# Disable automatic replies to remote domains.
Get-RemoteDomain | Set-RemoteDomain -AutoReplyEnabled $falseConsiderations
This setting prevents client-rule-based auto-replies from being sent externally. It does not affect Out-of-Office messages controlled by the AllowedOOFType setting. Ensure users are informed that client-side auto-replies will no longer reach external recipients.
References
EDCA-TLS-006: Non-delivery reports to remote domains are disabled
The NDREnabled property MUST be set to False on all remote domain entries. Sending Non-Delivery Reports to external senders exposes internal infrastructure details and contributes to backscatter spam. The CIS benchmark recommends disabling NDR delivery to external domains.
Evidence
| Domain | Status | Evidence |
|---|---|---|
| Default (*) | NDREnabled: False. |
Remediation
Set NDREnabled to False on all remote domains.
# Disable NDRs to remote domains.
Get-RemoteDomain | Set-RemoteDomain -NDREnabled $falseConsiderations
This is a CIS Level 2 control. Disabling NDRs to external senders may complicate troubleshooting of legitimate delivery failures. Consider whether your organization needs external NDRs for business continuity before applying.
References
EDCA-TLS-007: Out-of-Office messages to remote domains are set to None
The AllowedOOFType setting on a remote domain controls whether Exchange sends Out-of-Office (OOF) messages to external recipients. The CIS benchmark recommends setting this to None to prevent OOF messages from revealing information such as employee absence periods and contact details to external parties.
Evidence
| Domain | Status | Evidence |
|---|---|---|
| Default (*) | AllowedOOFType: None. | |
| Hybrid Domain - fabrikam.mail.onmicrosoft.com (fabrikam.mail.onmicrosoft.com) | AllowedOOFType: External — onmicrosoft.com domain; OOF to Exchange Online is acceptable in hybrid deployments. | |
| Hybrid Domain - fabrikam.onmicrosoft.com (fabrikam.onmicrosoft.com) | AllowedOOFType: External — onmicrosoft.com domain; OOF to Exchange Online is acceptable in hybrid deployments. |
Remediation
Set AllowedOOFType to None on all remote domains.
# Disable Out-of-Office messages to remote domains.
Get-RemoteDomain | Set-RemoteDomain -AllowedOOFType NoneConsiderations
This is a CIS Level 2 control. Disabling OOF to external recipients may impact customer-facing communication. Evaluate business requirements before applying, and consider creating explicit exceptions for partner domains. In Exchange hybrid deployments, the remote domain representing the Microsoft 365 tenant is configured with IsInternal=True by the Hybrid Configuration Wizard and may legitimately have AllowedOOFType set to a non-None value to support OOF flow between on-premises and cloud mailboxes. Such internal hybrid domains are excluded from this check.
References
- CIS 2.3.2 (L2): Ensure AllowedOOFType is set to None
- Remote domains in Exchange Server - OOF settings
- V-259688 Exchange external/internet-bound automated response messages must be disabled (EX19-MB-000136)
- V-228392 Exchange external/Internet-bound automated response messages must be disabled (EX16-MB-000480)
EDCA-TLS-008: Organization-wide maximum send message size is 25 MB or less
The MaxSendSize transport configuration setting places an organization-wide upper bound on the size of messages that can be sent. The CIS benchmark recommends a maximum of 25 MB (26214400 bytes) to limit mail queue pressure, reduce the risk of DoS via large message floods, and align with common internet limits.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | MaxSendSize is 25 MB (26,214,400 bytes) (26214400 bytes). |
Remediation
Set the organization-wide MaxSendSize to 25 MB.
# Set organization-wide maximum send size to 25 MB.
Set-TransportConfig -MaxSendSize 25MBConsiderations
Reducing MaxSendSize below the current value will cause existing clients sending large attachments to receive NDRs. Communicate the change and advise users to use SharePoint or OneDrive links for large file transfers instead of email attachments.
References
EDCA-TLS-009: Organization-wide maximum receive message size is 25 MB or less
The MaxReceiveSize transport configuration setting places an organization-wide upper bound on the size of messages that can be received. The CIS benchmark recommends a maximum of 25 MB (26214400 bytes) to reduce exposure to resource exhaustion attacks via oversized inbound messages.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | MaxReceiveSize is 25 MB (26,214,400 bytes) (26214400 bytes). |
Remediation
Set the organization-wide MaxReceiveSize to 25 MB.
# Set organization-wide maximum receive size to 25 MB.
Set-TransportConfig -MaxReceiveSize 25MBConsiderations
Reducing MaxReceiveSize may cause legitimate large-attachment emails from external senders to bounce. Communicate the change to relevant users and external partners who may send large files.
References
EDCA-TLS-010: External send connector uses DNS routing
The RequireDNSRouting property on the internet send connector (address space '*') MUST be set to True. Using DNS (MX record) routing ensures mail is delivered to recipient mail servers rather than relying on a smart host. The CIS benchmark requires DNS routing on the external send connector.
Evidence
| Connector | Status | Evidence |
|---|---|---|
| Outbound to Office 365 - a46fac84-50d1-4953-8e4c-c924f33dfa5b | DNS routing: enabled. | |
| EdgeSync - Default-First-Site-Name to Internet | DNS routing: enabled. |
Remediation
Enable DNS routing on the send connector used for internet mail.
# Enable DNS routing on the internet send connector (address space = '*').
Get-SendConnector | Where-Object { $_.AddressSpaces -like '*SMTP:*;*' -or $_.AddressSpaces -like '*' } |
Set-SendConnector -DNSRoutingEnabled $trueConsiderations
Switching from smart host to DNS routing requires that Exchange servers can resolve MX records and establish direct outbound SMTP connections on port 25. Ensure that firewall rules and DNS are configured accordingly before making this change.
References
EDCA-TLS-011: External send connector does not ignore STARTTLS
The IgnoreStartTLS property on the external send connector MUST be False. If set to True, Exchange will connect to remote SMTP servers in plaintext even when the server advertises STARTTLS, exposing mail content to interception. The CIS benchmark requires IgnoreStartTLS to be False on the external send connector.
Evidence
| Connector | Status | Evidence |
|---|---|---|
| Outbound to Office 365 - a46fac84-50d1-4953-8e4c-c924f33dfa5b | IgnoreStartTLS: False. | |
| EdgeSync - Default-First-Site-Name to Internet | IgnoreStartTLS: False. |
Remediation
Set IgnoreStartTLS to False on the external send connector.
# Ensure STARTTLS is not ignored on the internet send connector.
Get-SendConnector | Where-Object { $_.AddressSpaces -like '*' } |
Set-SendConnector -IgnoreStartTLS $falseConsiderations
Setting IgnoreStartTLS to False means Exchange will attempt STARTTLS whenever a remote server advertises it. If the remote server presents an invalid or untrusted certificate and RequireTLS is also True, delivery may fail. Test with a non-production connector first.
References
EDCA-TLS-012: Send connector maximum message size is 25 MB or less
The MaxMessageSize property on each send connector MUST be set to 25 MB or less. Oversized messages consume excessive bandwidth and storage and may be used to conduct denial-of-service attacks against remote servers. The CIS benchmark requires the connector-level send size limit to be 25 MB or less.
Evidence
| Connector | Status | Evidence |
|---|---|---|
| EdgeSync - Inbound to Default-First-Site-Name | MaxMessageSizeBytes: Unlimited. | |
| Outbound to Office 365 - a46fac84-50d1-4953-8e4c-c924f33dfa5b | MaxMessageSizeBytes: 36,700,160 bytes (35 MB). | |
| EdgeSync - Default-First-Site-Name to Internet | MaxMessageSizeBytes: 10,485,760 bytes (10 MB). |
Remediation
Set MaxMessageSize to 25 MB or less on all send connectors.
# Set the send size limit on all send connectors.
Get-SendConnector | Set-SendConnector -MaxMessageSize 25MBConsiderations
Reducing the maximum send size may cause legitimate large-attachment emails to be rejected. Coordinate with business stakeholders before lowering the limit.
References
EDCA-TLS-013: Receive connector maximum message size is 25 MB or less
The MaxMessageSize property on each receive connector MUST be set to 25 MB or less. Restricting inbound message size reduces the risk of storage exhaustion and denial-of-service attacks. The CIS benchmark requires the connector-level receive size limit to be 25 MB or less.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | 1 of 1 receive connector(s) exceed the 25 MB limit. - ex1\Default internal receive connector EX1: MaxMessageSize exceeds 25 MB | |
| ex2 | 5 of 5 receive connector(s) exceed the 25 MB limit. - EX2\Default EX2: MaxMessageSize exceeds 25 MB - EX2\Client Proxy EX2: MaxMessageSize exceeds 25 MB - EX2\Default Frontend EX2: MaxMessageSize exceeds 25 MB - EX2\Outbound Proxy Frontend EX2: MaxMessageSize exceeds 25 MB - EX2\Client Frontend EX2: MaxMessageSize exceeds 25 MB | |
| ex3 | All 5 receive connector(s) have MaxMessageSize at or below 25 MB. |
Remediation
Set MaxMessageSize to 25 MB or less on all receive connectors.
# Set the receive size limit on all receive connectors on this server.
Get-ReceiveConnector -Server $env:COMPUTERNAME | Set-ReceiveConnector -MaxMessageSize 25MBConsiderations
Reducing the connector-level limit may cause some inbound emails to be rejected. Ensure the value aligns with the organisation-level MaxReceiveSize setting.
References
EDCA-TLS-014: External send connector has domain security enabled
The DomainSecureEnabled property on the internet-facing send connector MUST be set to True. Domain security (mutual TLS) provides certificate-based authentication between mail servers, offering stronger guarantees than opportunistic TLS. The CIS benchmark requires domain security to be enabled on the external send connector.
Evidence
| Connector | Status | Evidence |
|---|---|---|
| Outbound to Office 365 - a46fac84-50d1-4953-8e4c-c924f33dfa5b | DomainSecureEnabled: False | RequireTLS: True | TlsAuthLevel: DomainValidation | TlsDomain: mail.protection.outlook.com | TlsCertificateName: <I>CN=GeoTrust TLS RSA CA G1, OU=www.digicert.com, O=DigiCert Inc, C=US<S>CN=mail.fabrikam.com. | |
| EdgeSync - Default-First-Site-Name to Internet | DomainSecureEnabled: True | RequireTLS: False | TlsAuthLevel: not set | TlsDomain: not set | TlsCertificateName: not set. |
Remediation
Enable DomainSecureEnabled on the external send connector.
# Enable domain security on the internet send connector.
Get-SendConnector | Where-Object { $_.AddressSpaces -like '*' } |
Set-SendConnector -DomainSecureEnabled $trueConsiderations
Domain security requires both sending and receiving mail systems to be configured with valid certificates and mutual TLS settings. Coordinate with partner mail administrators before enabling.
References
EDCA-TLS-015: Exchange Receive Connector maximum hop count is 60
The Exchange Receive Connector Maximum Hop Count MUST be 60. The hop count limit controls the maximum number of times a message is allowed to be relayed before Exchange rejects it as looping. The value of 60 is the DISA-required default and must not be set lower, which could reject legitimate complex routing paths.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | All 1 receive connector(s) have MaxHopCount set to 60. | |
| ex2 | All 5 receive connector(s) have MaxHopCount set to 60. | |
| ex3 | All 5 receive connector(s) have MaxHopCount set to 60. |
Remediation
Set MaxHopCount to 60 on all receive connectors.
Get-ReceiveConnector | Set-ReceiveConnector -MaxHopCount 60Considerations
A hop count below 60 may cause legitimate messages with complex routing paths to be rejected. The default Exchange value is 60. Only modify if directed by STIG guidance or confirmed routing loop analysis.
References
EDCA-TLS-016: Exchange transport service maximum outbound connections is 1000
The Exchange transport service MaxOutboundConnections MUST be set to 1000. Limiting the total number of concurrent outbound connections on the transport service prevents resource exhaustion and reduces exposure during mail flood scenarios.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Compliant — MaxOutboundConnections is 1000. | |
| ex2 | Compliant — MaxOutboundConnections is 1000. | |
| ex3 | Compliant — MaxOutboundConnections is 1000. |
Remediation
Set MaxOutboundConnections to 1000 on the transport service.
Set-TransportService -Identity $env:COMPUTERNAME -MaxOutboundConnections 1000Considerations
Setting connection limits too low may throttle outbound mail flow, particularly during peak delivery times. Review connector usage and balance security with operational mail flow requirements.
References
EDCA-TLS-017: Exchange outbound connection limit per domain is controlled
The Exchange Outbound Connection Limit per Domain Count MUST be controlled. Restricting the number of simultaneous outbound connections to a single domain prevents a single remote domain from consuming all available transport resources and limits the impact of outbound delivery queues growing uncontrolled.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | MaxPerDomainOutboundConnections is 40 (expected 20). | |
| ex2 | MaxPerDomainOutboundConnections is 40 (expected 20). | |
| ex3 | MaxPerDomainOutboundConnections is 40 (expected 20). |
Remediation
Set MaxPerDomainOutboundConnections to 20 on the transport service.
Set-TransportService -Identity $env:COMPUTERNAME -MaxPerDomainOutboundConnections 20Considerations
Setting this limit too low may slow delivery to high-volume partner domains. Review typical delivery volumes per domain before applying strict limits.
References
EDCA-TLS-018: Exchange outbound connection timeout is 10 minutes or less
The Exchange Outbound Connection Timeout MUST be 10 minutes or less. Outbound connection timeouts that are too long hold transport resources open while waiting for unresponsive remote servers. A 10-minute maximum ensures resources are released promptly and retry cycles are started in a timely manner.
Evidence
| Connector | Status | Evidence |
|---|---|---|
| EdgeSync - Inbound to Default-First-Site-Name | ConnectionInactivityTimeOut: 00:10:00. | |
| Outbound to Office 365 - a46fac84-50d1-4953-8e4c-c924f33dfa5b | ConnectionInactivityTimeOut: 00:10:00. | |
| EdgeSync - Default-First-Site-Name to Internet | ConnectionInactivityTimeOut: 00:10:00. |
Remediation
Set ConnectionInactivityTimeOut to 10 minutes or less on all send connectors.
Get-SendConnector | Set-SendConnector -ConnectionInactivityTimeOut 00:10:00Considerations
Reducing timeout values may cause premature connection failures to slow remote mail servers. Monitor NDR rates after applying changes. The default Exchange value is 10 minutes so this is typically already compliant.
References
EDCA-TLS-019: Exchange global recipient count limit is set
The Exchange Global Recipient Count Limit MUST be set. A global recipient count limit on outbound messages restricts the maximum number of recipients per message and prevents abuse of the mail infrastructure for large-scale spam campaigns or accidental mass mailing.
Evidence
| Organization | Status | Evidence |
|---|---|---|
| Organization | MaxRecipientEnvelopeLimit is 500 (compliant, ≤ 5000). |
Remediation
Set MaxRecipientEnvelopeLimit in global transport configuration.
Set-TransportConfig -MaxRecipientEnvelopeLimit 5000Considerations
Setting this limit too low may prevent legitimate bulk internal communications (e.g., company-wide alerts). Establish the limit based on organizational requirements, typically between 200 and 5000 recipients per message.
References
EDCA-TLS-020: Exchange receive connector connection timeout is limited
The Exchange receive connector timeout MUST be limited. Excessively long receive connector timeouts hold transport service resources open and may enable slow-transmission denial-of-service attacks. Receive connectors must be configured with a defined connection timeout to release stalled inbound connections promptly.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | All 1 receive connector(s) have ConnectionTimeout set to 5 minutes or less. | |
| ex2 | 5 of 5 receive connector(s) have ConnectionTimeout exceeding 5 minutes. - EX2\Default EX2: ConnectionTimeout=00:10:00 (must be ≤ 00:05:00) - EX2\Client Proxy EX2: ConnectionTimeout=00:10:00 (must be ≤ 00:05:00) - EX2\Default Frontend EX2: ConnectionTimeout=00:10:00 (must be ≤ 00:05:00) - EX2\Outbound Proxy Frontend EX2: ConnectionTimeout=00:10:00 (must be ≤ 00:05:00) - EX2\Client Frontend EX2: ConnectionTimeout=00:10:00 (must be ≤ 00:05:00) | |
| ex3 | 5 of 5 receive connector(s) have ConnectionTimeout exceeding 5 minutes. - EX3\Default EX3: ConnectionTimeout=00:10:00 (must be ≤ 00:05:00) - EX3\Client Proxy EX3: ConnectionTimeout=00:10:00 (must be ≤ 00:05:00) - EX3\Default Frontend EX3: ConnectionTimeout=00:10:00 (must be ≤ 00:05:00) - EX3\Outbound Proxy Frontend EX3: ConnectionTimeout=00:10:00 (must be ≤ 00:05:00) - EX3\Client Frontend EX3: ConnectionTimeout=00:10:00 (must be ≤ 00:05:00) |
Remediation
Set ConnectionTimeout on all receive connectors to 5 minutes or less.
Get-ReceiveConnector | Set-ReceiveConnector -ConnectionTimeout 00:05:00Considerations
Reducing connection timeout too aggressively may reject legitimate slow-transmitting senders. A 5-minute timeout is the DISA-recommended value and covers most SMTP use cases. Test with non-production connectors first.
References
EDCA-TLS-021: Exchange internal receive connectors require encryption
Exchange internal receive connectors accepting connections from internal mail servers MUST require TLS encryption to protect data in transit. The formal DISA STIG rule is specific to Exchange 2016; for Exchange 2019 and Exchange SE, the broader TLS protection requirements are addressed by EX-BP-057 and EX-BP-111. The security principle of requiring TLS on internal receive connectors applies to all Exchange versions.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | 1 of 1 internal receive connector(s) do not require TLS. - ex1\Default internal receive connector EX1: RequireTLS=False (expected True) | |
| ex2 | 2 of 2 internal receive connector(s) do not require TLS. - EX2\Default EX2: RequireTLS=False (expected True) - EX2\Client Proxy EX2: RequireTLS=False (expected True) | |
| ex3 | 2 of 2 internal receive connector(s) do not require TLS. - EX3\Default EX3: RequireTLS=False (expected True) - EX3\Client Proxy EX3: RequireTLS=False (expected True) |
Remediation
Set RequireTLS on internal receive connectors to ensure all internal SMTP connections are encrypted.
# Verify TLS requirements on internal receive connectors
Get-ReceiveConnector | Where-Object { $_.TransportRole -ne 'FrontendTransport' } |
Select-Object Name, RequireTLS, AuthMechanism
# Apply RequireTLS on internal connectors
# Get-ReceiveConnector | Where-Object { $_.Name -like '*Internal*' } | Set-ReceiveConnector -RequireTLS $trueConsiderations
The formal DISA STIG rule requires this for Exchange 2016. For Exchange 2019 and Exchange SE, RequireTLS on internal receive connectors is enforced as a best practice. Enabling RequireTLS requires that all internal sending sources (other Exchange servers, applications, scan-to-mail devices) support TLS -- verify compatibility before enabling or inbound delivery from those sources will fail.
References
EDCA-TLS-022: Exchange receive connectors control the number of recipients per message
Exchange receive connectors MUST limit the number of recipients per message to prevent misuse of inbound relay paths for large-scale bulk delivery or directed spam campaigns. The formal DISA STIG rule is specific to Exchange 2016. For Exchange 2019 and Exchange SE, global per-message recipient limits are enforced at the transport level (see EX-BP-141); per-connector limits are recommended for all Exchange versions.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | All 1 receive connector(s) have MaxRecipientsPerMessage set to a specific limit. | |
| ex2 | All 5 receive connector(s) have MaxRecipientsPerMessage set to a specific limit. | |
| ex3 | All 5 receive connector(s) have MaxRecipientsPerMessage set to a specific limit. |
Remediation
Set MaxRecipientsPerMessage on receive connectors. Align with the global recipient count limit defined in EX-BP-141.
# Check current per-message recipient limits on receive connectors
Get-ReceiveConnector | Select-Object Name, MaxRecipientsPerMessage
# Set limit on all receive connectors
# (Exchange 2016: explicit STIG requirement; Exchange 2019/SE: best practice)
# Get-ReceiveConnector | Set-ReceiveConnector -MaxRecipientsPerMessage 5000Considerations
Exchange 2016 has an explicit DISA STIG rule requiring per-connector recipient limits. For Exchange 2019 and Exchange SE, global transport recipient limits (see EX-BP-141) are the primary STIG control; per-connector limits are also recommended. Setting this too low may reject legitimate bulk internal communications -- align with EX-BP-141.
References
EDCA-TLS-023: Accepted domains publish enforcing DMARC records
Each accepted domain MUST publish a DMARC TXT record at _dmarc.<domain> with a policy of quarantine or reject. CISA BOD 18-01 requires configuring DMARC with a policy of reject. CIS Controls v8 requires implementing DMARC and enabling receiver-side verification.
Evidence
| Domain | Status | Evidence |
|---|---|---|
| contoso.com | DMARC record: v=DMARC1; p=quarantine; sp=reject; pct=100; rua=mailto:rua@contoso.com,mailto:eyqtblcl@ag.eu.dmarcadvisor.com,mailto:dmarc_agg@vali.email; ruf=mailto:ruf@contoso.com,mailto:eyqtblcl@fr.eu.dmarcadvisor.com; adkim=r; aspf=r; fo=1; rf=afrf; ri=86400;; policy: quarantine; issues: 0 | |
| wingtiptoys.com | DMARC record: v=DMARC1; p=quarantine; sp=reject; rua=mailto:rua@wingtiptoys.com,mailto:dmarc_agg@vali.email; ruf=mailto:ruf@wingtiptoys.com; fo=1; adkim=r; aspf=r; rf=afrf; ri=86400;; policy: quarantine; issues: 0 | |
| fabrikam.com | DMARC record: v=DMARC1; p=quarantine; rua=mailto:rua@fabrikam.com; ruf=mailto:ruf@fabrikam.com; fo=1; sp=reject; policy: quarantine; issues: 0 |
Remediation
Publish one DMARC TXT record and move policy to quarantine or reject after monitoring.
# DNS change required at _dmarc.<domain>, e.g. v=DMARC1
p=quarantine
rua=mailto:dmarc-reports@example.comConsiderations
Enforcing DMARC p=reject blocks mail that fails SPF and/or DKIM alignment, including forwarded mail and mailing lists that rewrite DMARC-aligned identities. Begin with p=none (monitoring mode) and review DMARC aggregate reports before moving to p=quarantine, then p=reject. Ensure DKIM is fully deployed before switching to reject policy.
References
- RFC 7489 - Domain-based Message Authentication, Reporting, and Conformance (DMARC)
- ENISA / NIS2 Directive (EU) 2022/2555 - Article 21(2)(e): network and information systems security, anti-spoofing - Section 1, 6.7, 3.2-3.4, 8
- CISA BOD 18-01 (2017): Enhance Email and Web Security - §d(3): Configure DMARC with a policy of reject
- CIS 9.5 (IG1): Implement DMARC and Enable Receiver-Side Verification
EDCA-TLS-024: Accepted domains publish SMTP DANE TLSA for MX hosts
Each MX host serving accepted domains MUST have SMTP DANE configured with TLSA records at _25._tcp.<mx-host>. CISA BOD 18-01 requires enforcing SMTP encryption for email transport.
Evidence
| Domain | Status | Evidence |
|---|---|---|
| contoso.com | _25._tcp.contoso-com.m-v1.mx.microsoft -> CNAME: smtpdane.mx.microsoft | |
| wingtiptoys.com | _25._tcp.wingtiptoys-com.s-v1.mx.microsoft -> CNAME: smtpdane.mx.microsoft | |
| fabrikam.com | _25._tcp.fabrikam-com.x-v1.mx.microsoft -> CNAME: smtpdane.mx.microsoft |
Remediation
Publish TLSA records for all MX targets and maintain DNSSEC-signed DNS zones for DANE trust validation.
# DNS change required: publish TLSA records at _25._tcp.<mx-host> and ensure DNSSEC chain of trust.Considerations
DANE requires DNSSEC to be enabled on the MX domain and TLSA records published in DNS. Many DNS providers do not support DNSSEC/DANE. Verify that your external DNS provider supports these features before attempting implementation. Incorrect TLSA records will cause legitimate inbound mail to be rejected by DANE-validating sending servers.
References
EDCA-TLS-025: Accepted domains publish valid MTA-STS policies
Each accepted domain MUST publish a valid MTA-STS DNS TXT record and host a reachable HTTPS policy file with STSv1 syntax. CISA BOD 18-01 requires enforcing email transport security via policy.
Evidence
| Domain | Status | Evidence |
|---|---|---|
| contoso.com | DNS record: "v=STSv1; id=202407191137" Policy (https://mta-sts.contoso.com/.well-known/mta-sts.txt): mode: enforce max_age: 604800 mx: contoso-com.m-v1.mx.microsoft | |
| wingtiptoys.com | DNS record: "v=STSv1; id=202604090914" Policy (https://mta-sts.wingtiptoys.com/.well-known/mta-sts.txt): mode: enforce max_age: 604800 mx: wingtiptoys-com.s-v1.mx.microsoft | |
| fabrikam.com | No MTA-STS DNS TXT record resolved: _mta-sts.fabrikam.com : DNS name does not exist |
Remediation
Publish _mta-sts TXT with v=STSv1; id=... and host a valid policy at https://mta-sts.<domain>/.well-known/mta-sts.txt.
# DNS + web hosting change required for MTA-STS policy publication.Considerations
MTA-STS in enforce mode causes sending servers that cannot verify TLS to bounce messages rather than deliver them in plaintext. Always begin with mode=testing and monitor policy evaluation before switching to enforce. The max_age TTL determines how long senders cache the policy - a shorter TTL allows faster rollback but reduces caching efficiency.
References
EDCA-TLS-026: Accepted domains publish valid SPF records
Each accepted domain MUST publish one syntactically valid SPF TXT record (v=spf1) with a terminal all mechanism and within the 10-lookup limit. CISA BOD 18-01 requires configuring SPF for all domains. CIS Controls v8 requires implementing DMARC and enabling receiver-side verification.
Evidence
| Domain | Status | Evidence |
|---|---|---|
| contoso.com | v=spf1 include:spf.protection.outlook.com ~all | |
| wingtiptoys.com | v=spf1 include:spf.protection.outlook.com -all | |
| fabrikam.com | v=spf1 include:spf.protection.outlook.com include:smtp.spf.ziggo.nl a:bbl29.synology.me -all |
Remediation
Publish one SPF TXT record per accepted domain with only authorized senders and an explicit -all or ~all policy.
# DNS change required: create one TXT at the zone apex, e.g. v=spf1 include:mail.example.com -allConsiderations
A hard-fail SPF record (v=spf1 ... -all) causes receiving servers to reject mail that does not pass SPF. Soft-fail (~all) marks mail without rejecting it. Before changing from softfail to hardfail, ensure all legitimate sending sources (bulk mail services, line-of-business applications, forwarding servers) are included in the SPF record. Incomplete SPF records will cause legitimate mail to be blocked.
References
- RFC 7208 - Sender Policy Framework (SPF)
- ENISA / NIS2 Directive (EU) 2022/2555 - Article 21(2)(e): network and information systems security, anti-spoofing - Section 1, 6.7, 3.2-3.4, 8
- CISA BOD 18-01 (2017): Enhance Email and Web Security - §d(1): Configure SPF for all domains
- CIS 9.5 (IG1): Implement DMARC and Enable Receiver-Side Verification
EDCA-TLS-027: DKIM signing is enabled for all accepted domains
Each accepted domain MUST have DKIM signing configured with valid selector keys published in DNS. DKIM (DomainKeys Identified Mail) cryptographically signs outbound messages, enabling receivers to verify message authenticity and prevent spoofing. Exchange Server on-premises does not natively support DKIM signing on any version; a third-party appliance, SaaS service, or signing agent is always required. BSI APP.5.3.A9 (Standard) requires DKIM as part of the expanded email authentication set (SPF + DKIM + DMARC + DANE + MTA-STS). CISA BOD 18-01 requires deploying DKIM for all domains. Detection probes well-known selectors for the following platforms: Exchange Online / Microsoft 365 (selector1, selector2), Google Workspace (google), Mimecast, Proofpoint (proofpoint), Amazon SES, SendGrid (s1, s2), Postmark (pm), Mailchimp / Mandrill (k1, k2), Klaviyo (k1, k2), Mailgun, SparkPost, Mailjet, SocketLabs, Salesforce Marketing Cloud, Symantec Email Security.cloud, and generic self-hosted signers (default, mail, dkim).
Evidence
| Domain | Status | Evidence |
|---|---|---|
| contoso.com | Exchange Online (Microsoft 365): - selector1._domainkey.contoso.com → CNAME: selector1-contoso-com._domainkey.contoso.onmicrosoft.com - selector2._domainkey.contoso.com → CNAME: selector2-contoso-com._domainkey.contoso.onmicrosoft.com | |
| wingtiptoys.com | Exchange Online (Microsoft 365): - selector1._domainkey.wingtiptoys.com → CNAME: selector1-wingtiptoys-com._domainkey.contoso.onmicrosoft.com - selector2._domainkey.wingtiptoys.com → CNAME: selector2-wingtiptoys-com._domainkey.contoso.onmicrosoft.com | |
| fabrikam.com | Exchange Online (Microsoft 365): - selector1._domainkey.fabrikam.com → CNAME: selector1-fabrikam-com._domainkey.fabrikam.onmicrosoft.com - selector2._domainkey.fabrikam.com → CNAME: selector2-fabrikam-com._domainkey.fabrikam.onmicrosoft.com |
Remediation
Configure DKIM signing via a third-party signing agent (e.g., Exchange DKIM Signer), a secure email gateway, or a cloud email security service, and publish selector TXT records in DNS.
# DKIM DNS records — Exchange Online (Microsoft 365) example
# The exact selector name and record value depend on the DKIM-supporting appliance or service in use.
# For other platforms (Exchange DKIM Signer, Mimecast, Proofpoint, etc.) refer to that platform's
# documentation for the correct selector and record value to publish in external DNS.
#
# Exchange Online requires two CNAME records per domain:
# selector1._domainkey.<domain> CNAME selector1-<domain-dots-as-hyphens>._domainkey.<tenant>.onmicrosoft.com
# selector2._domainkey.<domain> CNAME selector2-<domain-dots-as-hyphens>._domainkey.<tenant>.onmicrosoft.com
#
# Example for contoso.com with tenant contoso.onmicrosoft.com:
# selector1._domainkey.contoso.com CNAME selector1-contoso-com._domainkey.contoso.onmicrosoft.com
# selector2._domainkey.contoso.com CNAME selector2-contoso-com._domainkey.contoso.onmicrosoft.com
# Verify existing CNAME records resolve correctly:
$domains = Get-AcceptedDomain | Where-Object { $_.DomainType -eq 'Authoritative' }
foreach ($domain in $domains) {
$domainName = [string]$domain.DomainName
Write-Host "`n--- $domainName ---"
foreach ($selector in @('selector1', 'selector2')) {
$name = "$selector._domainkey.$domainName"
$result = Resolve-DnsName -Name $name -Type CNAME -ErrorAction SilentlyContinue
$cname = if ($result) { ($result | Where-Object { $_.Type -eq 'CNAME' } | ForEach-Object { $_.NameHost }) -join ' -> ' } else { $null }
Write-Host " $name : $(if ($cname) { "CNAME -> $cname" } else { 'NOT FOUND' })"
}
}Considerations
Exchange Server on-premises does not natively support DKIM signing on any version. For on-premises mail flow, DKIM signing must be handled externally — for example via Exchange DKIM Signer (https://github.com/pro/dkim-exchange), an open-source transport agent compatible with all Exchange Server versions. DNS selector records must be published at the external DNS provider before DKIM signing is activated, otherwise outbound messages will fail DKIM validation. DKIM must be fully deployed before enforcing DMARC p=reject (see EDCA-TLS-023).
References
- RFC 6376 - DomainKeys Identified Mail (DKIM) Signatures
- BSI IT-Grundschutz Kompendium 2023 - APP.5.3.A9: Erweiterte Sicherheitsmaßnahmen auf dem E-Mail-Server (Standard)
- CISA BOD 18-01 (2017): Enhance Email and Web Security - §d(2): Deploy DKIM for all domains
- Exchange DKIM Signer - Open-source DKIM signing agent for Exchange Server
- EmailArchitect – DKIM for Exchange Server for Exchange Server
EDCA-TLS-028: Accepted domains publish a valid TLS-RPT record
Each accepted domain SHOULD publish a valid TLS-RPT DNS TXT record at _smtp._tls.<domain> with the value v=TLSRPTv1 and a reporting endpoint (rua). TLS Reporting (RFC 8460) allows receiving domains to collect reports from sending servers about TLS negotiation failures, enabling operators to detect MTA-STS or DANE misconfigurations. BSI APP.5.3.A13 (Standard, erhöhter Schutzbedarf) requires TLS-Reporting for domains with elevated protection needs.
Evidence
| Domain | Status | Evidence |
|---|---|---|
| contoso.com | TLS-RPT record: v=TLSRPTv1; rua=mailto:tls@contoso.com,mailto:tls-report@vali.email; issues: 0 | |
| wingtiptoys.com | TLS-RPT record: v=TLSRPTv1; rua=mailto:tls@wingtiptoys.com,mailto:tls-report@vali.email; issues: 0 | |
| fabrikam.com | TLS-RPT record: v=TLSRPTv1; rua=mailto:tls@fabrikam.com; issues: 0 |
Remediation
Publish a TXT record at _smtp._tls.<domain> with content v=TLSRPTv1; rua=mailto:<reporting-address>.
# Diagnose: Check TLS-RPT DNS records for all accepted domains
$domains = Get-AcceptedDomain | Where-Object { $_.DomainType -eq 'Authoritative' }
foreach ($domain in $domains) {
$domainName = [string]$domain.DomainName
$tlsrpt = Resolve-DnsName -Name "_smtp._tls.$domainName" -Type TXT -ErrorAction SilentlyContinue
$value = if ($tlsrpt) { ($tlsrpt | ForEach-Object { $_.Strings -join '' }) -join '; ' } else { $null }
$status = if ($value -and ($value -match 'v=TLSRPTv1')) { 'OK' } elseif ($value) { 'INVALID' } else { 'MISSING' }
Write-Host "$domainName : $status$(if ($value) { ' ' + $value })"
}Considerations
TLS-RPT only collects diagnostic reports; it does not enforce any policy itself. It is most useful in combination with MTA-STS (EDCA-TLS-025) and DANE (EDCA-TLS-024), where TLS negotiation failures would otherwise be silent. The reporting address (rua) must be an active mailbox capable of receiving aggregate report emails from external senders. TLS-RPT applies only to domains that use MTA-STS or DANE; publishing it for domains without either protocol has no operational effect.
References
EDCA-TLS-029: Hybrid receive connector TLS integrity
At least one frontend transport receive connector MUST have TlsDomainCapabilities set to include mail.protection.outlook.com:AcceptCloudServicesMail (set by the Hybrid Configuration Wizard on Exchange 2016 CU3+ and Exchange 2019) or mail.protection.outlook.com:AcceptOorgProtocol (older hybrid deployments), MUST be enabled, and MUST include Tls in AuthMechanism. The TlsDomainCapabilities setting grants inbound connections from Exchange Online an elevated trust level, causing Exchange Server to treat mail arriving from Exchange Online as internal rather than anonymous. Without this setting, hybrid mail flow is classified as external, breaking features that depend on internal mail trust such as transport rules, moderation bypass, and public folder coexistence. Only connectors with TransportRole=FrontendTransport are relevant for inbound SMTP from Exchange Online.
Evidence
| Connector | Status | Evidence |
|---|---|---|
| EX3\Default Frontend EX3 | Enabled: True TlsDomainCapabilities: mail.protection.outlook.com:AcceptCloudServicesMail AuthMechanism: Tls, Integrated, BasicAuth, BasicAuthRequireTLS, ExchangeServer |
Remediation
Identify the frontend receive connector used for inbound mail from Exchange Online and set TlsDomainCapabilities to mail.protection.outlook.com:AcceptCloudServicesMail (Exchange 2016 CU3+/Exchange 2019/SE) or mail.protection.outlook.com:AcceptOorgProtocol (older deployments), ensure it is enabled, and ensure Tls is listed in AuthMechanism. The Hybrid Configuration Wizard configures this automatically; if it is missing, re-run the wizard or set the property manually.
# Diagnose: Check hybrid receive connectors across all Exchange servers
$servers = Get-ExchangeServer | Where-Object { $_.ServerRole -match 'Mailbox' }
foreach ($server in $servers) {
$connectors = Get-ReceiveConnector -Server $server.Name | Where-Object {
$_.TransportRole -eq 'FrontendTransport' -and
-not [string]::IsNullOrWhiteSpace([string]$_.TlsDomainCapabilities)
}
foreach ($c in $connectors) {
Write-Host "$($c.Identity)"
Write-Host " Enabled: $($c.Enabled)"
Write-Host " AuthMechanism: $($c.AuthMechanism)"
Write-Host " TlsDomainCapabilities: $($c.TlsDomainCapabilities)"
}
}
# Remediate: Set required properties on the hybrid receive connector
# $connector = Get-ReceiveConnector '<ServerName>\<ConnectorName>'
# Set-ReceiveConnector $connector.Identity -TlsDomainCapabilities 'mail.protection.outlook.com:AcceptCloudServicesMail' -AuthMechanism 'Tls, Integrated, BasicAuth, BasicAuthRequireTLS, ExchangeServer'
# NOTE: Use AcceptCloudServicesMail for Exchange 2016 CU3+/Exchange 2019/SE (HCW default). Use AcceptOorgProtocol for older hybrid deployments.Considerations
The Hybrid Configuration Wizard (HCW) creates and configures the hybrid receive connector automatically. If the environment was configured manually or the HCW was run partially, the connector may be missing or misconfigured. The exact AuthMechanism value depends on the connector type; the requirement is that Tls is included. In Exchange 2019 CU12+ and Exchange 2016 CU23+ environments using Modern Hybrid (connector-less), inbound mail from Exchange Online may not use a dedicated receive connector at all — verify the deployment model before applying this control.
References
EDCA-TLS-030: Edge subscription is active and valid
The Edge Transport server MUST have at least one active Edge subscription synchronising routing and recipient data with the internal Exchange organisation. An Edge server without a valid subscription cannot perform recipient validation or update anti-spam data, and mail routing decisions are made without current directory data.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | 1 valid Edge subscription(s) found, synchronising to site(s): . |
Remediation
Run the Edge Subscription wizard or New-EdgeSubscription and ImportEdgeConfig to establish a new subscription. Verify with Get-EdgeSubscription.
Get-EdgeSubscription | Format-List Name, Domain, Site, CreateUtc, LeaseType, IsValidConsiderations
After creating an Edge subscription, allow up to 60 minutes for EdgeSync to complete the initial synchronisation. The LeaseType value should be Leader to indicate a healthy subscription.
References
EDCA-TLS-031: Edge anti-spam agents are enabled
The Edge Transport server MUST have content filtering, recipient filtering, sender filtering, and connection filtering agents enabled. The Connection Filtering agent is enabled or disabled independently via Enable-TransportAgent / Disable-TransportAgent, not via a *-ConnectionFilterConfig cmdlet. Disabled anti-spam agents allow spam, phishing, and malicious mail to pass to internal mail servers without inspection.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Content, recipient, sender, and connection filtering agents are all enabled. |
Remediation
Enable the relevant agent(s). For content, recipient, and sender filtering use Set-ContentFilterConfig -Enabled $true, Set-RecipientFilterConfig -Enabled $true, or Set-SenderFilterConfig -Enabled $true. For connection filtering, enable the Connection Filtering transport agent with Enable-TransportAgent 'Connection Filtering Agent' then restart the transport service.
Get-ContentFilterConfig | Select-Object Enabled
Get-RecipientFilterConfig | Select-Object Enabled
Get-SenderFilterConfig | Select-Object Enabled
Get-TransportAgent -Identity 'Connection Filtering Agent' | Select-Object Identity,Enabled
# To enable connection filtering:
# Enable-TransportAgent 'Connection Filtering Agent'
# Restart-Service MSExchangeTransportConsiderations
Enabling or tuning anti-spam agents may temporarily affect mail flow if the thresholds are misconfigured. Test in a staging environment when possible.
References
EDCA-TLS-032: Edge recipient validation is enabled
The Edge Transport server MUST have recipient validation enabled in the recipient filter configuration. Without recipient validation, the Edge server accepts mail for non-existent recipients, consumes resources responding to directory harvest attacks, and delivers non-delivery reports that confirm valid addresses to external senders.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Recipient validation is enabled; mail for non-existent recipients is rejected at the Edge. |
Remediation
Enable recipient validation with Set-RecipientFilterConfig -RecipientValidationEnabled $true.
Set-RecipientFilterConfig -RecipientValidationEnabled $trueConsiderations
Recipient validation requires an active Edge subscription so the Edge server holds a current copy of the recipient data. Enable the Edge subscription before enabling recipient validation.
References
EDCA-TLS-033: Edge blank sender blocking is enabled
The Edge Transport server MUST have blank sender blocking enabled in the sender filter configuration. Mail with a blank MAIL FROM address is typically used in bounce spam and backscatter attacks. Accepting blank-sender mail generates non-delivery reports directed at innocent third parties.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Blank sender blocking is enabled; mail with an empty MAIL FROM address is rejected. |
Remediation
Enable blank sender blocking with Set-SenderFilterConfig -BlankSenderBlockingEnabled $true.
Set-SenderFilterConfig -BlankSenderBlockingEnabled $trueConsiderations
Some automated systems legitimately use a blank MAIL FROM for bounce notifications. Verify that enabling this setting does not block required notification mail before enforcing it in production.
References
EDCA-TLS-034: Edge outbound send connectors require TLS
All outbound send connectors on the Edge Transport server MUST have RequireTls set to True. Send connectors without mandatory TLS transmit mail in cleartext over the internet, exposing message content and sender/recipient metadata to interception and modification.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | 2 of 2 enabled send connector(s) do not require TLS: - @{OrgHierarchyToIgnore=; IsDeleted=False; Rdn=CN=EdgeSync - Default-First-Site-Name to Internet; Parent=Connections; Depth=10; DistinguishedName=CN=EdgeSync - Default-First-Site-Name to Internet,CN=Connections,CN=Exchange Routing Group (DWBGZMFD01QNBJR),CN=Routing Groups,CN=Exchange Administrative Group (FYDIBOHF23SPDLT),CN=Administrative Groups,CN=First Organization,CN=Microsoft Exchange,CN=Services,CN=Configuration,CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; IsRelativeDn=False; DomainId=CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; PartitionGuid=59ce2f71-eaa2-4ddf-a4fa-f25069d0b324; PartitionFQDN=CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; ObjectGuid=2e5fda10-7b64-4fa4-80f2-cd1457641673; Name=EdgeSync - Default-First-Site-Name to Internet} - @{OrgHierarchyToIgnore=; IsDeleted=False; Rdn=CN=EdgeSync - Inbound to Default-First-Site-Name; Parent=Connections; Depth=10; DistinguishedName=CN=EdgeSync - Inbound to Default-First-Site-Name,CN=Connections,CN=Exchange Routing Group (DWBGZMFD01QNBJR),CN=Routing Groups,CN=Exchange Administrative Group (FYDIBOHF23SPDLT),CN=Administrative Groups,CN=First Organization,CN=Microsoft Exchange,CN=Services,CN=Configuration,CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; IsRelativeDn=False; DomainId=CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; PartitionGuid=59ce2f71-eaa2-4ddf-a4fa-f25069d0b324; PartitionFQDN=CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; ObjectGuid=52014617-7f4f-4ba2-b9a2-11fdbfaf53e4; Name=EdgeSync - Inbound to Default-First-Site-Name} |
Remediation
Set RequireTls = $true on all send connectors: Set-SendConnector -Identity <name> -RequireTls $true. Verify that receiving mail servers present a valid certificate before enabling, to avoid mail flow disruption.
Get-SendConnector | Where-Object { -not $_.RequireTls } | Select-Object Identity, RequireTls, TlsAuthLevel, SmartHostsConsiderations
Enabling RequireTls means the send connector will fail delivery if the remote server does not present a valid TLS certificate. Test with non-critical connectors first.
References
EDCA-TLS-035: Edge send connector protocol logging is Verbose
All send connectors on the Edge Transport server MUST have protocol logging set to Verbose. Without verbose protocol logging, SMTP conversation details are not captured, making it impossible to diagnose mail flow issues or investigate security incidents involving outbound mail.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | 2 of 2 send connector(s) do not have Verbose protocol logging: - @{OrgHierarchyToIgnore=; IsDeleted=False; Rdn=CN=EdgeSync - Default-First-Site-Name to Internet; Parent=Connections; Depth=10; DistinguishedName=CN=EdgeSync - Default-First-Site-Name to Internet,CN=Connections,CN=Exchange Routing Group (DWBGZMFD01QNBJR),CN=Routing Groups,CN=Exchange Administrative Group (FYDIBOHF23SPDLT),CN=Administrative Groups,CN=First Organization,CN=Microsoft Exchange,CN=Services,CN=Configuration,CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; IsRelativeDn=False; DomainId=CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; PartitionGuid=59ce2f71-eaa2-4ddf-a4fa-f25069d0b324; PartitionFQDN=CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; ObjectGuid=2e5fda10-7b64-4fa4-80f2-cd1457641673; Name=EdgeSync - Default-First-Site-Name to Internet} (ProtocolLoggingLevel: @{Value=None}) - @{OrgHierarchyToIgnore=; IsDeleted=False; Rdn=CN=EdgeSync - Inbound to Default-First-Site-Name; Parent=Connections; Depth=10; DistinguishedName=CN=EdgeSync - Inbound to Default-First-Site-Name,CN=Connections,CN=Exchange Routing Group (DWBGZMFD01QNBJR),CN=Routing Groups,CN=Exchange Administrative Group (FYDIBOHF23SPDLT),CN=Administrative Groups,CN=First Organization,CN=Microsoft Exchange,CN=Services,CN=Configuration,CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; IsRelativeDn=False; DomainId=CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; PartitionGuid=59ce2f71-eaa2-4ddf-a4fa-f25069d0b324; PartitionFQDN=CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; ObjectGuid=52014617-7f4f-4ba2-b9a2-11fdbfaf53e4; Name=EdgeSync - Inbound to Default-First-Site-Name} (ProtocolLoggingLevel: @{Value=None}) |
Remediation
Enable verbose protocol logging on all send connectors: Get-SendConnector | Set-SendConnector -ProtocolLoggingLevel Verbose.
Get-SendConnector | Where-Object { $_.ProtocolLoggingLevel -ne 'Verbose' } | Set-SendConnector -ProtocolLoggingLevel VerboseConsiderations
Verbose protocol logging increases disk I/O and log file volume. Ensure the log partition has sufficient space and that a log rotation policy is in place.
References
EDCA-TLS-036: Edge SMTP certificate has the SMTP service assigned
The Edge Transport server MUST have at least one non-expired certificate with the SMTP service assigned. Without an SMTP-assigned certificate, the Edge server cannot present a certificate during STARTTLS negotiation, forcing all inbound and outbound SMTP sessions to communicate in cleartext.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | 2 non-expired certificate(s) with the SMTP service assigned: CN=mail.fabrikam.com, CN=ex1 |
Remediation
Import or request a certificate suitable for SMTP and assign the SMTP service: Enable-ExchangeCertificate -Thumbprint <thumb> -Services SMTP.
Get-ExchangeCertificate | Where-Object { $_.Services -match 'SMTP' } | Select-Object Thumbprint, Subject, NotAfter, ServicesConsiderations
The self-signed certificate installed by Exchange Setup is assigned to the SMTP service by default and is sufficient for opportunistic TLS between Edge and Mailbox servers. Replace it with a CA-signed certificate for inbound connections from external senders that enforce domain security.
References
EDCA-TLS-037: Edge Receive connectors have domain secure enabled
Receive connectors on the Edge Transport server that receive mail from external partner domains MUST have DomainSecureEnabled set to True. Domain security uses mutual TLS (MTLS) to authenticate partner mail servers and protect mail in transit. Without it, the Edge server cannot negotiate MTLS with partner domains.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | All 1 Receive connector(s) have DomainSecureEnabled set to True. |
Remediation
Enable domain security on Receive connectors: Set-ReceiveConnector -Identity <name> -DomainSecureEnabled $true.
Get-ReceiveConnector | Select-Object Identity, DomainSecureEnabled
# To enable:
# Set-ReceiveConnector -Identity '<name>' -DomainSecureEnabled $trueConsiderations
DomainSecureEnabled on a Receive connector is a prerequisite for MTLS with external partners. It must be paired with matching Send connector configuration and DNS TXT records for the partner domain. Enabling it alone does not force MTLS; it makes MTLS possible when both sides present valid certificates.
References
EDCA-TLS-038: Edge internet-facing Receive connectors offer TLS before basic authentication
Internet-facing Receive connectors on the Edge Transport server MUST have TLS in the AuthMechanism list. Offering basic authentication before TLS exposes credentials in cleartext during the SMTP handshake. TLS must be offered to encrypt the session before any authentication challenge.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | All 1 internet-facing Receive connector(s) include Tls in AuthMechanism. |
Remediation
Ensure Tls is in the AuthMechanism of internet-facing Receive connectors. Set-ReceiveConnector -Identity <name> -AuthMechanism Tls.
Get-ReceiveConnector | Select-Object Identity, AuthMechanism, BindingsConsiderations
Internet-facing Receive connectors on an Edge server typically accept connections from external SMTP servers. Modifying AuthMechanism may affect relay partner configurations. Verify with mail flow tests after changes.
References
EDCA-TLS-039: Edge internal Receive connectors require TLS encryption
Internal Receive connectors on the Edge Transport server (those accepting connections from internal Hub/Mailbox servers) MUST require TLS. Without mandatory TLS, internal mail can traverse the network segment between Mailbox and Edge servers in cleartext, exposing message content to interception.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | 1 internal Receive connector(s) do not require TLS: - @{OrgHierarchyToIgnore=; IsDeleted=False; Rdn=CN=Default internal receive connector EX1; Parent=SMTP Receive Connectors; Depth=11; DistinguishedName=CN=Default internal receive connector EX1,CN=SMTP Receive Connectors,CN=Protocols,CN=ex1,CN=Servers,CN=Exchange Administrative Group (FYDIBOHF23SPDLT),CN=Administrative Groups,CN=First Organization,CN=Microsoft Exchange,CN=Services,CN=Configuration,CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; IsRelativeDn=False; DomainId=CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; PartitionGuid=59ce2f71-eaa2-4ddf-a4fa-f25069d0b324; PartitionFQDN=CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; ObjectGuid=f60a8068-fb2f-4b87-a73f-51a76a5f7b76; Name=Default internal receive connector EX1} (RequireTLS: False) |
Remediation
Ensure AuthMechanism on internal Receive connectors includes Tls. Set-ReceiveConnector -Identity <name> -AuthMechanism Tls -RequireTLS $true.
# Diagnose: identify internal Receive connectors on this Edge server.
# Internal connectors are identified by ExchangeServer in AuthMechanism (set by EdgeSync during subscription).
$serverName = $env:COMPUTERNAME
$internalRc = Get-ReceiveConnector -Server $serverName | Where-Object {
[string]$_.AuthMechanism -match '\bExchangeServer\b'
}
$internalRc | Select-Object Identity, AuthMechanism, RequireTLS, Bindings
# Fix: require TLS on each internal Receive connector that does not already enforce it.
foreach ($rc in ($internalRc | Where-Object { -not $_.RequireTLS })) {
Set-ReceiveConnector -Identity $rc.Identity -RequireTLS $true
Write-Host "RequireTLS enabled on $($rc.Identity)."
}Considerations
The internal Receive connector on an Edge server is used by Mailbox servers to relay outbound mail to the Edge for internet delivery. Requiring TLS on this connector means Mailbox servers must present a valid certificate. The default Exchange transport certificate satisfies this requirement.
References
EDCA-TLS-040: Edge internal Receive connectors disallow anonymous connections
Internal Receive connectors on the Edge Transport server MUST NOT permit anonymous connections. Allowing anonymous connections on internal connectors enables unauthenticated relay, which can be abused to send spam or bypass anti-spam controls.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | 1 internal Receive connector(s) allow anonymous connections: - @{OrgHierarchyToIgnore=; IsDeleted=False; Rdn=CN=Default internal receive connector EX1; Parent=SMTP Receive Connectors; Depth=11; DistinguishedName=CN=Default internal receive connector EX1,CN=SMTP Receive Connectors,CN=Protocols,CN=ex1,CN=Servers,CN=Exchange Administrative Group (FYDIBOHF23SPDLT),CN=Administrative Groups,CN=First Organization,CN=Microsoft Exchange,CN=Services,CN=Configuration,CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; IsRelativeDn=False; DomainId=CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; PartitionGuid=59ce2f71-eaa2-4ddf-a4fa-f25069d0b324; PartitionFQDN=CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; ObjectGuid=f60a8068-fb2f-4b87-a73f-51a76a5f7b76; Name=Default internal receive connector EX1} (PermissionGroups: @{Value=AnonymousUsers, ExchangeServers, Partners}) |
Remediation
Remove AnonymousUsers from the PermissionGroups on internal Receive connectors.
# Diagnose: identify internal Receive connectors on this Edge server.
# Internal connectors are identified by ExchangeServer in AuthMechanism (set by EdgeSync during subscription).
$serverName = $env:COMPUTERNAME
$internalRc = Get-ReceiveConnector -Server $serverName | Where-Object {
[string]$_.AuthMechanism -match '\bExchangeServer\b'
}
$internalRc | Select-Object Identity, PermissionGroups, AuthMechanism, Bindings
# Fix: remove AnonymousUsers permission group from each internal connector that permits it.
foreach ($rc in ($internalRc | Where-Object { [string]$_.PermissionGroups -match '\bAnonymousUsers\b' })) {
Set-ReceiveConnector -Identity $rc.Identity -PermissionGroups ($rc.PermissionGroups -band (-bnot [Microsoft.Exchange.Data.PermissionGroups]::AnonymousUsers))
Write-Host "AnonymousUsers removed from $($rc.Identity)."
}Considerations
Internal Receive connectors used by Exchange Mailbox servers should use ExchangeServers or ExchangeLegacyServers permission groups, not AnonymousUsers. Removing anonymous access from a connector that is currently used for anonymous relay will immediately block that mail flow. Audit relay sources before making changes.
References
EDCA-TLS-041: SMTP banner must not reveal server version details
All Receive connectors on both Mailbox and Edge Transport servers MUST present a generic SMTP banner that does not disclose server identity, version, or operating system information. The default Exchange banner includes the server hostname, enabling attackers to fingerprint the software version and target known vulnerabilities. Internet-facing connectors are identified by PermissionGroups containing AnonymousUsers and AuthMechanism of Tls or None. An empty banner causes Exchange to emit the default identity-revealing greeting and is therefore treated as non-compliant.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | No internet-facing Receive connectors identified on this server; SMTP banner exposure not applicable. | |
| ex2 | All 1 internet-facing Receive connector(s) have a custom SMTP banner that does not reveal server identity. | |
| ex3 | All 1 internet-facing Receive connector(s) have a custom SMTP banner that does not reveal server identity. |
Remediation
Set a generic SMTP banner on all internet-facing Receive connectors on the server to avoid disclosing server details. Internet-facing connectors are identified by PermissionGroups containing AnonymousUsers and AuthMechanism of Tls or None. The banner must begin with '220' per RFC 5321. A value such as '220 Ready.' reveals no version, hostname, or product information. An empty banner results in Exchange using the default identity-revealing greeting and must be replaced.
# Set a non-revealing SMTP banner on internet-facing Receive connectors of this server.
# Internet-facing connectors: PermissionGroups includes AnonymousUsers AND AuthMechanism includes Tls or is None.
# Adjust the banner text to match your organisation's policy; it must start with '220'.
$serverName = $env:COMPUTERNAME
$allConnectors = Get-ReceiveConnector -Server $serverName
$internetFacing = @($allConnectors | Where-Object {
([string]$_.PermissionGroups -match '\bAnonymousUsers\b') -and
([string]$_.AuthMechanism -match '\bTls\b' -or [string]$_.AuthMechanism -eq 'None')
})
if ($internetFacing.Count -eq 0) {
Write-Warning "No internet-facing Receive connectors found on $serverName."
} else {
# Diagnose: show current banners
$internetFacing | Select-Object Identity, Banner
# Fix: set a generic banner on each connector with an empty or revealing banner
foreach ($connector in $internetFacing) {
Set-ReceiveConnector -Identity $connector.Identity -Banner '220 Ready.'
Write-Host "Banner updated on $($connector.Identity)."
}
}Considerations
Changing the SMTP banner is low-risk with no impact on mail delivery. The '220' status code is required by RFC 5321; the greeting text after it is arbitrary. Ensure the banner starts with '220 ' to remain RFC-compliant. An empty Banner field causes Exchange to fall back to the default identity-revealing greeting, so always set an explicit value. Some monitoring solutions parse SMTP banners for version tracking — update them accordingly.
References
EDCA-TLS-042: Edge internet-facing Send connectors route via a Smart Host
Internet-facing Send connectors on the Edge Transport server MUST route mail through an approved Smart Host rather than resolving recipients directly via DNS MX. Direct DNS-based delivery bypasses gateway filtering, egress controls, and data-loss-prevention inspection.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | 1 enabled send connector(s) use direct DNS routing instead of a Smart Host: - @{OrgHierarchyToIgnore=; IsDeleted=False; Rdn=CN=EdgeSync - Default-First-Site-Name to Internet; Parent=Connections; Depth=10; DistinguishedName=CN=EdgeSync - Default-First-Site-Name to Internet,CN=Connections,CN=Exchange Routing Group (DWBGZMFD01QNBJR),CN=Routing Groups,CN=Exchange Administrative Group (FYDIBOHF23SPDLT),CN=Administrative Groups,CN=First Organization,CN=Microsoft Exchange,CN=Services,CN=Configuration,CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; IsRelativeDn=False; DomainId=CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; PartitionGuid=59ce2f71-eaa2-4ddf-a4fa-f25069d0b324; PartitionFQDN=CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; ObjectGuid=2e5fda10-7b64-4fa4-80f2-cd1457641673; Name=EdgeSync - Default-First-Site-Name to Internet} |
Remediation
Configure Send connectors to route via an approved Smart Host: Set-SendConnector -Identity <name> -SmartHosts <FQDN-or-IP> -SmartHostAuthMechanism None.
Get-SendConnector | Select-Object Identity, SmartHosts, DNSRoutingEnabled, SmartHostAuthMechanismConsiderations
Using a Smart Host adds a single point of egress that can be monitored, filtered, and rate-limited. Ensure the Smart Host is highly available; a misconfigured or unavailable Smart Host will halt all outbound mail flow from the Edge server.
References
EDCA-TLS-043: Edge internal Send connectors use mutual-TLS domain security
Internal Send connectors on the Edge Transport server (those delivering mail back to Mailbox servers) MUST use mutual TLS (domain security). Without MTLS on the internal path, mail forwarded from Edge back to internal Mailbox servers is not authenticated, allowing man-in-the-middle interception.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | 1 enabled send connector(s) do not have DomainSecureEnabled: - @{OrgHierarchyToIgnore=; IsDeleted=False; Rdn=CN=EdgeSync - Inbound to Default-First-Site-Name; Parent=Connections; Depth=10; DistinguishedName=CN=EdgeSync - Inbound to Default-First-Site-Name,CN=Connections,CN=Exchange Routing Group (DWBGZMFD01QNBJR),CN=Routing Groups,CN=Exchange Administrative Group (FYDIBOHF23SPDLT),CN=Administrative Groups,CN=First Organization,CN=Microsoft Exchange,CN=Services,CN=Configuration,CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; IsRelativeDn=False; DomainId=CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; PartitionGuid=59ce2f71-eaa2-4ddf-a4fa-f25069d0b324; PartitionFQDN=CN={4A58F5F0-6475-4BED-B1A4-194A48854095}; ObjectGuid=52014617-7f4f-4ba2-b9a2-11fdbfaf53e4; Name=EdgeSync - Inbound to Default-First-Site-Name} |
Remediation
Set TlsAuthLevel to DomainValidation and DomainSecureEnabled to $true on internal Send connectors.
Get-SendConnector | Select-Object Identity, TlsAuthLevel, DomainSecureEnabled, SmartHostsConsiderations
MTLS on the Edge-to-Mailbox Send connector requires that both sides present valid certificates and that the sending domain is listed in the receiving connector's TlsDomain. Ensure the Edge subscription is active and certificates are valid before enabling.
References
EDCA-TLS-044: Edge Sender Filter blocks messages from unaccepted domains
The Edge Transport server Sender Filter MUST be configured to block senders from domains that are not in the organisation's accepted domain list. Permitting mail from unaccepted sender domains allows spoofed messages that impersonate internal addresses to reach recipients.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Sender filter is enabled but no blocked domains are configured. Add unaccepted sending domains to block spoofed internal-domain senders. |
Remediation
Enable blocking of unaccepted domain senders: Set-SenderFilterConfig -BlockedSendersAndDomains @{Add='<domain>'} and ensure the filter is enabled.
Get-SenderFilterConfig | Select-Object Enabled, BlankSenderBlockingEnabled, BlockedSendersAndDomainsConsiderations
Blocking unaccepted domains in the sender filter prevents spoofed internal-domain mail from external sources. This is most effective when combined with SPF, DKIM, and DMARC enforcement. Ensure legitimate partner relays are whitelisted before enabling domain-based blocking.
References
EDCA-TLS-045: Edge Sender Reputation filter is enabled
The Edge Transport server MUST have the Sender Reputation filter enabled. Sender Reputation analyses connection behaviour to calculate a Sender Reputation Level (SRL) and block senders that exceed the threshold. Disabled Sender Reputation allows high-volume spam and relay sources to remain undetected.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Sender Reputation filter is enabled. |
Remediation
Enable Sender Reputation: Set-SenderReputationConfig -Enabled $true.
Get-SenderReputationConfig | Select-Object Enabled, SenderBlockingEnabled, SenderBlockingPeriod
# To enable:
# Set-SenderReputationConfig -Enabled $trueConsiderations
Sender Reputation requires the Protocol Analysis agent to be enabled. The SRL threshold and blocking period are configurable. In high-volume environments, tune the threshold to balance false-positive risk against spam blocking effectiveness.
References
EDCA-TLS-046: Edge content filter is enabled
The Edge Transport server MUST have the content filter (spam confidence level evaluation) enabled. The content filter assigns a Spam Confidence Level (SCL) to each message; messages that exceed the SCL threshold are blocked, quarantined, or tagged. Disabling the content filter allows spam and phishing messages to pass without SCL classification.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Content filter (spam confidence level evaluation) is enabled. |
Remediation
Enable the content filter: Set-ContentFilterConfig -Enabled $true.
Get-ContentFilterConfig | Select-Object Enabled, SCLDeleteEnabled, SCLDeleteThreshold, SCLQuarantineEnabled, SCLRejectEnabled
# To enable:
# Set-ContentFilterConfig -Enabled $trueConsiderations
The content filter uses Intelligent Message Filter (IMF) heuristics. After enabling, monitor SCL thresholds to ensure legitimate mail is not incorrectly classified. False positives can be reduced by adding trusted senders to the safe sender list.
References
EDCA-TLS-047: Edge Sender ID filter rejects malformed From addresses
The Edge Transport server MUST have the Sender ID filter enabled and configured to reject messages with malformed From headers. Sender ID validates the Purported Responsible Address (PRA) in the message header against the sending domain's SPF record. Without it, spoofed header-From addresses are not challenged.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | Sender ID filter is enabled. SpoofedDomainAction: @{Value=StampStatus}. |
Remediation
Enable Sender ID and configure it to reject spoofed messages: Set-SenderIdConfig -Enabled $true -SpoofedDomainAction Reject.
Get-SenderIdConfig | Select-Object Enabled, SpoofedDomainAction
# To enable:
# Set-SenderIdConfig -Enabled $true -SpoofedDomainAction RejectConsiderations
Sender ID is a predecessor to modern SPF/DMARC enforcement. Some sending organisations do not publish SPF records, and Sender ID validation against those domains will return None (not a failure). Configure the SpoofedDomainAction to match your policy: StampStatus (tag only), Reject (block), or Delete.
References
EDCA-TLS-048: Edge Receive connector tarpitting interval is configured
Receive connectors on the Edge Transport server MUST have a tarpitting interval of at least 5 seconds (00:00:05). Tarpitting introduces an artificial delay in SMTP responses to commands issued by senders who fail recipient validation, slowing down directory harvest attacks and reducing the throughput of malicious senders.
Evidence
| Server | Status | Evidence |
|---|---|---|
| EX1 | All 1 Receive connector(s) have a tarpitting interval of at least 5 seconds. |
Remediation
Set TarpitInterval to at least 00:00:05 on all Edge Receive connectors: Set-ReceiveConnector -Identity <name> -TarpitInterval '00:00:05'.
Get-ReceiveConnector | Select-Object Identity, TarpitInterval
# To set minimum tarpitting:
# Get-ReceiveConnector | Set-ReceiveConnector -TarpitInterval '00:00:05'Considerations
The default tarpitting interval in Exchange is 5 seconds (00:00:05), which meets this control. Verify that no connector has been set to 00:00:00. Increasing the interval beyond 5 seconds may cause timeouts with legitimate mail servers that have strict timeout thresholds.