Cognito user pool password policy requires at least one uppercase letter
Amazon Cognito user pool password policy is evaluated for an uppercase character requirement (require_uppercase). The check also identifies user pools that have no password policy configured.
Risk
Missing an uppercase requirement lowers password entropy, easing password spraying, brute force, and offline cracking. Account takeover risks user data (confidentiality), enables unauthorized changes (integrity), and may disrupt services through abuse or lockouts (availability).
Run this check with Prowler
Run in Prowler Cloudprowler aws --checks cognito_user_pool_password_policy_uppercaseRecommendation
Enforce a strong password policy requiring uppercase characters, sufficient minimum_length, and diverse character sets. Layer defenses: MFA, rate limiting/lockout, and password reuse history. Where feasible, prefer long passphrases and monitor authentication events to prevent account takeover.
Remediation
CLI
aws cognito-idp update-user-pool --user-pool-id <USER_POOL_ID> --policies PasswordPolicy={RequireUppercase=true}Terraform
# Require uppercase in Cognito User Pool password policy
resource "aws_cognito_user_pool" "<example_resource_name>" {
name = "<example_resource_name>"
password_policy {
require_uppercase = true # Critical: enforce at least one uppercase letter
}
}NativeIaC
# CloudFormation to require uppercase in Cognito User Pool password policy
Resources:
<example_resource_name>:
Type: AWS::Cognito::UserPool
Properties:
Policies:
PasswordPolicy:
RequireUppercase: true # Critical: enforce at least one uppercase letterOther
Check Code
from prowler.lib.check.models import Check, Check_Report_AWS
from prowler.providers.aws.services.cognito.cognito_idp_client import cognito_idp_client
class cognito_user_pool_password_policy_uppercase(Check):
def execute(self):
findings = []
for pool in cognito_idp_client.user_pools.values():
report = Check_Report_AWS(metadata=self.metadata(), resource=pool)
if pool.password_policy:
if pool.password_policy.require_uppercase:
report.status = "PASS"
report.status_extended = f"User pool {pool.name} has a password policy with an uppercase requirement."
else:
report.status = "FAIL"
report.status_extended = f"User pool {pool.name} does not have a password policy with an uppercase requirement."
else:
report.status = "FAIL"
report.status_extended = (
f"User pool {pool.name} has not a password policy set."
)
findings.append(report)
return findings