深入解析Azure Active Directory:云身份认证与安全攻防

本文详细介绍了Azure Active Directory的核心架构、管理工具、PowerShell模块对比以及常见攻击方法如密码喷洒和账户枚举,同时提供了防御和检测策略,帮助理解云身份服务的安全实践。

什么是Azure Active Directory?

许多人对Active Directory很熟悉,它是Windows Server提供的本地目录和身份验证系统,但Azure Active Directory到底是什么?Azure Active Directory(Azure AD或AAD)是一个多租户云目录和身份验证服务。Azure AD是Office 365(和Azure)用于账户、组和角色的目录服务。它也是一个身份提供者(IPD)并支持联合身份验证(SAML等)。注意:鉴于云环境的快速变化,本文的某些内容可能在原始发布日期后很快过时。Azure AD具有高可用性并全球部署。

Azure AD在全球30多个数据中心部署,利用Azure可用性区域(如果存在)。随着更多Azure区域的部署,这个数字正在快速增长。为了持久性,写入Azure AD的任何数据都会复制到至少4个最多13个数据中心,具体取决于租户配置。在每个数据中心内,数据会再次复制至少9次,以实现持久性并扩展容量以服务身份验证负载。举例来说——这意味着在任何时间点,在我们最小的区域中,至少有36份目录数据副本可用。为了持久性,写入Azure AD只有在成功提交到区域外数据中心后才完成。这种方法既保证了数据的持久性,又提供了巨大的冗余——多个网络路径和数据中心可以服务任何给定的授权请求,系统会自动智能地重试并绕过数据中心内和跨数据中心的故障。为了验证这一点,我们定期进行故障注入并验证系统对Azure AD所构建系统组件故障的弹性。这包括定期关闭整个数据中心以确认系统可以容忍数据中心的丢失,且对客户零影响。… Azure AD已经是一个庞大的系统,运行在超过300,000个CPU核心上,并能够依赖Azure云的大规模可扩展性来动态快速扩展以满足任何需求。这包括流量的自然增加,例如某个区域上午9点的身份验证峰值,以及由我们的Azure AD B2C服务的新流量激增,该服务支持世界上一些最大的事件,并经常看到数百万新用户的涌入。… 为了支持健康检查(这些检查控制安全部署并为我们的工程团队提供系统健康状况的洞察),Azure AD发出大量内部遥测、指标和信号,用于监控系统健康。在我们的规模下,每周有超过11 PB的信号输入到我们的自动化健康监控系统。https://azure.microsoft.com/en-us/blog/advancing-azure-active-directory-availability/

Azure Active Directory不是云AD

Azure Active Directory不是托管在云中的Active Directory。没有标准的AD身份验证方法,如NTLM或Kerberos;没有LDAP;也没有组策略(GPO),因此Azure AD不适用于传统的本地应用程序。有云托管的Active Directory环境可用于管理Microsoft Azure(Azure Active Directory域服务)、Amazon AWS(Amazon Managed Microsoft AD)和Google Cloud(Managed Service for Microsoft Active Directory (AD))中的云工作负载。这些都是托管的Microsoft Active Directory环境,有2个或更多域控制器,租户管理员不会获得对托管AD环境的域管理员权限;只提供委派访问,通常包括在特定OU和特定GPO中创建/管理资源的能力。注意:我这里没有空间比较这些服务,但如果有兴趣,我可能会写一篇未来的文章(我在2017年做了一些研究,比较了Microsoft Azure和Amazon AWS的托管AD服务产品)。

主要管理工具

大多数AD管理员熟悉的工具是Active Directory用户和计算机,又名ADUC(MMC工具)。Azure Active Directory管理员将主要使用https://portal.azure.com的Web控制台来管理环境。管理本地Active Directory和现在Azure AD/Office 365的管理员将使用本地MMC工具以及Web管理门户(及其相关URL)。有PowerShell cmdlet可用于管理Azure AD(类似于本地),但云功能通常比PowerShell工具的发布速度更快,这意味着即使在使用PowerShell时,仍应使用云管理门户。

与Azure Active Directory交互

由于Azure AD没有LDAP,与AAD交互涉及通过Graph API(或PowerShell模块)连接。我喜欢PowerShell,所以我使用PowerShell模块(或门户网站)进行管理和报告。有两个主要的PowerShell模块用于与Azure AD交互:MSOnline和AzureAD。这些可以通过PowerShell安装功能安装:

1
2
Install-Module -Name MSOnline -Force
Install-Module -Name AzureAD -Force

