Рекомендации по единому выходу из системы SAML 2.0 после бездействия поставщика услуг

Рекомендации по единому выходу из системы SAML 2.0 после бездействия поставщика услуг
Рекомендации по единому выходу из системы SAML 2.0 после бездействия поставщика услуг

Понимание единого выхода из системы SAML 2.0 после таймаута сеанса

Поскольку системы единого входа (SSO) SAML 2.0 позволяют пользователям входить в различные приложения, используя единый набор учетных данных, они значительно упрощают аутентификацию пользователей. Но существуют также серьезные проблемы с понятием единого выхода из системы (SLO), особенно в отношении того, что происходит, когда сеанс пользователя истекает у поставщика услуг (SP), поскольку он не вошел в систему. (IDP) сессия тоже закончилась?

Управление сеансами между SP и IDP необходимо для обеспечения безопасного и эффективного доступа в контексте SAML 2.0. Когда сеанс SP завершается, не всегда очевидно, должен ли пользователь по-прежнему подключаться к IDP, что может повлиять на другие приложения, связанные с тем же IDP. Это поднимает вопросы как об удобстве использования, так и о безопасности.

Многим компаниям, особенно тем, которые используют такие интерфейсы, как Microsoft Entra, необходимо разработать четкую передовую практику для обработки таймаутов сеансов. Лучше ли сеанс SP просто прекратить на уровне SP, или это также должно привести к SLO, который выведет пользователя из его учетной записи IDP?

Используя реальные примеры для иллюстрации наиболее эффективных методов обработки тайм-аутов сеансов и обеспечения безопасности и удобства использования, в этом документе рассматриваются стандартные методы и стандарты обработки событий SAML 2.0 SLO в таких ситуациях.

Команда Пример использования
session() Используется в приложении Express для управления сеансами пользователей. В данном примере он помогает отслеживать активность пользователей и тайм-ауты сеансов, чтобы при необходимости можно было активировать логику выхода из системы.
maxAge Указывает период времени, в течение которого файл cookie сеанса действителен. В этом случае таймер настроен на истечение срока действия через 600 000 миллисекунд или 10 минут и инициирует событие выхода из системы.
create_logout_request_url() Когда сеанс поставщика услуг завершается, URL-адрес запроса единого выхода (SLO), созданный этим методом библиотеки SAML2, пересылается поставщику удостоверений (IDP).
readFileSync() Синхронно считывает файлы ключей и сертификаты, что необходимо для настройки поставщика услуг SAML2. Чтобы поставщик услуг и поставщик удостоверений могли безопасно общаться, эти сертификаты необходимы.
assert_endpoint Указывает URL-адрес, который после успешной аутентификации поставщик удостоверений будет использовать для передачи утверждения SAML. При этом гарантируется уровень аутентификации пользователя на уровне поставщика услуг.
window.onload Это событие используется для сброса таймера неактивности сеанса во внешнем интерфейсе. Он гарантирует, что когда пользователь впервые загружает программу, таймер запускается заново.
onmousemove Чтобы сбросить таймер сеанса, этот прослушиватель событий обнаруживает любое движение мыши. Это важно для отслеживания поведения пользователей и предотвращения случайных тайм-аутов сеанса.
fetch() Используется для асинхронной отправки запроса SLO на сервер после истечения времени ожидания сеанса. Чтобы подключиться к поставщику удостоверений и выйти из IDP, он активирует внутреннюю логику.
setTimeout() Эта функция в коде внешнего интерфейса вызывает событие тайм-аута сеанса после заранее определенного периода бездействия. Это важно для отслеживания поведения пользователей и соблюдения правил безопасности.

Оптимизация единого выхода из системы с помощью обработки тайм-аута сеанса SAML 2.0

С использованием Node.js и Express, внутренний сценарий для обработки единого выхода из системы (SLO), фокусируется на возможности отслеживать истечение срока действия сеанса пользователя и инициировать последовательность выхода из системы на уровнях поставщика услуг (SP) и поставщика удостоверений (IDP). В основе этих рассуждений лежит управление экспресс-сессиями. Мы устанавливаем триггерную точку, настраивая сеанс на завершение после заранее определенного периода бездействия — в нашем примере десяти минут. Когда сеанс завершается, сценарий использует метод create_logout_request_url()} для запуска запроса на выход из SAML 2.0, который затем подключается к IDP (в данном случае Майкрософт Энтра), чтобы полностью завершить сеанс пользователя. Это повышает безопасность, гарантируя, что пользователь полностью вышел из системы.

