用于检查孤立资源的Azure资源

时间:2019-01-05 09:05:56

标签: azure azure-cli

我正在寻找解决方案以找出已停止|释放资源Azure中的孤立资源。我获取虚拟机数据。但是,如果有人旋转虚拟机,并且显示正在运行的虚拟机,如何检查所有者自30天以来未使用该虚拟机。

az vm list  -d --output table

任何自动化建议都会受到欢迎。

az vm list  -d --output table

TESTSXG                                                      VM running

1 个答案:

答案 0 :(得分:0)

我在这里看到多个查询。

  1. 确定是否有人创建了任何资源(例如VM)并忘记取消分配资源。
  2. 要检查VM中的上次登录时间是否超过30天。
  3. 要检查所有者在最近30天内没有使用过VM。
  4. 如果一段时间以来我们没有登录到VM,并且某些服务(例如Jenkins等)正在运行并且没有受到影响。

要审核对资源的操作并确定对资源执行的操作,可以使用活动日志。有关更多信息,请参考此(https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-audit)链接。

对于#1 ,您可以执行以下命令。

Get-AzureRmVM -Status|select Name, PowerState

对于#2和#3 ,以下是可以在VM中手动运行的命令。

Get-WmiObject -Class Win32_NetworkLoginProfile | 
Sort-Object -Property LastLogon -Descending | 
Select-Object -Property * -First 1 | 
Where-Object {$_.LastLogon -match "(\d{14})"} | 
Foreach-Object { New-Object PSObject -Property @{ Name=$_.Name;LastLogon=[datetime]::ParseExact($matches[0], "yyyyMMddHHmmss", $null)}}

但是我知道我们正在寻找一种自动的方法来验证您订阅下的所有VM。因此,这里的要求是从Azure门户自动(即,远程)连接到所有“正在运行的” VM,然后获得所需的输出。如果我没记错的话,很可能我们可以通过多种方式实现此要求,即

i。日志分析

ii。 DSC

iii。功能

iv。 Runbook

v。逻辑应用

i。按照此处(https://docs.microsoft.com/en-us/azure/azure-monitor/learn/quick-collect-azurevm)的说明,创建Log Analytics OMS工作区并在VM上安装OMS代理。然后在OMS中添加Azure安全中心(安全和审核)解决方案,以便将安全事件推送到OMS存储库。然后转到Log Analytics-> OMSworkspaceName-> Logs并运行下面的Kusto查询以获取所需的输出。

SecurityEvent
| where EventID == 4624 
| sort by TimeGenerated desc

请注意,事件ID 4624是登录到计算机上的任何帐户的事件日志的ID。

ii。按照此处(https://docs.microsoft.com/en-us/azure/automation/automation-dsc-onboarding)的说明在VM上安装Azure DSC,并使用“脚本” DSC资源编写DSC配置脚本,该脚本将运行上述Get-WmiObject…。在DSC节点(即VM)上远程执行命令,并获取所需的输出。

iii。编写一个HTTP触发器PowerShell函数,该函数将运行上述Get-WmiObject…。在VM上远程执行命令(即,可以尝试新的ps会话并调用命令),然后获取所需的输出。您可以参考此(https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-first-azure-function)链接以了解函数。

iv。编写将运行上述Get-WmiObject…的PowerShell Runbook。在虚拟机上远程执行命令(即,可以尝试新的ps会话并调用命令),并获取所需的输出。

v。当前,Azure Logic Apps似乎不支持运行PowerShell和CLI脚本。但是,我们可能会尝试使用可用的Logic Apps Functions连接器或任何类似的连接器,并在内部尝试调用PowerShell以执行上述Get-WmiObject…。远程命令。仅供参考(https://feedback.azure.com/forums/287593-logic-apps/suggestions/33913552-run-a-powershell-code-within-a-logic-app-action)是Azure反馈中有关在Logic App中运行PowerShell代码的声音,如果您对此选项感兴趣,可以投票。

对于#4 ,请在VM上安装OMS代理,以便将事件详细信息存储在OMS存储库中。例如,如果没有人登录到VM,但是Jenkins服务正在该VM上运行,则在这种情况下,您可能不想打扰该VM。因此,要验证Jenkins服务是否在VM上运行,您可能必须运行Kusto查询。

Event
| where (EventLog == "System")
| where (RenderedDescription has "jenkins" and RenderedDescription has "stopped")

希望这会有所帮助!