Автоматизация процесса запроса, создания и раздачи доступа к сетевой папке сотрудника через IDM Midpoint

Типовая задача: сотруднику нужна сетевая папка на Windows сервере. Чтобы её создать нужен Админ, чтобы раздать к ней права нужен Админ — убираем Админа из этой задачи при помощи IDM Midpoint.

Упрощённая схема, чтобы понять что происходит

25ccc17a42d9aa8a1126679cc4180511.png

1. Сотрудник в Midpoint запросил роль Create Shared Folder и получил её сразу, или через согласование с кем-нибудь (там же, в Midpoint).

2. Роль создаёт в промежуточном ресурсе запись для этого пользователя через обычный Scheme Handler в CSV файле. Факт создания этой записи запускает Additional Connector который позволяет запустить Powershell скрипт на сервере. Additional Connector реагирует на события создание, удаление, изменение в конкретном Scheme Handler.

3. Скрипт Powershell создаёт сетевую папку, AD группы с правами чтения, редактирования. Добавляет пользователя в группу редактирования (уже может пользоваться).

4. При очередной синхронизации AD ресурса в Midpoint создаются роли для AD group, созданных скриптом. На их выдачу назначается Approver сотрудник запросившей сетевую папку, это делает роль-политика Policy: Add Approver.

5. User B в своём кабинете Midpoint видит новые роли по сетевой папке User A и может их запросить. User A так же в своём кабинете одобряет или отвергает выдачу доступов к своей сетевой папке!

Приступаем к настройке исходные данные:

 — Midpoint 4.8.4 полностью настроена интеграция с Windows Server

 — Windows Server 2019, LDAPS, Open-SSH (из компонентов)

1. Создаём ресурс CSV Shared Folder

Нам нужен ресурс для запуска скрипта. Им может быть CSV или DB. Для простоты и наглядности берём CSV. Midpoint в нём будет вести состояние — должна быть у пользователя сетевая папка или нет. При выдаче роли создаётся учётка в CSV-ресурсе, что запускает скрипт на создание сетевой папки, при отъёме роли удаляется учётка в CSV-ресурсе, что запускается скрипт на удаление сетевой папки.

На сервере Midpoint в папке

/opt/midpoint

создаем пустой файл

shared_folder.csv

в нем одна строка

hr_id;date_create;info_1;info_2;info_3;info_4


В админке Midpoint создаём ресурс CSV в Resources\New Resource\From Scratch выбираем CsvConnector

Далее все как на картинках, название CSV Shared Folder

ebafe69939b15c5cc57ddaf8d8b29fcb.pngf76808646a2092ac278097b1657da24d.png

Дальше по-умолчанию всё ок


Заходим в ресурс CSV Shared Folder, нажимаем Edit Raw

и добавляем перед

следующий code


        
            account
            Account SCV Shared Folder
            Account SCV Shared Folder
            true
            
                ri:AccountObjectClass
            
            
                c:UserType
            
            
                ri:hr_id
                
                    01 HR ID to hr_id
                    strong
                    
                        $focus/personalNumber
                    
                
                
                    just for correlation
                    strong
                    
                        personalNumber
                    
                    synchronization
                
            
            
                ri:info_1
                
                    02 FullName to info_1
                    strong
                    
                        $focus/fullName
                    
                
            
            
                ri:date_create
                
                    03 Date to date_create
                    weak
                    
                        $focus/personalNumber
                    
                    
                        
                    
                
            
            
                
                    
                        Corr HR ID personalNumber
                        
                            c:personalNumber
                        
                    
                
            
            
                
                    unlinked
                    
                        
                    
                
                
                    deleted
                    
                        
                    
                
            
        
    


Этот Scheme Handler берёт из Midpoint у сотрудника personalNumber и вставляет в CSV файл в hr_id. Дату создания в date_create и fullName в info_1. Еще остаются две колонки пустые, на всякий случай.


Теперь настраиваем Additional Connector

Скачиваем со страницы SSH Connector jar файлhttps://docs.evolveum.com/connectors/connectors/com.evolveum.polygon.connector.ssh.SshConnector/

Кладём его в папку

/opt/midpoint/var/connid-connectors

И перезагружаем Midpoint

Смотрим в Repository Objects появился ли ConnId com.evolveum.polygon.connector.ssh.SshConnector v1.0

тут же берем его OID

388af43f-fae8-4734-8f17-c549352d5939

Заходим в ресурс CSV Shared Folder, нажимаем Edit Raw

и добавляем после

следующий code


        ssh
        
            
        
        
            
                192.168.1.168
                midpoint
                qwerty123
            
            
                false
                false
                false
            
        
        
            
                
                
                    
                        resource
                    
                    
                        connector
                    
                
            
            
                
                    true
                
            
        
    

 — указывает ваш OID для SSH Connector

 — host

 — Логин учётки для управления AD со всеми нужными правами (например из AD Ресурса)

 — пароль, его Midpoint сразу зашифрует и в XML не будет показывать в явном виде.

