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

Zimbra Collaboration Suite Open-Source Edition как раз является цифровым рабочим местом, способным предоставить доступ не только к электронной почте, но также к цифровым календарям, спискам задач, адресным книгам, а с помощью набора расширений Zextras Suite Pro и к совместному редактированию документов, корпоративному текстовому и видеочату и персональному хранилищу Drive. Ко всему прочему, Zimbra OSE можно с легкостью интегрировать в корпоративный портал. Давайте же посмотрим на то, как это можно сделать на примере домена company.ru.

image

Существуют два интерфейса интеграции Zimbra OSE с корпоративным порталом. Первый, URL-интерфейс, заключается в создании специальной ссылки, на основе которой можно создать баннер, при нажатии на который авторизованный на корпоративном портале пользователь перенаправляется в свою учетную запись Zimbra OSE и может спокойно выполнять свои задачи. Второй основан на предварительной авторизации с использованием SOAP-интерфейса. Первый интерфейс наиболее распространен и используется из-за простоты его интеграции с большинством веб-порталов. Второй интерфейс обычно используется с порталами, которые требуют контроля над созданием токена аутентификации и перенаправлением пользователя.

В обоих случаях первым делом нам необходимо подготовить наш почтовый домен. Для этого нужно создать ключ предварительной аутентификации. Делается это с помощью команды zmprov generateDomainPreAuthKey company.ru. В выводе данной команды будет содержаться 64-символьный ключ, который получается за счет случайной генерации 32 знаков и их шифрования, например preAuthKey: 9b34da63e5c1cba4cf7eb8262bacb18f712f6abafb02cf670234cb9bca63cb31. Этот ключ впоследствии можно будет вновь просмотреть при помощи команды zmprov gd company.ru zimbraPreAuthKey. После этого следует перезапустить почтовый сервер, чтобы внесенные изменения вступили в силу.

Разберемся в том, как реализовать предварительную аутентификацию с помощью URL- интерфейса. Затем на основании этого ключа предварительной авторизации мы создадим специальный URL-адрес, по которому уже авторизованный на корпоративном портале пользователь сможет войти в Zimbra OSE без необходимости ввода пароля. URL-адрес будет иметь вид mail.company.ru/service/preauth?{account-identifier}{by-value}{time}{expires}[&admin=1]{computed-preauth}.

Параметрами в данном URL являются:

  • {account-identifier} и {by-value}, которые нужны для идентификации учетной записи. В первом параметре указывается её идентификатор, а во втором вид этого идентификатора. Если вид используемого {by-value} не указан, используется аутентификация по имени.
  • {time} представляет из себя временную отметку, преобразованную во время Unix
  • {expires} является временем в миллисекундах, после которого истекает срок действия токена аутентификации. Если в качестве значения этого параметра указан 0, используется время истечения токена для учетной записи по умолчанию
  • [&admin=1] данный параметр нужен только в том случае, если вы хотите использовать предварительную аутентификацию для входа не только в веб-клиент, но и в консоль администрирования. Если этот параметр указан, вводите его между параметрами {account-identifier} и {by-value} при вычислении HMAC.
  • {computed-preauth} вычисленное значение предварительной аутентификации.

Вычисление {computed-preauth} производится следующим образом:

  1. Необходимо собрать вместе значения {account-identifier}, {by-value}, {time} и {expires} именно в этом порядке
  2. Выстроить их в ряд, разделив знаком "|"
  3. Вычислить HMAC с использованием DomainPreAuthKey
  4. Перевести значение HMAC в шестнадцатеричный вид

Например, имея следующие данные:

  • DomainPreAuthKey: 9b34da63e5c1cba4cf7eb8262bacb18f712f6abafb02cf670234cb9bca63cb31
  • {account-identifier}: manager@company.ru
  • {by-value}: name
  • {expires}: 0
  • {time}: 1579862639

Можно сформировать следующий набор информации manager@company.ru|name|0|1579862639. Затем из этой строки можно вычислить SHA-1 HMAC: preauth = hmac(«manager@company.ru|0|1579862639»,«9b34da63e5c1cba4cf7eb8262bacb18f712f6abafb02cf670234cb9bca63cb31»); В результате получаем значение {computed-preauth} 93a43cd03a5b2fca40f46c3ce99b4a4dd6e5676a.

