Общие сведения

Система позволяет использовать механизм скриптов для динамического вычисления шагов сценария MFA (сценария аутентификации). Данный способ определения сценария используется в качестве альтернативы классическому механизму, использующему графический интерфейс настройки сценария MFA. Также он обладает дополнительными преимуществами перед классическим способом настройки MFA, позволяя использовать:

  • Основные и дополнительные атрибуты профиля пользователя в логических условиях;
  • Признаки наличия групп, ролей и прав у пользователя;
  • Параметры входящего сетевого запроса, который был отправлен в рамках текущего запроса;

Текущая инструкция описывает методику разработки скрипта аутентификации на языке JavaScript.

Предполагается, что разработчик сценария MFA обладает следующими компетенциями:

  • владение языком программирования ECMAScript 5.1 или JavaScript;
  • понимание механизма многофакторной аутентификации, реализуемого системой, и способов его диагностики.

Процесс выполнения скрипта

Сценарий, описанный на языке JavaScript, выполняется в процессе аутентификации в определённое подключенное к системе приложение.

В первую очередь система определяет, в какое приложение осуществляется аутентификация пользователя. После определения приложения система проверяет, какой сценарий настроен на вкладке MFA данного приложения. Если в качестве метода входа выбран скрипт MFA, то система вычисляет сценарий аутентификации динамически на основе скрипта. Если скрипт не был выбран для конкретного приложения, то параметры сценария аутентификации будут определяться настройками, заданными на вкладке MFA приложения без выполнения скрипта аутентификации.

Методика разработки скрипта

Для разработки скрипта необходимо:

  1. Чтобы была доступна тестовая среда с приложением, на примере которого выполняется тестирование и отладка разрабатываемого скрипта, предполагающая отсутствие влияния на реальных пользователей;
  2. Чтобы была выполнена корректная интеграция приложения с системой через один из интеграционных механизмов:
    1. OAuth/OpenID Connect;
    2. SAML;
    3. RADIUS;
    4. Reverse Proxy;
    5. Enterprise SSO.
  3. В разделе «Редактор скриптов» должен быть создан как минимум пустой скрипт аутентификации с типом «Multi Factor Authentication».
  4. На вкладке MFA для данного приложения в качестве первого и единственного шага должен быть выбран созданный на предыдущем шаге скрипт.

Для отладки скрипта у пользователя должны присутствовать все необходимые настроенные факторы. Отладка осуществляется только путём выполнения аутентификации в целевое тестовое приложение.

Сценарии использования

Определение специфического сценария MFA на основе значения атрибута пользователя

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

Пример скрипта, настроенного в разделе «Редактор скриптов»:

var user = context.GetUser()

if (typeof user === 'undefined') {
    context.AddStep(
        [
            { factor: "pwd" }
        ]);
} else {
     var hasViceUserAttribute = user.Attributes['vice'] === 'false';

     if (hasViceUserAttribute) {
        context.AddStep([
            { factor: "pwd" }
        ]);
        context.AddStep([
            { factor: "sms" }
        ]);
    } else {
        context.AddStep([
            { factor: "pwd" }
        ]);
        context.AddStep([
            { factor: "totp" }
        ]);
    }
}

Расширенный сценарий аутентификации

В сценарии решается задача комплексной оценки сценария аутентификации:

// пример скрипта
var user = context.GetUser()
// console.log(context.Session.AuthFlags);
var session = context.GetSession();
console.log(session.AuthFlags);
var request = context.GetRequest();
console.log(request.IPAddress);
// нужна идентификация либо ввод логина пароля для идентификации пользователя
if (typeof user === 'undefined') {
    context.AddStep(
        [

            { factor: "pwd" }
        ]);
} else {
    console.log(user.Domain, user.Name, user.FirstName, user.LastName, user.Email)

    var hasViceUserAttribute = user.Attributes['vice'] === 'false';
    var memmberOfGroup1 = false;
    var hasRoleRight1 = false;

    for (var i = 0; i < user.Groups.length; i++) {
        if (user.Groups[i].Name === 'desktop_applications') { 
            console.log("groupName", user.Groups[i].Name);
            memmberOfGroup1 = true; 
        }
        // console.log("GR1", user.Groups[i].ID, user.Groups[i].Name);
    }
    for (var i = 0; i < user.Roles.length; i++) {
        if (user.Roles[i].Name === 'Right1') { hasRoleRight1 = true; }
        // console.log("RL1", user.Roles[i].ID, user.Roles[i].Name);
    }
    console.log("hasViceUserAttribute", hasViceUserAttribute, "memmberOfGroup1", memmberOfGroup1, "hasRoleRight1", hasRoleRight1);

    if (hasViceUserAttribute) {
        context.AddStep([
            { factor: "pwd" }
        ]);
        context.AddStep([
            { factor: "ip", parameters: ["127.0.0.0/8", "::1"] },
            { factor: "sms" }
        ]);
    } else if (memmberOfGroup1) {
        context.AddStep([
            { factor: "pwd" }
        ]);
        context.AddStep([
            { factor: "totp" }
        ]);
    } else if (hasRoleRight1) {
        context.AddStep([
            { factor: "pwd" }
        ]);
        context.AddStep([
            { factor: "telegram" }
        ]);
    }
}

Приложение 1. Спецификация функций

В рамках механизма скриптинга доступен ряд дополнительных функций, вызов которых позволяет выполнять специфические для сценария MFA операции:

Функция Назначение Пример вызова

context.GetUser()

Получение контекста пользователя.

Пример установки соответствующих значений в переменные:

var user = context.GetUser()

context.GetSession()

Получение контекста сессии.

Пример подписи строки и помещения подписанного значения в переменную:

var session = context.GetSession();
console.log(session.AuthFlags);

context.GetRequest()

Получение контекста запроса.

Пример вызова функции получения контекста:

var request = context.GetRequest();

context.AddStep()

Добавление шага аутентификации.

Пример вызова функции установки факторов в рамках сценария:

context.AddStep([
      { factor: "sms" }
]);