AWS Organization has centralized root credentials management enabled
AWS Organizations uses centralized root credentials management to control root user credentials across member accounts.
This finding evaluates whether the organization has enabled the RootCredentialsManagement feature to centrally govern presence and recovery of root passwords, access keys, signing certificates, and MFA.
Risk
Without central control, member accounts can retain or recover long-term root credentials, weakening confidentiality and integrity.
Threats include:
- Account takeover via root email recovery
- Persistent access through root keys
- Unfixable lockouts from misconfigured policies
- Bypass of separation of duties
Run this check with Prowler
Run in Prowler Cloudprowler aws --checks iam_root_credentials_management_enabledRecommendation
Enable centralized root access with root credentials management and assign a delegated administrator.
Apply least privilege and separation of duties by deleting long-term root credentials in members, limiting privileged tasks to short-lived sessions, enforcing MFA, and auditing root-related activity for defense in depth.
Remediation
CLI
aws iam enable-organizations-root-credentials-managementOther
Check Code
from prowler.lib.check.models import Check, Check_Report_AWS
from prowler.providers.aws.services.iam.iam_client import iam_client
from prowler.providers.aws.services.organizations.organizations_client import (
organizations_client,
)
class iam_root_credentials_management_enabled(Check):
def execute(self) -> Check_Report_AWS:
findings = []
if (
organizations_client.organization
and organizations_client.organization.status == "ACTIVE"
and iam_client.organization_features is not None
):
report = Check_Report_AWS(
metadata=self.metadata(),
resource={},
)
report.region = iam_client.region
report.resource_arn = iam_client.audited_account_arn
report.resource_id = iam_client.audited_account
if "RootCredentialsManagement" in iam_client.organization_features:
report.status = "PASS"
report.status_extended = "Root credentials management is enabled."
else:
report.status = "FAIL"
report.status_extended = "Root credentials management is not enabled."
findings.append(report)
return findings