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

本文详细介绍了Azure Active Directory(Azure AD)的核心架构、管理工具及安全特性,涵盖其全球分布式数据复制机制、PowerShell管理模块对比、常见攻击手法如密码喷洒和账户枚举,以及防御措施如条件访问和特权身份管理(PIM)。

什么是Azure Active Directory?

许多人都熟悉Active Directory——一种随Windows Server提供的本地目录和身份验证系统,但Azure Active Directory究竟是什么?

Azure Active Directory(Azure AD或AAD)是一种多租户云目录和身份验证服务。Azure AD是Office 365(及Azure)用于账户、组和角色的目录服务。它也是一个身份提供商(IDP),支持联合身份验证(SAML等)。
注意:鉴于云环境的快速变化,本文部分内容可能在发布后不久就会过时。

Azure AD具有高可用性且全球部署。

  • Azure AD在全球30多个数据中心部署,并利用现有的Azure可用区。随着更多Azure区域的部署,这一数字正在快速增长。
  • 为确保持久性,写入Azure AD的任何数据都会根据租户配置复制到至少4个、最多13个数据中心。在每个数据中心内,数据还会至少复制9次,既保证持久性,也扩展认证负载能力。
  • 举例来说,这意味着在任何时间点,我们的服务中最小的区域至少有36份目录数据副本。为确保持久性,只有在成功提交到区域外数据中心后,Azure AD的写入操作才完成。
  • 这种方法既保证了数据的持久性,又提供了巨大的冗余——多个网络路径和数据中心可以服务任何授权请求,系统会自动智能地重试并绕开数据中心内及跨数据中心的故障。
  • 为验证这一点,我们定期进行故障注入测试,验证系统对Azure AD所构建组件故障的恢复能力。这甚至包括定期关闭整个数据中心,以确认系统能够承受数据中心丢失而不会对客户造成任何影响。
  • Azure AD已经是一个庞大的系统,运行在超过30万个CPU核心上,并能依赖Azure云的大规模可扩展性动态快速地扩展以满足任何需求。这包括流量的自然增长(如某区域早上9点的认证峰值),以及由Azure AD B2C支持的世界大型活动带来的新流量激增(经常出现数百万新用户的涌入)。
  • 为支持健康检查(确保安全部署)并为工程团队提供系统健康洞察,Azure AD发出大量内部遥测、指标和信号用于监控系统健康。在我们的规模下,每周有超过11 PB的信号输入到自动健康监控系统。
  • 参考:Advancing Azure Active Directory Availability

Azure Active Directory不是云版AD

Azure Active Directory并非托管在云中的Active Directory。它没有标准的AD认证方法(如NTLM或Kerberos)、没有LDAP、也没有组策略(GPO),因此Azure AD不适用于传统的本地应用程序。

存在可用于管理Microsoft Azure(Azure Active Directory域服务)、Amazon AWS(Amazon Managed Microsoft AD)和Google Cloud(Managed Service for Microsoft Active Directory)中云工作负载的云托管Active Directory环境。这些都是托管的Microsoft Active Directory环境,拥有2个或更多域控制器,租户管理员不会获得托管AD环境的域管理员权限;仅提供委派访问权限,通常包括在特定OU中创建/管理资源以及特定GPO的能力。

注意:此处没有空间比较这些服务,但如果有兴趣,我可能会在未来写一篇文章(我在2017年曾研究比较Microsoft Azure与Amazon AWS的托管AD服务产品)。

主要管理工具

