Доктор в облаке: как мы создали сервис телемедицины для борьбы с коронавирусом в Люксембурге



Разработкой платформы мы занялись… случайно. Всё началось с пандемии, из-за которой правительство Люксембурга и распорядилось создать сервис онлайн-консультаций с врачами. Чтобы выжать из платформы максимум пользы, в неё решили добавить всё, что только нужно для полноценной работы врачей с пациентами. Обмен всевозможными медицинскими документами и даже выдача рецептов на лекарства исключениями не стали — старый вендор всё и сразу заложил в сервис. А затем, чтобы всё добро было в сохранности, к нам и обратились с уже готовым продуктом — нам всего-то и требовалось, что развернуть платформу в защищённой точке присутствия облака.

Через полтора месяца сервис успешно работал в люксембургском дата-центре EDH Tier IV, но ещё при первом знакомстве мы признали в нём слабое звено всего проекта: в отличие от точки присутствия, платформа защищённостью похвастаться не могла и обладала десятком других недостатков. Решение было очевидным — сервис нужно было делать с нуля. Оставалась убедить в этом правительство Люксембурга.



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

1. Систему разрабатывали без фреймворка
Из-за этого проблем в платформе было немыслимое количество. Если бы для создания сервиса использовался какой-нибудь популярный фреймворк — Symfony, Laravel, Yii или что-то ещё, — то даже посредственные разработчики избежали бы большинства проблем безопасности, ведь ORM умеют подготавливать запросы к базе, шаблонизаторы — эндкодить полученный от пользователя контент, а формы по умолчанию защищены CSRF-токенами, да и авторизация и аутентификация, как правило, доступны практически из коробки. В этом же случае платформа заставила нашего разработчика ностальгировать по студенческим временам — код выглядел почти так же, как его первая лабораторная работа в университете.

Вот, например, как было реализовано подключение к базе данных. Учётные данные для подключения были захардкожены выше в том же файле.
if (!isset($db)) {
	$db = new mysqli($db_info['host'], $db_info['user'], $db_info['pass'], $db_info['db']);
	if ($db->connect_errno) {
		die("Failed to connect to MySQL: " . $db->connect_errno);
	}
	if (!$db->set_charset("utf8")) {
		die("Error loading character set utf8 for MySQL: " . $db->connect_errno);
	}
	$db->autocommit(false);
}


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

SQL-инъекции. В 90% запросов попадали введенные пользователями данные без их предварительной подготовки.
$sql = "
	UPDATE user
	SET firstname='%s', lastname='%s', born='%s', prefix='%s', phone='%s', country_res='%s', extra=%s
	WHERE id=%d
;";
$result = $db->query(sprintf($sql,
	$_POST['firstname'],
	$_POST['lastname'],
	$_POST['born'],
	$_POST['prefix'],
	$_POST['phone'],
	$_POST['country'],
	isset($_POST['extra']) ? "'".$_POST['extra']."'" : "NULL",
	$_SESSION['user']['id']
));


XSS-уязвимости. Пользовательский код никак не фильтровался перед выводом:
<button id="btn-doc-password" class="btn btn-primary btn-large pull-right" data-action="<?= $_GET['action'] ?>"><i class="fas fa-check"></i> <?= _e("Valider") ?></button>


Кроме того, попавшая в БД информация, вроде причины консультации с врачом, не фильтровалась ни перед записью в базу, ни перед рендерингом на странице.
Отсутствие проверки прав доступа. Достаточно было иметь аккаунт пациента и подобрать автоинкрементный ID другого пациента, чтобы без труда получить список приёмов и другой информации из профиля. Те же проблемы были и на стороне приложения доктора. Более того, зная ID врача не составляло проблем получить доступ к его приёмам.
Отсутствие проверки загружаемых файлов. Через форму добавления документов можно было загрузить какой угодно файл в любую из папок, доступных для записи пользователям веб-сервера. Помимо того, поиграв с quеry-string запроса на загрузку документа можно было даже скачать файлы с исходным кодом.
$file_dir = $settings['documents']['dir'] . $_SESSION['client']['id'] . DIRECTORY_SEPARATOR . $_GET['id_user'];


