1. 域到底是什么:别再把它当作“一台机器”或者“一个共享文件夹”
先说说我自己的经历。刚接触“域”的时候,我把这些概念圈在自己的知识边界外,总觉得域控是网管的事,我搞等保测评、做应急响应,用到的时候再去翻文档就行。结果第一次给某家公司做内网渗透测试服务时,对方IT递给我拓扑图,上面写着“DC-01 10.10.10.5”,我当时的表现是很诚实地问了一句:这个DC是做什么用的?对方愣住了。从那天起,我把自己关在屋里,把域相关的知识重新捋了一遍。今天这篇笔记,就是我把网络安全课程第7天的视频内容,结合自己后续做项目时碰到的真实场景,整理出来的一份加深记忆的笔记。
先解决一个最基础的问题:域到底是什么。
如果你把一台电脑装完系统、设置好IP、连上交换机,这台电脑就是网络中一个独立的工作组(Workgroup)成员。工作组模式下的每台机器各自为政,登录本机时用本机的用户名和密码,A电脑上的账号和B电脑上的账号没有任何关系。你要在一百台电脑上给一百个员工开通账号,就要登录一百台电脑各建一个用户。这听着不复杂,但接下来就麻烦了:员工改密码要登录每台电脑改;你想禁止所有人使用U盘,你要远程一台一台去改策略;离职人员的账号注销,你得知道他曾经用过哪几台电脑。
域(Domain)换了一种思路:把用户、计算机、权限、策略当成资源集中到一个中央数据库里,这个数据库所在的服务器就叫域控制器(Domain Controller,DC)。大家加入域之后,不管在哪里登录,都去域控那里验证身份,然后由域控把“这个人能做什么、不能做什么、这台电脑遵循什么规则”统一下发。这是整个Windows企业网络的基础设施。没有域,你后续做桌面安全管理、权限审计、统一防病毒分发,都会变得很痛苦。
但光知道“域=集中管理”没什么用。课程视频里老前辈反复强调的一句话,我当时没留意,后来在项目里才真正体会到:“域的核心不在域控这台服务器,而在DNS。”为什么?因为域里所有计算机要找到域控、应用要定位服务,全部依赖DNS里的SRV记录。很多人加域失败、域内资源共享超时、或者老提示“找不到域”,八成跟DNS配置有关,而不是域控本身出了毛病。
所以我会把“域”拆成三层来理解:第一层是身份验证的集中(Kerberos协议授权认证);第二层是资源访问的统一(网络共享、组策略等);第三层是DNS的定位机制(让域内的计算机知道找谁去认证、找谁去同步策略)。
2. 域环境的核心组件拆解:AD数据库、DC、DNS三者怎么配合
2.1 域控不是一台“服务器”,而是承载AD数据库的角色
AD(Active Directory,活动目录)是一个数据库,它存的不只是账号密码,还包括了计算机账号、组、组策略对象(GPO)、打印机、共享文件夹等等。域控制器就是这台承载AD数据库并验证登录请求的服务器。注意“承载”这个说法:一台服务器安装了AD DS(Active Directory Domain Services)角色之后,它的角色就从“普通服务器”变成了“域控”,但这并不意味着它不能干别的事,只不过如果你把DHCP、文件服务等都堆积在这台机器上,以后扩展或者做高可用就会很麻烦,这是后话。
AD数据库的文件,最核心的是Ntds.dit。它默认在C:\Windows\NTDS目录里。很多做过取证或者应急响应的人对这个文件不陌生,因为域里所有的用户hash、组关系、策略信息都在这里面。如果域控被攻破,对方直接把NTDS.dit拖走离线破解,整个域就沦陷了。所以域控是所有安全防护的C位中的C位。
2.2 DNS为什么是域的“地基”
这节课的内容讲到了DNS记录,我用项目里真实查过的记录来说明,最直观。当你在成员服务器上运行dcpromo(现在安装AD DS用的是PowerShell命令Install-WindowsFeature)把一台机器提升为域控后,系统会同时创建一堆DNS记录。最典型的几条:
- _ldap._tcp.dc._msdcs.域名:这是域控的定位器记录,作用是告诉域内其他机器“找哪台机器能做LDAP认证”。
- _kerberos._tcp.域名:Kerberos认证使用的SRV记录。
- _gc._tcp.域名:全局编录(GC)的SRV记录,多域环境中做跨域查找用户用。
域内成员找域控的时候,不是直接猜一个IP,而是先向自己配置的DNS服务器发起查询,根据这些SRV记录找到对应的域控地址。所以如果成员机的DNS指向了我行我素的公共DNS或没指向域控,加入域的过程基本就是失败的。
有个很经典的现象,加域时报错:“找不到网络路径”或者“域控制器类型不正确”。很多人去查防火墙、查网络连接,结果最终原因就是DNS指向不对。我把这个坑记在笔记第一页:加域前,先把成员机的DNS服务器地址改成域控IP,再把域名后缀补上。视频里有一句很精辟的结论:域里所有的服务都是通过DNS来定位的,DNS是域的“电话簿”。没有电话簿,你连“门牌号”都找不到。
2.3 域控之间如何互相复制与协同
只有一个域控的域,叫单域控环境,出了问题就是单点故障。稍微规范一点的企业都会搭两台以上域控。域控之间不是各存各的,而是通过多主复制(Multi-Master Replication)机制保持AD数据库同步。注意:虽然所有域控都是AD数据库的副本,但有些操作只能在一台机器上进行,比如架构主机、域命名主机等,专业术语叫FSMO五大角色。默认情况下,五类操作主机角色都在第一台域控上,你可以通过命令netdom query fsmo查看当前角色的归属。
我在真实项目里碰到过一种情况:第一台域控坏了,IT直接从虚拟机快照恢复了一台老的域控,结果AD数据回滚,又和现存域控产生冲突,出现各种复制报错。恢复域控不像恢复一台文件服务器那么简单,牵涉到USN回滚问题,最好的处理方式是从备份做“授权还原”,而不是直接从虚拟机快照硬拉。如果本节视频只讲了域控概念,我这里补充的就是一个实战教训:域控的备份恢复一定要了解AD的权威还原和非权威还原机制,不要拿快照当万能药。
3. 搭建一个单域环境:从取名到提升域控的细节复盘
课程视频里老师带着大家在一台Windows Server 2019上搭建域环境,我没法把视频里的每一步都抄完整,但我想把“为什么这么做”和“要注意什么”整理清楚,因为大多数人照着视频能搭出来,但换个环境或者出了错就手足无措。
3.1 部署之前必须定下的“四个值”
搭建域控之前,有四个“值”要先想清楚,不然装到一半再去改很折腾。
服务器主机名:最好提前改成一个有意义的机器名,比如DC01、DC02,不要装完系统之后叫WIN-U8I2K3之类的随机名再提升域控。虽然也能改,但主机名改动会牵连到DNS记录,现场我见过很多次因为改主机名导致证书和SPN对不上的问题。
静态IP:域控的IP必须是静态IP,这一点几乎不用讨论。你给域控分配DHCP地址,一旦租约变了,所有成员的DNS指向全部失效,整个域都会找不到北。
域名选择:这是有讲究的。内网域通常使用形如corp.local或ad.example.cn这样的后缀。如果企业未来可能对外发布某服务并需要域内集成认证,建议用子域或者专用域名做规划,避免直接使用与外网域名完全相同的域。有时候你直接用example.cn做AD域名,内网有DNS和外网DNS冲突之后,排查让人想砸键盘。课程视频里的习惯是给一个类似“XX.com”的名字做演示,但真实环境我建议用corp.xxx.com之类的子域,更稳妥。
NetBIOS名称:装AD DS过程中会让你填NetBIOS名称,在纯Windows环境下一般是域名前缀,比如域是corp.xxx.com,NetBIOS名默认会成为CORP。注意NetBIOS名称必须全网唯一,不能和现有名称冲突,也不能起成容易混淆的名字。
3.2 安装AD DS并提升域控的操作回顾
如果是在Windows Server的图形界面上操作,流程大致是这样的:打开服务器管理器,点击“添加角色和功能”,勾选“Active Directory Domain Services”,安装完成后,服务器管理器右上角会有一个黄色感叹号提示“将此服务器提升为域控制器”。点击进入部署配置,选“添加新林”,根域名填你规划好的域名,然后设置目录服务还原模式(DSRM)密码。
这个过程中有一个选项很关键:没有专门讲的话,很多人不会勾选“DNS服务器”选项。当你提升一台新域控时,系统会询问是否需要同时安装DNS服务器。除非你已经有专门负责域解析的DNS服务器,否则强烈建议勾上,因为AD域环境必须依赖DNS,少这一步后面就会有很多莫名其妙的问题。
顺便说一句,现在很多版本用PowerShell来做更简洁:
Install-WindowsFeature AD-Domain-Services -IncludeManagementTools Install-ADDSForest -DomainName "corp.contoso.local" -DomainNetbiosName "CORP" -InstallDNS跑完会自动重启,重启之后,这台机器就是一台真正的域控了。
3.3 提升域控后马上要做的事
不要认为装完AD角色就万事大吉了,重启完你需要花几分钟检查几个基本项。首先是DNS自检,看看服务器管理器里有没有DNS报错。然后在命令行里跑一下:
nltest /dsgetdc:corp.contoso.local如果它能返回一台域控的信息,说明域控定位正常。我自己喜欢再跑一次:
Get-ADDomainController -Discover这个命令能看到当前环境里的GC(全局编录),有输出一般说明域控服务正常。
另外一个很容易被忽略的点是时间同步。域环境下,Kerberos认证有个容差机制,默认情况下服务器和客户端之间的时间偏差不能超过5分钟,超过就会认证失败。域控之间会有时间同步拓扑,但域控本身最好是跟外部可靠时间源同步。我在给某公司做等级保护整改时,发现他们整个域的时区时间混乱,导致大量登录错误和文件共享失败。所以做完域控提升,最好顺手把NTP服务指好。
4. 把Windows 10加进域:正常流程和常见报错处理
单域控搭好之后,下一步就是把一台Windows 10专业版加入域。这一步看似简单,却是日常运维里收到求助最多的地方。课程视频里可能一下就带过了,我多花点篇幅说说。
4.1 最稳的加域三步走
在成员机上,需要确保三点:
计算机名清晰可辨:不要用一堆随机字符,最好和资产编号对应,例如PC-IT-001,方便后续按计算机名做管理。
DNS指向域控:这一点上面强调过,但值得再写一次。打开网络适配器的IPv4设置,首选DNS服务器填域控IP。很多加域失败就是这一步没有做。注意:如果域内有多台DNS,首选填主域控IP,备选填另一台域控IP,不要填外部公共DNS。有人说我填公共DNS也能加域?那可能是因为网络里路由转发,你把查询转发到了域控所在的DNS,更可能只是当时没出大问题,但域内SRV解析非常依赖DNS,查不到关键记录就会加不进去。
系统版本支持:Windows家庭版不支持加域,必须专业版、企业版或教育版。这一点像常识,但不少新手卡住。
然后右键“此电脑”–属性–更改设置–计算机名–更改,选择“隶属于域”,填上域名,输入有权限加域的域账户和密码,重启即可。
4.2 加域报错“找不到域”怎么办
这是出现频率最高的报错。我先说一个我自己的排查习惯:看到报错,第一反应不是看网络通不通,而是先在成员机上用命令行解析一下域名对应的域控。
nslookup -type=SRV _ldap._tcp.dc._msdcs.域名如果无响应或返回非域控IP,再回头检查成员机DNS指向和域控DNS服务状态。很多所谓的“找不到域”本质上是DNS查询方向错了。还有一种情况是防火墙挡了域控的端口,域控需要放行53(DNS)、88(Kerberos)、389(LDAP)、135(RPC)、445(SMB)等端口。不过只要域控自身的Windows防火墙保持默认允许规则,通常不会出问题。如果改过防火墙策略,这些端口的放行情况就要列清楚。
4.3 加域后的本地账号变化需要注意什么
将计算机加入域后,本地管理员组的成员不会自动变成域管理员。如果你在本地管理员组里添加了某域账号,那这个域账号在这台机器上就拥有本地管理员权限。课堂上一般会提醒学生:域管理员不等于本地管理员。比如我们在域客户端上看到Administrator登录界面,默认可以选“其他用户”,此时使用域账号输入域用户凭据是可以登录的,但如果你用该电脑本地管理员账户登录,用的是这台机器本地密码,和域账号密码无关。这两个概念容易混淆,尤其是在做安全审计时需要分清楚。
5. 组策略:域环境下批量管理的“灵魂”所在
群里的笔记爱好者们都说,学域之后最期待的环节就是组策略,因为组策略才能真正体现“集中管理”的威力。视频课里的组策略部分讲了很多分支,我把它梳理成几条脉络。
5.1 组策略对象(GPO)和OU的组织逻辑
先理解两个基本概念。OU(Organizational Unit,组织单位)是AD里的容器,可以用来放用户、计算机、组,甚至其他OU。GPO(Group Policy Object,组策略对象)是一组配置规则的集合。域控上有一条默认域策略(Default Domain Policy)和一条默认域控制器策略(Default Domain Controllers Policy),但你最好不要把自定义规则写在这两个默认策略里,很容易在后续排错时分不清规则来源。我一般建议:按部门或用途新建OU,然后在OU上挂GPO。举个例子,你可以在某个OU下创建一个GPO,设置了屏保等待时间为5分钟,下次客户端刷新策略后,该OU下的所有用户5分钟没有操作就会自动锁屏。
组策略的继承顺序是:本地策略 – 站点策略 – 域策略 – 父OU策略 – 子OU策略。子OU的GPO默认会继承父OU的GPO。如果不想继承,可以设置“阻止继承”。有冲突时,后应用的策略优先,但如果父级策略设置了“强制”(Enforced),子级就无法覆盖。这种逻辑跟权限继承很像,理解了继承规则,很多GPO的“怪现象”就解释得通了。
5.2 几条常用但也容易配错的策略
课程里提到了不少策略,我挑几个我实战中踩过坑的,给大家说说。
密码策略:默认域策略里自带密码复杂度要求、密码长度要求、账户锁定阈值等。很多人直接在默认域策略里改密码策略,这没问题,但要注意Windows Server默认密码策略有一个“密码历史”和“最长使用期限”的问题。比如你把“最长使用期限”设为0天时,界面会提示“无法设置”。因为取值存在限制,你最终设置的值必须是0天或者1到998天,而0表示永不过期。这个细节不留意的话很容易被卡住。
“拒绝从网络访问这台计算机”策略:这是一条安全加固里常用的策略,把不必要的账户加进去,禁止它们通过SMB访问。有个项目里IT人员给域用户批量加这条策略,结果把“域用户”整个组都加进去了,第二天大家全连不上共享目录了。这个坑提醒我们,先看看策略里默认已经带了哪些组,再决定要不要动。
登录脚本(Logon Script):域环境里可以通过用户属性里的“配置文件”标签页法定代表人配置登录脚本,也可以用GPO的“登录”脚本配置。视频里这种做法比较经典,但实操中脚本执行路径容易搞错。如果要给所有用户统一映射一个网络驱动器,用GPO里的“驱动器映射”功能更方便,不必写脚本,比手工去人人电脑上net use好太多了。
5.3 组策略刷新的几件事
GPO默认刷新间隔是每90分钟(随机偏移0-30分钟),域控则会每5分钟刷新一次。手动刷新用:
gpupdate /force如果需要看一台机器实际生效了哪些策略,用:
gpresult /r排查某条策略没生效时,我一般先看gpresult确认策略有没有落到这台机器上,再看事件日志里有没有相关的策略错误(事件ID 1129、1058之类)。很多GPO不生效的问题,不是规则做错了,而是客户端没有正常和域控通信,或DNS解析不到域控股票名称。
6. 域环境里的安全视角:认清“域管”权限的边界
学习域不只是为了装好一个环境,也是为了让做网络安全的同学理解攻击面的变化。这里我说一点自己的认识,不完全来自那节课视频,更多来自做安服项目时的积累。
6.1 有的本地管理员不再是顶点
在工作组环境里,一台电脑的本地管理员就是这台电脑的老大。但进入域环境后,如果把域管理员账户(Domain Admins组)加入了某台成员机的本地管理员组,那这台机器上的本地管理员也能窃取到域管理员的凭证,后续就能横向移动。所以安全基线里都建议:普通工作站不要轻易把Domain Admins组加入本地管理员组,要让普通用户使用标准域账号,必要时用专门的本地管理员账号来做本地提权管理。
在域渗透中有一个非常经典的操作叫“假域控”(也叫DCShadow之类)或者提权后监听。作为防御方就要注意:域内所有主机都要限制本地管理员权限,防止通过LSASS进程dump密码哈希。我可以负责任地说,我在好几个企业内网中看到问题不是域没配好,而是本地管理员权限放得太宽,域管理员的哈希轻松就能在内存里被提取到。这不是危言耸听。
6.2 受保护用户组与LAPS
随着系统版本更新,微软给出了不少域安全加固选项,比如把高权限账号加入“Protected Users”组,里面的账号无法被委派,不支持NTLM认证,安全性明显提升。Windows 10/Server 2016及以上版本还可以使用LAPS(Local Administrator Password Solution)集中管理本地管理员密码,定时自动更换。这套机制在企业里很实用,可以避免每台电脑都用同一个本地管理员密码的混乱局面。如果学习域时只掌握了“让用户加入域”却没了解这些安全机制,后面做管理时很容易吃大亏。
6.3 账号委派和权限分配的最小化原则
域里做权限分配,最忌讳图省事把用户直接加进Domian Admins组,因为DA账号一旦被拿下,整个域的统治权就丢了。哪怕是运维需要在一台服务器上做操作,也应该通过“委派控制向导”或仅添加进这台服务器对应的本地管理员组,而不是无脑给域管理员。我在课程视频笔记里加了一条红色提醒:域管账号是王炸,但也是引爆点。拿域管做日常办公的人,等于抱着核弹开关逛菜市场。
7. 域内排障思路:DNS、时间和复制三个维度是救命绳
做域运维和域排障,见过的故障大多逃不出三个维度:DNS解析、时间同步、AD复制。我列一个自己的排查思路供参考,连老师在视频课里没有完全展开的内容也可以拿来用。
7.1 DNS维度排查清单
- 成员机nslookup解析域名能否得到域控IP;
- 域控上的DNS服务是否有_SRC目录对应的区域,尤其是_msdcs区域是否存在;
- 事件查看器里面有没有DNS服务相关报错(事件ID 4000、4015等);
- 条件转发器或区域传输是否断掉(多域控场景)。
课程视频里反复强调一句话:“如果DNS出了问题,你就假装所有的域故障都是DNS引起的,从DNS查起,能解决80%的问题。”听起来夸张,但在培训环境里这个比例是真的。
7.2 时间同步维度
Kerberos协议非常依赖时间。客户端和域控时间偏差超过5分钟,会直接导致“KDC_ERR_SKEW(Clock skew too great)”之类的错误。每次看到这个错误码,我先检查客户端时间,再检查域控时间源。Windows域默认的同步机制是从域控同步,域控之间参考域控层级。如果域控和外部时间源断连,终有一天时间漂移到不可接受的程度,然后整个域登录一起“抽风”。处理方式是把域控的W32Time服务配置好外部NTP服务器:
w32tm /config /manualpeerlist:"ntp.aliyun.com" /syncfromflags:manual /reliable:yes /update restart w32time7.3 AD复制维度
多域控对之间,用工具查看复制状态:
repadmin /replsummary repadmin /showrepl如果出现复制失败,常见原因是DNS定位域控失败、防火墙阻断135端口/RPC动态端口、或者快照回滚及USN回滚。课程视频没有细讲多域控,但很多企业即便只有一台域控,也迟早会加第二台,所以我建议学习时将这块内容作为后续补充。
8. 用域账号和本地账号做区分:一道常见的理解门槛
从学习者的反馈来看,“域账号”和“本地账号”是第一个容易混乱的地方。我想用一句通俗的话说明:本地账号就是这台电脑自己认识的账号,域账号是“整个公司都认识”的账号。你在某台电脑上新建了一个用户Test,那么这仅仅是这台电脑上的Test,而Test@corp.contoso.local看起来差不多,却是域里的身份。
加域之后,登录界面默认会显示“其他用户”,你输入域账号加域名(或用UPN格式)就能登录域环境。本地管理员账户往往默认采用这台电脑自己的密码体系。两者登录后的权限范围截然不同。从安全角度讲,一台机器上的本地管理员账号密码如果太多相同,攻击者在一台机器上拿到哈希,就能用同一组密码横向刷一大片,这就是安全问题。讲一个运维经验:正规企业内部的人员管理全部走域账号,本机不允许开额外的本地管理员账号,除非特殊情况(如加域前预配置或安全应急)。
9. 域环境里常用命令和工具:效率不只是“点点点”
图形界面当然可以做很多事,但熟了命令行,效率能得到质的提升。视频课里提到几个工具印象深,我也补充一些自己日常常用的。
# 查看域控信息和FSMO角色 netdom query fsmo # 查看当前域控 nltest /dclist:corp.contoso.local # 查询用户属性 dsquery user "OU=技术部,DC=corp,DC=contoso,DC=local" # 查看AD数据库复制状态 repadmin /replsummary # 强制组策略更新(客户端执行) gpupdate /force # 查看策略实际生效结果 gpresult /r图形工具里,日常比不上这几样:AD用户和计算机(dsa.msc)、AD站点和服务(dssite.msc)、组策略管理(gpmc.msc)、DNS管理器(dnsmgmt.msc)。另外要注意,现在也可以在PowerShell下完成大部分AD管理操作,比如Get-ADUser、Set-ADUser、New-ADUser等,连图形界面打开都省了。
有读者问,域学习要不要先会PowerShell?我的建议是:一开始不需要,图形界面能帮你把每个环节的选项看明白,之后再用命令行来提速。如果直接从命令行入手,容易因为不知道某个参数的意义而感到迷茫。
10. 课程视频之外的延伸:单域控环境下的备份与高可用
视频里把单域控环境搭起来就收尾了,但这是实验室,真实生产环境不能这样“裸奔”。我多说两句备份与高可用的思路,这部分算是额外补充。
先讲讲备份。AD的备份要以系统状态为单位,Windows Server Backup可以备份系统状态,或者在添加功能时选“Windows Server Backup”。备份完之后,“活字”就是要定期确认备份可恢复,而不是备份完就再也不管。真遇到过一年没检查备份,域控硬盘坏了恢复出来的备份根本不可用的案例。另外也可以启用Active Directory回收站(默认在新林部署时是启用的),方便误删用户或组时恢复。
再讲高可用。一般建议至少部署两台域控,把GC(全局编录)在每台域控上都勾上,防止单点故障导致域用户无法登录。有些人图省事只做一台域控,等到硬件故障了才意识到,全公司登录都依赖那一台机器,压力山大。把第二台域控提升,加一台普通Server装AD角色,加入现有域,就能通过AD复制自动同步数据库。整个过程是平滑的,不需要额外动客户端。
多域控的优先级、操作主机等概念,如果视频没有展开,我建议先把单域控沿用下来,再学这些也不迟。毕竟域的学习线索很长,一次性吃透所有细节不可能。我当年学完第7天的视频后,又花了几个晚上自己搭虚拟机折腾,才真正把域控、DNS、成员加域串成一条线。现在回看,最值钱的一段经历就是“反复搭、反复删、反复看日志”,眼过千遍不如手过一遍。
最后分享一个小技巧:如果在学习过程中遇到域控怎么也“起不来”的情况,别急着重装系统,先看一眼C:\Windows\Debug\NetSetup.log,这个日志会详细记录域控提升过程中的每一步操作和报错。我在这份日志里找到过很多“玄学问题”的答案,比在搜索引擎里碰运气有效率得多。