首页 / 资讯动态 / Windows Server域控策略下服务器密码定期修改合规

Windows Server域控策略下服务器密码定期修改合规

Windows Server域控环境里,服务器密码定期修改这件事,很多运维团队都是直接通过默认域策略里的“密码最长使用期限”来强制执行的。但真正落地时你会发现,光靠这一个设置远远不够。要么是到期前用户收不到通知,要么是改了密码后服务账户批量挂掉,更麻烦的是有些合规审计要求你证明“所有服务器都按时改了”,而你根本拿不出像样的日志。下面直接讲具体怎么配置、怎么验证、怎么避坑。

核心策略位置与基础配置

域控环境下,影响服务器本地账户和域账户密码策略的设置集中在“默认域策略”或者你自定义的GPO里。路径是:组策略管理编辑器 → 计算机配置 → Windows设置 → 安全设置 → 账户策略 → 密码策略。这里有几个关键项必须同时配置才算完整:

“密码最长使用期限”直接决定了多少天后必须改密码,合规场景通常设60天或90天,等保要求更短。“密码最短使用期限”如果不设,用户一天内可以反复改密码绕回过期限制,建议设1天。“强制密码历史”必须设,否则用户改密码时用回旧密码,定期修改就毫无意义,一般设5到24个记住的密码。“密码必须符合复杂性要求”要启用,这是合规底线。

很多人忽略了一个致命细节:域控上的密码策略对域内所有域用户生效,但服务器本地账户不受域策略管控。如果你服务器上还有本地管理员账户在用,必须额外通过“本地安全策略”或者针对服务器OU单独链接GPO,在“本地策略”里设置相同的密码过期时间,否则审计时会被判定为“存在不受控账户”。

细粒度密码策略:不同服务器不同要求

一个域默认只能有一套密码策略,但现实中你很可能需要让核心数据库服务器的密码30天改一次,普通应用服务器90天改一次。这时候就要用到“细粒度密码策略”。这个功能从Windows Server 2008开始就有,但很多人至今没用上。

配置方法是在“Active Directory管理中心”里,导航到“系统” → “密码设置容器”,右键新建密码设置对象。你可以直接指定优先级、密码长度、最短和最长使用期限、锁定阈值等参数,然后把策略应用到全局安全组或者特定用户组。注意,细粒度密码策略只能应用到用户对象,不能直接应用到计算机对象。所以你需要把服务器运行服务所用的域账户、或者管理这些服务器的管理员账户,放进对应的安全组里,再把细粒度策略关联到这个组。优先级数字越小越优先,冲突时以优先级高的为准。

一个常见的错误是:管理员以为把服务器本身放进安全组就能让策略生效,结果发现服务器本地登录的域账户依然走默认域策略。正确做法是梳理清楚每台服务器上实际在用的域账户有哪些,按账户归类,再通过安全组绑定细粒度策略。

密码到期通知机制:没有原生的,必须自己搭

Windows域控本身不提供任何原生的密码到期邮件通知或桌面弹窗功能。这一点让无数运维踩坑。你设了90天过期,用户不知道,到期那天突然登不进去,然后疯狂打你电话。合规审计还会问你“是否有提醒机制”,你答不上来就是缺陷。

解决方案主要有两种。第一种是用PowerShell脚本定期扫描即将过期的用户,发邮件通知。脚本逻辑大致是:获取AD用户,计算密码最后设置时间与域策略中最大密码期限的差值,筛选出7天内到期的用户,通过Send-MailMessage发送邮件。下面是一个可直接在生产环境调整使用的脚本框架:

Import-Module ActiveDirectory
$maxPwdAge = (Get-ADDefaultDomainPasswordPolicy).MaxPasswordAge.Days
$expireDays = 7
$users = Get-ADUser -Filter * -Properties PasswordLastSet, EmailAddress, DisplayName
foreach ($user in $users) {
    if ($user.PasswordLastSet -ne $null) {
        $expireDate = $user.PasswordLastSet.AddDays($maxPwdAge)
        $daysLeft = ($expireDate - (Get-Date)).Days
        if ($daysLeft -le $expireDays -and $daysLeft -ge 0) {
            $subject = "密码即将过期通知"
            $body = "您好 $($user.DisplayName),您的域账户密码将在 $daysLeft 天后过期,请尽快按Ctrl+Alt+Del修改密码。"
            Send-MailMessage -To $user.EmailAddress -Subject $subject -Body $body -SmtpServer "smtp.你的公司.com"
        }
    }
}

把这段脚本放在任务计划里每天跑一次即可。注意邮件服务器如果不需要认证,SMTP直接填内部中继就行;如果需要认证,得用更复杂的凭据传递方式。

