【问题标题】:Azure Activity LogAzure 活动日志
【发布时间】:2019-09-03 17:22:44
【问题描述】:

我想监控谁对 rbac 分配进行了更改,我创建了 powershell 脚本以从 Azure 活动日志中收集数据。我使用了下面的一段代码。使用此解决方案,我可以获得以下项目: caller - 更改角色分配的用户, 时间戳, 资源名称 - 已提供此资源分配更改, 动作类型 - 写入或删除

在 Azure 门户的活动日志面板中,在摘要门户(消息:与“用户信息”共享)中,我可以看到已被授予资源权限/分配的用户的名称,但使用我的 powershell 脚本我是无法获取此信息,有什么方法可以获取此信息吗?

Get-AzureRmLog -StartTime (Get-Date).AddDays(-7) | 
Where-Object {$_.Authorization.Action -like 
'Microsoft.Authorization/roleAssignments/*'} |
Select-Object @{N="Caller";E={$_.Caller}}, 
@{N="Resource";E={$_.Authorization.Scope}}, 
@{N="Action";E={Split-Path $_.Authorization.action -leaf}},
EventTimestamp

脚本输出:

Caller         : username@xxx.com
Resource   :/subscriptions/xxxx/resourceGroups/Powershell/providers/Microsoft.Compute/virtualMachines/xx/providers/Microsoft.Authorization/roleAssignments/xxxx
Action         : write
EventTimestamp : 8/29/2019 10:12:31 AM

