■ 北京 刘长明
在Windows服务器的日常运维工作中,经常需要为一个特定的服务申请一个专用的账号,并由系统管理员对该账号进行人工维护,但人工维护账号会存在人为错误的潜在风险,可能导致服务停止或者中断。由于对运行的服务域用户账号密码管理起来较麻烦,因此托管服务帐号(Managed Service Account)应运而生。本文将会全面介绍微软的托管服务账号的基本概念和实用配置,期待在运维工作方面跟大家相互学习。
Windows服务只有登录到某一帐户的情况下才能访问操作系统中的资源和对象。服务一般不要更改默认的登录帐户,否则可能导致服务失败。如果选定帐户没有足够的权限,Microsoft管理控制台(MMC)的服务管理单元将自动为该帐户授予登录所管理计算机中服务的用户权限。
Windows Server的服务可以用域帐户或者三个内置的本地帐户作为各系统服务的登录帐户,三个内置帐户没有密码:
1.本地系统帐户(Local System):本地系统帐户功能强大,它可对系统进行完全访问。
2.本地服务帐户(NT AUTHORITYLocal Service)。
3.网络服务帐户(NT AU THORITYNetwork Service)。
系统中绝大多数的服务都是使用上述三个内置本地帐户作为登录帐户。
在一些情况下使用域帐户和内置帐户存在一些问题,假设SQL Server的服务使用的是Local System帐号,那么其他使用Local System帐号的服务都可以连接到SQL Server数据库;如果使用的是域帐户,那么域帐户的密码在更改后,还需要在services.msc中手动相应更改这些服务的登陆帐户密码;如果服务所使用的域帐户的密码设置为永不过期,又会留下系统安全隐患,所以从Windows Server 2008 R2开始,一个新功能Managed Service Account(托管服务帐户)应运而生。
所谓托管服务帐号,也即委托给操作系统进行管理的帐号。托管服务帐号(MSA)的密码由操作系统自动设定、维护,定期自动更新,并不需要管理员手工干预,对管理员来说,好像此帐号没有密码一样。既减少了人为工作,又能进一步确保服务运行的稳定性,不会因账号问题出现服务故障。
从Windows Server 2018 R2域架构主机开始,引进了一个新的对象类msDSManagedServiceAccount,创建一个MSA,查看它的objectClass属性值,你会发现它有一个有意思的对象类继承架构:
Computer
msDS-ManagedServiceAc count
organizationalPerson
Top
User
这个对象既是用户对象,同时又是计算机对象,类似于一个计算机账户。
密码管理上,托管服务账号是一个准计算机对象,它使用与计算机对象相同的密码更新机制,当计算机更新其密码时,将同时更新MSA帐户密码(默认每30天更新一次)。当然,我们也可以通过修改注册表键值来修改更新时间。
HKEY_LOCAL_MACHINESYS TEMCurrentControlSetServ icesNetLogonParameters
DisablePasswordChange=[0 or 1,default if value name does not exist is 0]
MaximumPasswordAge=[1-1,000,000 in days,default if value name does not exist is 30]
托管服务账号不遵守域或细粒度的密码策略,它使用自动生成的复杂密码(240字节,也就是120个字符,随机生成)。托管服务账号不能被锁定,无法进行交互式登录。当然,必要情况下,管理员也可以通过命令将MSA密码设置为已知值。
所有的托管服务账号都存储在Managed Service Accounts容器里(如图1),通过设置域用户和计算机视图中的显示高级设置来查看这些账号信息,但针对该账号的所有操作都只能通过Powershell进行,不能在这里进行操作。
(1)必须是AD域环境。
(2)需要域管理员权限。
(3)AD域功能级别和域架构主机必须是Windows server 2008 R2及以上。
图1 托管服务账号存储在Managed Service Accounts中
(4)服务运行的宿主机系统必须是Windows server 2008 R2及以上。
(5)使用服务账号的宿主机需要启用PowerShell,AD PowerShell(远程管理工具中的AD管理工具),以及.Net 3.5x framework。
(6)使用Managed Servi ce Account时需要以domai n nameManaged Service Account$的格式引用。
(7)托管服务帐户要只能绑定在一台计算机上使用,一个托管服务帐户应该只给一个服务来使用。
在域控上,以域管理员身份打开powershell并运行如下命令
Import-Module ActiveDirectory
New-ADServiceAccount-Name <托管服务账号名>-Enabled $true
Add-ADComputerServi ceAccount -Identity<目标计算机主机名>-ServiceAccount <托管服务账号名 >
Import-Module ActiveD irectory
Install-ADServiceAcco unt -Identity <托管服务账号名 >
打开服务控制管理器,展开“配置→服务”,在右侧双击所需配置的服务,在登录标签页下,选择“此账户”→“浏览”,导航到之前创建的MSA帐号,点击确定,使用该服务以选定MSA帐号运行。
也可通过如下powershell命令完成该操作# Edit this section:$MSA=”contosoMSAaccountname$”
$ServiceName=”‘s
ervice-name‘”
# Don’t edit this section:
$Password=$null
$Service=Get-Wmiobjec t win32_service -filter“name=$ServiceName”
$InParams=$Service.psbase.getMethodParamete rs(“Change”)
$InParams[“StartName”]=$MSA
$InParams[“StartPass word”]=$Password
$Service.invokeMeth od(“Change”,$InParams,$nu ll)
(1)使用如下命令将MSA账号从本地计算机上移除。Remove-ADServiceAccount–identity
(2)在域控上使用如下命令将MSA账号从域里删除。(如果仅仅是将MSA账号从当前的计算机关联到另外一台计算机,不需要运行这一步。)Remove-ADComputerServiceAccount–Identity <当前关联的计算机主机名 >-ServiceAccount
至此,我们就了解了托管服务账号的创建和配置,以及账号移除操作。