Продукты: Indeed PAM
Затрагиваемые компоненты: RDP Proxy, SSH Proxy, PAM Gateway
Описание проблемы: При отсутствии активности со стороны пользователя сессия прерывается, что сопровождается одним из следующих событий:
1. 3116, причина -- DurationExceeded: The session has been terminated due to user inactivity:

2. 3116, причина -- ErrorOccurred: Время сессии истекло:

3. 1018, Пользователь завершил сессию, инициатор не обязательно сам пользователь:

Причины возникновения:
1. Активирована опция "Прерывать сессию при отсутствии пользовательской активности" в применяемой политике РАМ, активность со стороны пользователя отсутствовала дольше указанного периода:

2. Не связано с активностью пользователя, за время его неактивности сессия достигла ограничения на максимальную длительность в применяемой политике РАМ:

3. Сессия была прервана внешним, относительно РАМ, инициатором, например, балансировщиком нагрузки или межсетевым экраном. Их настройки всегда будут приоритетнее настроек РАМ, т.к. они управляют непосредственно сетевым трафиком. РАМ не имеет возможности определить внешнюю причину прерывания сессии, даже если пользователь собственноручно сессию не прерывал.
Варианты решения:
Для случаев 1 и 2 решением является изменение соответствующих настроек в политиках РАМ, т.к. причина кроется именно в них.
Для 3-го случая всё зависит от конфигурации инфраструктуры и варианта развёртывания самого РАМ. В случае с HAProxy (в дистрибутиве РАМ используется именно это ПО, в остальных случаях будут аналогичные настройки), на это влияют 2 параметра:
timeout client -- указывает время, после которого сессия будет разорвана при отсутствии сетевого трафика между пользователем и балансировщиком.
timeout server -- указывает время, после которого сессия будет разорвана при отсутствии сетевого трафика между балансировщиком и сервером доступа.
Они берутся из секции defaults, таймаут сервера может быть указан для конкретного бэкэнда:
 
Время может быть указано в следующих единицах измерения:
- us : микросекунда. 1us = 1/1000ms
- ms : миллисекунда. -- используется по умолчанию, если единица измерения не указана.
- s : секунда. 1s = 1000ms
- m : минута. 1m = 60s = 60000ms
- h : час. 1h = 60m = 3600s = 3600000ms
- d : день. 1d = 24h = 1440m = 86400s = 86400000ms
Так как трафик сессии идёт по цепочке пользователь -> балансировщик -> сервер доступа, на прерывание влияют оба параметра. Например, для обеих ситуаций:
timeout client 3h
timeout server 10m
timeout client 10m timeout server 3h
Сессия будет прервана после 10 минут бездействия.
 Соответственно, в случае неожиданного прерывания сессии при наличии промежуточных узлов, управляющих сетевым трафиком между пользователем и сервером доступа, необходимо проверить, коррелирует ли длительность сессии/бездействия пользователя с настройками таймаутов на промежуточных узлах.
Если используется HAProxy из дистрибутива РАМ, на серверах будут соответствующие контейнеры:

Файл конфигурации находится по пути /etc/indeed/indeed-pam/haproxy. Для применения внесённых в него изменений необходимо выполнить перезапуск командой:
bash /etc/indeed/indeed-pam/scripts/run-pam.sh
Для компонента Indeed PAM Gateway, работающего на основе RDS, все настройки сервера RDS приоритетнее настроек РАМ. Если сессия через Indeed PAM Gateway прерывается по бездействию пользователя, на это может влиять следующая настройка в его политиках:
Конфигурация компьютера → Административные шаблоны → Компоненты Windows → Службы удаленных рабочих столов → Узел сеансов удаленных рабочих столов

Если разрыв вызван политикой RDS выше, его причину можно увидеть в журнале событий:
Журналы приложений и служб → Microsoft → Windows → TerminalServices-SessionBroker → Admin

Как и в случае с настройками в политиках РАМ, сессия может быть прервана не из-за бездействия пользователя, а из-за достижения максимальной длительности за время его бездействия, если соответствующие настройки выполнены со стороны RDS:

Нюансы keepalive в SSH Proxy:
Настройка KeepAlive позволяет не прерывать сессию из-за отсутствия трафика, обеспечивая периодическую отправку пакетов в рамках соединения. Для RDP подключений характерен периодический обмен трафика даже при отсутствии активности пользователя, что позволяет игнорировать значения настроек таймаутов на промежуточном узле в большинстве случаев. Поэтому со стороны РАМ такая настройка есть только у компонента SSH Proxy:
/etc/indeed/indeed-pam/ssh-proxy/appsettings.json

Пакеты KeepAlive могут не проходить до пользовательского клиента сквозь промежуточный узел, управляющий трафиком, т.е. из настроек:
timeout client 3h
timeout server 10m
KeepAlive позволит проигнорировать только таймаут сервера. Сессия будет прервана через 3 часа бездействия, так как между клиентом SSH и балансировщиком пакетов KeepAlive не будет, если они настроены только со стороны SSH Proxy. Решением будет настройка KeepAlive со стороны клиента SSH. Пример окна настроек для клиента PuTTY:

Период, выбранный для KeepAlive, должен быть меньше, чем таймаут для клиента/сервера по отсутствию сетевой активности, иначе сессия может быть прервана несмотря на наличие KeepAlive.
|