Условия для развёртывания
Предусловия:
- Установленный и настроенный Indeed AM (9.4 и выше).
- Установленный и настроенный Indeed Key Server (9.4 и выше).
- Отдельный Linux-сервер под обратный прокси Squid.
- Публичное DNS-имя, через которое сервисы будут открываться, и сертификат для этого имени.
Ниже используются реальные примерные значения (squid-am1.indeed1.local, IP-адреса, порты) — это конкретный пример для наглядности. Везде, где встречается squid-am1.indeed1.local, подставляйте своё публичное имя, на которое реально настроен ваш прокси и выписан ваш сертификат.
Схема:

Клиент обращается по публичному имени на Squid (443 — UC/IDP, 83 — Indeed Key). Squid терминирует TLS своим сертификатом и переправляет запрос на AM. Для входа в UC требуется логин через IDP — поэтому в данном сценарии публикуются оба. Внутренние компоненты AM (Core, MC, LogServer) через прокси не публикуются.
1. Подготовка сертификата для Squid
Прокси терминирует TLS своим сертификатом, отдельным от сертификата самого AM — сертификат должен быть выписан на публичное имя, через которое сервисы будут открываться (в примере — squid-am1.indeed1.local), а не на внутреннее имя AM-сервера.
Если сертификат выдан в формате .pfx, на сервере Squid его нужно сконвертировать в .pem и положить в отдельную директорию:
mkdir -p /etc/squid/certs
cd /путь/к/сертификату
openssl pkcs12 -in squid-am1.indeed1.local.pfx -nocerts -nodes \
-out /etc/squid/certs/privkey_squidam1.pem
openssl pkcs12 -in squid-am1.indeed1.local.pfx -clcerts -nokeys \
-out /etc/squid/certs/servercert_squidam1.pem
# ca.cer — корневой сертификат CA, которым подписан серверный сертификат
cat /etc/squid/certs/servercert_squidam1.pem ca.cer \
> /etc/squid/certs/fullchain_squidam1.pem
chown squid:squid /etc/squid/certs/privkey_squidam1.pem \
/etc/squid/certs/fullchain_squidam1.pem
chmod 600 /etc/squid/certs/privkey_squidam1.pem
chmod 644 /etc/squid/certs/fullchain_squidam1.pem
Проверка, что ключ и сертификат совпадают, и что CN/SAN верные:
openssl x509 -noout -modulus -in /etc/squid/certs/servercert_squidam1.pem | openssl md5
openssl rsa -noout -modulus -in /etc/squid/certs/privkey_squidam1.pem | openssl md5
# оба хэша должны совпасть
openssl x509 -in /etc/squid/certs/servercert_squidam1.pem -noout -text | grep -A1 "Subject:"
openssl x509 -in /etc/squid/certs/servercert_squidam1.pem -noout -text | grep -A1 "Subject Alternative Name"
grep -c "BEGIN CERTIFICATE" /etc/squid/certs/fullchain_squidam1.pem # должно быть 2
Обратите внимание! Этот же сертификат (pfx и корневой ca) понадобится ещё раз позже, при настройке Indeed Key Server на стороне AM (раздел 3.3) — держите файлы под рукой.
2. Установка и настройка Squid
2.1. Установка
dnf install squid -y
systemctl enable squid
2.2. Конфигурация
/etc/squid/squid.conf:
#
# Recommended minimum configuration
#
acl localnet src 0.0.0.1-0.255.255.255
acl localnet src 10.0.0.0/8
acl localnet src 100.64.0.0/10
acl localnet src 169.254.0.0/16
acl localnet src 172.16.0.0/12
acl localnet src 192.168.0.0/16
acl localnet src fc00::/7
acl localnet src fe80::/10
acl SSL_ports port 443
acl SSL_ports port 83
acl Safe_ports port 80
acl Safe_ports port 21
acl Safe_ports port 443
acl Safe_ports port 70
acl Safe_ports port 210
acl Safe_ports port 1025-65535
acl Safe_ports port 280
acl Safe_ports port 488
acl Safe_ports port 591
acl Safe_ports port 777
acl Safe_ports port 83
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access deny to_localhost
http_access deny to_linklocal
# ===== ACL по путям AM и порту Indeed Key =====
acl path_uc urlpath_regex ^/am/uc
acl path_idp urlpath_regex ^/am/idp
acl port_iks myportname iks_push
# Indeed Key отклоняет запросы с этими заголовками — Squid добавляет
# их по умолчанию в accel-режиме, для Indeed Key их нужно убрать
request_header_access Surrogate-Capability deny port_iks
request_header_access Cache-Control deny port_iks
http_access allow path_uc
http_access allow path_idp
http_access allow port_iks
http_access deny all
# ===== Frontend: TLS для squid-am1.indeed1.local (IDP/UC) =====
# defaultsite — здесь указывается ваш публичный URL, значение ниже
# использовано для примера
https_port 443 accel \
cert=/etc/squid/certs/fullchain_squidam1.pem \
key=/etc/squid/certs/privkey_squidam1.pem \
defaultsite=squid-am1.indeed1.local
# ===== Frontend: TLS для Indeed Key =====
# Порт 83 выбран для примера — используйте тот, что удобен вам, он
# должен совпадать с INDEED_KEY_HTTPS_PORT_EXTERNAL в .env AM
https_port 83 accel \
cert=/etc/squid/certs/fullchain_squidam1.pem \
key=/etc/squid/certs/privkey_squidam1.pem \
defaultsite=squid-am1.indeed1.local \
name=iks_push
# ===== Backend (origin AM) =====
# 192.168.10.60 — IP сервера AM для примера, замените на свой
# Порт 443 — тот, на котором AM реально слушает IDP/UC
cache_peer 192.168.10.60 parent 443 0 no-query originserver \
ssl sslflags=DONT_VERIFY_PEER \
name=am_https_backend \
forceddomain=squid-am1.indeed1.local
# Порт 83 — тот, на котором AM реально слушает Indeed Key (уточните
# у себя, если отличается)
cache_peer 192.168.10.60 parent 83 0 no-query originserver \
ssl sslflags=DONT_VERIFY_PEER \
name=am_iks_backend \
forceddomain=squid-am1.indeed1.local
cache_peer_access am_https_backend allow path_uc
cache_peer_access am_https_backend allow path_idp
cache_peer_access am_https_backend deny all
cache_peer_access am_iks_backend allow port_iks
cache_peer_access am_iks_backend deny all
# ===== Заголовки для AM =====
request_header_add X-Forwarded-Proto https path_uc
request_header_add X-Forwarded-Proto https path_idp
request_header_add X-Forwarded-Host squid-am1.indeed1.local path_uc
request_header_add X-Forwarded-Host squid-am1.indeed1.local path_idp
# ===== Никакого кэширования — трафик AM полностью динамический =====
cache deny all
# ===== Таймауты (UC делает долгие операции синхронизации) =====
read_timeout 300 seconds
connect_timeout 30 seconds
request_timeout 300 seconds
coredump_dir /var/spool/squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
# Убираем служебные заголовки, которые Indeed Key считает признаком прокси
via off
forwarded_for delete
Обратите внимание! Значение forceddomain — это Host/SNI, которые Squid отправляет на backend AM, независимо от того, как к прокси обратился клиент. Оно обязано совпадать с тем, что будет разрешено в haproxy.cfg на стороне AM (раздел 3.2) — иначе AM ответит 403 Forbidden.
2.3. Проверка конфигурации и запуск
squid -k parse
systemctl restart squid
ss -tlnp | grep squid # должны слушать :443 и :83
2.4. Firewall
Проверьте, что реально фильтрует трафик на сервере (firewalld, nftables или iptables — зависит от дистрибутива), и откройте нужные порты, например для firewalld:
firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --add-port=83/tcp --permanent
firewall-cmd --reload
3. Настройки со стороны Indeed AM
AM всегда располагается по пути /opt/am. Правки в этом разделе применяются одним разом в конце (раздел 3.5) — сначала внесите все изменения из пунктов 3.1–3.4, а затем перезапустите стек.
3.1. .env
Ниже — только те строки, которые нужно изменить (остальные строки .env не трогаем):
ENDPOINT_NAME_IDP=squid-am1.indeed1.local
ENDPOINT_NAME_UC=squid-am1.indeed1.local
INDEED_KEY_EXTERNAL_ENDPOINT_NAME=squid-am1.indeed1.local
INDEED_KEY_HTTPS_PORT_EXTERNAL=83
ENDPOINT_NAME_THIS_HOST, ENDPOINT_NAME_CORE, ENDPOINT_NAME_MC, ENDPOINT_NAME_LS оставляем как есть, на внутреннем имени AM — Core/MC/LogServer не публикуются через прокси, их трафик локальный.
3.2. haproxy.cfg — разрешённые Host для фронтенда IDP/UC
Откройте /opt/am/haproxy/haproxy.cfg, найдите секцию frontend FrontendHTTPs (самый первый frontend в файле). Сразу после строки option forwardfor if-none там стоит блок из трёх строк:
acl host-hdr-check1 hdr(host) -i "${ENDPOINT_NAME}" acl host-hdr-check2 hdr(host) -i "${ENDPOINT_NAME}:${HTTPS_PORT}" http-request deny unless host-hdr-check1 || host-hdr-check2
Замените его на:
acl host-hdr-check1 hdr(host) -i "${ENDPOINT_NAME}" acl host-hdr-check2 hdr(host) -i "${ENDPOINT_NAME}:${HTTPS_PORT}" acl host-hdr-check5 hdr(host) -i squid-am1.indeed1.local http-request deny unless host-hdr-check1 || host-hdr-check2 || host-hdr-check5
Для Indeed Key Server отдельный frontend FrontendIndeedKeyHTTPs уже проверяет ${EXTERNAL_ENDPOINT_NAME} — она подхватывается из .env (INDEED_KEY_EXTERNAL_ENDPOINT_NAME), отдельно править не требуется.
3.3. Сертификат для Indeed Key Server
Indeed Key Server за реверс-прокси должен предъявлять внешним клиентам тот же публичный сертификат, что стоит на самом прокси (squid-am1.indeed1.local) — тот же .pfx и корневой ca, подготовленные в разделе 1, нужно скопировать в /opt/am/ssl.
Конвертация pfx в сертификат для HAProxy AM:
cd /opt/am
sudo bash ./convertPfxForReverseProxy_ik_external.sh -f <серверный сертификат>.pfx -p <пароль>
Результат: создаётся серверный сертификат am/ssl/https/reverse_proxy_server_ik.pem, который HAProxy AM предъявляет внешним клиентам Indeed Key Server.
Формирование доверенного CA для контейнеров:
cd /opt/am
sudo bash ./prepareCaFile.sh
Результат: создаётся сертификат am/ssl/ca/trusted_ca.crt, который содержит список всех публичных сертификатов, добавленных в am/ssl/ca.
Примечание. При изменении состава каталога am/ssl/ca скрипт prepareCaFile.sh нужно будет запускать заново перед следующим перезапуском контейнеров.
3.4. app-settings.json Indeed Key Server
В am/indeed-key/app-settings.json укажите внешний публичный адрес и порт — тот же, что и в .env (INDEED_KEY_HTTPS_PORT_EXTERNAL):
{
"Server": {
"Url": "https://squid-am1.indeed1.local:83",
"Logon": {
"Delay": "00:05:00"
}
}
}
3.5. Применение правок
Когда изменения из пунктов 3.1–3.4 внесены — перезапустите стек:
cd /opt/am
docker compose down -v
docker compose up -d
4. Проверка работы
Откройте https://squid-am1.indeed1.local/am/uc и залогиньтесь.

Если возникнут проблемы с UC — попробуйте залогиниться отдельно через https://squid-am1.indeed1.local/am/idp.

Для Indeed Key проверьте healthcheck-эндпоинт: https://squid-am1.indeed1.local:83/healthcheck/ishealthy.

|