Индикатор «Шлюз НРД», проверка ключа ИШ, папки шлюза по сети, сотрудники из домена, переключатель QUIK в настройках

- журнал ИШ: номер процесса выравнивается пробелами — опросы НРД не распознавались (серый индикатор)
- «Проверить СКЗИ и ключ»: Валидата, датчик случайных чисел, подпись профилем ИШ (а не старый bj-crypto);
  индикатор «Криптографии» — по готовности ключа; карточка автозагрузки УЦ — только для разработки
- шаг «Шлюз НРД»: папки обмена по сети (Samba): логин/пароль, ручная настройка не трогается
- «Учётные записи»: необязательно — подключить домен, проверить связь, найти сотрудника и добавить с ролью;
  роль из bj действует, пока группы домена с ролями не сопоставлены
- настройка QUIK МНП: «Только чтение / Чтение и запись», тонкая настройка цикла свёрнута
- индикатор «Обновления» — только когда есть что обновить; «Мастер настройки» в меню и в настройках

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
zuevav
2026-10-07 00:24:19 +03:00
parent 6a48f7e7a4
commit afc5776347
17 changed files with 421 additions and 55 deletions
+42
View File
@@ -321,5 +321,47 @@ SQL
err "канал $CODE$dep записан, но движок ИШ не перешёл в Running — см. журнал ИШ $DATA_DIR/logs-svc/log.txt (отпечаток УЦ, адрес контура, ключ)"
fi ;;
# папки обмена шлюза по сети (SMB): для программ организации, которые кладут/забирают файлы через ИШ. bj это не
# нужно. Блок общих папок в smb.conf — между метками bj; заведённые вручную [igate_exchange] не трогаем.
share)
CONF=/etc/samba/smb.conf; B='# >>> bj: папки шлюза НРД'; E='# <<< bj: папки шлюза НРД'
on=$(j enabled); su=$(j user); sp=$(j password)
manual=false; [ -f "$CONF" ] && sed "/^$B/,/^$E/d" "$CONF" | grep -q '^\[igate_exchange\]' && manual=true
if [ "${on:-}" = status ] || [ -z "${on:-}" ]; then
mine=false; [ -f "$CONF" ] && grep -q "^$B" "$CONF" && mine=true
u=$( [ "$mine" = true ] && sed -n "/^$B/,/^$E/p" "$CONF" | sed -n 's/^ *valid users *= *//p' | head -1 )
[ "$manual" = true ] && [ -z "$u" ] && u=$(sed -n '/^\[igate_exchange\]/,/^\[/p' "$CONF" | sed -n 's/^ *valid users *= *//p' | head -1)
echo "{\"ok\":true,\"on\":$( [ "$mine" = true ] || [ "$manual" = true ] && echo true || echo false),\"manual\":$manual,\"user\":$(q "$u"),\"smbd\":$(q "$(systemctl is-active smbd 2>/dev/null)")}"; exit 0
fi
[ "$manual" = true ] && err "папка igate_exchange уже открыта вручную в $CONF — bj её не меняет; чтобы управлять из bj, уберите её из smb.conf"
if [ "$on" != true ]; then
[ -f "$CONF" ] && sed -i "/^$B/,/^$E/d" "$CONF"
systemctl reload smbd >/dev/null 2>&1 || true
ok "доступ к папкам шлюза по сети закрыт"; exit 0
fi
[[ "$su" =~ ^[a-z][a-z0-9_-]{2,31}$ ]] || err "логин — латинские строчные буквы, цифры, _ и -, от 3 символов, начинается с буквы"
case "$su" in root|igate|bj|postgres) err "логин $su занят системой — выберите другой" ;; esac
if ! command -v smbd >/dev/null 2>&1; then
DEBIAN_FRONTEND=noninteractive apt-get install -y -q samba >/dev/null 2>&1 || err "не удалось установить Samba (apt-get install samba) — нужен доступ к репозиторию"
fi
id "$su" >/dev/null 2>&1 || useradd --system --no-create-home --shell /usr/sbin/nologin "$su" || err "пользователь $su не создан"
if [ -n "$sp" ]; then
[ ${#sp} -ge 8 ] || err "пароль — не короче 8 символов"
printf '%s\n%s\n' "$sp" "$sp" | smbpasswd -s -a "$su" >/dev/null 2>&1 || err "пароль для $su не задан (smbpasswd)"
smbpasswd -e "$su" >/dev/null 2>&1
elif ! pdbedit -L 2>/dev/null | grep -q "^$su:"; then
err "задайте пароль для $su"
fi
[ -f "$CONF" ] && sed -i "/^$B/,/^$E/d" "$CONF"
{ echo "$B"
for c in test3 prod; do d=$(exchange_dir "$c"); [ -d "$d" ] || continue
n=igate_exchange; [ "$c" = prod ] && n=igate_exchange_prod
printf '[%s]\n comment = Шлюз НРД: папки обмена %s (INBOX/OUTBOX/SENT/ERRORS)\n path = %s\n browseable = yes\n read only = no\n valid users = %s\n force user = %s\n force group = %s\n' "$n" "$c" "$d" "$su" "$SVC_USER" "$SVC_USER"
done
echo "$E"; } >> "$CONF"
testparm -s "$CONF" >/dev/null 2>&1 || { sed -i "/^$B/,/^$E/d" "$CONF"; err "smb.conf после правки не проходит проверку (testparm) — правка отменена"; }
systemctl enable smbd >/dev/null 2>&1; systemctl restart smbd >/dev/null 2>&1 || err "служба smbd не перезапустилась"
ok "папки шлюза открыты по сети для $su: \\\\$(hostname -I | awk '{print $1}')\\igate_exchange" ;;
*) err "неизвестная команда: $cmd" ;;
esac
+24 -14
View File
@@ -60,6 +60,22 @@ keysvc_restart(){
sleep 1
}
# ---- проверка ключа: подписать проверочный документ профилем ИШ активного контура (как подписывает ИШ) ----
KEYCHECK="skip"; KEYDIAG=""
keysign(){ # 0 — ключ подписал проверочный документ под igate
local kt ko; kt=$(mktemp -d); echo "bj key check" > "$kt/in"; chown -R igate:igate "$kt"
ko=$(timeout -k 5 60 runuser -u igate -- env HOME=/var/lib/igate LD_LIBRARY_PATH="$VDLIB" "$ZPKI" -sign -profile "$PROFILE" -registry -in "$kt/in" -out "$kt/out.p7s" 2>&1)
if [ -s "$kt/out.p7s" ]; then rm -rf "$kt"; KEYCHECK=ok; return 0; fi
rm -rf "$kt"
KEYCHECK="fail: $(printf '%s' "$ko" | grep -iE 'ошибк|результат|error' | head -1 | tr -d '"\\' | head -c 200)"; return 1
}
keydiag(){ # что видит ИШ: смонтирована ли ключевая флешка и какие ключи (*.vdk) ему доступны
local m v
m=$(findmnt -rn -o SOURCE,FSTYPE "$DEFAULT_KEYMEDIA" 2>/dev/null | grep -v autofs | head -1)
v=$(runuser -u igate -- env HOME=/var/lib/igate sh -c 'ls -1L "$HOME"/.Validata/vdkeys/*/*.vdk "$HOME"/.Validata/vdkeys/*.vdk 2>/dev/null' | xargs -r -n1 basename | tr '\n' ' ')
KEYDIAG="флешка в $DEFAULT_KEYMEDIA: ${m:-не смонтирована}; ключи, видимые ИШ: ${v:-нет}; служба ключей Валидаты (vdcrysvc): $(pgrep -x vdcrysvc >/dev/null && echo работает || echo 'не запущена')"
}
if [ "$ACTION" = "restart-ish" ]; then
systemctl restart igate.service >/dev/null 2>&1 || systemctl restart igate-svc >/dev/null 2>&1 || true
echo '{"ok":true,"action":"restart-ish"}'; exit 0
@@ -106,6 +122,14 @@ for p in sys.argv[1:]:
print(json.dumps(out,ensure_ascii=False))
PY2
}
if [ "$ACTION" = "keycheck" ]; then
prof_dir; PROFILE="$PROFILE_NAME"
RNG=$([ -x /usr/local/sbin/bj-validata-rng ] && /usr/local/sbin/bj-validata-rng status 2>/dev/null | grep -o '"ready":[a-z]*' | cut -d: -f2)
keysvc_up_quiet(){ pgrep -x vdcrysvc >/dev/null || keysvc_restart; }; keysvc_up_quiet
keysign || keydiag
printf '{"ok":true,"profile":"%s","rng":"%s","keycheck":"%s","keydiag":"%s"}\n' "$PROFILE" "${RNG:-}" "$KEYCHECK" "$(printf '%s' "$KEYDIAG" | tr -d '"\\')"
exit 0
fi
if [ "$ACTION" = "certs-list" ]; then
prof_dir
echo "{\"ok\":true,\"profile\":\"$PROFILE_NAME\",\"dir\":\"$PROFDIR\",\"certs\":$(certs_list_json)}"; exit 0
@@ -328,20 +352,6 @@ PY
fi
# ---- проверка: ключ подписывает под igate (как будет подписывать ИШ) — проверочный документ профилем ----
KEYCHECK="skip"; KEYDIAG=""
keysign(){ # 0 — ключ подписал проверочный документ под igate
local kt ko; kt=$(mktemp -d); echo "bj key check" > "$kt/in"; chown -R igate:igate "$kt"
ko=$(timeout -k 5 60 runuser -u igate -- env HOME=/var/lib/igate LD_LIBRARY_PATH="$VDLIB" "$ZPKI" -sign -profile "$PROFILE" -registry -in "$kt/in" -out "$kt/out.p7s" 2>&1)
if [ -s "$kt/out.p7s" ]; then rm -rf "$kt"; KEYCHECK=ok; return 0; fi
rm -rf "$kt"
KEYCHECK="fail: $(printf '%s' "$ko" | grep -iE 'ошибк|результат|error' | head -1 | tr -d '"\\' | head -c 200)"; return 1
}
keydiag(){ # что видит ИШ: смонтирована ли ключевая флешка и какие ключи (*.vdk) ему доступны
local m v
m=$(findmnt -rn -o SOURCE,FSTYPE "$DEFAULT_KEYMEDIA" 2>/dev/null | grep -v autofs | head -1)
v=$(runuser -u igate -- env HOME=/var/lib/igate sh -c 'ls -1L "$HOME"/.Validata/vdkeys/*/*.vdk "$HOME"/.Validata/vdkeys/*.vdk 2>/dev/null' | xargs -r -n1 basename | tr '\n' ' ')
KEYDIAG="флешка в $DEFAULT_KEYMEDIA: ${m:-не смонтирована}; ключи, видимые ИШ: ${v:-нет}; служба ключей Валидаты (vdcrysvc): $(pgrep -x vdcrysvc >/dev/null && echo работает || echo 'не запущена')"
}
if [ "$IGATE_RES" = connected ] || [ "$IGATE_RES" = pending-channel ]; then
if ! keysign; then
if [ -n "$TARGET_DEV" ] && [ -b "$TARGET_DEV" ] && [ -z "$(findmnt -rn -o FSTYPE "$DEFAULT_KEYMEDIA" 2>/dev/null | grep -v autofs)" ]; then
+1 -1
View File
@@ -12,7 +12,7 @@ process_one(){
quikexport-*) out=$(BJ_EXTRA="$extra" /usr/local/sbin/bj-quikexport-admin "${action#quikexport-}" "$staging" 2>&1) ;;
component-install) out=$(/usr/local/sbin/bj-component-install "$staging" 2>&1) ;;
# интеграционный шлюз НРД: состояние, установка, канал контура (TEST3 | боевой); параметры — JSON в extra
igate-status|igate-install|igate-contour) out=$(BJ_EXTRA="$extra" /usr/local/sbin/bj-igate-admin "${action#igate-}" 2>&1) ;;
igate-status|igate-install|igate-contour|igate-share) out=$(BJ_EXTRA="$extra" /usr/local/sbin/bj-igate-admin "${action#igate-}" 2>&1) ;;
# датчик случайных чисел Валидаты: проверка и сеанс «двигайте мышью» (движения — из мастера bj)
rng-status|rng-start|rng-cancel) out=$(/usr/local/sbin/bj-validata-rng "${action#rng-}" 2>&1) ;;
# системные настройки сервера: серверы времени (NTP)