AzureAD模块可能最终会取代MSOnline PowerShell模块,但MSOnline中有一些功能尚未移植到Azure AD模块(目前)。

Azure AD PowerShell模块和Cmdlet比较

(模块和cmdlet数据截至2020年1月)

类别 MSOnline AzureAD
Administrative Unit Get-MsolAdministrativeUnit
Administrative Unit Get-MsolAdministrativeUnitMember
Application Get-AzureADApplication
Application Get-AzureADApplicationExtensionProperty
Application Get-AzureADApplicationKeyCredential
Application Get-AzureADApplicationLogo
Application Get-AzureADApplicationOwner
Application Get-AzureADApplicationPasswordCredential
Application Get-AzureADApplicationProxyApplication
Application Get-AzureADApplicationProxyApplicationConnectorGroup
Application Get-AzureADApplicationProxyConnector
Application Get-AzureADApplicationProxyConnectorGroup
Application Get-AzureADApplicationProxyConnectorGroupMember
Application Get-AzureADApplicationProxyConnectorMemberOf
Application Get-AzureADApplicationServiceEndpoint
Application Get-AzureADMSApplication
Application Get-AzureADMSApplicationExtensionProperty
Application Get-AzureADMSApplicationOwner
Application Get-AzureADDeletedApplication
Application Get-AzureADServiceAppRoleAssignedTo
Application Get-AzureADServiceAppRoleAssignment
Application Get-AzureADGroupAppRoleAssignment
Authentication Get-AzureADMSIdentityProvider
Authentication Get-AzureADMSLifecyclePolicyGroup
Contact Get-MsolContact Get-AzureADContact
Contact Get-AzureADContactDirectReport
Contact Get-AzureADContactManager
Contact Get-AzureADContactMembership
Contact Get-AzureADContactThumbnailPhoto
Contract Get-AzureADContract
Device Get-MsolDevice Get-AzureADDevice
Device Get-MsolDeviceRegistrationServicePolicy
Device Get-AzureADDeviceConfiguration
Device Get-AzureADDeviceRegisteredOwner
Device Get-AzureADDeviceRegisteredUser
DirSync Get-MsolDirSyncConfiguration
DirSync Get-MsolDirSyncFeatures
DirSync Get-MsolDirSyncProvisioningError
DirSync Get-MsolHasObjectsWithDirSyncProvisioningErrors
Domain Get-MsolDomain Get-AzureADDomain
Domain Get-MsolDomainVerificationDns Get-AzureADDomainVerificationDnsRecord
Domain Get-MsolDomainFederationSettings
Domain Get-AzureADDomainNameReference
Domain Get-AzureADDomainServiceConfigurationRecord
Federation Get-MsolFederationProperty
Group Get-MsolGroup Get-AzureADGroup
Group Get-MsolGroup Get-AzureADMSGroup
Group Get-MsolGroupMember Get-AzureADGroupMember
Group Get-AzureADGroupOwner
Group Get-AzureADMSGroupLifecyclePolicy
License Subscription Get-MsolSubscription Get-AzureADSubscribedSku
Object Get-AzureADMSDeletedDirectoryObject
Object Get-AzureADObjectByObjectId
Partner Get-MsolPartnerContract
Partner Get-MsolPartnerInformation
Password Get-MsolPasswordPolicy
Role Group Get-MsolRole Get-AzureADDirectoryRole
Role Group Get-MsolRoleMember Get-AzureADDirectoryRoleMember
Role Group Get-MsolScopedRoleMember
Role Group Get-AzureADDirectoryRoleTemplate
Service Principal Get-MsolServicePrincipal Get-AzureADServicePrincipal
Service Principal Get-MsolServicePrincipalCredential Get-AzureADServicePrincipalKeyCredential
Service Principal Get-AzureADServicePrincipalCreatedObject
Service Principal Get-AzureADServicePrincipalMembership
Service Principal Get-AzureADServicePrincipalOAuth2PermissionGrant
Service Principal Get-AzureADServicePrincipalOwnedObject
Service Principal Get-AzureADServicePrincipalOwner
Service Principal Get-AzureADServicePrincipalPasswordCredential
Session Get-AzureADCurrentSessionInfo
Tenant Get-MsolCompanyAllowedDataLocation
Tenant Get-MsolCompanyInformation
Tenant Get-AzureADTenantDetail
Tenant Get-AzureADTrustedCertificateAuthority
Tenant Get-CrossCloudVerificationCode
User Get-MsolUser Get-AzureADUser
User Get-MsolUserByStrongAuthentication Get-AzureADUserAppRoleAssignment
User Get-MsolUserRole Get-AzureADUserCreatedObject
User Get-AzureADUserDirectReport
User Get-AzureADUserExtension
User Get-AzureADExtensionProperty
User Get-AzureADUserLicenseDetail
User Get-AzureADUserManager
User Get-AzureADUserMembership
User Get-AzureADUserOAuth2PermissionGrant
User Get-AzureADUserOwnedDevice
User Get-AzureADUserOwnedObject
User Get-AzureADUserRegisteredDevice
User Get-AzureADUserThumbnailPhoto
User Get-MsolAccountSku

