怎样用脚本批量修改密码策略?

wen 实用脚本 3

本文目录导读:

怎样用脚本批量修改密码策略?

  1. 场景一:Windows Active Directory(最常用)
  2. 场景二:Linux (通过 Ansible 批量管理)
  3. 场景三:通过 PAM 模块统一配置(适用于所有 Linux)
  4. 关键注意事项与最佳实践

这是一个涉及系统管理和安全操作的问题,批量修改密码策略通常需要在域控制器(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_pwhistorypwqualitychage 管理密码,推荐使用 Ansible(运维自动化工具)。

Ansible Playbook 示例:修改 /etc/login.defspwquality.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"

关键注意事项与最佳实践

  1. 备份是底线:修改任何系统策略前,备份配置文件(/etc/login.defs, /etc/security/pwquality.conf, AD中的GPO)。
  2. 测试优先:先在测试OU(AD)或测试服务器(Linux)上执行,再推广到生产环境。
  3. 区分应用范围
    • Windows:分清是改“默认域策略”、“细粒度密码策略”还是“单个用户属性”。
    • Linux:分清是改“新用户默认策略”(login.defs)还是“现有用户策略”(chage)。
  4. 权限要求:脚本通常需要管理员/域管理员权限运行。
  5. 安全合规:参考你所在组织的安全标准(如NIST、等级保护)来设定具体参数,不要设得过于严格(导致用户频繁忘记密码)或过于宽松。

如果你能提供更具体的需求(例如是Windows还是Linux、是改新用户默认策略还是强制修改现有所有用户),我可以给出更精准的代码。

抱歉,评论功能暂时关闭!