id: pwpolicy_upper_case_character_enforce
title: Require Passwords Contain a Minimum of One Uppercase Character
discussion: |
  The macOS _MUST_ be configured to require at least one uppercase character be used when a password is created.

  This rule enforces password complexity by requiring users to set passwords that are less vulnerable to malicious users.

  NOTE: To comply with Executive Order 14028, “Improving the Nation's Cybersecurity”, OMB M-22-09, “Moving the U.S. Government Toward Zero Trust Cybersecurity Principles”, and NIST SP-800-63b, “Digital Identity Guidelines: Authentication and Lifecycle Management” federal, military, and intelligence communities must adopt the following configuration settings. Password policies must not require the use of complexity policies such as upper characters, lower characters, or special characters. Password policies must also not require the use of regular rotation. Password policies should define a minimum length. Multifactor authentication should be used where ever possible.

  NOTE: macOS 14 supports password policy complexity with custom regex deployed with a mobileconfig file. To use a mobileconfig file use *pwpolicy_custom_regex_enforce*. 
check: |
  /usr/bin/pwpolicy -getaccountpolicies 2> /dev/null | /usr/bin/tail +2 | /usr/bin/xmllint --xpath '//dict/key[text()="minimumAlphaCharactersUpperCase"]/following-sibling::integer[1]/text()' - | /usr/bin/awk '{ if ($1 >= $ODV ) {print "pass"} else {print "fail"}}'
result:
  string: 'pass'
fix: |
  This setting may be enforced using local policy or by a directory service.

  To set local policy to require at least $ODV lowercase letter, edit the current password policy to contain the following <dict> within the "policyCategoryPasswordContent":

  [source,xml]
  ----
  <dict>
  <key>policyContent</key>
  <string>policyAttributePassword matches &apos;(.*[A-Z].*){$ODV,}+&apos;</string>
  <key>policyIdentifier</key>
  <string>Must have at least $ODV uppercase letter</string>
  <key>policyParameters</key>
  <dict>
  <key>minimumAlphaCharactersUpperCase</key>
  <integer>$ODV</integer>
  </dict>
  </dict>
  ----
  After saving the file and exiting to the command prompt, run the following command to load the new policy file, substituting the path to the file in place of "$pwpolicy_file".

  [source,bash]
  ----
  /usr/bin/pwpolicy setaccountpolicies $pwpolicy_file
  ----
  NOTE: See the password policy supplemental on more information on how to implement password policies on macOS.
references:
  cce:
    - CCE-94347-2
  cci:
    - N/A
  800-53r5:
    - IA-5(1)
  800-53r4:
    - IA-5
    - IA-5(1)
  disa_stig:
    - N/A
  srg:
    - N/A
  800-171r3:
    - 03.05.07
  cis:
    benchmark:
      - N/A
    controls v8:
      - 5.2
  cmmc:
    - IA.L2-3.5.7
    - IA.L2-3.5.8
    - IA.L2-3.5.9
macOS:
  - '15.0'
odv:
  hint: Number of Upper Case characters.
  recommended: 1
tags:
  - none
  - cnssi-1253_moderate
  - cnssi-1253_low
  - cnssi-1253_high
mobileconfig: false
mobileconfig_info:
