From 8f32f7937246b65deb369c2d201748773221f26a Mon Sep 17 00:00:00 2001 From: fontvielle Date: Thu, 22 Oct 2026 12:55:35 +0300 Subject: [PATCH] =?UTF-8?q?AD:=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=20sv?= =?UTF-8?q?c-bj=20=D1=81=D0=B0=D0=BC=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80?= =?UTF-8?q?=D0=B8=D1=80=D1=83=D0=B5=D1=82=20=D0=BF=D0=B0=D1=80=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=20=D0=B8=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B0=D0=B5?= =?UTF-8?q?=D1=82=20=D0=B8=D1=82=D0=BE=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Пароль — 24 случайных символа (RandomNumberGenerator), показывается один раз в конце. Итог: создан пользователь (где) или уже был (пароль не менялся), по каждой группе bj-* — создана (где) или уже есть (DN). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn --- .../web/templates/part_accounts.html | 64 ++++++++++++++----- 1 file changed, 49 insertions(+), 15 deletions(-) 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 обычной доменной учётной записью: проверяет пароль пользователя и его группы. Прав администратора домена ей не нужно — читать каталог могут все пользователи домена. Создаёт запись администратор домена:

  1. На контроллере домена (или компьютере с RSAT) откройте PowerShell от имени администратора домена.
  2. -
  3. Скопируйте и выполните скрипт ниже — он спросит пароль для svc-bj.
  4. +
  5. Скопируйте и выполните скрипт ниже. Он создаст svc-bj со случайным паролем и группы (или сообщит, что они уже есть) и в конце покажет итог и пароль.
  6. Добавьте сотрудников в группы bj-admins, bj-operators, bj-risk, bj-viewers — по ним bj назначит роли (группы можно переназначить после подключения).
  7. Здесь введите 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 обновите его здесь.