diff --git a/internal/lkgateway/web/templates/part_accounts.html b/internal/lkgateway/web/templates/part_accounts.html index 5c748d3..f0919f6 100644 --- a/internal/lkgateway/web/templates/part_accounts.html +++ b/internal/lkgateway/web/templates/part_accounts.html @@ -87,28 +87,62 @@
bj читает AD обычной доменной учётной записью: проверяет пароль пользователя и его группы. Прав администратора домена ей не нужно — читать каталог могут все пользователи домена. Создаёт запись администратор домена:
svc-bj.svc-bj со случайным паролем и группы (или сообщит, что они уже есть) и в конце покажет итог и пароль.bj-admins, bj-operators, bj-risk, bj-viewers — по ним bj назначит роли (группы можно переназначить после подключения).svc-bj@{{with $A.ADDomain}}{{.}}{{else}}ваш-домен{{end}} и пароль — «Подключить».# Bridge&Join: служебная учётная запись для чтения AD и группы ролей +# Запуск: PowerShell от имени администратора домена (контроллер домена или компьютер с RSAT). Import-Module ActiveDirectory -$dom = Get-ADDomain # домен {{with $A.ADDomain}}{{.}}{{else}}ваш-домен{{end}} -$name = "svc-bj" -$ou = $dom.UsersContainer # или своё OU, например "OU=Service Accounts,$($dom.DistinguishedName)" -$pwd = Read-Host "Пароль для $name (длинный, случайный)" -AsSecureString -New-ADUser -Name $name -SamAccountName $name -UserPrincipalName "$name@$($dom.DNSRoot)" ` - -Path $ou -AccountPassword $pwd -Enabled $true ` - -PasswordNeverExpires $true -CannotChangePassword $true ` - -Description "Bridge&Join: чтение AD для входа пользователей (без прав администратора)" -# Группы, по которым bj назначает роли -@{ "bj-admins" = "администраторы bj"; "bj-operators" = "операторы депозитария"; - "bj-risk" = "риск-менеджеры (НПР)"; "bj-viewers" = "наблюдатели" }.GetEnumerator() | ForEach-Object { - if (-not (Get-ADGroup -Filter "Name -eq '$($_.Key)'")) { - New-ADGroup -Name $_.Key -GroupScope Global -GroupCategory Security -Path $ou -Description "Bridge&Join: $($_.Value)" +$dom = Get-ADDomain # домен {{with $A.ADDomain}}{{.}}{{else}}ваш-домен{{end}} +$name = "svc-bj" +$ou = $dom.UsersContainer # или своё OU, например "OU=Service Accounts,$($dom.DistinguishedName)" +$report = @() + +# пароль — 24 случайных символа (буквы, цифры, знаки) +$chars = [char[]]'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789!#%*+-=?@' +$rng = [System.Security.Cryptography.RandomNumberGenerator]::Create() +$bytes = New-Object byte[] 24; $rng.GetBytes($bytes) +$plain = -join ($bytes | ForEach-Object { $chars[$_ % $chars.Length] }) + +$user = Get-ADUser -Filter "SamAccountName -eq '$name'" -ErrorAction SilentlyContinue +if ($user) { + $report += "Пользователь $name уже есть: $($user.DistinguishedName) — пароль НЕ менялся" + $plain = $null +} else { + New-ADUser -Name $name -SamAccountName $name -UserPrincipalName "$name@$($dom.DNSRoot)" ` + -Path $ou -AccountPassword (ConvertTo-SecureString $plain -AsPlainText -Force) -Enabled $true ` + -PasswordNeverExpires $true -CannotChangePassword $true ` + -Description "Bridge&Join: чтение AD для входа пользователей (без прав администратора)" + $report += "Создан пользователь $name@$($dom.DNSRoot) в $ou" +} + +# группы, по которым bj назначает роли +$groups = [ordered]@{ "bj-admins" = "администраторы bj"; "bj-operators" = "операторы депозитария"; + "bj-risk" = "риск-менеджеры (НПР)"; "bj-viewers" = "наблюдатели" } +foreach ($g in $groups.Keys) { + $ex = Get-ADGroup -Filter "Name -eq '$g'" -ErrorAction SilentlyContinue + if ($ex) { + $report += "Группа $g уже есть: $($ex.DistinguishedName)" + } else { + New-ADGroup -Name $g -GroupScope Global -GroupCategory Security -Path $ou -Description "Bridge&Join: $($groups[$g])" + $report += "Создана группа $g ($($groups[$g])) в $ou" } } -Write-Host "Готово. В bj: учётная запись $name@$($dom.DNSRoot)"+ +Write-Host "" +Write-Host "===== Bridge&Join: итог =====" -ForegroundColor Cyan +$report | ForEach-Object { Write-Host " - $_" } +Write-Host "" +Write-Host "В bj (Пользователи и вход → Подключить домен):" -ForegroundColor Cyan +Write-Host " учётная запись: $name@$($dom.DNSRoot)" +if ($plain) { + Write-Host " пароль: $plain" -ForegroundColor Yellow + Write-Host " Скопируйте пароль в bj и закройте это окно — больше он нигде не показывается." -ForegroundColor Yellow +} else { + Write-Host " пароль: прежний (запись уже была). Новый: Set-ADAccountPassword $name -Reset" +} +Write-Host "Добавьте сотрудников в группы bj-* — по ним bj назначит роли."
Без модуля ActiveDirectory (cmd от администратора домена, * — запросит пароль):
dsadd user "CN=svc-bj,CN=Users,{{with $A.ADBaseDN}}{{.}}{{else}}DC=corp,DC=example,DC=ru{{end}}" -samid svc-bj -upn svc-bj@{{with $A.ADDomain}}{{.}}{{else}}ваш-домен{{end}} -pwd * -pwdneverexpires yes -canchpwd no -desc "Bridge&Join: чтение AD"
Рекомендуем: запретить этой записи интерактивный вход и вход по RDP (групповая политика «Запретить локальный вход», «Запретить вход через службу удалённых рабочих столов») — она нужна только для чтения каталога. Пароль bj хранит у себя; при смене пароля в AD обновите его здесь.