Переносим пользователей из 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/


Интересные статьи

Интересные статьи

Что, если я скажу вам, что поддержка пользователей в геймдеве не нужна?Давайте попробуем сегодня "сыграть наоборот": я докажу вам, что "саппорт не нужен". Без удивительных историй из моей практики (и ...
В апреле 2021 года, параллельно с началом государственной программы предустановки российского ПО на умные устройства, МойОфис впервые выпустил бесплатные настольные редакторы документов для частных ли...
Решения для больших компаний обычно должны выдерживать высокие нагрузки. Когда в штате много десятков тысяч человек, и значительная доля из них ежедневно пользуются ...
Работая старшим консультантом по дижитал-аналитике в ведущем международном аналитическом агентстве, с огромным интересом наблюдаю за нынешним крестовым походом современных веб-браузер...
Через такое прошли многие стартапы: каждый день регистрируются толпы новых пользователей, а команда разработчиков изо всех сил пытается поддержать работу сервиса. Это приятная проблема, но в С...