Так же добавляем перед

Следующий код


        
        
    

Тут запускаются два скрипта

add — операция добавления создания

account— учетки

Account SCV Shared Folder — в Schem Handlere с таким то intent

after — скрипт запускается после создания записи в CSV ресурсе

Описываем передаваемый в скрипт аргумент:

            
                user_hr_id
                $focus/personalNumber
            

И строка запуска на Windows сервере

powershell.exe -File "C:\Users\midpoint\Documents\shared_folder_create.ps1" %*


Остаётся положить на Windows Server скрипты

Папка

C:\Users\midpoint\Documents\

Имя

shared_folder_create.ps1

Код

param([string]$user_hr_id) 

$SF_Name_Read = 'Shared_Folder_READ_' + $user_hr_id
$SF_Name_Edit = 'Shared_Folder_EDIT_' + $user_hr_id
$SF_Name_Folder = 'SF_' + $user_hr_id
$SF_Name_Path = 'C:\Shared Folder\' + $SF_Name_Folder

#Create AD Groups
New-ADGroup -Name $SF_Name_Read -SamAccountName $SF_Name_Read -GroupCategory Security -GroupScope Global -DisplayName $SF_Name_Read -Path "OU=Groups,OU=OOO_ODIN,DC=168testserverhome,DC=com" -Description $user_hr_id
New-ADGroup -Name $SF_Name_Edit -SamAccountName $SF_Name_Edit -GroupCategory Security -GroupScope Global -DisplayName $SF_Name_Read -Path "OU=Groups,OU=OOO_ODIN,DC=168testserverhome,DC=com" -Description $user_hr_id
#add owner user to edit group
Get-ADUser -Properties employeeNumber -Filter 'employeeNumber -eq $user_hr_id' | ForEach-Object {Add-ADGroupMember -Identity $SF_Name_Edit -Members $_.SamAccountName} 

#Create Shared Folder
New-Item -Path 'C:\Shared Folder\' -Name $SF_Name_Folder -ItemType 'directory'
$Parameters = @{
Name = $SF_Name_Folder
Path = $SF_Name_Path
ReadAccess = $SF_Name_Read
ChangeAccess = $SF_Name_Edit
}
New-SmbShare @Parameters
#Set access rights for AD groups
$ACL = Get-Acl -Path $SF_Name_Path
$AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($SF_Name_Edit,"ListDirectory,Read,ReadAndExecute,Write,Modify,FullControl","3","0","Allow") 
$AccessRule2 = New-Object System.Security.AccessControl.FileSystemAccessRule($SF_Name_Read,"ListDirectory,Read,ReadAndExecute","3","0","Allow")
$ACL.SetAccessRule($AccessRule)
$ACL.SetAccessRule($AccessRule2)
$ACL | Set-Acl -Path $SF_Name_Path

Папка

C:\Users\midpoint\Documents\

Имя

shared_folder_delete.ps1

Код

param([string]$user_hr_id) 

$SF_Name_Read = 'Shared_Folder_READ_' + $user_hr_id
$SF_Name_Edit = 'Shared_Folder_EDIT_' + $user_hr_id
$SF_Name_Folder = 'SF_' + $user_hr_id
$SF_Name_Path = 'C:\Shared Folder\' + $SF_Name_Folder
$date = Get-Date -Format "yyyyMMddHHmm"
$SF_NEW_Name_Folder = 'ARC_' + $date + '_SF_' + $user_hr_id

#delete groups from shared folder ACL
$acl = Get-Acl $SF_Name_Path
$groupid = New-Object System.Security.Principal.Ntaccount($SF_Name_Read)
$acl.PurgeAccessRules($groupid)
$acl | Set-Acl $SF_Name_Path
$acl = Get-Acl $SF_Name_Path
$groupid = New-Object System.Security.Principal.Ntaccount($SF_Name_Edit)
$acl.PurgeAccessRules($groupid)
$acl | Set-Acl $SF_Name_Path

#delete share folder capability not data
Remove-FileShare -Name $SF_Name_Folder -confirm:$false
#rename ex shared folder
Rename-Item -Path $SF_Name_Path -NewName $SF_NEW_Name_Folder
#delete groups
Remove-ADGroup -Identity $SF_Name_Read  -confirm:$false
Remove-ADGroup -Identity $SF_Name_Edit  -confirm:$false

Сетевая папка создается в C:\Shared Folder\

Как формируется имя тоже задано в начале скрипта .