第二种方案是借助第三方AD管理工具,这类工具自带密码到期通知、自助改密门户、甚至密码强度实时反馈。如果公司规模大、合规要求高,直接上成熟方案更省心,自己写脚本在日志审计和异常处理上很难做到完备。

服务账户与托管账户的密码轮换

服务器上跑的各种服务,比如SQL Server、IIS应用程序池、计划任务,往往用的是域账户。这些账户密码一旦过期,服务直接停摆。传统做法是把这些服务账户设成“密码永不过期”,但合规扫描会直接标红。

正确的做法是使用“组托管服务账户”或者“托管服务账户”。gMSA的密码由域控自动管理,每30天自动轮换一次,你完全不用手动改,服务端配置一次即可。条件是域控必须至少是Windows Server 2012级别,并且需要在域控上先执行Add-KdsRootKey创建根密钥,然后才能创建gMSA。创建命令大致是:

New-ADServiceAccount -Name "svc_sql" -DNSHostName "svc_sql.你的域.com" -PrincipalsAllowedToRetrieveManagedPassword "CN=SQLServer,OU=Servers,DC=你的域,DC=com"

然后在目标服务器上安装这个gMSA,并在服务登录账户里指定。整个过程密码完全透明,合规审计时你只需要证明使用了gMSA即可,因为微软官方文档明确说明其密码轮换机制符合安全标准。

对于那些实在无法使用gMSA的老旧应用,至少要做到两点:一是把密码过期时间设得比普通用户长,比如180天,并在合规文档中说明业务限制;二是建立手工轮换的SOP和记录表,每次修改后更新文档,确保审计时有据可查。

强制修改时的用户体验与远程桌面场景

服务器管理员经常通过远程桌面登录,密码过期时RDP会直接提示“您必须在第一次登录前更改密码”,这个流程本身没问题。但问题出在如果服务器开启了网络级身份验证,密码过期的账户在NLA阶段就会被拒绝,连改密码的界面都看不到。解决方法是在组策略里启用“要求使用网络级身份验证”的同时,确保用户知道可以通过其他方式先改密码,比如在另一台已登录的域成员机器上按Ctrl+Alt+Del选择“更改密码”,或者提前部署好前面说的自助改密门户。

另外,密码修改后,服务器上挂载的网络驱动器、计划任务里保存的凭据、浏览器里记住的密码都会失效。这一点必须在通知邮件里明确告知用户,避免改完密码后业务中断。

合规审计与日志验证

密码定期修改是否真正执行到位,最终要落到日志上。域控上需要开启“账户管理”审计策略,路径在组策略 → 计算机配置 → Windows设置 → 安全设置 → 高级审核策略配置 → 账户管理 → 审核用户账户管理,勾选“成功”和“失败”。这样每次用户改密码,域控安全日志里会记录事件ID 4723(用户更改自己的密码)或4724(管理员重置用户密码)。

你需要定期收集这些日志,可以用Windows事件转发功能集中到一台日志服务器,或者用SIEM系统做聚合。审计时,对方会要求你提供“过去90天内所有服务器相关账户的密码修改记录”,如果你能直接导出事件ID 4723和4724的清单,并关联到具体账户,合规就过了。如果拿不出来,前面所有配置在审计眼里都等于没做。

还有一个容易被忽略的点:域控本身的本地管理员密码也要定期改。很多企业域控装完后就再也没动过本地administrator密码,这会被判定为高风险。建议用LAPS(本地管理员密码解决方案)自动管理所有服务器包括域控的本地管理员密码,定期轮换,且每台机器密码不同。LAPS配置后,密码存储在AD计算机对象的机密属性里,只有授权用户可以查看,既满足合规又避免密码雷同带来的横向移动风险。

常见配置错误与排查思路

策略设了但不生效,排查顺序是:先在客户端用命令gpresult /h report.html查看该机器当前应用的GPO列表,确认密码策略所在的GPO是否在列表中,以及是否被更高优先级的GPO覆盖。如果是细粒度密码策略,用Get-ADUserResultantPasswordPolicy命令查看某个用户当前生效的密码策略对象。如果返回空,说明该用户没有被任何细粒度策略覆盖,走的是默认域策略。

密码修改时提示“不符合密码策略要求”,先检查“密码必须符合复杂性要求”是否启用,再检查“强制密码历史”是否设得过高导致用户反复用旧密码。还有一个隐蔽原因是某些第三方软件或Windows组件本身对密码长度有额外限制,比如某些旧版SQL Server不接受超过16位的密码,这种情况需要在合规性和兼容性之间做平衡,并在文档中记录例外。

最后强调一点:密码定期修改策略必须和账户锁定策略配合使用。如果锁定阈值设得太低,用户改密码时输错几次就被锁定,反而增加运维负担。建议锁定阈值设为5次,锁定持续时间15分钟,这样既能防暴力破解,又不至于影响正常使用。