Индикатор «Шлюз НРД», проверка ключа ИШ, папки шлюза по сети, сотрудники из домена, переключатель 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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user