Устаревшие сторонние библиотеки. У старого вендора никто не следил за версиями сторонних библиотек, которые, кстати, вместо использования того же Composer просто копировались в проект. Более того, в некоторые из таких сторонних зависимостей вносились изменения «под себя».
Небезопасное хранение паролей пользователей. Для хранения паролей использовались ненадёжные криптографические функции.
$sql = "
	SELECT id, firstname, lastname
	FROM user
	WHERE id=%d AND password=PASSWORD('%s')
;";
$result = $db->query(sprintf($sql, $_SESSION['user']['id'], $_POST['pass']));


Уязвимость CSRF. Ни одна форма не была защищена CSRF-токеном.
Отсутствие защиты от brute-force атак. Её просто не было. Никакой.

Тут можно было бы продолжить и дальше, но уже этих проблем достаточно, чтобы понять: либо у системы были серьёзные проблемы, либо она сама была серьёзной проблемой.

3. Код было сложно поддерживать и расширять
Проблемами безопасности всё не ограничилось. К нашему удивлению, на проекте отсутствовала система контроля версий. Код был совершенно не структурирован. В root-директории web-сервера находились файлы вроде ajax-new.php, ajax2.php и все они использовались в коде. Отсутствовало и чёткое разграничение на слои (presentation, application, data). В подавляющем большинстве случаев файл с кодом представлял собой смешение PHP, HTML и JavaScript.

Всё это привело к тому, что когда нас попросили сделать примитивный backoffice для этой системы, лучшим решением стало развернуть рядом Symfony 4 в связке с Sonata Admin и вообще не касаться существующего кода. Понятно, что если бы нас попросили добавить новые возможности для врачей или пациентов, это отняло бы у нас кучу сил и времени. А поскольку об автоматических тестах речи не шло, вероятность сломать при этом что-нибудь была бы крайне велика.

Всего перечисленного правительству Люксембурга оказалось достаточно — нам дали зелёный свет на разработку новой платформы.

Доктор едет-едет: как мы разрабатывали новую платформу

Готовиться к разработке новой платформы мы начали с самого начала — ещё когда увидели детище старого вендора. Поэтому, когда нам дали добро на разработку новой платформу, мы сразу приступили к созданию её MVP-версии. С этой задачей команда из четырёх PHP- и трёх фронтенд-разработчиков справилась за какие-то три с половиной недели. Все работы велись на Symfony 5, а делегировать удалось только видеозвонки и чаты — их реализовали с помощью нашего сервиса G-Core Meet. Пригодился и backoffice для старой системы: его удалось адаптировать к МVP всего за пару дней. В результате MVP-версия системы на 80% закрывала функционал старой платформы. Сейчас она, кстати, используется и для ещё одной задачи — в один момент мы клонировали MVP для хелпдеска агентства электронного здравоохранения Люксембурга, чтобы администраторы там могли созваниваться с пользователями.

Когда MVP был готов, мы приступили к разработке полноценной новой платформы. В качестве основы для API использовали API Platform и ReactJS в связке с Next.js для client-side. Без интересных задач не обошлось.

1. Реализуем уведомления
Одна из сложностей возникла с уведомлениями. Поскольку клиентами API могли быть как мобильный приложения, так и наши SPA, требовалось комбинированное решение.
Сначала мы выбрали Mercure Hub, с которым клиенты взаимодействуют через SSE (Server Sent Event). Но как бы это решение не пиарили сами создатели API Platform, наша мобильная команда его забраковала, так как с ним получать уведомления приложение могло только в активном состоянии.

Так мы пришли к Firebase, с помощью которого удалось добиться поддержки нативных пушей на мобильных устройствах, а для браузерных приложений оставили Mercure Hub. Теперь, когда в системе происходило какое-то событие, мы уведомляли пользователя об этом через нужный нам private-канал в Mercure Hub и, помимо этого, отправляли пуш ещё и на Firebase для мобильного устройства.