【问题讨论】:

    标签: azure azure-devops azure-powershell azure-log-analytics


    【解决方案1】:

    目前不支持使用 Az PowerShell cmdlet Get-AzLogGet-AzureRmLog 获取分配了 RBAC 角色的用户名的要求。

    但是,我们可以利用 Azure REST API for Activity Logs - List 和 Az PowerShell cmdlet Get-AzureADUser 来满足您的要求。

    以这种方式,因为我们依赖于 Activity Logs - List 的 Azure REST API(但看起来您需要 PowerShell 方式来完成要求),所以在 PowerShell 中调用 REST API,如下所示。

        $request = "https://management.azure.com/subscriptions/{subscriptionId}/providers/microsoft.insights/eventtypes/management/values?api-version=2015-04-01&`$filter={$filter}"
        $auth = "eyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
        $authHeader = @{
        'Content-Type'='application/json'
        'Accept'='application/json'
        'Authorization'= "Bearer $auth"
        }
        $Output = Invoke-RestMethod -Uri $request -Headers $authHeader -Method GET -Body $Body
        $ActivityLogsFinalOutput = $Output.Value
    

    开发您的 PowerShell 代码以从 Azure REST API 的输出中获取“PrincipalId”(位于“properties”下)以进行 Activity Logs - List 调用。获取到的“PrincipalId”就是你最终想要得到的用户的ObjectID。

    现在利用 Az PowerShell cmdlet Get-AzureADUser 并让您的命令如下所示。

    (Get-AzureADUser -ObjectID "<PrincipalID>").DisplayName
    

    希望这会有所帮助!!干杯!!

    更新:

    请找到 PowerShell 获取需要在上述 REST API 调用中使用的身份验证令牌(即 $auth)的方式。

    $ClientID       = "<ClientID>" #ApplicationID
    $ClientSecret   = "<ClientSecret>"  #key from Application
    $tennantid      = "<TennantID>"
    
    $TokenEndpoint = {https://login.windows.net/{0}/oauth2/token} -f $tennantid 
    $ARMResource = "https://management.core.windows.net/";
    
    $Body1 = @{
            'resource'= $ARMResource
            'client_id' = $ClientID
            'grant_type' = 'client_credentials'
            'client_secret' = $ClientSecret
    }
    
    $params = @{
        ContentType = 'application/x-www-form-urlencoded'
        Headers = @{'accept'='application/json'}
        Body = $Body1
        Method = 'Post'
        URI = $TokenEndpoint
    }
    
    $token = Invoke-RestMethod @params
    $token | select access_token, @{L='Expires';E={[timezone]::CurrentTimeZone.ToLocalTime(([datetime]'1/1/1970').AddSeconds($_.expires_on))}} | fl *
    

    我也看到了this 新方法,但我没有机会对此进行测试。如果有兴趣,您也可以试试这个或采用上述方法。

    更新 2:

    $ActivityLogsFinalOutput| %{
        if(($_.properties.responseBody) -like "*principalId*"){
            $SplittedPrincipalID = $_.properties.responseBody -split "PrincipalID"
            $SplittedComma = $SplittedPrincipalID[1] -split ","
            $SplittedDoubleQuote = $SplittedComma[0] -split "`""
            $PrincipalID = $SplittedDoubleQuote[2]
            #Continue code for getting Azure AD User using above fetched $PrincipalID
            #...
            #...
        }
    }
    

    【讨论】:

    • 可能你的回答没问题,但我仍然收到错误消息 --> "Invoke-RestMethod : {"error":{"code":"InvalidAuthenticationToken","message":"The access令牌无效。"}"。我创建了具有完全访问权限的新 PAT,并尝试运行脚本几次并面临同样的问题。前段时间我遇到了类似的问题,一段时间后问题解决了,我重新生成了我的 PAT 几次,也许这是一个解决方案,将尝试在 2 小时内再次使用新的 PAT 密钥运行脚本。
    • 我认为我 AM 使用的令牌不正确,你知道我怎样才能获得可以与 invoke-restmethod 一起使用的令牌吗?
    • 是的,我知道。相应地使用所需信息更新了上述答案。
    • 感谢您的反对,但请解释一下我在哪里可以找到 $ClientID、$ClientSecret?这是一个查询 Azure 活动日志的 powershell 脚本。
    • 当然。 ClientID、ClientSecret 分别是 Azure AD 应用程序(服务主体)的应用程序 ID 和密码。您最初可能需要使用New-AzADServicePrincipal 生成一个以获得这些。有关更多信息,请参阅this doc。或者 az ad sp create-for-rbac 是 Az CLI 方式。
    【解决方案2】:

    这对你有用吗?

    Get-AzureRmLog -StartTime (Get-Date).AddDays(-7) | 
    Where-Object {$_.Authorization.Action -like 'Microsoft.Authorization/roleAssignments/*'} | 
    Select-Object @{N="Caller";E={$_.Caller}}, 
    @{N="Resource";E={$_.Authorization.Scope}}, 
    @{N="Action";E={Split-Path $_.Authorization.action -leaf}},
    @{N="Name";E={$_.Claims.Content.name}}, 
    EventTimestamp
    

    我的输出:

    Caller         : username@domain.com
    Resource       : /subscriptions/xxxx/resourceGroups/xxxx/providers/Microsoft.Authorization/roleAssignments/xxxx
    Action         : write
    Name           : John Doe
    EventTimestamp : 30.08.2019 12.05.52
    

    注意:我使用了 Get-AzLog。不确定 Get-AzLog 和 Get-AzureRmLog 之间是否有任何区别。

    【讨论】:

    • 嗨,不完全是,在属性名称:John Doe 下,我们可以看到执行更改的用户的名称,名称 = 呼叫者,我需要已被授予权限/分配的用户的名称资源。例如,如果我将 user1 添加到访问控制 AIM 刀片中的 rbac 角色,接下来(角色分配),在脚本输出中我需要他的名字 user1。
    【解决方案3】:

    可以肯定的是,此 cmdlet 不会暴露这一点。我什至没有在角色分配中看到此信息。所以不知道你到底是什么意思。

    【讨论】:

    • 您可以在以下位置看到此信息:订阅 --> 审核日志 --> 为操作创建过滤器,输入“角色分配”选择所有三个复选框,输入“角色定义”选择三个复选框,更改“时间跨度”过滤到上个月。然后使用“创建角色分配”之类的描述拾取事件,然后在摘要选项卡中您将看到项目“共享给”,我需要使用 powershell 这个用户名。
    • 对,所以你必须这样做,但这没有任何意义,因为赋值操作可能在很久以前就发生了
    • 据此 --> “但这没有意义,因为分配操作可能发生在很久以前” - 我需要捕捉对 azure 资源所做的更改,例如新用户分配,所以解决方案说得通。例如,新任务将在 9 月 1 日创建,脚本将在 9 月 2 日执行,在输出中您将看到谁进行了更改,在哪个资源上进行了更改,等等...
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 2022-11-02
    • 2020-05-25
    • 2022-11-02
    • 2015-10-27
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多