导语:许多企业组织正在转到云计算的方向,这往往需要一定程度上的联合。简单来说,联合服务将认证从一个系统(或组织)扩展到另一个系统(或组织)。

许多企业组织正在转到云计算的方向,这往往需要一定程度上的联合。简单来说,联合服务将认证从一个系统(或组织)扩展到另一个系统(或组织)。

Gerald Steere(@Darkpawh)和我在2017年7月DEF CON安全峰会上讨论过云安全。
演示幻灯片和视频可以在这里找到:“ 黑掉云服务 ”

我们介绍的内容中有一个关键的点是如何保护联合服务器,特别是Microsoft Active Directory联合服务器(ADFS)。

微软正在不断的更新保护ADFS的指导信息。
这篇文章描述了关键的ADFS概念以及给出了一个关于如何正确的保护ADFS的安全建议的简短列表。

联合服务器概述

联合服务器通常部署在DMZ中的代理服务器的内部网络上。联合服务器上安装有证书。

ADFS使用以下证书:

·  服务沟通

·  令牌解密

·  令牌签名

ADFS术语还包括:

·  依赖方信任:云服务和应用程序

·  声明规则:确定访问的类型和允许访问的位置。

主要联合点:

·  联合:利用PKI的组织之间的信任(证书)

·  云端SSO通常利用临时或持久的浏览器cookie(cookie提供访问)

·  SAML通常可以支持多种协议。(协议和版本很重要)

·  联合服务器(或代理)在公共Internet上通过端口443(HTTPS)提供服务。

联合身份验证流程概念

Federation-Authentication-Flow-300x244.png

在上图中:

·  用户访问网站:web.sith.co并点击登录。

·  用户的浏览器可识别联合身份验证配置并连接Web应用程序的联合登录页面。

·  用户被退回到企业组织中的注册联合服务器,该服务器请求验证或使用现有的用户身份验证(AD Kerberos等)。可能会提示用户进行多因素身份验证。

·  联合服务器为用户提供用户想要连接的Web应用的令牌。

·  用户返回到Web应用程序的身份验证页面,并且由于用户具有令牌,因此用户可以根据令牌中的声明进行访问。

密钥联合认证项目:

·  联合认证实际上是Kerberos的云端版本(尽管存在很大的差异)。

·  拥有联合服务器,拥有自己的企业组织云服务。

·  令牌和签名证书与KRBTGT帐户非常相似,因为它们都用于签署证明验证的令牌(请参阅黄金票证)。

·  窃取联合证书来伪造/欺骗访问令牌。

为了突出 Gerald和我在2017年在DEFCON所表达的观点,CyberArk发布了“GoldenSAML”工具,使得具有联合服务器签名证书的人可以伪造SAML令牌,可以伪造成任何他们想要成为的用户。此功能意味着联合服务器需要与域控制器一起在最高级别受到保护。

请注意,尽管CyberArk的帖子称GoldenSAML是“新发现的”,但这是不正确的。任何操作过联合服务器的人都明白,联合证书的所有权意味着对身份验证的控制,就像PKI CA证书的所有权能够创建PKI证书一样。

杰拉尔德·斯蒂尔(Gerald Steere)提供了一些防御性的建议
“防御针对联合服务器的攻击是很难的,但是如果你比较一下攻防双方,你会发现不寻常的东西就是一个不争的事实。例如,比较从身份提供商发放的令牌与登录到你的云服务 ”。

保护ADFS服务器

这意味着联合服务器(包括ADFS服务器)需要在同一级别的域控制器(第0层)中受到保护。

保护ADFS的一些建议:

·  只有Active Directory管理员和ADFS管理员才能拥有ADFS系统的管理权限。

·  减少所有ADFS服务器上的本地Administrators组成员身份。

·  所有的云管理员都使用多重身份验证(MFA)。

·  通过代理设置最小的管理能力。

·  通过主机防火墙限制网络访问。

·  确保ADFS管理员使用管理工作站来保护其凭据。

·  将ADFS服务器计算机对象放置在不承载其他服务器的顶级OU中。

·  所有适用于ADFS服务器的GPO都应该只适用于它们,而不适用于其他服务器。这通过GPO修改限制了潜在的特权升级。

·  确保安装的证书防止被窃取(不要将这些证书存储在网络的共享上),并设置日历提醒,以确保在到期前续订(过期证书会中断联合身份验证)。

·  将日志记录设置为最高级别并将ADFS(以及安全)日志发送到SIEM并与AD身份验证以及AzureAD(或类似)相关联。

·   删除不必要的协议和Windows功能

用于记录ADFS配置的一些有用的PowerShell命令:

识别管理员

#修改自$Members = @()
#Invoke-Command {
$Members += net localgroup administrators | where {$_ -AND $_ -notmatch "command completed successfully"} | select -skip 4
$LocalAdmins = New-Object PSObject -Property @{
 Computername = $env:COMPUTERNAME
 Group = "Administrators"
 Members = $Members
 } 
$LocalAdmins

在ADFS服务器上,有相关的ADFS PowerShell cmdlet。我们可以通过运行以下命令来识别:

Get-Command -module ADFS

我觉得最有用的cmdlet是:

·  GET-ADFSCertificate Get-ADFSCertificate cmdlet检索联合身份验证服务用于令牌签名,令牌解密和安全服务通信的证书。请密切关注到期日期。

·  GET-AdfsAdditionalAuthenticationRule Get-AdfsAdditionalAuthenticationRule cmdlet检索管理所有触发其他身份验证提供程序调用的应用程序的全局规则。当声明的引擎评估了附加的认证规则并确定需要多因素认证时,会提示用户执行附加的认证方式。仅在所有应用程序都能够通过Active Directory联合身份验证服务(ADFS)执行基于Web的凭据收集时才使用此规则。如果由于评估规则而导致触发条件成立,那么使用WS-Trust等协议的应用程序将无法获得安全令牌。

·  GET-AdfsAttributeStore Get-ADFSAttributeStore cmdlet检索联合身份验证服务的属性存储。在执行此cmdlet时,你可以使用不带参数来检索联合身份验证服务的所有属性存储。

·  GET-AdfsAuthenticationProvider Get-AdfsAuthenticationProvider cmdlet获取当前在Active Directory联合身份验证服务(AD FS)中注册的所有身份验证提供程序的列表。只读列表包括了内置和外部身份验证提供程序以及相关的属性。

·  GET-AdfsClaimDescription Get-ADFSClaimDescription cmdlet检索联合身份验证服务中的声明描述。声明说明描述了联合身份验证服务使用的声明。他们还描述了如何在联邦元数据中发布这些声明。在执行此cmdlet时,你可以使用不带参数来获取声明说明的完整列表。

·  GET-AdfsClaimsProviderTrust Get-ADFSClaimsProviderTrust cmdlet检索联合身份验证服务中的声明提供程序信任对象。在执行此cmdlet时,你可以使用不带参数来获取所有声明提供程序信任对象。

·  GET-AdfsClient Get-AdfsClient cmdlet检索先前在Active Directory联合身份验证服务(ADFS)中注册的OAuth 2.0客户端的注册信息。

·  GET-AdfsEndpoint Get-ADFSEndpoint cmdlet从联合身份验证服务中检索指定的端点。ADFSEndpoint对象的集合是服务器上所有受支持端点的列表。你可以使用此列表来查看端点的配置并启用或禁用它们。要查看完整的端点列表,那么在执行此cmdlet时,你可以不带任何参数执行。

·  GET-AdfsGlobalAuthenticationPolicy Get-AdfsGlobalAuthenticationPolicy cmdlet会显示全局身份验证策略,其中包括当前允许在AdditionalAuthenticationProvider属性中作为附加提供程序的提供程序。

·  GET-AdfsGlobalWebContent Get-AdfsGlobalWebContent cmdlet获取所有全局Web内容对象或与你指定的语言环境对应的全局Web内容对象。如果不指定Locale参数,则cmdlet将获取所有语言环境的全局Web内容对象。

·  GET-AdfsProperties Get-ADFSProperties cmdlet检索联合身份验证服务的属性。

·  GET-AdfsRelyingPartyTrust Get-ADFSRelyingPartyTrust cmdlet检索联合身份验证服务中的信任方信任。在执行此cmdlet时,你可以使用不带参数来获取所有依赖方信任对象。

· GET-AdfsSslCertificate Get-AdfsSslCertificate cmdlet获取为Active Directory联合身份验证服务(ADFS)配置的所有SSL绑定的主机名,端口和证书哈希,如果启用,则会获取设备注册服务。

·  GET-AdfsSyncProperties Get-ADFSSyncProperties cmdlet检索联合身份验证服务的配置数据库同步属性。

·  GET-AdfsWebApplicationProxyRelyingPartyTrust Get-AdfsWebApplicationProxyRelyingPartyTrust cmdlet获取代理的Web应用程序代理依赖方信任对象。
Web应用程序代理依赖方信任对象对于从公司网络外部管理全局网络访问非常有用。通过设置身份验证和授权策略,管理员可以限制对通过Web应用程序代理发布的内部Web应用程序和服务的访问。

·  GET-AdfsWebConfig Get-AdfsWebConfig cmdlet获取Active Directory联合身份验证服务(ADFS)Web自定义配置设置。

·  GET-AdfsWebTheme Get-AdfsWebTheme cmdlet获取AdfsWebTheme对象。按名称指定Web主题。如果不指定名称,则cmdlet将获取所有的AdfsWebTheme对象。

以下是我们用来检查特定配置的一些ADFS PowerShell命令:

# Ensure lockout threshold < AD lockout
Get-AdfsProperties | fl ExtranetLockoutEnabled,ExtranetLockoutthreshold,ExtranetObservationWindow
 
# Set to >5 years
Get-ADFSProperties | Select CertificateDuration
 
Write-Output "ADFS Server Logging Level:"
(Get-AdfsProperties).LogLevel

ADFS参考

·  Active Directory联合身份验证服务(MSDN)
https://msdn.microsoft.com/en-us/library/bb897402.aspx?f=255&MSPPError=-2147217396 

·  Active Directory联合身份验证服务
https://docs.microsoft.com/zh-cn/windows-server/identity/active-directory-federation-services

·  ADFS概述
https://technet.microsoft.com/zh-cn/library/cc755226(v=ws.11).aspx

·  AWS和ADFS 
https://aws.amazon.com/blogs/security/tag/ad-fs/

·  安全规划和部署ADFS的最佳实践
https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/design/best-practices-for-secure-planning-and-deployment-的-AD-FS

·  ADFS证书最佳实践(DirTeam)
https://dirteam.com/sander/series/ad-fs-certificates-best-practices/

·  ADFS 3.0最佳实践(FlamingKeys)
https://flamingkeys.com/ad-fs-3-best-practices/

·  AD FS for Windows Server 2016最佳实践(FlamingKeys)
https://flamingkeys.com/ad-fs-windows-server-2016-best-practices/

源链接

Hacking more

...