大多数AD管理员熟悉的工具是Active Directory用户和计算机(ADUC,MMC工具)。
Azure Active Directory管理员将主要使用Web控制台(https://portal.azure.com)来管理环境。
管理本地Active Directory及现在Azure AD/Office 365的管理员将使用本地MMC工具以及Web管理门户(及其相关URL)。
有用于管理Azure AD的PowerShell cmdlet(类似于本地),但云功能通常比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中有一些功能尚未移植到AzureAD模块(截至目前)。

Azure AD PowerShell模块和Cmdlet比较

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

类别 MSOnline AzureAD
管理单元 Get-MsolAdministrativeUnit
管理单元成员 Get-MsolAdministrativeUnitMember
应用程序 Get-AzureADApplication
应用程序扩展属性 Get-AzureADApplicationExtensionProperty
应用程序密钥凭据 Get-AzureADApplicationKeyCredential
应用程序徽标 Get-AzureADApplicationLogo
应用程序所有者 Get-AzureADApplicationOwner
应用程序密码凭据 Get-AzureADApplicationPasswordCredential
应用程序代理应用程序 Get-AzureADApplicationProxyApplication
应用程序代理应用程序连接器组 Get-AzureADApplicationProxyApplicationConnectorGroup
应用程序代理连接器 Get-AzureADApplicationProxyConnector
应用程序代理连接器组 Get-AzureADApplicationProxyConnectorGroup
应用程序代理连接器组成员 Get-AzureADApplicationProxyConnectorGroupMember
应用程序代理连接器成员 Get-AzureADApplicationProxyConnectorMemberOf
应用程序服务端点 Get-AzureADApplicationServiceEndpoint
应用程序 Get-AzureADMSApplication
应用程序扩展属性 Get-AzureADMSApplicationExtensionProperty
应用程序所有者 Get-AzureADMSApplicationOwner
已删除的应用程序 Get-AzureADDeletedApplication
服务应用角色分配 Get-AzureADServiceAppRoleAssignedTo
服务应用角色分配 Get-AzureADServiceAppRoleAssignment
组应用角色分配 Get-AzureADGroupAppRoleAssignment
身份提供商 Get-AzureADMSIdentityProvider
生命周期策略组 Get-AzureADMSLifecyclePolicyGroup
联系人 Get-MsolContact Get-AzureADContact
联系人直接报告 Get-AzureADContactDirectReport
联系人经理 Get-AzureADContactManager
联系人成员资格 Get-AzureADContactMembership
联系人缩略图 Get-AzureADContactThumbnailPhoto
合同 Get-AzureADContract
设备 Get-MsolDevice Get-AzureADDevice
设备注册服务策略 Get-MsolDeviceRegistrationServicePolicy
设备配置 Get-AzureADDeviceConfiguration
设备注册所有者 Get-AzureADDeviceRegisteredOwner
设备注册用户 Get-AzureADDeviceRegisteredUser
目录同步 Get-MsolDirSyncConfiguration
目录同步功能 Get-MsolDirSyncFeatures
目录同步配置错误 Get-MsolDirSyncProvisioningError
具有目录同步配置错误的对象 Get-MsolHasObjectsWithDirSyncProvisioningErrors
Get-MsolDomain Get-AzureADDomain
域验证DNS Get-MsolDomainVerificationDns Get-AzureADDomainVerificationDnsRecord
域联合设置 Get-MsolDomainFederationSettings
域名引用 Get-AzureADDomainNameReference
域服务配置记录 Get-AzureADDomainServiceConfigurationRecord
联合属性 Get-MsolFederationProperty
Get-MsolGroup Get-AzureADGroup
Get-MsolGroup Get-AzureADMSGroup
组成员 Get-MsolGroupMember Get-AzureADGroupMember
组所有者 Get-AzureADGroupOwner
组生命周期策略 Get-AzureADMSGroupLifecyclePolicy
许可证订阅 Get-MsolSubscription Get-AzureADSubscribedSku
对象 Get-AzureADMSDeletedDirectoryObject
对象 Get-AzureADObjectByObjectId
合作伙伴合同 Get-MsolPartnerContract
合作伙伴信息 Get-MsolPartnerInformation
密码策略 Get-MsolPasswordPolicy
角色组 Get-MsolRole Get-AzureADDirectoryRole
角色组成员 Get-MsolRoleMember Get-AzureADDirectoryRoleMember
作用域角色成员 Get-MsolScopedRoleMember
角色组 Get-AzureADDirectoryRoleTemplate
服务主体 Get-MsolServicePrincipal Get-AzureADServicePrincipal
服务主体凭据 Get-MsolServicePrincipalCredential Get-AzureADServicePrincipalKeyCredential
服务主体创建的对象 Get-AzureADServicePrincipalCreatedObject
服务主体成员资格 Get-AzureADServicePrincipalMembership
服务主体OAuth2权限授予 Get-AzureADServicePrincipalOAuth2PermissionGrant
服务主体拥有的对象 Get-AzureADServicePrincipalOwnedObject
服务主体所有者 Get-AzureADServicePrincipalOwner
服务主体密码凭据 Get-AzureADServicePrincipalPasswordCredential
会话 Get-AzureADCurrentSessionInfo
租户 Get-MsolCompanyAllowedDataLocation
租户信息 Get-MsolCompanyInformation
租户详情 Get-AzureADTenantDetail
受信任的证书颁发机构 Get-AzureADTrustedCertificateAuthority
跨云验证码 Get-CrossCloudVerificationCode
用户 Get-MsolUser Get-AzureADUser
用户强认证 Get-MsolUserByStrongAuthentication Get-AzureADUserAppRoleAssignment
用户角色 Get-MsolUserRole Get-AzureADUserCreatedObject
用户直接报告 Get-AzureADUserDirectReport
用户扩展 Get-AzureADUserExtension
扩展属性 Get-AzureADExtensionProperty
用户许可证详情 Get-AzureADUserLicenseDetail
用户经理 Get-AzureADUserManager
用户成员资格 Get-AzureADUserMembership
用户OAuth2权限授予 Get-AzureADUserOAuth2PermissionGrant
用户拥有的设备 Get-AzureADUserOwnedDevice
用户拥有的对象 Get-AzureADUserOwnedObject
用户注册的设备 Get-AzureADUserRegisteredDevice
用户缩略图 Get-AzureADUserThumbnailPhoto
用户账户SKU 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密码喷洒缓解
通过

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计