У пользователей в AD должен быть заполнен employeeNumber соответсовать personalNumber в Midpoint по ниму в скрипте идет поиск и добавление в группу для редактирования

Get-ADUser -Properties employeeNumber -Filter 'employeeNumber -eq $user_hr_id' | ForEach-Object {Add-ADGroupMember -Identity $SF_Name_Edit -Members $_.SamAccountName}

В ADMINISTRATION\Role\All Roles создаём просто роль (чёрную) под названием Create Shared Folder

Заходим в неё, нажимаем Edit Raw

Вставляем перед

следующий code


        
            
                
            
            account
            Account SCV Shared Folder
        
    

 — OID ресурса CSV Shared Folder, у вас будет свой


Проверяем как работает. Берём пользователя User A, у него уже есть учётка в ресурсе AD. Выдаём ему роль Create Shared Folder.

Смотрим сразу в файле

/opt/midpoint/shared_folder.csv

появилась запись

87328348;10/10/2024 09:35:39;Егеров Егеров Ким;;;

Смотрим в AD

4e0d11f59e4049698792652b0cd76da0.png

Все создалось!

2. Создаём в Midpoint группы по сетевой папке из ресурса AD

AD группы редактирование и чтение под сетевую папку пользователя создались в AD. Но в Midpoint их пока нет, хотя бы потому что мы не запускали синхронизацию групп AD в роли Midpoint и обычная синхронизация нас не устроит — этим группам ролям при создании в Midpoint нужно назначать одобрителя на выдачу.

Поэтому в Schem Handler«e для прочих групп AD настраиваем фильтр. В Resources\Your AD resource\Scheme Handler\Yout AD group ALL\Basic Attributes на второй странице в Filter пишем

attributes/cn not startsWith 'Shared_Folder_'

Этот Scheme Handler будет обрабатывать только AD группы сn которых не начинается на Shared_Folder_…

Создаём Scheme Handler под сетевые папки, я назову его Groups Shared Folder POC

В Resources\Your AD resource\Scheme Handler\Add object type запоняем как на картинках

72d781fb36f1596086460946dace7414.pngfc9c1f2e26c221eda80c545a9bc602d2.png6897498d6e86619409570910dabd6211.png

Заходим в созданный Schema Handler и редактируем дальше в квадратиках

Groups Shared Folder POC\Mappings

2812efb3cd83dc48590c13119c70a41f.png

02 — Здесь script

return true

05 — Здесь script («Win-ikpur723q06» hostname Windows сервера)

"Rights for user HRID:" + input + " shared folder path \\\\Win-ikpur723q06\\sf_" + input

06 — Пишем в атрибут Documentation табельный номер который в AD группе писали в Description

03–04 — здесь конструкция для назначения роли по OID, её можно только в код вставить, делайте сначала пустой, а потом заполняете.


                    03 add POLICY add approver from role atribute
                    active
                    strong
                    
                        
                            c:RoleType
                            a0f4de80-c941-43bd-9216-966bc3a62d3e
                        
                    
                    
                        $focus/assignment
                    
                

Роль в маппинге 03, которая будет назначать одобрителя ещё не создана. А роль в мапинге 04 копирует роль для обычных групп AD, только со своими именами.

Groups Shared Folder POC\Synchronization

e1cbeb61bdcb91bfc7207b2eaac1f918.png

Groups Shared Folder POC\Correlation

9025d46d94b3e8ae7e3d4518f3321549.png9519cf38b91ca43dc5cca8051b61da04.png

По настройкам Scheme Handler почти всё, нам надо создать роль, которая будет добавлять одобрителя в роли сетевых папок и её OID написать в маппинг 03

Полностью кодом Scheme Handler Groups Shared Folder POC


            entitlement
            intent Groups Shared Folder POC
            Groups Shared Folder POC
            
                ri:group
                
                    attributes/cn startsWith 'Shared_Folder_'
                
            
            
                c:RoleType
            
            
                ri:cn
                
                    01 name is name
                    strong
                    
                        name
                    
                
                
                    02 set requestable mark
                    strong
                    
                        
                    
                    
                        requestable
                    
                
                
                    03 add POLICY add approver from role atribute
                    active
                    strong
                    
                        
                            c:RoleType
                            a0f4de80-c941-43bd-9216-966bc3a62d3e
                        
                    
                    
                        $focus/assignment
                    
                
                
                    04 add ADD AD group SHARED FOLDER
                    active
                    strong
                    
                        
                            c:RoleType
                            99cefb8d-2aa8-4015-b427-b9fde2fe50a9
                        
                    
                    
                        $focus/assignment
                    
                
            
            
                ri:objectGUID
            
            
                ri:description
                
                    05 some human readable text
                    strong
                    
                        
                    
                    
                        description
                    
                
                
                    06 user HR id for approver set
                    strong
                    
                        documentation
                    
                
            
            
                ri:dn
                
                    07 dn for identifier
                    strong
                    
                        identifier
                    
                
            
            
                
                    
                        
                            c:identifier
                        
                    
                
            
            
                
                    unlinked
                    
                        
                    
                
                
                    linked
                    
                        
                    
                
                
                    unmatched
                    
                        
                    
                
            
        