Мы загружаем SAML-сертификаты и вводит ключи в приложение с помощью команды `readFileSync()}, чтобы обеспечить безопасную связь между SP (MyApp) и IDP (Microsoft Entra). Подтверждая подлинность запроса на выход из системы, эти сертификаты защищают от несанкционированного выхода из системы и гарантируют, что связь остается зашифрованной и подтвержденной. Пользователь отправляется на URL-адрес запроса выхода из системы после его создания, где IDP обрабатывает выход из системы и, при необходимости, завершает сеанс пользователя во всех связанных приложениях. Для обеспечения безопасности и целостности установок единого входа (SSO) с несколькими приложениями требуется такая двусторонняя связь.

Сценарий JavaScript необходим для отслеживания действий пользователей в режиме реального времени на внешнем интерфейсе. Каждый раз, когда пользователь взаимодействует с программой, мы сбрасываем таймаут сеанса, используя прослушиватели событий, такие как onmousemove} и onkeypress. Таймер, установленный с помощью setTimeout(), предупреждает пользователя и автоматически выводит его из SP (MyApp), когда пользователь становится бездействующим. После выхода из системы ранее описанный процесс выхода из системы SAML 2.0 запускается сценарием внешнего интерфейса, отправляющим запрос SLO на серверную часть с помощью fetch(). Этот метод гарантирует, что бездействие на уровне SP устраняется быстро, безопасно и без сбоев.

Когда интеграция SAML 2.0 и управление сеансами объединены, пользовательский опыт безупречен, а стандарты безопасности соблюдаются. Чтобы не допустить, чтобы пользователь оставался аутентифицированным дольше, чем разрешено во время бездействия, тайм-аут сеанса инициирует как выход из системы локального SP, так и выход из системы IDP. Хотя SAML 2.0 не требует каких-либо особых правил в отношении тайм-аутов сеанса, обычно считается лучшей практикой использовать истечение срока действия сеанса для инициирования SLO. Завершая сеансы бездействия, он обеспечивает баланс между безопасностью и удобством пользователя, позволяя синхронизировать выходы из системы на различных платформах, подключенных к SSO.

Использование Node.js и Express для обработки единого выхода SAML 2.0 с тайм-аутом сеанса

Серверный метод для управления SLO SAML 2.0 с таймаутами сеанса поставщика услуг с использованием Node.js и Express. Это решение использует запросы SAML, чтобы проверить, истек ли сеанс, и инициировать SLO на уровне поставщика удостоверений.

// Required modules for Node.js and SAML SSO
const express = require('express');
const session = require('express-session');
const saml2 = require('saml2-js');
const app = express();

// Service Provider (SP) setup
const sp = new saml2.ServiceProvider({
  entity_id: "http://myapp.com/metadata.xml",
  private_key: fs.readFileSync("./cert/sp-private-key.pem").toString(),
  certificate: fs.readFileSync("./cert/sp-certificate.pem").toString(),
  assert_endpoint: "http://myapp.com/assert"
});

// Identity Provider (IDP) setup
const idp = new saml2.IdentityProvider({
  sso_login_url: "https://login.microsoftonline.com/sso",
  sso_logout_url: "https://login.microsoftonline.com/logout",
  certificates: fs.readFileSync("./cert/idp-certificate.pem").toString()
});

// Session management
app.use(session({
  secret: 'mySecretKey',
  resave: false,
  saveUninitialized: true,
  cookie: { maxAge: 600000 } // Set session expiration time
}));

// Middleware to handle session timeout and SLO
app.use((req, res, next) => {
  if (req.session.expires && Date.now() > req.session.expires) {
    sp.create_logout_request_url(idp, {}, (err, logout_url) => {
      if (err) return res.status(500).send("Logout error");
      return res.redirect(logout_url); // Trigger SLO
    });
  } else {
    next(); // Continue if session is valid
  }
});

app.listen(3000, () => {
  console.log("Server running on port 3000");
});

Использование интерфейса JavaScript и обнаружения тайм-аута простоя для обработки SAML 2.0 SLO

Во внешнем методе тайм-аут сеанса определяется с помощью обычного JavaScript для отслеживания бездействия пользователя и инициирования единого выхода из системы (SLO). Это указывает поставщику услуг выдать запрос SLO поставщику удостоверений.

// Define variables for session timeout
let timeoutDuration = 600000; // 10 minutes
let timeoutTimer;

// Reset the timer on any user interaction
function resetTimer() {
  clearTimeout(timeoutTimer);
  timeoutTimer = setTimeout(triggerLogout, timeoutDuration);
}

// Trigger logout function
function triggerLogout() {
  alert("Session expired due to inactivity.");
  window.location.href = "/logout"; // Redirect to SP logout
}

// Monitor user actions
window.onload = resetTimer;
document.onmousemove = resetTimer;
document.onkeypress = resetTimer;

// SLO event triggered after logout
function sendSLORequest() {
  fetch('/api/slo', { method: 'POST' })
    .then(response => {
      if (response.ok) {
        console.log("SLO request sent to IDP");
      }
    })
    .catch(err => console.error("SLO request failed", err));
}

Знакомство с SAML 2.0: единый выход из системы и тайм-аут бездействия

Как действует единый выход из системы SAML 2.0 (SLO) бездействие на уровне поставщика услуг (SP) является критически важным компонентом, которым нужно управлять. Хотя очевидно, что выход из системы на SP вручную должен также вызывать выход из системы поставщика удостоверений (IDP), тайм-ауты сеансов, вызванные бездействием, усложняют ситуацию. В стандарте SAML 2.0 нет четкого указания, как следует обрабатывать SLO по истечении срока действия сеанса. Однако это позволяет применять лучшие практики, которые могут улучшить взаимодействие с пользователем и повысить безопасность.

Например, даже после отключения от SP из-за бездействия пользователи, которые входят в такое приложение, как MyApp, через Microsoft Entra (IDP), часто остаются в системе IDP. Если пользователь считает, что он полностью вышел из системы, в то время как другие приложения, использующие тот же единый вход, все еще работают, это может привести к увеличению проблемы безопасности. Настройка управления сеансами SAML для имитации события тайм-аута SP на уровне IDP и гарантирования синхронизированных выходов из системы — один из способов снизить этот риск.

Реализация во внешнем коде методов обнаружения простоя является еще одним фактором. Разработчики могут предвидеть время бездействия и предупреждать пользователей до истечения срока действия сеанса, используя прослушиватели событий для активности пользователей. Используя это, пользователи могут контролировать свои сеансы и быть уверенными, что их Сеанс единого входа не работает постоянно. В среде, интегрированной с единым входом, разработчики могут сохранить безопасность и комфорт пользователя, обеспечив баланс между этими факторами.

Распространенные вопросы о SAML 2.0 SLO и тайм-аутах сеансов

  1. Что происходит на уровне поставщика услуг, когда время сеанса истекает?
  2. Обычно пользователь выходит из программы по истечении времени сеанса на уровне SP. Однако это зависит от того, как настроена система, поскольку спецификация SAML 2.0 не требует, чтобы это вызывало SLO в IDP.
  3. Должен ли SLO у поставщика удостоверений инициироваться по истечении времени ожидания сеанса поставщика услуг?
  4. Это регулируется политикой организации. Хотя SAML 2.0 не требует этого, многие из соображений безопасности предпочитают включать SLO в IDP, когда сеанс SP завершается.
  5. Когда неактивный сеанс заканчивается, как я могу выполнить SLO?
  6. Истечение срока действия сеанса может быть обнаружено с помощью внутреннего механизма, который затем инициирует create_logout_request_url() процедура подачи запроса SLO к IDP.
  7. Как неактивность сеанса обнаруживается на внешнем интерфейсе?
  8. Слушателям событий нравится как onmousemove и onkeypress обычно используются для отслеживания бездействия, поскольку они сбрасывают таймер каждый раз, когда пользователь взаимодействует с приложением.
  9. Безопасно ли открывать сеанс IDP после выхода из SP?
  10. Если оставить сеанс IDP открытым, может возникнуть угроза безопасности, особенно если пользователь считает, что он полностью завершил сеанс. Рекомендуется настроить SLO для репликации срока действия сеанса SP.

Подведение итогов по управлению таймаутом сеанса SAML 2.0

Для обеспечения безопасности в системе единого входа необходимо убедиться, что поставщик удостоверений и поставщик услуг синхронизируют процессы выхода из системы. Несмотря на то, что SAML 2.0 не предписывает, как следует обрабатывать таймауты сеансов, многие компании обрабатывают одиночные выходы из системы единообразно.

Рекомендуется отправлять запрос SLO каждый раз, когда сеанс поставщика услуг завершается из-за бездействия, чтобы повысить безопасность. Это гарантирует, что пользователь вышел из поставщика удостоверений, а также из приложения, что позволяет избежать нежелательного доступа на многих платформах.

Ссылки и источники лучших практик SAML 2.0
  1. Подробную документацию по стандартам и рекомендациям SAML 2.0 и единого выхода можно найти в официальном документе. Базовая спецификация OASIS SAML 2.0 .
  2. Дополнительные сведения о Microsoft Entra и ее интеграции с SSO и SLO см. в официальной документации Microsoft на сайте Microsoft Entra. Azure Active Directory и SAML .
  3. Библиотеку Node.js SAML, использованную в примерах, а также методы управления сеансами, можно дополнительно изучить на странице Документация библиотеки SAML2-js .
  4. Чтобы ознакомиться с рекомендациями по настройке единого входа и управления сеансами, посетите статью Лучшие практики единого входа по Auth0.