Почему мы сразу не реализовали всё на Firebase? Тут всё просто: несмотря на поддержку web-клиентов, браузеры без Push API — тот же Safari и большинство мобильных браузеров — с ним не работают. Однако, мы ещё планируем реализовать пуш-уведомления от Firebase для тех пользователей, которые используют поддерживаемые браузеры.

2. Функциональные тесты
Другая интересная ситуация возникла, когда мы занимались функциональными тестами для API. Как известно, каждый из них должен работать в чистом окружении. Но каждый раз поднимать базу и заполнять в ней базовые fixtures + fixtures, необходимые для тестирования, оказалось накладно с точки зрения производительности. Чтобы этого избежать, мы решили на начальном этапе поднимать базу данных на основании маппинга сущностей (bin/console doctrine:schema:create) и уже затем добавлять базовые fixtures (bin/console doctrine:fixtures:load).

Затем с помощью расширения dama/doctrine-test-bundle мы добились того, чтобы выполнение каждого теста оборачивалось в транзакцию и в конце тест-кейса откатывало её без фиксации. Благодаря этому, даже если в ходе тестирования в базу вносятся изменения, они не фиксируются, а база после прогона остаётся в том же состоянии, что и до запуска PHPUnit.
Чтобы на каждый эндпоинт был написан хотя бы один тест, мы сделали auto review тест. Он обнаруживает все зарегистрированные роуты и проверяет наличие тестов для них. Так, например, для роута app_appointment_create он проверяет, есть ли в папке tests/Functional/App/Appointment файл CreateTest.php.

Дополнительно за качеством кода следят PHP-CS-Fixer, php-cpd и PHPStan c расширениями типа phpstan-strict-rules.

3. Клиентская часть
Для врачей и пациентов мы создали два независимых клиентских приложения с одинаковым UI и схожим возможностями. Чтобы наладить переиспользование функционала и UI в них, мы решили применить монорепозиторий, который включает в себя библиотеки и приложения. При этом сами приложения собираются и деплоятся независимо друг от друга, но могут зависеть от одних и тех же библиотек.

Такой подход позволяет в одном пул-реквесте создать фичу (библиотеку) и интегрировать её во все нужные приложения. Это преимущество и привело к использованию монорепозитория вместо реализации фич в отдельных npm-библиотеках и проектов в разных репозиториях.
Для конфигурации монорепозитория используется библиотека ns.js, которая с коробки позволяет собирать библиотеки и приложения React и Next.js, а именно этот стек и используется в проекте. Чтобы следить за качеством кода, мы используем ESLint и Prettier, для написания unit-тестов — Jest, а для тестирования компонентов React — React Testing Library.

Доктор прибыл: что получилось в итоге
Всего за пять месяцев все проблемы были разрешены, а новая платформа стала доступна пользователям любых устройств: мы подготовили веб-версию сервиса, а также мобильные приложения для iOS и Android.

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

Платформа доступна для всех медицинских профессионалов, жителей и работников Люксембурга. Сейчас она работает в 2-х крупнейших учреждениях здравоохранения страны — в Больнице им. Роберта Шумана (Hôpitaux Robert Schuman) и Больничном центре им. Эмиля Мэйриша (Centre Hospitalier Emile Mayrisch). Сервис развёрнут в защищённой точке присутствия облака G-Core Labs в люксембургском дата-центре EDH Tier IV, где для него настроена виртуальная среда в соответствии с нужными спецификациями.

https://gcorelabs.com

Аналитический отчет DDoS-GUARD о DDoS-атаках 2018-2020



В 2020 году мир столкнулся с пандемией коронавирусной инфекции. Локдаун во многих странах стал причиной еще большего проникновения интернета в жизнь мирового сообщества. Количество пользователей всемирной сети увеличилось на 7% – это 298 миллионов новых пользователей. По данным DataReportal в “ковидное” время люди проводили онлайн в среднем 100 дней в прошлом году. Широкое распространение получили устройства «Интернета вещей» (IoT) и облачных сервисов.

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

DDoS-атаки — серьезная угроза доступности интернета. Время простоя сервиса, задержки в работе или недоступности сайта могут существенно повлиять на репутацию бренда, доверие клиентов и доход компании.