Добавить одобрителя через маппинг не удаётся известными способами. Поэтому создаём роль с политикой, запускающей скрипт, который всё может. Эту роль политику и назначаем каждой роли-группе AD, созданной в Scheme Handler Groups Shared Folder POC.

В ADMINISTRATION\Role\All Roles создаём просто роль (чёрную) под названием POLICY add approver from role atribute

Заходим в неё, нажимаем Edit Raw

Вставляем перед

Следующий код


        
            add approver from role atribute
            
                
                    c:documentation
                
            
            
                
                    some script
                    
                        
                            
                                execute-script
                                
                                    script
                                    
                                        
import com.evolveum.midpoint.xml.ns._public.common.common_3.*
import com.evolveum.midpoint.prism.delta.builder.*
import com.evolveum.midpoint.model.api.*
import com.evolveum.midpoint.schema.constants.SchemaConstants
import javax.xml.namespace.QName


role = midpoint.getObject(RoleType.class, input.oid)
userId = basic.stringify(role.documentation)
query_user = midpoint.queryFor(UserType.class, "personalNumber = '$userId'") 
result_USER = midpoint.searchObjects(query_user)

userApprover = new ObjectReferenceType()
userApprover.setOid(input.oid)
userApprover.setType(RoleType.COMPLEX_TYPE)
userApprover.setRelation(SchemaConstants.ORG_APPROVER)
addAssignment = new AssignmentType()
addAssignment.setTargetRef(userApprover)
def delta = []
delta = prismContext.deltaFor(UserType.class).item(FocusType.F_ASSIGNMENT).add(addAssignment.asPrismContainerValue()).asObjectDelta(result_USER.oid)
midpoint.modifyObject(delta, ModelExecuteOptions.createRaw())
midpoint.recompute(UserType.class, basic.stringify(result_USER.oid))


                                    
                                
                            
                        
                    
                
            
        
        c:RoleType
    

При изменении в роли атрибута documentation (это включает и его первое заполнение) будет запускаться скрипт, который назначает одобрителем этой роли того, чей табельный номер (HRID) указан в роли в атрибуте documentation.

Берём OID роли POLICY add approver from role atribute и вставляем его в Groups Shared Folder POC в маппинге 03

Теперь в AD ресурсе можно запускать синхронизацию Scheme Handler«а Groups Shared Folder POC

Начинают появляться роли-AD группы

6abfb80bfd7d2916d7321c1572f37732.png

Name как cn в AD (надо быть уверенным, что он будет уникальным для Midpoint также как и для AD). Description заполнен по скрипту. И Requestable проставлен True.

63e8703f4f6b2ba0c58c823bc19dbabb.png

Пользователь с табельным номером 87328348 одобритель роли Shared_Folder_EDIT_87328348.

3. Запрашиваем права к сетевой папке

У нас в Midpoint два пользователя с ролями

User A

 — End User

 — Approver

 — AD account

 — Create Shared Folder

 — Shared_Folder_EDIT_87328348

 — Shared_Folder_EDIT_87328348

 — Shared_Folder_READ_87328348

User B

 — End User

 — AD account

End User — стандартная роль Midpoint, нам от неё нужно то, что она позволяет заходить на GUI Midpoint и запрашивать роли, помеченные Requestable как True

Approver — стандартная роль Midpoint, позволяет одобрять запросы на добавление в роль

Shared_Folder_EDIT_87328348 — в пользователе будет видна как две отдельные роли, в списке видимые как одинаковые. Одна придёт как выданная с синхронизацией AD, а вторая будет помечена как функционал approver.

aee879bd30fadfe96a4123c5b5f1d1b0.png

Заходим под User B в Midpoint, идём в Request Access и запрашиваем роль Shared_Folder_READ_87328348.

65078211b24649c7ce33ab31af6ced0d.png

Теперь заходим в Midpoint под User A видим пришёл запрос, одобряем его

dad023373331081a19eda723339cc89b.png

Заходим ещё раз в Midpoint пользователем User B, на главной странице видим в My accesses что появилась запрошенная роль, и сам запрос в My request тоже видно, что одобрен.

cc6e041768ac21eaad32acda7e79801e.png

Теперь заходим под пользователем User B на Windows ПК, если зашли раньше то выходим и заходим по новой, и видим что читать можем, а редактировать нет!

bae66c2227316c645aed490960420c7c.png

© Habrahabr.ru