Back to Checks
Idle session timeout of 3 hours or less is configured
entra_idle_session_timeout_configured
Service: entraSeverity: medium
OfficialBuilt-inVerified
Categories:identity-accesse3
Resource Type:NotDefined
An activity-based timeout policy should sign out inactive users from Microsoft 365 web apps after a period of inactivity. The web session idle timeout (WebSessionIdleTimeout) should be set to 3 hours or less so that unattended sessions are terminated.
Risk
Without an idle session timeout, an unattended and unlocked session on a shared or public device remains authenticated indefinitely, allowing anyone with physical access to act as the signed-in user.
Run this check with Prowler
Run in Prowler CloudRun
prowler m365 --checks entra_idle_session_timeout_configuredRecommendation
Configure an idle session timeout of 3 hours or less so inactive users are automatically signed out of Microsoft 365 web apps.
Remediation
Other
1Navigate to the Microsoft 365 admin center at https://admin.microsoft.com/
2Go to **Settings** > **Org settings** > **Security & Privacy** > **Idle session timeout**
3Turn on the setting and set the period of inactivity to **3 hours** or less
4Click **Save**
Check Code
from typing import List
from prowler.lib.check.models import Check, CheckReportM365
from prowler.providers.m365.services.entra.entra_client import entra_client
# CIS recommends an idle session timeout of 3 hours or less.
MAX_IDLE_TIMEOUT_SECONDS = 3 * 60 * 60
class entra_idle_session_timeout_configured(Check):
"""Check if an idle session timeout of 3 hours or less is configured.
An activity-based timeout policy should sign out inactive users from Microsoft
365 web apps after a period of inactivity. The web session idle timeout should be
set to 3 hours or less.
- PASS: An activity-based timeout policy enforces an idle timeout of 3 hours or
less.
- FAIL: No activity-based timeout policy enforces an idle timeout of 3 hours or
less.
"""
def execute(self) -> List[CheckReportM365]:
"""Execute the idle session timeout policy check.
Returns:
A list of reports for the collected activity-based timeout policies.
"""
findings = []
policies = entra_client.activity_based_timeout_policies
if not policies:
report = CheckReportM365(
metadata=self.metadata(),
resource={},
resource_name="Activity Based Timeout Policies",
resource_id="activityBasedTimeoutPolicies",
)
report.status = "FAIL"
report.status_extended = (
"No activity-based timeout policy enforces an idle session timeout of "
"3 hours or less."
)
findings.append(report)
return findings
for policy in policies:
report = CheckReportM365(
metadata=self.metadata(),
resource=policy,
resource_name=policy.display_name or "Activity Based Timeout Policy",
resource_id=policy.id,
)
timeout = policy.web_session_idle_timeout_seconds
if timeout is not None and timeout <= MAX_IDLE_TIMEOUT_SECONDS:
report.status = "PASS"
report.status_extended = (
f"Activity-based timeout policy '{policy.display_name or policy.id}' "
f"enforces an idle session timeout of {timeout // 60} minutes and "
f"{timeout % 60} seconds."
)
else:
report.status = "FAIL"
report.status_extended = (
f"Activity-based timeout policy '{policy.display_name or policy.id}' "
"does not enforce an idle session timeout of 3 hours or less."
)
findings.append(report)
return findings