Теперь используем его для составления URL: mail.company.ru/service/preauth?account=manager@company.ru&expires=0&timestamp=1579862639&preauth=93a43cd03a5b2fca40f46c3ce99b4a4dd6e5676a. Перейдя по этому URL можно будет попасть в веб-клиент Zimbra и получить токен аутентификации без необходимости ввода имени учетной записи или пароля.

Если же вы хотите осуществить предварительную аутентификацию, то для вычисления HMAC используйте данные "admin@company.ru|1|name|0|1579862639", а для входа используйте URL mail.company.ru/service/preauth?account=admin@company.ru&expires=0&timestamp=1579862639&preauth=7b410ed71e4eb6c7724598587ae03078bca5e29f&admin=1

В случае же с SOAP-интерфейсом, используется стандартный запрос AuthRequest, в котором вместо пароля передаются данные предварительной аутентификации по следующему шаблону:

{account-identifier}
{computed-preauth}

Заполним этот шаблон на примере manager@company.ru:

manager@company.ru
93a43cd03a5b2fca40f46c3ce99b4a4dd6e5676a

После этого остается только сформировать ссылку company.ru/CorpPortal/preauth?isredirect=1&authtoken={...} с указанием токена аутентификации, которая перенаправит пользователя на сервер Zimbra, и внедрить её с использованием уже знакомого нам URL-интерфейса.

Ещё одной задачей перед системным администратором, внедряющим предварительную аутентификацию Zimbra на своем корпоративном портале является автоматизация вычисления значения {computed-preauth}. Добиться этого можно при помощи скрипта, который будет автоматически подставлять все требуемые данные и на выходе предоставлять готовую для предварительной аутентификации ссылку. Вот пара примеров таких скриптов:

Python/Django

def webmail_redirect(request):
    from time import time
    import hmac, hashlib
    preauth_key = "9b34da63e5c1cba4cf7eb8262bacb18f712f6abafb02cf670234cb9bca63cb31"
    preauth_url = "http://mail.company.ru/service/preauth"
    timestamp = int(time()*1000)
    try:
        acct = request.user.email
        pak = hmac.new(preauth_key, '%s|name|0|%s'%(acct, timestamp), hashlib.sha1).hexdigest()
        return HttpResponseRedirect("%s?account=%s&expires=0&timestamp=%s&preauth=%s"%(preauth_url, acct, timestamp, pak))
    except:
        pass
    return HttpResponseRedirect("/not_logged_in/")

PHP

<?php
    /**
    * Глобальные параметры. Могут храниться во внешнем config.inc.php или забираться из базы данных.
    */
    $PREAUTH_KEY="9b34da63e5c1cba4cf7eb8262bacb18f712f6abafb02cf670234cb9bca63cb31";
    $WEB_MAIL_PREAUTH_URL="http://mail.company.ru/service/preauth";
    /**
    * Адрес электронной почты пользователя и домен. В этом примере получен из параметра запроса GET.
    */
    $user = $_GET["user"];
    $domain=$_GET["domain"];
   
    $email = "{$user}@{$domain}";
    if(empty($PREAUTH_KEY)) {
        die("Need preauth key for domain ".$domain);
    }
   
    /**
    * Создание токена и URL предварительной аутентификации
    */
    $timestamp=time()*1000;
    $preauthToken=hash_hmac("sha1",$email."|name|0|".$timestamp,$PREAUTH_KEY);
    $preauthURL = $WEB_MAIL_PREAUTH_URL."?account=".$email."&by=name&timestamp=".$timestamp."&expires=0&preauth=".$preauthToken;
   
    /**
     * Перенаправление на URL предварительной аутентификации Zimbra
     */
    header("Location: $preauthURL");
?>

По всем вопросам, связанными c Zextras Suite вы можете обратиться к Представителю компании «Zextras» Екатерине Триандафилиди по электронной почте katerina@zextras.com