使用PowerShell 獲取 Azure賬戶中的用戶權限分配情況

    今天再來分享一篇關於PowerShell的文章,這次分享的腳本主要是用來獲取Azure中用戶權限分配的情況,原始的需求是因爲公司Azure賬戶因爲權限分配混亂,導致了一些不該發生的事情,所以需要重新整理所有的用戶權限分配情況,重新進行梳理和規整,這種情況下,瞭解當前的權限分配情況就非常重要了。一般情況下,Azure可以根據RBAC的方式進行權限分配,這個是很方便的,簡單介紹下RBAC的概念吧

    

     RBAC概念

     使用 RBAC,可以在團隊中實現職責分離,僅向用戶授予執行作業所需的訪問權限。 無需向每個人授予 Azure 訂閱或資源的無限制權限,可以僅允許在特定的範圍執行某些操作。

規劃訪問控制策略時,最佳做法是授予用戶完成工作所需的最低權限。 下圖顯示了與 RBAC 使用有關的建議模式。




    微信截圖_20190130104826.png



    使用 RBAC 控制資源訪問權限的方式是創建角色分配。 這是一個需要理解的重要概念 — 它涉及到如何強制實施權限。 角色分配包含三個要素:安全主體、角色訂閱和範圍。



    安全主體

    安全主體是一個對象,表示請求訪問 Azure 資源的用戶、組、服務主體或託管標識。


    1.png




  • 用戶 - 在 Azure Active Directory 中具有配置文件的人員。 也可以將角色分配到其他租戶中的用戶。 有關其他組織中的用戶的信息,請參閱 Azure Active Directory B2B

  • 組 - 在 Azure Active Directory 中創建的一組用戶。 將某個角色分配到某個組時,該組中的所有用戶都擁有該角色。

  • 服務主體 - 應用程序或服務用來訪問特定 Azure 資源的安全標識。 可將服務主體視爲應用程序的用戶標識(用戶名和密碼或證書)。

  • 託管標識 - Azure Active Directory 中由 Azure 自動託管的標識。 在開發雲應用程序時,通常使用託管標識來管理用於向 Azure 服務進行身份驗證的憑據。


    角色

    

    

    2.png




    

Azure 包含多個可用的內置角色 下面列出了四個基本的內置角色。 前三個角色適用於所有資源類型。

  • 所有者 - 擁有對所有資源的完全訪問權限,包括將訪問權限委派給其他用戶的權限。

  • 參與者 - 可以創建和管理所有類型的 Azure 資源,但無法將訪問權限授予其他用戶。

  • 讀取者 - 可以查看現有的 Azure 資源。

  • 用戶訪問管理員 - 允許你管理用戶對 Azure 資源的訪問。



    範圍


    範圍是訪問權限適用於的資源集。 分配角色時,可以通過定義範圍來進一步限制允許的操作。 如果你想要將某人分配爲網站參與者,但只針對一個資源組執行此分配,則使用範圍就很有幫助。

在 Azure 中,可在多個級別指定範圍:管理組、訂閱、資源組或資源。 範圍採用父子關係結構。

3.png



在父範圍授予訪問權限時,這些權限會繼承到子範圍。 例如:

  • 如果將所有者角色分配給管理組範圍的用戶,則該用戶可以在管理組中管理所有訂閱中的一切內容。

  • 如果在訂閱範圍向某個組分配了讀取者角色,則該組的成員可以查看訂閱中的每個資源組和資源。

  • 如果在資源組範圍向某個應用程序分配了參與者角色,則該應用程序可以管理該資源組中所有類型的資源,但不能管理訂閱中的其他資源組資源。


  角色分配是出於授予訪問權限的目的,將角色定義附加到特定範圍內的用戶、組、服務主體或託管標識的過程。 通過創建角色分配來授予訪問權限,通過刪除角色分配來撤銷訪問權限。 

  下圖顯示了角色分配的示例。 在此示例中,爲“營銷”組分配了醫藥銷售資源組的參與者角色。 這意味着,“營銷”組中的用戶可以在醫藥銷售資源組中創建或管理任何 Azure 資源。 “營銷”用戶無權訪問醫藥銷售資源組外部的資源,除非他們屬於另一個角色分配。

4.png


 基本上RBAC的概念已經簡單介紹過了,我們也是通過RBAC的方式進行權限分配的,如果想了解權限分配的情況,可以運行以下的腳本

      

function Write-DateTimeMessage {
    param (
        [parameter(Mandatory = $false)]
        [switch]$Warning,
        [parameter(Mandatory = $true)]
        [string]$Message,
        [parameter(Mandatory = $false)]
        [string]$ForegroundColor
        
    )
    
    
    if ($Warning) {
        Write-Warning ($(Get-Date -UFormat '%Y/%m/%d %H:%M:%S') + " * " + $Message)
    }
    else {
        if ($ForegroundColor) {
            Write-Host ($(Get-Date -UFormat '%Y/%m/%d %H:%M:%S') + " * " + $Message) -ForegroundColor $ForegroundColor
        }
        else {
            Write-Host ($(Get-Date -UFormat '%Y/%m/%d %H:%M:%S') + " * " + $Message)
        }
    }
    
}


[pscustomobject[]]$UserObjects = $null
    
Get-AzureRmADUser | % {
    $User = $_
    Write-DateTimeMessage -Message "Checking User $($User.UserPrincipalName)"
    


    $RoleAssignments = Get-AzureRmRoleAssignment -SignInName $User.UserPrincipalName
        
    if ($null -ne $RoleAssignments) {
            
        $RoleAssignments | % {
            $RoleAssignment = $_
             
            $UserObject = New-Object -TypeName psobject
            $UserObject | Add-Member -MemberType NoteProperty -Name DisplayName -Value $RoleAssignment.DisplayName
            $UserObject | Add-Member -MemberType NoteProperty -Name SignInName -Value $RoleAssignment.SignInName
            $UserObject | Add-Member -MemberType NoteProperty -Name Scope -Value $RoleAssignment.Scope
            $UserObject | Add-Member -MemberType NoteProperty -Name RoleDefinitionName -Value $RoleAssignment.RoleDefinitionName
            $UserObject | Add-Member -MemberType NoteProperty -Name ObjectType -Value $RoleAssignment.ObjectType
            $UserObject | Add-Member -MemberType NoteProperty -Name CanDelegate -Value $RoleAssignment.CanDelegate
            $UserObject | Add-Member -MemberType NoteProperty -Name RoleDefinitionId -Value $RoleAssignment.RoleDefinitionId
            $UserObject | Add-Member -MemberType NoteProperty -Name ObjectId -Value $RoleAssignment.ObjectId
            $UserObjects += $UserObject
            
                
        }
    }else{

        Write-DateTimeMessage "No role assignment for user $($User.DisplayName)" -Warning

    }
        
        
}
    


$OutputPath = Join-Path -Path ([Environment]::GetFolderPath("Desktop")) -ChildPath ("AzureUserPermission-" + $(Get-Date -Format "yyyyMMdd-HHmmss") + ".csv")

if ($null -ne $UserObjects) {
    
    $UserObjects | Export-Csv -NoTypeInformation -LiteralPath $OutputPath
    Write-DateTimeMessage -Message "Please check $OutputPath" -Warning
}
else {
    Write-DateTimeMessage  "Maybe no user in the environment or didn't get information, please check" -warning
}

腳本沒有任何的參數,直接運行即可,運行的效果大概如下

5.png

運行完成後,會在你的桌面生成一個csv文件,裏邊會記錄這些信息

6.png


  


    



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章