深入解析Azure Active Directory:微软云身份认证的核心架构

本文详细解析了Azure Active Directory的技术架构、管理工具及安全特性,包括其全球部署的高可用性设计、与本地AD的本质区别、PowerShell管理模块对比,以及防范密码喷洒攻击的最佳实践。文章还涵盖了特权身份管理(PIM)和ADAL认证库等高级安全功能。

什么是Azure Active Directory?

许多人都熟悉Windows Server中的本地目录和认证系统——Active Directory,但Azure Active Directory究竟是什么?Azure Active Directory(Azure AD或AAD)是一个多租户云目录和认证服务。它是Office 365(和Azure)用于账户、组和角色的目录服务,同时也是一个支持联合认证(SAML等)的身份提供者(IdP)。

注意:鉴于云技术的快速变化,本文部分内容可能在发布后不久就会过时。

Azure AD的高可用性架构

Azure AD具有极高的可用性和全球部署能力:

  • 在全球30多个数据中心部署,并利用Azure可用区
  • 数据写入后至少会复制到4个(最多13个)数据中心
  • 每个数据中心内数据至少复制9次以实现持久性和负载均衡
  • 系统定期进行故障注入测试,甚至模拟整个数据中心宕机
  • 目前运行在超过30万个CPU核心上,每周处理超过11PB的监控数据

Azure AD不是云版本的AD

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

微软Azure(Azure Active Directory Domain Services)、亚马逊AWS(Amazon Managed Microsoft AD)和谷歌云(Managed Service for Microsoft AD)都提供可以用于管理云工作负载的托管Active Directory环境。这些环境都有2个或更多域控制器,租户管理员不会获得域管理员权限,只能获得特定OU和GPO的委派管理权限。

主要管理工具

大多数AD管理员熟悉的工具是Active Directory用户和计算机(ADUC,MMC工具)。Azure Active Directory管理员主要使用https://portal.azure.com网页控制台进行管理。

管理本地AD和Azure AD/Office 365的管理员将同时使用本地MMC工具和网页管理门户(及其各种相关URL)。虽然Azure AD也有PowerShell cmdlet(类似于本地AD),但云功能的发展速度通常快于PowerShell工具的发布速度,因此即使在使用PowerShell时,仍应使用云管理门户。

与Azure AD交互

由于Azure AD没有LDAP,与之交互需要通过Graph API或PowerShell模块。有两个主要的PowerShell模块用于与Azure AD交互:MSOnline和AzureAD。可以通过以下命令安装:

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

AzureAD模块可能最终会取代MSOnline PowerShell模块,但MSOnline中有些功能尚未移植到AzureAD模块。

Azure AD PowerShell模块和cmdlet对比

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

类别 MSOnline AzureAD
管理单元 Get-MsolAdministrativeUnit
应用 Get-AzureADApplication
联系人 Get-MsolContact Get-AzureADContact
设备 Get-MsolDevice Get-AzureADDevice
Get-MsolDomain Get-AzureADDomain
Get-MsolGroup Get-AzureADGroup
用户 Get-MsolUser Get-AzureADUser

(表格中详细列出了两个模块的cmdlet对比,此处仅展示部分)

使用ADAL实现单点登录

微软云环境最初只支持用户名和密码认证。这种"传统认证"不包括多因素认证(MFA),出于安全考虑,应通过安全默认值、条件访问等禁用传统认证。

Azure Active Directory认证库(ADAL)提供"现代认证",完全支持MFA(甚至无密码认证)。根据微软的定义:

ADAL使开发人员能够通过以下功能更轻松地进行认证:

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

安装ADAL PowerShell模块(Install-Module -Name adal.ps)后,可以运行以下命令加载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

Azure AD的访问权限

在Active Directory中,几乎所有内容都可以作为普通用户查看。Azure AD用户可以查看有关用户和组的信息,但在可访问性方面存在一些限制。在Azure AD中,特权组被称为"角色"(实际上是组),用于标识特殊访问权限。Office 365中有几个这样的管理员角色,提供对整个Office 365或特定部分的管理级权限。

许多组织在全局管理员(又称租户管理员)角色中有一个报告账户,该角色实际上是集成了企业管理员、域管理员和架构管理员权限的单一组。全局管理员对Azure AD和所有Office 365服务拥有完全控制权。这就是为什么许多组织的全局管理员超过5个(微软推荐的最大数量)。只有云账户应被添加到角色中,以便他们可以利用Azure MFA(和无密码认证)以及由PIM控制的角色成员资格。

还强烈建议创建一个(或两个)“应急"管理员账户,以确保对租户的持续特权访问。微软发布了一份关于如何保护特权访问的文档。

特权身份管理(PIM)强烈推荐用于控制角色成员资格,需要为每个将使用PIM的账户购买Azure AD Premium 2(P2)许可证。PIM提供对具有所需权限的管理角色的即时访问。当管理员需要管理员权限时,他们可以通过PIM请求并获得访问权限(可以发送审批或自动批准)。微软建议所有角色中的账户都由PIM管理(并拥有AAD P2许可证)。

还有一个用于PIM的PowerShell模块可以安装:

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

2019年秋季,微软添加了一个名为"全局读取者"的新角色,该角色对所有Azure AD/Office 365服务具有只读/查看权限,这些服务全局管理员可以看到(有一些例外,因为微软仍在向所有Office 365服务推出全局读取者只读功能)。全局读取者的成员资格应提供给需要Microsoft Cloud(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客户端”(这意味着执行了传统认证)来检测。

账户令牌窃取和重用

由于云认证通常会在认证的应用或网页浏览器中存储令牌,这是认证的证明,可能会被重用。网页浏览器通常将此认证令牌存储为cookie。如果这些数据被盗,攻击者可能利用这些数据伪造访问并配置持久性以保持持续访问。

Azure AD审查

微软的Azure AD GitHub包括用于审查Azure AD配置的PowerShell代码(https://github.com/AzureAD/AzureADAssessment)

Trimarc还提供了一项名为Microsoft Cloud Security Assessment(MCSA)的新服务,类似于本地Active Directory安全评估,但专注于Azure AD和Office 365。

其他Office 365服务PowerShell模块

  • Exchange Online模块
    1
    
    Install-Module -Name ExchangeOnlineManagement
    
  • Microsoft SharePoint
    1
    
    Install-Module -Name Microsoft.Online.SharePoint.PowerShell
    
  • Microsoft Teams
    1
    
    Install-Module -Name MicrosoftTeams
    
  • Microsoft Skype for Business Online
  • Microsoft InTune
    1
    
    Install-Module -Name Microsoft.Graph.Intune -Force
    
    (需要管理员提供管理员同意:Connect-MSGraph -AdminConsent
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计