Переносим пользователей из AD в FreeIPA

—

от автора

В связи с уходом Microsoft из России у многих возник вопрос о переносе службы каталогов на open-source или решения из реестра отечественного ПО. Одним из доступных решений является FreeIPA. Проект живет при поддержке RedHat и доступен в репозиториях отечественных операционных систем.

В этой статье мы рассмотрим перенос учетных записей с нужными нам атрибутами из Active Directory в FreeIPA 4.10.1. В качестве инструмента мы будем использовать PowerShell 5.1, так как кроме него и установленного модуля для работы с AD нам по сути ничего и не потребуется.

Для начала потребуется создать шаблон вызова метода API в формате json. В данной статье мы будем создавать staged учетные записи. Все методы для API описаны: IPA Server‑API Browser. В шаблоне нам необходимо сопоставить соответствующие атрибуты объектов.

{   "method": "stageuser_add",   "params": [     [       "$($ADUser.SamAccountName)"     ],     {       "givenname": "$($ADUser.GivenName)",       "sn": "$($ADUser.Surname)",       "cn": "$($ADUser.Name)",       "mail": "$($ADUser.mail)",       "title": "$($ADUser.title)",       "employeenumber": "$($ADUser.employeeNumber)",       "telephonenumber": "$($ADUser.telephoneNumber)",       "mobile": "$($ADUser.mobile)",       "ou": "$($ADUser.department)"     }   ] }

При использовании PowerShell в качестве REST клиента могут возникнуть проблемы с недоверенным сертификатом сервера FreeIPA. В данной статье мы не будем устанавливать сертификаты на машину с PowerShell, нам будет достаточно игнорировать недоверенный сертификат. Начиная c PowerShell 6 при вызове REST запроса, достаточно добавить параметр -SkipCertificateCheck. Для более младших версий, применим политику:

# Apply policy to trust all certificates add-type @"  using System.Net;  using System.Security.Cryptography.X509Certificates;  public class TrustAllCertsPolicy : ICertificatePolicy {  public bool CheckValidationResult(  ServicePoint srvPoint, X509Certificate certificate,  WebRequest request, int certificateProblem) {  return true;  }  } "@ [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12'

Занесем в переменные: Base DN с учетными записями Active Directory, FQDN сервера FreeIPA и путь к json файлу c шаблоном метода API FreeIPA. Так же создадим новую сессию.

$BaseDN = "OU=Users,DC=local,DC=example,DC=domain" $FreeIPAFqdn ="freeipa.example.domain" $Json = ".\stageuser_add.json"  # New web session $RestSession = New-Object Microsoft.PowerShell.Commands.WebRequestSession

Выгружаем пользователей из Active Directory с нужными нам атрибутами

# Get Active Directory users $OrganizationalUnit = Get-ADOrganizationalUnit -Identity $BaseDN $ADUsers = Get-ADUser -Filter * -SearchBase $OrganizationalUnit -Properties employeeNumber,     title,mail,department,telephoneNumber,mobile

Заносим в переменную учетные данные администратора FreeIPA

# Get FreeIPA credentials $FreeIPACredentials = Get-Credential -Message "FreeIPA log in with username and password"

Создадим функцию авторизации в API

function Invoke-FreeIPALogin {     param(         [parameter(Mandatory = $True)]$Session,         [parameter(Mandatory = $True)][string]$Fqdn,         [parameter(Mandatory = $True)][PSCredential]$Credentials     )     process {         $Credentials.Password | ConvertFrom-SecureString          $User = $Credentials.UserName         $Password = $Credentials.GetNetworkCredential().Password         $Body = @{"user" = "$($User)"; "password" = "$($Password)"}         $Header = @{"Content-Type" = "application/x-www-form-urlencoded"; "Accept" = "application/json"}         Invoke-RestMethod -Uri "https://$($Fqdn)/ipa/session/login_password" -Method POST -Body $Body `             -WebSession $Session -Headers $Header     } }

Далее нам потребуется функция вызова метода API

function Invoke-FreeIPARequest {     param(         [parameter(Mandatory = $True)]$Session,         [parameter(Mandatory = $True)][string]$Fqdn,         [parameter(Mandatory = $True)][string]$Body     )     process {         $Header = @{"Referer" = "https://$($Fqdn)/ipa"; "Accept" = "application/json"}         $Type = "application/json; charset=utf-8"         $Request = Invoke-RestMethod -Uri "https://$($Fqdn)/ipa/session/json" -WebSession $Session `             -Method POST -Body $Body -Headers $Header -ContentType $Type         return $Request     } }

Теперь можно авторизоваться в API и создать новых пользователей FreeIPA по шаблону созданному ранее

# Login to FreeIPA try {     Invoke-FreeIPALogin -Session $RestSession -Fqdn $FreeIPAFqdn -Credentials $FreeIPACredentials } catch {     Write-Host $_ -BackgroundColor Red     exit 1 }  # Transfer users to FreeIPA foreach ($ADUser in $ADUsers) { Invoke-Expression ('$Body = @"' + "`n" + (Get-Content $Json -Encoding UTF8 | ForEach-Object {$_ + "`n"}) + "`n" + '"@')     try {         $Request = Invoke-FreeIPARequest -Session $RestSession -Fqdn $FreeIPAFqdn -Body $Body         Write-Host ($Request.Result)     }     catch {         Write-Host $_ -BackgroundColor Red         continue      } }

На этом наша работа завершена. По аналогии можно выгружать любые данные из Active Directory и, используя методы API, создавать объекты в службе каталогов FreeIPA.


ссылка на оригинал статьи https://habr.com/ru/articles/759218/