当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 将 PowerShell 与 IP 地理位置数据结合使用

作者:精品下载站 日期:2024-12-14 04:08:49 浏览:13 分类:玩电脑

将 PowerShell 与 IP 地理位置数据结合使用


基于 Paul Cunningham 2015 年的原创文章

使用地理定位服务解析审核日志中的 IP 地址和 IP 地址

许多 Microsoft 365 和 Exchange Server 日志包含 IP 地址。 Microsoft 365 是一个很好的例子,因为每个审核事件都包含源的 IP 地址。在 Exchange Server 上下文中,IIS 日志保存有关用于 OWA、ActiveSync 和 EWS 等连接的 IP 地址的信息。

当管理员查看日志中的事件时,他们很自然地可能想要检查 IP 地址,特别是如果这些地址来自未用于公司位置的陌生范围。条件访问策略允许组织限制与已知位置的连接。如果您使用 PowerShell 提取和分析日志数据,则可以使用各种 IP 地理定位服务来解析 IP 地址。

基于网络的地理定位服务

IP-API 是主要的 IP 地理定位服务之一。它支持非商业用途的免费访问。目前,为了保护其服务的完整性,IP-API 将您可能与 PowerShell 一起使用的端点的访问限制为每分钟 45 个 HTTP 请求。其他 API(例如 FreeGeoIP.net)的免费访问限制较低,同时也提供限制较高的付费订阅。像往常一样,四处寻找能够满足您需求的服务。如果某个 IP 地址持续发出过多请求,某些 Web 服务将阻止对该 IP 地址的访问。

Microsoft 365 杀伤链和攻击路径管理

有效的网络安全策略需要对攻击如何展开有清晰、全面的了解。阅读本白皮书,获取保卫您的组织所需的专家见解!

使用 PowerShell 解析 IP 地址

在所有情况下,您都可能使用 Invoke-RestMethod cmdlet 向 Web 服务发送查询并接收结构化响应。对于 IP-API,响应采用 JSON 格式。这是一个例子:

IPInfo = Invoke-RestMethod -Method Get -Uri "http://ip-api.com/json/20.81.111.85"
$IPInfo

status      : success
country     : United States
countryCode : US
region      : VA
regionName  : Virginia
city        : Boydton
zip         : 23917
lat         : 36.677696
lon         : -78.37471
timezone    : America/New_York
isp         : Microsoft Corporation
org         : Microsoft Azure Cloud (eastus)
as          : AS8075 Microsoft Corporation
query       : 20.81.111.85

使用 Invoke-RestMethod cmdlet 从 Web 服务检索信息的另一个示例是使用 Microsoft Translator 服务将文本翻译成目标语言。

GitHub 上提供了使用 Invoke-RestMethod 与 IP-API 服务交互的示例脚本。

避免节流

如上所述,Web 服务通常会限制入站 HTTP 请求,以避免流氓行为者或不良代码可能会因大量请求而淹没其服务。考虑到这一点,任何希望分析 IP 信息的脚本都应该包含检查以避免限制。

避免问题的一种方法是使用 Start-Sleep cmdlet 在脚本中构建暂停。例如,由于 IP-API 将请求限制为每分钟 45 个,因此脚本可以在每个请求后暂停 1.4 秒。

另一种方法是将已解析地址的 IP 信息存储在哈希表中,并在发出新请求之前检查该表以查看地址是否存在。这种技术效果很好,因为日志中发现的许多 IP 地址都是相同的。

下面是一些代码,用于根据哈希表查找 IP 地址,以确定是否有必要向 Web 服务发出请求。如果信息已经存在,则从哈希表中获取。如果没有,脚本将运行请求并将信息存储在哈希表中。

$IPInfo = $Null
If (!($IPAddressHash[$AuditData.ClientIP])) {
   $IPInfo = Get-IPGeoLocation -IPAddress $AuditData.ClientIP
   $IPAddressHash.Add([string]$IPInfo.IP,$IPInfo)
   # Sleep to avoid any throttling issues with the web service
   Start-Sleep -Seconds 1
} Else {
   # Get the IP information from the hash table
   $IPInfo = $IpAddressHash[$AuditData.ClientIP]
}

显然,可以编写更多具有良好错误处理能力的防弹代码,但这足以证明原理。

使用条件访问位置

如果您希望重点关注组织未使用的 IP 地址,则可以提取为 Azure AD 位置定义的 IP 地址范围集。通常,条件访问策略使用这些位置来测试传入连接是内部连接还是外部连接。 Get-MgIdentityConditionalAccessNamedLocation cmdlet(来自 Microsoft Graph PowerShell SDK)检索位置的详细信息。例如,此代码查找当前位置集并提取位置中定义的 IP 范围:

[array]$CAKnownLocations = Get-MgIdentityConditionalAccessNamedLocation
[array]$IPAddressRanges = $Null 
ForEach ($Location in $CAKnownLocations) {
  $IPRanges = $Null
  $IPRanges = $Location.AdditionalProperties['ipRanges']
  If ($IPRanges) {
     ForEach ($Address in $IPRanges) {
        $IPAddressRanges += $Address['cidrAddress']
     }
   }
}

结果是一组 CIDR 格式的 IPv4 和 IPv6 地址:

51.171.212.129/24
2001:db8::/56
2001:db8::/53

根据 CIDR 地址检查 IPv4 地址需要将 CIDR 扩展到该范围内的各个地址。这个脚本完成了这项工作。例如,以下是如何使用脚本中的函数使用上一步中发现的两个 IPv4 CIDR 来填充数组:

[array]$IPAddresses = Get-IPRange -Subnets "51.171.212.200/24", "51.171.212.129/24"

现在可以轻松对照阵列检查日志中找到的 IPv4 地址,以确定它们是否属于内部位置。例如:

If ($AuditData.ClientIP -in $IPAddresses) {
   $InternalFlag = $True 
} Else {
  $ InternalFlag = $False }

如果您不将 IP 位置用于条件访问策略,则可以以不同的方式创建和填充阵列。例如,您可能在 Excel 电子表格中定义了公司内可用的所有 IP 地址,PowerShell 可以读取该电子表格来创建阵列。

使用地理定位服务

使用地理定位服务通过 PowerShell 解析 IP 地址并不难。诀窍是以智能方式执行此操作,以便 Web 服务不会限制或阻止访问。这可以通过包含检测内部 IP 地址的代码并仅向地理定位服务请求未知外部地址的解析来实现。请随意改进此处提供的 PowerShell 代码。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