yc_list_roles.ps1 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. #Скрипт предназанчен для получения списка ролей для пользователейб групп и сервисных учеток. Роли вычитываются
  2. #на уровне организации, облака и фолдера по отдельности
  3. #есть возможность указать фильтр для организации и облака
  4. #запускать необходимо с ролью, имеющей, как минимум, viewer на все запрашиваемые контейнеры
  5. #скрипт выводит в CSV файл таблицу, в каждой строке которой содержится инофрмация об одной роли, субъекте и к какому объекту эта роль назначена
  6. #анализировать желательно в Excel или, например, в Data Lens
  7. $filePath = "yc_roles.csv"
  8. #установите значение max_user_count, гарантированно перекрывающее максимальное количество пользователей в любой вашей организации
  9. $max_user_count = 25000
  10. $use_orgs_filter = $false
  11. #формат фильтра - массив @("b1giodvrq10i1s552158", "b1gp1d7evq3spemmkb37")
  12. $orgs_filter = @("bpfi6o0mvliepdcf1610")
  13. $use_clouds_filter = $false
  14. $clouds_filter = @("b1giodvrq10i1s552158", "b1gp1d7evq3spemmkb37")
  15. $header = "Level;OrgName;OrgID;CloudName;CloudID;FolderName;FolderID;Role;SubjectType;SubjectID;SubjectName"
  16. $users = $null
  17. $groups = $null
  18. $outString = New-Object System.Collections.Generic.List[System.Object]
  19. if ( $use_orgs_filter ) {
  20. write-host "Используется фильтр по организации. В случае ошибок проверьте правильность id организаций в фильтре." -ForegroundColor Yellow
  21. $orgs = @()
  22. foreach ($id in $orgs_filter) {
  23. $o_temp = yc organization-manager organization get --id $id --format=json | ConvertFrom-Json
  24. $orgs += $o_temp
  25. }
  26. }
  27. else {
  28. $orgs = yc organization-manager organization list --format=json | ConvertFrom-Json
  29. }
  30. $i_org = 0
  31. $p_org = 0
  32. foreach ($o in $orgs) {
  33. #Собираем Hash список по польователям и сервисным учеткам
  34. $i_org += 1
  35. $p_org = ($i_org / $orgs.Count) * 100
  36. Write-Progress -Id 0 "Рвботаем с организацией - $($o.name)..." -PercentComplete $p_org
  37. $users_list = yc organization-manager user list --organization-id $o.id --limit $max_user_count --format=json | ConvertFrom-Json
  38. $users = @{}
  39. foreach ($u in $users_list) {
  40. if ( $u.subject_claims.preferred_username -eq $null) {
  41. $users.Add($u.subject_claims.sub, $u.subject_claims.name)
  42. }
  43. else {
  44. $users.Add($u.subject_claims.sub, $u.subject_claims.preferred_username)
  45. }
  46. }
  47. #Собираем Hash список по группам
  48. $groups = @{}
  49. #две последующие строки нужны для фильтрации сценария, где в орге нет групп
  50. $raw_group_list = yc organization-manager group list --organization-id $o.id --format=json
  51. if ( $raw_group_list.count -gt 2 ) {
  52. $group_list = $raw_group_list | ConvertFrom-Json
  53. foreach ($g in $group_list) {
  54. $groups.Add($g.id, $g.name)
  55. }
  56. }
  57. #Собираем роли на уровне орги
  58. $org_bingings = yc organization-manager organization list-access-bindings $o.id --format=json | ConvertFrom-Json
  59. foreach ($b in $org_bingings) {
  60. $s = "Org;$($o.name);$($o.id);;;;;$($b.role_id);$($b.subject.type);$($b.subject.id)"
  61. $outString.Add($s)
  62. }
  63. if ( $use_clouds_filter ) {
  64. write-host "Используется фильтр по облакам. В случае ошибок проверьте правильность id облаков в фильтре." -ForegroundColor Yellow
  65. $clouds = @()
  66. foreach ($id in $clouds_filter) {
  67. $c_temp = yc resource-manager cloud get --id $id --format=json | ConvertFrom-Json
  68. $clouds += $c_temp
  69. }
  70. }
  71. else {
  72. $raw_clouds = yc resource-manager cloud list --organization-id=$ORG_ID --format=json
  73. if ( $raw_clouds.count -gt 2 ) {
  74. $clouds = $raw_clouds | ConvertFrom-Json
  75. }
  76. else {
  77. $clouds = @()
  78. }
  79. }
  80. $i_cloud = 0
  81. $p_cloud = 0
  82. foreach ($c in $clouds) {
  83. $i_cloud += 1
  84. $p_cloud = ($i_cloud / $clouds.Count) * 100
  85. Write-Progress -Id 1 -ParentId 0 "Рвботаем с облаком - $($c.name)..." -PercentComplete $p_cloud
  86. #Собираем роли на уровне облака
  87. $cloud_bingings = yc resource-manager cloud list-access-bindings $c.id --format=json | ConvertFrom-Json
  88. foreach ($b in $cloud_bingings) {
  89. $s = "Cloud;$($o.name);$($o.id);$($c.name);$($c.id);;;$($b.role_id);$($b.subject.type);$($b.subject.id)"
  90. $outString.Add($s)
  91. }
  92. $raw_folders = yc resource-manager folder list --cloud-id=$($c.id) --format=json
  93. if ( $raw_folders.count -gt 2 ) {
  94. $folders = $raw_folders | ConvertFrom-Json
  95. }
  96. else {
  97. $folders = @()
  98. }
  99. $i_folder = 0
  100. $p_folder = 0
  101. foreach ($f in $folders) {
  102. $i_folder += 1
  103. $p_folder = ($i_folder / $folders.Count) * 100
  104. #пополняем список пользователей и сервисных учеток учетками sa на уровне папки
  105. Write-Progress -Id 2 -ParentId 1 "Рвботаем с фолдером - $($f.name)..." -PercentComplete $p_folder
  106. $raw_sa_list = yc iam service-account list --folder-id $($f.id) --format=json
  107. if ( $raw_sa_list.count -gt 2 ) {
  108. $sa_list = $raw_sa_list | ConvertFrom-Json
  109. foreach ($sa in $sa_list) {
  110. if ($users[$sa.id].Length -eq 0 ) {
  111. $users.Add($sa.id,$sa.name)
  112. }
  113. }
  114. }
  115. #Собираем роли на уровне фолдера
  116. $folder_bingings = yc resource-manager folder list-access-bindings $f.id --format=json | ConvertFrom-Json
  117. foreach ($b in $folder_bingings) {
  118. $s = "Folder;$($o.name);$($o.id);$($c.name);$($c.id);$($f.name);$($f.id);$($b.role_id);$($b.subject.type);$($b.subject.id)"
  119. $outString.Add($s)
  120. }
  121. }
  122. }
  123. }
  124. Write-Progress -Activity "Разрешаем имена пользователей"
  125. $out = New-Object System.Collections.Generic.List[System.Object]
  126. $out.Add($header)
  127. #разрешаем id учеток в их имена
  128. foreach ($s in $outString) {
  129. $type = $s.Split(";")[-2]
  130. $id = $s.Split(";")[-1]
  131. switch ($type) {
  132. "group" { $subject_name = $groups[$id] }
  133. default { $subject_name = $users[$id] }
  134. }
  135. $out.Add("$s;$subject_name")
  136. }
  137. Set-Content -Path $filePath -Value $out