Как мы допиливали Битрикс и защищали его от хищных роботов
Всем привет! Хочу развенчать миф, что в производственных компаниях решение любого вопроса сопряжено с мириадами бумажек, беготней по отделу кадров, и прочими малоприятными вещами. Расскажу о корпоративном портале НЛМК, который для всех нас — сотрудников офиса и производства — единое цифровое окно. Тут все могут решить самые разные вопросы и получить оперативную информацию.
Я как раз стоял у истоков создания портала и участвовал/участвую во всех его жизненных циклах — от идеи и заканчивая принятием на поддержку с дальнейшим развитием. О причинах выбора платформы Битрикс, и неких других технических тонкостях — расскажу под катом.
Понятно, что портал — в первую очередь про почитать — новости, блоги, сообщества, мероприятия, акции и т.д. Но в нашем случае это не всё. Тут собрано более 80 разных сервисов: от заказать кадровую справочку, перенести отпуск и прочее кадровое, выйти в корп. облако и на разные обменные ресурсы, до отправить посылку, заказать услуги переводчика, ну и, конечно, охрана труда и безопасность.
В отличие от многих компаний, в НЛМК доступ к порталу есть не только у офисных сотрудников, находящихся в домене компании, но и у рабочих на производстве. Для этого мы развернули собственную инсталляцию системы аутентификации Blitz IDP — (через неё, например, осуществляется доступ в Госуслуги). Так что воспользоваться порталом можно и без доступа во внутреннюю корпоративную сеть. Но не буду забегать вперед, сначала расскажу историю разработки.
История создания портала
В 2017 году мы начали делать новую версию портала. Краеугольный камень решения — вовлечь в процесс каждого сотрудника НЛМК, от цеха до офиса. Притом в расчет брались и российские точки присутствия, и зарубежные. Это задача не из легких: в компании работает порядка 70 тысяч сотрудников. Так что де-факто мы развернули крупную инсталляцию Битрикс (мы полагаем, что наш портал может претендовать на звание самой крупной инсталляции Битрикс в мире, но это не точно) и построили единое медийное и сервисное пространство для всех.
Предыдущая, гораздо менее функциональная версия портала была реализована на Sharepoint и имела ряд существенных ограничений.
Во-первых, Sharepoint работал только для офисных сотрудников –, а это порядка 30–40% всего кадрового состава НЛМК. Изучив рынок, мы пришли к выводу, что самым оптимальным вариантом (с точки зрения функциональности, цены и качества) окажется Битрикс. Почему именно он?
Критерии выбора платформы:
Надежность. Несколько лет назад компания запустила «семейство внешних сайтов» на платформе »1С-Битрикс». Решение прошло проверку временем.
Доступность. Важным фактором стала стоимость лицензии и внедрения. Она ниже, чем у западных вендоров. В России масса интеграторов и самостоятельных программистов с опытом разработки на платформе «Битрикс24», а зарубежные решения поддерживать, зачастую, дороже.
Возможности платформы:
Масштабируемость. Благодаря встроенным возможностям кластеризации и балансировки нагрузки портал «разворачивается» на офисы по всей стране и выдерживает высокие нагрузки
Адаптивность. Интранет открывается с любых устройств
Гибкость. Архитектура продукта позволяет постоянно добавлять в программный код новые функции.
А еще Битрикс — это российское решение. Конечно, на момент создания этот фактор мы не учитывали, но тем не менее рады, что сейчас наш портал работает именно на базе отечественной разработки. В нынешних реалиях это весомый плюс.
Кто и как использует портал НЛМК
Что касается офисных сотрудников — здесь и так всё понятно. Они получили привычный инструментарий, пусть и существенно расширенный. Но всё самое интересное происходило на стороне рабочих цехов: для них фактически открылся целый новый мир.
Через портал можно решить все кадровые вопросы, забронировать командировку, заполнить отпуск, получить справку 2-НДФЛ. Больше не нужно ходить с бумажками к руководителю: на портале ему видны все сотрудники, а согласования «прилетают» автоматически. Если человеку нужно перенести отпуск или взять отгул на следующей неделе, это всего несколько кликов. Можно изучить расчетный лист за месяц/год (сколько и за что было начислено) — компания становится прозрачнее и доступнее для всех сотрудников. Из прочих сервисов можно отметить заказ встречи делегаций, корпоративную почту DHL, сервисы перевода, юридическую поддержку и даже заказ средств индивидуальной защиты.
Функциональность десктопной версии корпоративного портала НЛМК
Наш портал превосходно закрывает задачи, касающиеся общения, как на уровне «компания-сотрудники», так и на уровне «сотрудник-сотрудник».
У людей есть возможность мгновенно получить важные новости: выплаты, ковидные меры, пункты сдачи тестов. Конкурсы внутри компании (например, «Лучший сотрудник»), значимые события (назначения, ответы на вопросы). По ряду направлений организованы отдельные сообщества — например, у каждого цеха есть своя «группа» для обмена информацией. Там публикуются важные орг. документы — графики работы, движение транспорта, маршруты между субъектами компании (внутри комбината реализована собственная транспортная служба со своим расписанием и остановками).
Что касается непосредственно контента — у нас есть возможность гибко подавать новости целевой аудитории. Можно настраивать фильтры на конкретный регион или, допустим, только на офисных сотрудников. При этом люди имеют возможность подписываться на конкретные рубрики и искать информацию — по новостям, по автору публикации, по упоминаниям. Личные профили тесно интегрированы со сторонними системами (Outlook, Skype for Business). Стоит загрузить аватар, и он обновится везде.
Есть функционал блогов. У нас максимально свободный подход к тому, что пишут и публикуют сотрудники. Блоги практически не модерируются (за исключением случаев, когда контент противоречит законодательству), и сами модераторы преимущественно заняты сбором обратной связи. Преданные пользователи портала тестируют его новые функции — мы ничего не выпускаем без теста. Как только все баги устранены — можно выкатывать обновление для всех.
Пользователям доступны также закрытые сообщества — для общения на внутренние темы. А все изменения, новости, доступ к любой информации — через портал. Можно комментировать, лайкать, репостить.
Кроме того, не стоит забывать, что Битрикс — это решение с рядом административных интерфейсов. Он позволяет реализовывать различные бизнес-процессы, функции, сервисы и при этом неплохо защищен и умеет перехватывать атаки.
Портал НЛМК интегрирован со многими внешними системами: SAP-приложения, ITSM-системы, Blitz, Sharepoint (да, у нас все еще есть сервисы, которые не мигрировали на новый портал). Также это мастер-система в части мобильного приложения, профиля — для Skype, Exchange и т.п.
Что касается непосредственно рабочих задач — у многих отделов, в частности, у ОТПБ (охрана труда и пожарной безопасности) внедрен собственный KPI. Например, карта выявления опасностей. Заявку можно оставить если, к примеру, сломался забор: сотрудники ОТПБ должны обработать задачу и решить ее в кратчайшие сроки.
Также популярен расчетный лист — все любят посмотреть, сколько им пришло зарплаты, за что начислены средства. В НЛМК есть много социальных программ — например, система дотационного питания. За небольшую сумму можно на льготных условиях получать комплексные обеды. В Sharepoint этого функционала в принципе не было.
Наши собственные разработки
Несмотря на то, что Битрикс «из коробки» оснащен богатым набором возможностей, кое-что мы доделывали самостоятельно, в том числе и при поддержке вендора.
Защита от хищных роботов и несанкционированного доступа
Для работы с порталом необходимо авторизоваться, но это правило распространяется на исполняемые файлы, но не статику, которую можно заполучить, для этого достаточно знать путь к файлу (рассматриваю «типовую» настройку LEMP стека необходимую для запуска web приложения). Как защитить от лишних глаз важные документы, видео и изображения, которые должны быть доступны только сотрудникам группы компаний НЛМК? Для того, чтобы лица, не прошедшие процесс аутентификации или идентификации, не могли получить доступ к этим данным, мы реализовали дополнительную авторизацию для статичных файлов.
Дополнительная авторизация происходит автоматически на стороне бэкенда. После идентификации пользователя на портале ему посылается cookie с проверочной информацией. Проверочная информация преобразуется/шифруется для обеспечения ее безопасности. Ключ для шифрования хранится в отдельном хранилище за пределами корневой папки сайта (DOCUMENT_ROOT).
Cookie устанавливается на время жизни текущей сессии пользователя. У cookie выставляется признак HttpOnly, благодаря чему они не могут быть изменены браузерным кодом и будут отправляться только на сервер.
При попытке доступа к информации по прямой ссылке у пользователя проверяется наличие cookie и соответствие дешифрованного сообщения исходному. Если условия будут истинными, то пользователь получит запрашиваемую информацию. В противном случае вернется ошибка или произойдет редирект на систему аутентификации.
Блок схема алгоритма работы дополнительной авторизации:
Офис внутри портала
Мы продолжаем использовать Sharepoint, так как он хорошо работает с документами Word, Excel — онлайн-просмотр, редактирование. С этой системой портал интегрирован через протокол WOPI.
Office Web Apps Server (далее OWA) — веб-версия популярного офисного пакета приложений, включает в себя облегченные браузерные приложения Word, Excel, PowerPoint и OneNote.
OWA ставится на отдельный физический сервер и отвечает только за отображение документов в браузере. Вся логика по организации хранения файлов ложится на WOPI-host.
Взаимодействие между OWA и хранилищем происходит через WOPI API, который необходимо реализовать.
Схема взаимодействия
В схеме взаимодействия представлены три участника:
Браузер — фронтенд выполнение JS скриптов;
WOPI-host — бэкенд реакция на ajax запросы браузера и API запросы WOPI-client;
WOPI-client — запрос информации о файле и формирование страницы просмотра документа.
Рассмотрим подробно схему взаимодействия:
При клике в браузере на элементе, вызывающем просмотр документов, управление передается JS-компоненту, который выполняет ajax-запрос к зарегистрированному BX.ajax.runAction методу, где в одном из параметров передается FILE_ID просматриваемого документа.
В ответ сервер возвращает сформированную особым образом ссылку для передачи управления на WOPI-client.
В зависимости от настроек JS-компонент открывает полученную ссылку либо в Side Panel, либо в новом окне.
WOPI-client начинает процесс формирования страницы просмотра и первым действием посылает запрос к WOPI-host на получение информации о файле (имя файла, размер, …).
Запрос обрабатывается в REST-методе и при положительном результате формируется ответ в формате JSON с информацией о файле для WOPI-client.
WOPI-client посылает второй запрос к WOPI-host на получение самого файла.
Запрос обрабатывается в REST-методе и при положительном результате формируется ответ с бинарным содержимым файла.
WOPI-client получив всю необходимую информацию формирует страницу просмотра документа и возвращает ее в браузер.
Вынесение конфигурационных параметров
Сейчас уже есть много различных реализаций библиотек для работы с переменными окружения, но на практике встречается очень много проектов, где используется дефолтная структура Битрикса, а логины и пароли гуляют в открытом доступе.
Основные конфигурационные данные хранятся в:
Так как в этих файлах хранятся глобальные константы, которые зависят от площадки (ландшафта), то:
при создании резервной копии эти данные попадут в бэкап;
нарушается безопасность, т.к. при получении доступа к корневой папке сайта ($_SERVER[«DOCUMENT_ROOT»]) данные становятся доступными в исходном виде;
при развертывании бэкапа на новой площадке каждый раз приходится менять значения этих переменных.
Для исключения вышеперечисленных пунктов мы написали свой класс для работы с глобальными параметрами, идею которого позаимствовали из из фреймворка Symfony класс DotEnv. Основная идея заключается в вынесении глобальных параметров (логины/пароли для подключения к БД, к серверу очередей, к шинам данных и т.д.) за пределы сайта.
В итоге конфигурационные файлы становиться похожими на следующее:
define («DB_LOGIN», getVar («DB_LOGIN»));
define («DB_PASSWORD», getVar («DB_PASSWORD»));
Стоит учитывать, что реализация метода getVar должна быть определена до подключения конфигурационных файлов Битрикса или в самом их начале.
Enterprise из коробки? И что пошло не так…
Сразу хотелось бы сказать, что на практике мы не встречали готовых «коробочных» решений, полностью покрывающих потребности Enterprise сегмента бизнеса. Возможно, их и нет, так как зачастую крупные компании сами являются «диктаторами моды», задавая собственные тренды.
Поэтому цель данного раздела — не показать насколько хорош или плох продукт, а донести ряд моментов, с которыми мы столкнулись и как мы это решали. Стоит учитывать, что вендор активно помогал и помогает нам в решении наших потребностей. При таком тесном симбиотическом сотрудничестве наши разработки, исправления, рекомендации находят отражение в обновлениях и новых версиях продукта Битрикс.
Когда мы установили максимальную Enterprise-версию решения с самым широким набором модулей, оказалось, что часть функционала на работает должным образом в масштабах НЛМК: >50000 пользователей с количеством департаментов >4500.
В качестве примера можно рассмотреть:
сообщества, которые не создаются на более чем 1000+;
мессенджер который зависает при поиске сотрудника по оргуструктуре или при отправке массовых сообщений;
календарь который зависает при создании события более чем на 1000+ человек;
функционал задач, который тоже отказывается работать с нашими масштабами.
Основная проблема заключается в долгих операциях по вычислении орг. структуры, структуры подчинённости, статусов пользователей и т.д. в режиме хита (браузерной сессии) пользователя. Выражаясь математических языком, необходимо построить топологическое пространство на основе декартового произведения множеств и произвести некие действия над этими элементами.
Исходя из этого, бэкенд часть обрывает соединение по таймауту, т.к. считает, что скрипт завис.
Как мы боролись с восстановлением функционала отправки push уведомлений
Для решения проблемы с отправкой пуш-уведомлений был переписан класс мессенджера, наследованный от стандартного CIMMessenger, который:
перехватывает событие OnBeforeMessageNotifyAdd;
записывает исходные данные/параметры сообщения в отдельную очередь;
выкидывает исключение для остановки работы.
Далее был реализован агент, которые читает эту очередь и выполняет необходимые действия, но уже в режиме cli.
Верхнеуровневый алгоритм работы ниже.
Не работает календарь событий
Проблема заключается в невозможности создания и просмотра событий на 1000+ пользователей. Усугубляется тем, что функционал календаря используется во многих местах, сообщества, различные страницы, профиль и т.д.
Ниже несколько проблемных мест:
Файл bitrix/modules/calendar/classes/general/calendar_request.php
\CCalendar: GetDestinationUsers ($arAccessCodes) получает ~60–80к строк для нашего числа пользователей, но это не много. После получения данных календарь получает настройки по каждому пользователю не единым запросом, а итерационно в цикле по каждому пользователю через функцию CCalendarUserSettings: Get (). На что, собственно, и уходит много времени.
Метод updateSearchIndex, который вызывается на каждого участника (файл bitrix/modules/calendar/classes/general/calendar_event.php). Он обновляет столбец SEARCHABLE_CONTENT таблицы b_calendar_event. При 50000 сотрудников столбец забивается огромным количеством текста. С каждым новым добавленным участником к событию работа скрипта замедляется всё сильнее.
Mетод UpdateCounter и получение данных через GetList, в котором есть два места, после которых случается fatal error:
— Большой массив $users, который передается единым запросом к БД, но из-за длины самого запроса БД его не принимает и выдает ошибку.
— Метод Getlist пытается закешировать запрос и падает из-за нехватки памяти.
Мы пробовали переписать функционал и повесить вызов тяжелых запросов на бэк часть путем перехвата событий, но это привело к проблемам в других местах.
В итоге мы создали свой легковесный календарь, который служит верой и правдой, удовлетворяя всем нашим требованиям.
Заключение
Выше приведены наиболее «важные» доработки и решения, но это далеко не полный перечень кастомизации. Некоторые решения стали «скелетонами» для других проектов.
Битрикс24 включает в себя множество функциональных возможностей, многие из которых «из коробки» готовы для использования организациями различного масштаба. Для проекта НЛМК некоторые возможности нам не подошли, в силу специфичных задач и размера внедрения. Доработок было немало, и мы рады, что нам удалось их реализовать и решить все поставленные перед внедрением задачи.
В заключение хотелось отметить, что нам удалось создать полноценную Enterprise платформу, и коробка «Битрикса» стала хорошей «суповой основой» для приготовления блюда Мишленовского уровня. Нужны только хорошие «повара» :)