Service Principal Name (SPN)

Service Principal Name (SPN)
服务类实际上是服务的某种通用名称。例如,所有Web服务器都分组在“ www”类中,而SQL服务则在“ SqlServer”类中。 如果服务在自定义端口后面运行,或者您要指定它以避免任何歧义,则可以将其附加到主机名:

 1.UPN很好理解那什么叫SPN在域里面?

笔者现在对SPN的理解是在域里面的服务主体的名称叫做SPN
tips:
我们处于Active Directory环境中。要了解什么是SPN,我们必须了解Active Directory中的服务概念是什么。

服务实际上是一种功能,一种软件,可以由AD(Active Directory)的其他成员使用。例如,您可以拥有Web服务器,网络共享,DNS服务,打印服务等。要识别服务,我们至少需要两件事。相同的服务可以在不同的主机上运行,​​因此,我们需要指定主机,而计算机可以承载多个服务,因此,显然,我们需要指定服务。

通过结合这些信息,我们可以准确地指定服务。此组合表示其服务主体名称或SPN。看起来像这样:
smtpSvc/Exc.7dap.club
比如有人在7dap.club域中的的Exc机器上面请求了host服务,创建了此票证

 

服务类实际上是服务的某种通用名称。例如,所有Web服务器都分组在“ www”类中,而SQL服务则在“ SqlServer”类中。

如果服务在自定义端口后面运行,或者您要指定它以避免任何歧义,则可以将其附加到主机名:
SqlServer/mssql.7dap.club:1433

 当然服务类肯定不止mssql和smtpSvc这里是微软文档的介绍。

 这里有我们认识的http服务 cifs文件共享服务,dns域名解析服务,以及命令执行用到的rpc等很多,但是此列表并不详细,比如LDAP和SqlServer

在域中有一个很特殊的SPN服务属性叫做HOST

HOST SPN并不是真正的服务类。这是一组服务类,一种别名,将大量SPN组合在一起。它组合在一起的元素在Active Directory的“ SPN映射”属性中定义。可以使用以下命令列出这些类:
Get-ADObject -Identity "CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,DC=7dap,DC=club" -properties sPNMappings

 

因此,如果用户曾经在WEB-SERVER-01上寻找www SPN,则Active Directory将寻找wwww / WEB-SERVER-01,但也会寻找HOST / WEB-SERVER-01。如果主机具有HOST SPN,则意味着它具有www SPN(以及许多其他主机)

 这是一个获取当前域内的所有spn的小ps脚本

$search = New-Object DirectoryServices.DirectorySearcher([ADSI]"")
$search.filter = "(servicePrincipalName=*)"
$results = $search.Findall()
foreach($result in $results) {
	$userEntry = $result.GetDirectoryEntry()
	Write-host "Object : " $userEntry.name "(" $userEntry.distinguishedName ")"
	Write-host "List SPN :"        
	foreach($SPN in $userEntry.servicePrincipalName)
	{
		Write-Host $SPN       
	}
	Write-host ""
}

 

如果我们只想看那些user启动(或者使用)了那些服务可以用以下ps1脚本

$search = New-Object DirectoryServices.DirectorySearcher([ADSI]"")
$search.filter = "(&(objectCategory=person)(objectClass=user)(servicePrincipalName=*))"
$results = $search.Findall()
foreach($result in $results)
{
	$userEntry = $result.GetDirectoryEntry()
	Write-host "User : " $userEntry.name "(" $userEntry.distinguishedName ")"
	Write-host "SPNs"        
	foreach($SPN in $userEntry.servicePrincipalName)
	{
		$SPN       
	}
	Write-host ""
}

参考

https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc772815(v=ws.10)#service-principal-names
https://dirkjanm.io/krbrelayx-unconstrained-delegation-abuse-toolkit/
https://en.hackndo.com/service-principal-name-spn/

原文地址:https://www.cnblogs.com/-zhong/p/14466280.html