Публикация UC/IDP/IKey через обратный прокси Squid
Автор Dmitry Bukreev, Last modified by Dmitry Bukreev на 07 сентября 2026 04:26 PM

Условия для развёртывания

Предусловия:

  • Установленный и настроенный 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.

(0 голос(а))
Эта статья полезна
Эта статья бесполезна