SPN服务主体名称
SPN服务主体名称

SPN服务主体名称

SPN

SPN(Service Principal Name)是一个在活动目录(Active Directory)中用来唯一标识服务实例的名称。它主要用于身份验证过程中,特别是当服务需要与域中的其他服务或资源进行交互时。SPN 允许服务使用 Kerberos 认证协议来验证其身份,这是基于票证的认证方式,比传统的用户名和密码认证更加安全。

SPN 通常由以下几部分组成:

  • 服务类(Service Class):表示服务的类型,如 HTTPMSSQLSvc 等。
  • 服务名(Service Name):服务实例的名称,通常是主机名或域名。
  • 端口号(Port Number):服务监听的端口号,可选。
  • 域名(DNS Domain Name):服务所在的域的 DNS 名称,可选。

例如,一个 SPN 可能看起来像这样:

HTTP/myserver.example.com

或者如果服务监听特定端口:

HTTP/myserver.example.com:8080

在 Kerberos 认证中,客户端使用 SPN 来请求服务的认证票证(Service Ticket)。然后,服务可以使用这个票证来验证客户端的请求。如果没有正确配置 SPN,可能会导致认证失败。

管理员可以使用 setspn 命令行工具来查询、添加或删除 SPN。例如,添加一个 SPN 可以使用以下命令:

setspn -S HTTP/myserver.example.com myserviceaccount

// 使用活动目录PowerShell模块添加SPN
PowerShell -ep bypass
Import-Module .\ActiveDirectory.psd1
Set-ADUser 
Set-ADUser -Identity hk\IISSvc -ServicePrincipalNames @{Add='http/srv01.hk.dms2.com'}

这将为 myserviceaccount 账户添加一个 SPN,用于 HTTP 服务在 myserver.example.com 主机上。

SPN账户分类与密钥生成过程

SPN(Service Principal Name)账户主要分为两种类型,它们分别注册在活动目录(Active Directory)的不同位置:

  1. 注册在活动目录的域用户账户(Users)下:当服务以某个特定的域用户账户运行时,相关的 SPN 将注册在这个域用户的账户下。例如,如果 SQL Server 或其他服务使用域用户账户作为服务账户,则该账户下会注册相应的 SPN。普通域用户绑定的SPN的密钥是用户密码hash后得到的128位的密钥,所以在注册SPN是一定要关注域用户密码是否为弱口令,如果是弱口令极大降低了Kerberoasting攻击方式的攻击难度
  2. 注册在活动目录的机器账户(Computers)下:这种情况通常适用于服务以本地系统(Local System)或网络服务(Network Service)权限运行的情况。例如,当服务在启动时使用这些内置账户,SPN 将注册在相应的计算机账户下。该类型SPN机器账户密钥通常是系统随机生成的128位的随机数难以破解

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注