在上表中,我对两个Azure AD PowerShell模块的cmdlet进行了分类,并尝试链接提供相同或类似功能的cmdlet。我计划未来发布更多关于这些cmdlet的内容。

不幸的是,单点登录(SSO)到这些模块并不是一件简单的事。可以在PowerShell中捕获凭据并在模块之间重用,但前提是没有强制执行MFA(这会降低账户安全性)。Microsoft云环境最初只支持用户名和密码身份验证。这种“旧式身份验证”不包括多因素身份验证(“MFA”),因此出于安全原因,应禁用旧式身份验证(通过安全默认值、条件访问等)。Azure Active Directory身份验证库提供“现代身份验证”,完全支持MFA(和无密码!)。

根据Microsoft的说法,ADAL:Azure Active Directory身份验证库(ADAL)v1.0使应用程序开发人员能够对云或本地Active Directory(AD)的用户进行身份验证,并获取用于保护API调用的令牌。ADAL通过以下功能使身份验证更易于开发人员:

  • 可配置的令牌缓存,存储访问令牌和刷新令牌
  • 当访问令牌过期且存在刷新令牌时自动刷新令牌
  • 支持异步方法调用

有一个ADAL PowerShell模块(Install-Module -Name adal.ps),它提供跨模块(支持它的模块)的某种程度的SSO。安装ADAL模块后,运行以下命令以在会话中加载ADAL令牌:

1
2
3
4
5
6
$clientId = "1b730954-1685-4b74-9bfd-dac224a7b894" # Azure AD PowerShell
$redirectUri = [Uri]::new('urn:ietf:wg:oauth:2.0:oob')
$authority = "https://login.windows.net/common/oauth2/authorize"
$resourceUrl = "https://graph.windows.net"

$ADALresponse = get-adaltoken -Resource $resourceUrl -ClientId $clientId -RedirectUri $redirectUri -Authority $authority -PromptBehavior:Always

一旦捕获了$ADALResponse变量,您就可以在Azure AD模块中利用此令牌:

1
2
3
4
5
6
$ConnectAzureADInfo = connect-azuread -AadAccessToken $ADALresponse.AccessToken -AccountId $ADALresponse.UserInfo.DisplayableId

$ConnectMsolInfo = connect-msolservice -AdGraphAccessToken $ADALresponse.AccessToken

# 看起来Microsoft Teams PowerShell模块也支持ADAL,不过我添加了一个包含已登录用户UPN的新变量。
Connect-MicrosoftTeams -AadAccessToken $ADALresponse -AccountId $AssessmentAccountUPN

对Azure Active Directory的访问权限

对于Active Directory,几乎所有内容都可以作为普通用户查看。Azure AD用户可以查看有关用户和组的信息,但在可访问的内容方面存在一些限制。在Azure AD中,特权组称为“角色”(即组)以识别特殊访问。Office 365中有几个这样的管理员角色,它们提供对全部或特定部分Office 365的管理员级权限。(分配角色)许多组织在全局管理员(又名租户管理员)角色中有一个报告账户,该角色有效地将企业管理员、域管理员和架构管理员组合到一个组中。全局管理员对Azure AD和所有Office 365服务具有完全控制权。这就是为什么许多组织拥有超过5个全局管理员(Microsoft的最大推荐数量)。只有云账户应添加到角色中,以便它们可以利用Azure MFA(和无密码)以及由PIM控制的角色成员资格。还强烈建议创建一个(或两个)“紧急访问”管理员账户,以确保对租户的持续特权访问。Microsoft发布了一份关于如何保护特权访问的文档。强烈推荐使用特权身份管理(PIM)来控制角色成员资格,并且每个将使用PIM的账户都需要Azure AD Premium 2(P2)许可证。PIM提供对具有所需权限的管理员角色的即时访问。当管理员需要管理员权限时,他们可以通过PIM请求和获得访问权限(可以发送审批或自动批准)。Microsoft建议所有角色中的账户都由PIM管理(并拥有AAD P2许可证)。还有一个用于PIM的PowerShell模块可以安装:

