Как мы допиливали Битрикс и защищали его от хищных роботов

Всем привет! Хочу развенчать миф, что в производственных компаниях решение любого вопроса сопряжено с мириадами бумажек, беготней по отделу кадров, и прочими малоприятными вещами. Расскажу о корпоративном портале НЛМК, который для всех нас — сотрудников офиса и производства — единое цифровое окно. Тут все могут решить самые разные вопросы и получить оперативную информацию.

Я как раз стоял у истоков создания портала и участвовал/участвую во всех его жизненных циклах — от идеи и заканчивая принятием на поддержку с дальнейшим развитием. О причинах выбора платформы Битрикс, и неких других технических тонкостях — расскажу под катом.

1ea3df8d362c150b8d0d08ccf47a65be.jpg

Понятно, что портал — в первую очередь про почитать — новости, блоги, сообщества, мероприятия, акции и т.д. Но в нашем случае это не всё. Тут собрано более 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 и соответствие дешифрованного сообщения исходному. Если условия будут истинными, то пользователь получит запрашиваемую информацию. В противном случае вернется ошибка или произойдет редирект на систему аутентификации.

Блок схема алгоритма работы дополнительной авторизации:

1b678d1430a21ec31481e166fe8d9426.png

Офис внутри портала

Мы продолжаем использовать Sharepoint, так как он хорошо работает с документами Word, Excel — онлайн-просмотр, редактирование. С этой системой портал интегрирован через протокол WOPI.

Office Web Apps Server (далее OWA) — веб-версия популярного офисного пакета приложений, включает в себя облегченные браузерные приложения Word, Excel, PowerPoint и OneNote.

OWA ставится на отдельный физический сервер и отвечает только за отображение документов в браузере. Вся логика по организации хранения файлов ложится на WOPI-host.

Взаимодействие между OWA и хранилищем происходит через WOPI API, который необходимо реализовать.

Схема взаимодействия

24b9a0a18e185ca991eae6bbc3b92fe5.jpg

В схеме взаимодействия представлены три участника:

  • Браузер — фронтенд выполнение JS скриптов;

  • WOPI-host — бэкенд реакция на ajax запросы браузера и API запросы WOPI-client;

  • WOPI-client — запрос информации о файле и формирование страницы просмотра документа.

Рассмотрим подробно схему взаимодействия:

  1. При клике в браузере на элементе, вызывающем просмотр документов, управление передается JS-компоненту, который выполняет ajax-запрос к зарегистрированному BX.ajax.runAction методу, где в одном из параметров передается FILE_ID просматриваемого документа.

  2. В ответ сервер возвращает сформированную особым образом ссылку для передачи управления на WOPI-client.

  3. В зависимости от настроек JS-компонент открывает полученную ссылку либо в Side Panel, либо в новом окне.

  4. WOPI-client начинает процесс формирования страницы просмотра и первым действием посылает запрос к WOPI-host на получение информации о файле (имя файла, размер, …).

  5. Запрос обрабатывается в REST-методе и при положительном результате формируется ответ в формате JSON с информацией о файле для WOPI-client.

  6. WOPI-client посылает второй запрос к WOPI-host на получение самого файла.

  7. Запрос обрабатывается в REST-методе и при положительном результате формируется ответ с бинарным содержимым файла.

  8. 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.

Верхнеуровневый алгоритм работы ниже.

497fe5c5d8ed780ad73456747db0ce0f.png

Не работает календарь событий

Проблема заключается в невозможности создания и просмотра событий на 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, который передается единым запросом к БД, но из-за длины самого запроса БД его не принимает и выдает ошибку.

385b73473e55f7740c1f7c41b3ee0c0a.png

— Метод Getlist пытается закешировать запрос и падает из-за нехватки памяти.

aae47224b8561a8b1baf3bd2c49cc00a.png

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

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

Заключение

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

Битрикс24 включает в себя множество функциональных возможностей, многие из которых «из коробки» готовы для использования организациями различного масштаба. Для проекта НЛМК некоторые возможности нам не подошли, в силу специфичных задач и размера внедрения. Доработок было немало, и мы рады, что нам удалось их реализовать и решить все поставленные перед внедрением задачи.

В заключение хотелось отметить, что нам удалось создать полноценную Enterprise платформу, и коробка «Битрикса» стала хорошей «суповой основой» для приготовления блюда Мишленовского уровня. Нужны только хорошие «повара» :)

© Habrahabr.ru