Какими были атаки на клиентов DDoS-Guard за последние три года? Читайте в нашем отчете.

Отчет содержит наблюдения за DDoS-атаками на клиентов DDoS-Guard за 2018-2020 годы.

Ключевые моменты
Количество атак: Количество атак на сеть DDoS-Guard каждый год увеличивается вдвое. Если считать данные за 2020 год максимальными (100%), то показатели за 2019 год — 57%, а за 2018 и вовсе 33%.


Продолжительность: 98% всех наблюдаемых атак длились менее 1 часа.

Размер: Наблюдается тенденция смещения на крупные DDoS-атаки размером более 5 Гбит/с.

Крупные DDoS-атаки: Количество атак более 100 Гбит/с в 2019 году выросло в 6,3 раз по сравнению с 2018 годом и продолжило расти меньшими темпами в 2020 году.

Распределение атак по месяцам
Впервые в 2020 году во всех месяцах, кроме октября, общее количество зафиксированных нами DDoS-атак на уровнях L3-L4 OSI превысило количество атак в самый активный месяц 2019 года — август.

Самым насыщенным месяцем 2020 года был январь. Количество DDoS-инцидентов в январе в 2,8 раза превысило среднемесячный показатель 2019 года.

Анализ распределения количества атак по месяцам за 3 года дает понять, что атаки злоумышленников не носят сезонный характер. Только август стабильно входит в топ-3 самых насыщенных месяцев года.



Распределение DDoS-атак по дням недели
Самыми активными днями недели в 2020 году для DDoS-атак были среда, четверг и пятница. В понедельник и выходные дни нами был замечен спад активности.



Параметры атак
Существуют разные способы измерения размера DDoS-атак на уровне L3-L4 OSI. Один из них — это объем трафика или его битрейт (бит в секунду). Другой — это количество пакетов или «скорость передачи пакетов» (пакетов в секунду).

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

Структура
В 2020 году большинство атак были размером в диапазонах 1-5 Гбит/с и 1-10 млн пакетов в секунду (Mpps) — большинство атак совершаются любителями с использованием простых инструментов, которые стоят не более нескольких долларов. Небольшие атаки могут также служить уловкой для инженеров по безопасности: ими отвлекают от других видов кибератак или проверяют существующие механизмы защиты.


Размер
Последние 2 года наблюдается рост атак размером более 100 Гбит/с. Количество таких атак в 2019 году выросло в 6,3 раза по сравнению с 2018 годом и продолжило расти в 2020 году.


Увеличение количества крупных DDoS-атак — тревожный знак. Это происходит из-за того, что увеличивается мощность телекоммуникационного оборудования, доступные для конечного пользователя скорости передачи данных становятся выше, злоумышленники становятся все изощреннее и используют инструменты, которые позволяют проводить более масштабные атаки. Также необходимо отметить, что все чаще крупные атаки имеют негативные последствия не только для сети компании, но и для промежуточных поставщиков услуг — хостинг-провайдеров, дата-центров, интернет-провайдеров.

Протоколы
Вектор атаки — это термин, который используется для описания метода атаки. Самыми популярными атакуемыми протоколами в 2020 году по прежнему являются TCP и UDP. На них приходится 59% и 28% случаев соответственно.


Защита сетевой инфраструктуры от DDoS-атак
DDoS-Guard с 2011 года специализируется на защите от DDoS-атак на уровнях L3-L7 OSI. Для этого мы используем уникальные каскады фильтров, технологии искусственного интеллекта и собственные разработки. Непрерывную работоспособность обеспечивают высококлассные специалисты отрасли. Круглосуточно мы на страже вашего бизнеса в сети.

Нам доверяют тысячи клиентов, среди которых: hh.ru, Reg.ru, Apteka.ru, ISP system, Центральный банк России, Авантел, Мастертел, ПрофМедиа, КонсультантПлюс, АиФ, АвтоРадио, Университет Синергия, НТВ, СберСтрахование, ТТК, Высшая школа экономики, Хёрст Шкулёв Паблишинг.