1
Install-Module -Name Microsoft.Azure.ActiveDirectory.PIM.PSModule

在2019年秋季,Microsoft添加了一个名为“全局读取者”的新角色,该角色具有对全局管理员可以看到的所有Azure AD/Office 365服务的只读/仅查看权限(有一些例外,因为Microsoft仍在向所有Office 365服务推出全局读取者只读功能)。全局读取者的成员资格应提供给需要Microsoft云(Azure AD和Office 365)环境的仅查看访问权限的安全团队或审计员。

攻击Azure Active Directory

Office 365服务可从互联网访问(默认情况下,使用条件访问限制访问),这使它们对攻击者具有吸引力。攻击者利用几种攻击方法针对Azure AD和Office 365。

账户枚举

对于老式Active Directory,任何Active Directory用户都可以枚举所有用户账户和管理员组成员身份,并具有对域控制器的网络访问权限。Azure Active Directory用户可以枚举所有用户账户和管理员组成员身份,并具有对Office 365服务(默认情况下为互联网)的访问权限。用户枚举通常可以在没有账户的情况下使用O365creeper进行,该工具尝试使用电子邮件地址列表向O365进行身份验证。根据响应代码,该工具确定电子邮件地址是否是有效用户账户(或不是)。Azure AD枚举工具:

  • O365 Creeper – Office 365身份验证页面(Python)[账户发现]
  • OWA(Golang)
  • ActiveSync(Python)
  • MSOnline/AzureAD PowerShell模块(PowerShell)

密码喷洒

攻击者以及许多渗透测试人员和红队人员利用的一种常见方法称为“密码喷洒”。密码喷洒很有趣,因为它是自动化的密码猜测。这种针对所有用户的自动化密码猜测通常避免账户锁定,因为使用特定密码的登录尝试是针对每个用户执行的,而不是针对一个特定用户,这是账户锁定设计要击败的。攻击者从一个他们将要尝试的密码列表开始,该列表以最可能的密码(“Fall2017”、“Winter2018”等)开头。当密码喷洒开始时,我们从列表中的第一个密码开始。该第一个密码用于尝试以每个用户(或子集)的身份进行身份验证。这个密码针对每个用户尝试,一旦所有用户都用该密码测试过,我们就继续下一个。

密码喷洒相对容易执行且非常有效。我们与许多组织合作过,这些组织的账户通过密码喷洒其云环境而受到损害。许多联合客户没有意识到这是他们的工作,而不是云的工作。密码喷洒存在超出云的实际风险。如果云账户和本地使用相同的密码,并且没有配置MFA,攻击者可能密码喷洒云账户,然后获得对公司网络的访问权限。这不是理论或假设场景,并强调了MFA的重要性。

Office 365密码喷洒工具:

  • Ruler(Exchange)[Golang]
  • SprayingToolkit(Lync/Skype for Business/OWA)[Python]
  • LyncSniper(Lync/Skype for Business)[PowerShell]
  • MailSniper(OWA/EWS)[PowerShell]

Office 365密码喷洒缓解: 通过启用“安全默认值”或配置自定义条件访问策略来禁用旧式身份验证。还强烈建议要求所有用户使用MFA。

Office 365密码喷洒检测: 假设密码喷洒针对Office 365服务且未配置联合(ADFS、Okta等),则可以通过参考Azure AD登录日志进行检测。通过关联同一用户在时间范围内的多个事件,登录错误代码为“50126”且客户端应用为“其他客户端;较旧的Office客户端”(这意味着执行了旧式身份验证)来检测。

账户令牌盗窃和重用

由于云身份验证通常会导致令牌存储在经过身份验证的应用程序或Web浏览器中,这是身份验证的证明,并且可以被重用。Web浏览器通常将此身份验证令牌存储为cookie。如果此数据被盗,攻击者可以利用此来欺骗访问并配置持久性以继续访问。

Azure AD审查

Microsoft的Azure AD GitHub包括用于审查Azure AD配置的PowerShell代码(https://github.com/AzureAD/AzureADAssessment)Trimarc还有一个名为Microsoft云安全评估(MCSA)的新服务产品,类似于本地Active Directory安全评估,但专注于Azure AD和Office 365。

其他Office 365服务PowerShell模块

  • Exchange Online模块:`Install-Module -Name ExchangeOnlineManagement
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计