本文目录导读:

- 场景一:Windows Active Directory(最常用)
- 场景二:Linux (通过 Ansible 批量管理)
- 场景三:通过 PAM 模块统一配置(适用于所有 Linux)
- 关键注意事项与最佳实践
这是一个涉及系统管理和安全操作的问题,批量修改密码策略通常需要在域控制器(Windows Active Directory)、Linux LDAP服务器或者批量管理工具(如Ansible、PowerShell)中执行。
重要安全提示: 修改密码策略(如密码长度、复杂度、过期时间)会影响所有用户的安全,操作前请务必在测试环境验证脚本,并备份当前策略配置。
以下针对最常见的Windows AD环境和Linux环境提供几种脚本示例。
Windows Active Directory(最常用)
如果你是企业网络管理员,需要批量修改所有域用户的密码策略(例如将最长密码期限改为90天),可以使用 PowerShell 脚本。
修改域默认密码策略(影响所有用户)
这个操作会修改整个域的默认组策略(Default Domain Policy)。
# 以管理员身份运行 PowerShell (Active Directory 模块) Import-Module ActiveDirectory # 获取当前默认策略 $DefaultPolicy = Get-ADDefaultDomainPasswordPolicy # 显示当前设置 Write-Host "当前策略:" -ForegroundColor Green $DefaultPolicy # 修改密码最长使用期限为 90 天 Set-ADDefaultDomainPasswordPolicy -MaxPasswordAge 90.00:00:00 # 修改密码最短使用期限为 1 天 Set-ADDefaultDomainPasswordPolicy -MinPasswordAge 1.00:00:00 # 启用密码复杂性要求 Set-ADDefaultDomainPasswordPolicy -ComplexityEnabled $true # 设置密码长度最少为 8 位 Set-ADDefaultDomainPasswordPolicy -MinPasswordLength 8 # 设置密码历史记录(记住最近24个密码,防止重复) Set-ADDefaultDomainPasswordPolicy -PasswordHistoryCount 24 Write-Host "默认密码策略已更新!" -ForegroundColor Yellow
修改特定OU(组织单元)的精简密码策略(Fine-Grained Password Policy)
从Windows Server 2012开始,可以为不同用户组设置不同的策略。
# 创建新的密码策略设置对象(PSO)
New-ADFineGrainedPasswordPolicy `
-Name "StrictPolicy" `
-Precedence 100 `
-MinPasswordLength 12 `
-PasswordHistoryCount 24 `
-MinPasswordAge 1.00:00:00 `
-MaxPasswordAge 90.00:00:00 `
-ComplexityEnabled $true `
-ReversibleEncryptionEnabled $false `
-LockoutThreshold 5 `
-LockoutDuration 00:30:00 `
-LockoutObservationWindow 00:30:00
# 将该策略应用到特定的用户组
Add-ADFineGrainedPasswordPolicySubject `
-Identity "StrictPolicy" `
-Subjects "CN=VIPUsers,OU=Groups,DC=yourcompany,DC=com"
Write-Host "细粒度密码策略已创建并应用!"
批量强制所有用户下次登录时修改密码(非直接改策略,但常配合使用)
Import-Module ActiveDirectory
# 获取所有普通用户(排除禁用和系统账号)
$Users = Get-ADUser -Filter { enabled -eq $true } -Properties Name, SamAccountName
foreach ($User in $Users) {
# 设置用户下次登录时必须修改密码
Set-ADUser -Identity $User.SamAccountName -ChangePasswordAtLogon $true
}
Write-Host "已强制所有用户下次登录时修改密码!"
Linux (通过 Ansible 批量管理)
如果你的服务器是Linux,并且使用 pam_pwhistory、pwquality 或 chage 管理密码,推荐使用 Ansible(运维自动化工具)。
Ansible Playbook 示例:修改 /etc/login.defs 和 pwquality.conf
---
- name: 批量修改 Linux 密码策略
hosts: all # 替换为你的目标主机组
become: yes
vars:
# 定义新策略参数
pass_max_days: 90
pass_min_days: 1
pass_warn_age: 14
pass_min_len: 8
tasks:
- name: 更新 /etc/login.defs 中的密码老化策略
ansible.builtin.lineinfile:
path: /etc/login.defs
regexp: "^{{ item.key }}"
line: "{{ item.key }} {{ item.value }}"
backup: yes
loop:
- { key: 'PASS_MAX_DAYS', value: "{{ pass_max_days }}" }
- { key: 'PASS_MIN_DAYS', value: "{{ pass_min_days }}" }
- { key: 'PASS_WARN_AGE', value: "{{ pass_warn_age }}" }
- { key: 'PASS_MIN_LEN', value: "{{ pass_min_len }}" }
- name: 更新密码复杂度配置 (pwquality)
ansible.builtin.lineinfile:
path: /etc/security/pwquality.conf
regexp: "^#?{{ item.key }}"
line: "{{ item.key }} = {{ item.value }}"
backup: yes
loop:
- { key: 'minlen', value: '8' }
- { key: 'dcredit', value: '-1' } # 至少1位数字
- { key: 'ucredit', value: '-1' } # 至少1位大写字母
notify: restart sshd # 如有必要重启SSH
- name: 对现有用户应用新的密码过期策略 (chage)
ansible.builtin.shell: |
chage -M {{ pass_max_days }} -m {{ pass_min_days }} -W {{ pass_warn_age }} {{ item }}
loop: "{{ ansible_facts.user_names }}" # 注意:这会修改所有系统用户,建议精确指定用户列表
when: item not in ['root', 'nobody'] # 跳过一些系统账户
handlers:
- name: restart sshd
ansible.builtin.service:
name: sshd
state: restarted
使用 Shell 脚本 + chage 批量修改现有用户
#!/bin/bash
# 定义新的密码策略
MAX_DAYS=90
MIN_DAYS=1
WARN_DAYS=14
# 获取所有可以登录的用户(UID >= 1000 且不是nobody)
users=$(awk -F: '($3>=1000) && ($1!="nobody") {print $1}' /etc/passwd)
for user in $users; do
echo "正在修改用户: $user"
chage -M $MAX_DAYS -m $MIN_DAYS -W $WARN_DAYS "$user"
done
echo "所有普通用户的密码策略已更新!"
通过 PAM 模块统一配置(适用于所有 Linux)
如果你只需要修改强度密码要求(复杂度),使用 pwquality 配置最彻底:
Shell 脚本(直接修改配置文件):
#!/bin/bash # 备份原始文件 cp /etc/security/pwquality.conf /etc/security/pwquality.conf.bak.$(date +%Y%m%d) # 写入新配置 cat > /etc/security/pwquality.conf << EOF # 新密码策略 minlen = 10 dcredit = -1 ucredit = -1 lcredit = -1 ocredit = -1 minclass = 3 maxrepeat = 3 EOF echo "密码复杂度配置已更新" echo "确保 /etc/pam.d/system-auth 和 /etc/pam.d/password-auth 中存在:" echo "password requisite pam_pwquality.so retry=3"
关键注意事项与最佳实践
- 备份是底线:修改任何系统策略前,备份配置文件(
/etc/login.defs,/etc/security/pwquality.conf, AD中的GPO)。 - 测试优先:先在测试OU(AD)或测试服务器(Linux)上执行,再推广到生产环境。
- 区分应用范围:
- Windows:分清是改“默认域策略”、“细粒度密码策略”还是“单个用户属性”。
- Linux:分清是改“新用户默认策略”(login.defs)还是“现有用户策略”(chage)。
- 权限要求:脚本通常需要管理员/域管理员权限运行。
- 安全合规:参考你所在组织的安全标准(如NIST、等级保护)来设定具体参数,不要设得过于严格(导致用户频繁忘记密码)或过于宽松。
如果你能提供更具体的需求(例如是Windows还是Linux、是改新用户默认策略还是强制修改现有所有用户),我可以给出更精准的代码。