Клиенты выбирают защиту DDOS-GUARD, потому что у нас:
  • геораспределенная сеть с узлами фильтрации по всему миру;
  • собственные разработки для анализа и фильтрации трафика;
  • прозрачная ценовая политика без тарификации за атаки;
  • бесплатный тестовый период для типовых решений;
  • детализированная статистика по трафику в личном кабинете.
Больше информации о защите сетевой инфраструктуры вы можете посмотреть здесь.

Для заказа индивидуальной консультации специалиста отправьте письмо на электронный адрес sales@ddos-guard.net.

https://ddos-guard.net

SBG1/AD => SBG4



После завершения работы SBG-1 мы переносим серверы SBG-1 в центр обработки данных SBG-4.
Серверы SBG-1, расположенные в RACK 61A *, 61D * и 62A *, будут перемещены в SBG-4 в стойках 90A * / B * / C * / D *.
В 37 стойках необходимо перенести 758 серверов.

Обновление 1 апреля, 19:30:
Завершение серверов: 75 (10%)

Обновление 1 апреля, 23:00:
Завершение серверов: 116 (15%)

Обновление 2 апреля, 12:30:
Завершение серверов: 140 (18%)

Обновление 2 апреля, 15:30:
Завершение серверов: 209 (27%)

Обновление 2 апреля, 21:30:
Завершение серверов: 237 (31%)

Раздам красивые поддомены - russia.network



Пишите NS — выдам поддомен сразу на NS серверы, чтобы вы сами управляли.
Какой-ниб типо cloud.russia.network — себе зарезервировал. Под VM-6 буду раздавать по 300р.

А вот разное GEO или просто бренд какой-ниб который хорошо подходит под Russia Network — без проблем.


Под мусор и чернь — не раздаю, увижу сразу бан.
Анонимам тоже не очень хотелось бы раздавать. Поэтому лучше представиться кто вы, когда просите.

В 2015 кстати тоже раздавал когда только network появилась зона. Правда спустя 5 лет так и не нашел применения тому домену, а на «ту идею» уже купил новые.

Новый тариф Free+

Здравствуйте!



Рады сообщить, что теперь бесплатный хостинг стал ещё лучше и быстрее!

Мы объединили услуги расширенного бесплатного хостинга и активацию тарифа за деньги в единый пакет Free+. Этот пакет включает в себя все плюсы бесплатного расширенного хостинга:

— Возможность активации хостинга без верификации
— Отсутствие требований к поддержанию бесплатного хостинга: не нужно заходить в личный кабинет, писать отзывы
— Можно использовать бесплатные сертификаты на своих сайтах

Также мы полностью сохранили стоимость услуги (от 30 рублей в месяц) и увеличили следующие ресурсы:

— Диска: 2000 мегабайт (против 1000 мб ранее)
— Оперативной памяти: 384 мегабайт (против 256 мб ранее)

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

Ссылка для заказа тарифов Free/Free+ — my.hostiman.ru/order/2



С уважением, Ваш хостинг-провайдер HostiMan.

Международный день веб-мастера. Скидки 40% на vds



4.04 — Международный день веб-мастера. Скидки 40% на vds
Ежегодно 4 апреля веб-мастера всех уголков мира отмечают свой профессиональный праздник — Международный день веб-мастера. Дата этого праздника выбрана не случайно, если присмотреться то 4.04 по своему написанию напоминает ошибку 404 (Not Found), которая хорошо знакома любому веб-мастеру. Более того, 4 апреля отмечают ещё один праздник — Международный день Интернета.

Наша компания не могла оставить без внимания такое событие и мы объявляем о старте праздничной распродажи, которая приурочена к Международному дню веб-мастера. В период с 4 апреля по 19 апреля 2021 года (включительно) все желающие могут сделать новый заказ vds или виртуального хостинга со скидкой 40% (максимальный срок заказа 6 месяцев). Таким образом, стоимость виртуального сервера составит всего от € 1.79 в месяц. Для того, чтобы воспользоваться скидкой, во время заказа сервера или виртуального хостинга используйте промо-код notfound21

Также мы подготовили сюрприз в рамках акции «Старый друг лучше новых двух» для друзей, которые ранее пользовались нашими услугами, но по каким-либо причинам отказались от них. Заказав VDS или виртуальный хостинг в период проведения акции (в том числе при использовании промо-кода, дающего скидку), Вы получаете:
  • восстановленную скидку по программе лояльности 15%, которая учитывается при последующих продлениях услуги;
  • в подарок 1 месяц использования vds или виртуального хостинга.
Для получения бонуса «Старый друг лучше новых двух» после оплаты услуги необходимо сделать запрос в финансовый отдел.

Если у Вас уже есть активный заказ vds или виртуальныого хостинга, то Вы также можете получить бонус: продлите заказ на год (при продлении на 12 месяцев будет учитываться скидка 10% + скидка по программе лояльности автоматически) и получите в подарок 1 месяц бесплатно. Для получения бонуса, после оплаты продления заказа, необходимо создать запрос в финансовый отдел.
Не упустите шанс сделать новый заказ или продлить уже активный с большой скидкой.

Акция действует с 04.04.2021 по 19.04.2021 включительно и/или до момента исчерпания акционных предложений vds и виртуального хостинга (в зависимости от того, какое событие наступит ранее).
С уважением, Friendhosting LTD

https://my.friendhosting.net

Новый сервис для хранения секретов Yandex Lockbox



Новый сервис Yandex Lockbox вышел в стадии Preview. Теперь в инфраструктуре Yandex.Cloud вы можете безопасно хранить секреты: логины и пароли, ключи сертификатов серверов или ключи сервисного аккаунта в облаке и другие конфиденциальные данные.
cloud.yandex.ru/services/lockbox

Секреты хранятся только в зашифрованном виде — Yandex Lockbox работает в связке с сервисом криптографических ключей Yandex Key Management Service.
cloud.yandex.ru/services/kms

Как работает сервис
Вы можете создавать секреты в консоли управления или через API и настраивать доступ к ним с помощью сервисных ролей.
cloud.yandex.ru/docs/lockbox/security/


Секреты безопасно хранятся в Yandex Lockbox и доступны для использования в других сервисах платформы. Также можно обращаться к секретам Yandex Lockbox из внешних систем с помощью gRPC или REST API. Подробнее о работе с сервисом читайте в документации.

Сервис поможет
  • Безопасно и централизованно хранить секреты и контролировать доступ к их значениям.
  • Управлять жизненными циклами секретов.
  • Проходить аудиты и соответствовать требованиям информационной безопасности.

Сервис находится на стадии Preview и не тарифицируется.
cloud.yandex.ru/docs/overview/concepts/launch-stages
cloud.yandex.ru/docs/lockbox/quickstart

Запуск конструктора виртуальных серверов!



Рады сообщить о запуске конструктора виртуальных серверов!

Процессор, количество ядер, ОЗУ, дисковое пространство — оплачивайте ровно столько ресурсов, сколько вам нужно!

Конструктор доступен как для посуточной, так и для ежемесячной оплаты. Также VPS можно конфигурировать и после активации. Например, если вы заказали сервер на 4 ядра и 8ГБ ОЗУ, а в последствие выяснилось, что вам все-таки нужно 3 ядра и 10ГБ ОЗУ, для этого достаточно лишь изменить значения в личном кабинете — система скорректирует параметры и сервер перезагрузится.

Заказывай выгодно: msk.host/products/vds

Обновление почтового клиента

Спешим сообщить, что мы обновили наш почтовый клиент Roundcube до версии 1.4.11 с новым дизайном. Благодаря стильному оформлению пользоваться почтой стало в разы удобнее и приятнее.

В новой версии доступны:
  • полная поддержка на мобильных устройствах;
  • новый пользовательский интерфейс;
  • возможность email-рассылки;
  • улучшенная интеграция Mailvelope;
  • функция повторной отправки электронной почты;
  • и множество изменений улучшающих работу клиента.

sprinthost.ru