Рейтинг
0.00

G-Core Labs Хостинг

1 читатель, 9 топиков

102 IX: как мы подключили больше ста точек обмена трафиком и автоматизируем пиринг

Качественный BGP-пиринг — одна из главных причин хорошей связности глобальной сети G-Core Labs, охватывающей пять континентов. Мы присутствуем уже на 102 точках обмена трафиком, работаем с 5000 партнёрами по пирингу и входим в топ-10 сетей мира по количеству прямых пирингов. О том, как нам это удаётся — под катом.



Что такое BGP-пиринг
BGP-пиринг — это обмен интернет-трафиком между автономными системами (AS) напрямую, в обход вышестоящих операторов связи (аплинков).

Он помогает участникам точки обмена трафиком (IX, Internet Exchange) сокращать маршруты передачи данных между сетями, снижать затраты на трафик, а также в большинстве случаев и время отклика (RTT). Через точку обмена трафиком проще соединиться сразу c несколькими участниками: вместо отдельного коннекта к каждому достаточно одного соединения с IX, где все эти участники присутствуют.

Каждый участник IX выигрывает за счёт экономии на каналах и закупке трафика у аплинков. Это выгодно и для конечного пользователя: сокращаются сетевые задержки и время отклика до ресурсов.

Таким образом, чем больше точек обмена трафиком, тем лучше связность интернета и тем он доступнее.

Первые точки обмена трафиком начали появляться с 1994 года в крупных европейских городах: Лондоне (LINX), Франкфурте (DE-CIX), Амстердаме (AMS-IX), Москве (MSK-IX). Сейчас во всём мире работает более 500 IX



Как мы выбираем дата-центры и точки обмена трафиком
Мы подбираем дата-центры по количеству операторов первого (Tier1) и второго (Tier2) уровней и локальных IX.
  • Публичный пиринг. Выбираем ведущих интернет-провайдеров в каждом регионе и стыкуемся с ними в крупнейших точках обмена трафиком.
  • Приватный пиринг. У нас более 5000 партнёров по пирингу по всему миру. Это позволяет сохранять локальность трафика в разных регионах, сокращая задержки доставки контента между сетями.

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

Быть участником IX недостаточно, так как многие eyeball-операторы связи имеют закрытую пиринговую политику (например, Selective или Restrictive). Это означает, что оператор не отдаёт свои сети на Route Server (сетевой сервис, позволяющий упростить пиринговое взаимодействие между участниками IX и сократить количество индивидуальных администрируемых пиринговых сессий).

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

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

Почему мы не стали использовать готовые решения по автоматизации пиринга
Подходы к автоматизации пиринга от большой четвёрки глобальных операторов (Google, Microsoft, AWS, Cloudflare) нам не подошли.

Google и Microsoft используют Web Peering Portal, к которому непросто получить доступ. К тому же в случае Microsoft надо оформить минимальную подписку на Azure.

После получения доступа вам нужно заполнить информацию о себе (как об операторе), пройти верификацию и только потом получить возможность создавать запросы на пиринг. Для каждого запроса обычно создаётся отдельная задача, где также требуется заполнить информацию и внести (выбрать) параметры для BGP-сессии.

Как правило, на создание одного запроса может уходить до 10 минут. Теперь представим, что нам нужно сделать 200 таких запросов, чтобы поднять все нужные нам сессии по всему миру. И это только для одного оператора. Можно легко посчитать, сколько времени нужно затратить на такую задачу. И это без учёта времени ответа на письма, в которых могут быть дополнительные вопросы. Куда проще послать одно письмо из нескольких слов и в течение суток получить ответ уже с преднастроенной конфигурацией.

С какими проблемами пришлось столкнуться:
  • Человеческий фактор. Управлять конфигурацией в ручном режиме не представлялось возможным — одной из главных проблем стал бы человеческий фактор. Поскольку как бы ни был хорош сетевой инженер, в таких глобальных масштабах и он может допускать ошибки, которые могут приводить к простою сервиса.
  • Автоматизация. Мы разработали собственную систему автоматизации с нуля и постоянно её дорабатываем. Ведь важно не только настроить BGP-сессию, но и поддерживать дальнейшее оперирование. Например, по статистике ежедневно мы поднимаем более 40 сессий, а удаляем примерно 20. Если смотреть за месяц, то это примерно 1200 новых сессий и 600–800 удалённых.

Как автоматизирован наш пиринг сегодня
Достаточно послать запрос на noc@gcore.lu с темой Peering и номером ASN, отличным от нашей (199524).

Зачастую наши потенциальные пиринг-партнёры сами направляют запросы на организацию пиринга. Далее эти запросы попадают в оркестратор и система проводит анализ их целесообразности. Если запрос удовлетворяет нашим критериям, система автоматически настраивает соответствующие сессии и высылает конфигурацию участнику.

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

Бывают и обратные ситуации, когда мы делаем запрос на пиринг с потенциально интересующим нас партнёром, как правило, с крупным оператором.

Как мы оцениваем целесообразность пиринга:
  • В первую очередь оценивается количество indirect-трафика (то есть трафика через наши upstream-каналы) за последние 30 дней.
  • Если значение выше порогового, то в оценку идут другие параметры, например, есть ли сети данного оператора на Route Server в полном составе.
  • Затем идёт выбор точек обмена трафика наиболее эффективных для нас.

Какие данные мы анализируем
Мы анализируем данные, которые собираются с наших пограничных маршрутизаторов посредством NetFlow/JFlow. Имея эти данные, мы знаем о своём трафике всё до последнего байта.

Как мы оцениваем эффективность пиринга и связность сети
Мы используем телеметрию с наших сервисов. Для этого у нас есть разные продукты, в том числе CDN, насчитывающая уже больше ста точек присутствия и входящая в топ-10 сетей доставки контента в Европе и Азии по данным CDNPerf.

Основные метрики, которые мы берём в расчёт со стороны сети, — это Packet Loss и Round-Trip Time до конечного пользователя.

На скольких IX мы присутствуем
Мы присутствуем уже на 102 точках обмена трафиком по всему миру. Это стало возможным благодаря мощной сетевой инфраструктуре, без которой пирингов быть не может. Ведь чтобы включить точку обмена трафиком нужно локальное присутствие, а это уже подразумевает наличие инфраструктуры, сетевого оборудования и каналов передачи данных.


Как мы планируем улучшать связность сети
Сейчас в приоритете страны Латинской Америки, Африки и Азии. Это потенциально очень большой и перспективный рынок, над которым мы работаем и будем продолжать работать.

Приглашаем к бесплатному пирингу
G-Core Labs — быстро развивающийся контент-оператор с собственной экосистемой облачных сервисов и глобальной инфраструктурой. В её развитии нам помогают технологии Intel: в апреле 2021 мы одними из первых начали интеграцию Intel Xeon Scalable 3-го поколения (Ice Lake) в серверную инфраструктуру своих облачных сервисов.

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

Преимущественно мы заинтересованы в пиринге с крупными операторами широкополосного доступа, а также с мобильными операторами. Для получения более детальной информации посетите нашу страницу на PeeringDB или напишите нам по адресу noc@gcore.lu. Подробней о пиринге можно узнать на этой странице. gcorelabs.com/ru/internet-peering/

Доставить за 30 мс: 5 лучших плагинов для оптимизации работы WordPress в 2021 году

Вы и без нас знаете, что у WordPress есть проблемы. Да, при создании сайтов им пользуются в 40% случаев — на то он и простой, как трёхколёсный велосипед. Но проблема в том, что при желании из этого велосипеда легко можно собрать хоть Франкенштейна социальную сеть с экосистемой встроенных сервисов — достаточно установить десяток-другой, а то и всю сотню плагинов на сайт. В результате возникают проблемы с безопасностью, совместимостью и скоростью загрузки сайта. Хорошая новость в том, что есть как минимум пять способов заставить WordPress работать лучше — подробней о них в нашей подборке плагинов. О большинстве из них вы уже наверняка слышали, но в списке есть и одна новинка — вместе с другими решениями она позволит вашим пользователям забыть об ожидании загрузки контента на сайте.


Шаг 1: устанавливаем дополнительные меры защиты
Зачем вам спорткар, если у него не закрываются двери? Так же всё обстоит и с WordPress-сайтами, на которые по разным оценкам приходится около 80% всех атак на CMS: как бы привлекательна ни была высокая скорость работы, сначала нужно позаботиться о безопасности. Мы не будем останавливаться на очевидных советах вроде важности регулярного обновления системы и плагинов до актуальных версий — об этом вы наверняка знаете и без нас, — но расскажем об одном из лучших способов обеспечить сайт на WordPress дополнительными мерами защиты. Плагин iThemes Security, ранее известный как Better WP Security, — это комплексное решение, которое разом справляется с рядом задач:
  • Распознаёт уязвимости других плагинов и определяет устаревшие версии ПО;
  • Обнаруживает и сообщает администратору об изменениях в файлах;
  • Сравнивает файлы ядра с текущей версией WordPress;
  • Предупреждает об использовании старых паролей;
  • Определяет и блокирует вредоносных пользователей;
  • Обеспечивает резервное копирование баз данных;
  • Позволяет настроить двухфакторную аутентификацию.

Всего в плагине предусмотрено более 30 мер защиты. Недостаток лишь в том, что многие из них доступны в платной версии плагина iThemes Security Pro. Последняя обойдётся в $48 за годовую лицензию на один сайт, $77 — за 10 сайтов или $120 — за любое количество.

Шаг 2: настраиваем кеширование
Долгосрочное хранение постраничного или транзитного кеша в WordPress по умолчанию не предусмотрено. А жаль: кеширование в разы ускоряет передачу пользователям запрашиваемых данных. Очевидно, это хорошо сказывается и на отношении к сайту поисковиков, и на поведенческих факторах. Помимо того, оно снижает нагрузку на сервер, так как ему не приходится больше раз за разом выполнять одни и те же операции. Простой способ добавить эту технологию на WordPress-сайт — установить плагин WP Super Cache. Он заменяет динамический HTML сайта статической версией и затем выдаёт её пользователям, что и сокращает время загрузки контента. В плагине предусмотрено всё нужное для повышения скорости работы сайта, в том числе разные механизмы обработки данных на выбор пользователя — так, например, Apache mod_rewrite обходит стороной все медленные и требовательные к ресурсам PHP-скрипты.

Помимо того, что плагин совершенно бесплатный, у него есть и другое важное преимущество — наличие поддержки CDN на выбор пользователя благодаря интеграции с OSSDL CDN off-linker. Для этого достаточно изменить URL-адреса файлов (кроме .php) в папках wp-content и wp-includes на сервере таким образом, чтобы они указывали на другое имя хоста.

Шаг 3: подключаем CDN
Если WP Super Cache позволяет кешировать файлы WordPress-сайта, то сеть доставки контента ускоряет их передачу до пользователей. Это происходит благодаря тому, что с помощью CDN статические данные передаются не с основного сервера, а с кеш-серверов, распределённых по миру. Таким образом, нужные файлы пользователи получают с ближайших к ним точек присутствия сети CDN-провайдера, что ускоряет загрузку сайта, уменьшает нагрузку на сервер и сокращает количество расходуемого трафика.

Подключить CDN можно как с помощью OSSDL CDN off-linker, встроенного в WP Super Cache, так и другим простым способом — установив плагин G-Core Labs CDN. Детальная настройка работы сети доставки контента с его помощью займёт 15 минут. Для этого после установки достаточно указать персональный домен из личного кабинета G-Core Labs в настройках плагина, а затем выбрать типы файлов и папок, которые вы хотите раздавать через сеть доставки контента. Расширение автоматически настроит замену существующих статических ссылок на CDN и эффективно ускорит доставку контента: для этого в сети используются решения на основе процессоров Intel Xeon Scalable второго и третьего поколения, а точки её присутствия расположены более чем в 100 городах по всему миру, что обеспечивает время загрузки сайта в пределах 20–30 миллисекунд.

Шаг 4: отключаем лишние опции WordPress
После того, как кеширование всего, что можно кешировать, настроено, а всё, что можно доставлять через CDN, через неё и доставляется, хорошо бы избавиться от всего лишнего. Для решения этой задачи предназначен плагин Perfmatters, который позволяет оптимизировать работу WordPress без изменения кода и файла functions.php.

В настройках плагина предусмотрен длинный перечень возможностей CMS, которые можно включать и отключать одним кликом. Скажем, если вы не добавляете на страницы сайта emojis, то к чему вам их поддержка — отключите её, чтобы сократить общее количество HTTP-запросов и размер страницы. А если вам не нужны редакции страниц трёхлетней давности, то и хранить их нет смысла — сократите их число до нужного количества с помощью Perfmatters. Подобных настроек в плагине предусмотрены десятки: от изменения интервалов автосохранений до отключения комментариев и поддержки Google Maps на страницах, где их нет.

Шаг 5: настраиваем резервное копирование
Что бы ни произошло с сайтом, если у вас есть бэкап — всё поправимо. Желательно только, чтобы бэкап был не годичной давности. Как раз таки для избежания таких проблем и предусмотрены плагины для настройки резервного копирования. Понятно, что справиться с этой задачей можно и вручную или средствами хостинг-провайдера. Однако, плагины — простое решение, которое позволяет автоматизировать весь процесс копирования за несколько минут. Одним из лучших среди них считается UpdraftPlus, это расширение установлено на трёх с лишним миллионах сайтов, а среди его пользователей такие компании и организации, как Cisco, Microsoft и NASA.

Бесплатная версия плагина позволяет сохранять полные копии ресурса и затем выгружать их на локальный диск или в удобное облачное хранилище — для этого в нём предусмотрена поддержка Dropbox, Google Drive и других сервисов. Также резервные копии можно отправлять по FTP и SFTP, а настройка расписания позволяет автоматизировать не только процесс резервного копирования, но и сохранение копий в удобное хранилище. Платная версия плагина — UpdraftPremium — обойдётся в $70 за лицензию на два сайта, но разработчики предлагают и другие планы с «оптовыми» ценами.

Bare metal за 5 минут: как мы из андерклауда сделали облачный сервис для аренды выделенных серверов

Хоть мы тогда и сами об этом не знали, но создавать сервис для аренды выделенных серверов мы начали два года назад. При запуске новых регионов публичного облака нам требовалось оперативно развернуть множество серверов разных конфигураций по всему миру, но целыми днями заниматься этим вручную никто не хотел. Вместо людей со стальными нервами мы нашли более изящное решение в лице Ironic — сервиса OpenStack для провижининга «голого железа». Совместно с другими инструментами он позволял и раскатывать образ, и настраивать систему, и на тот момент этого уже было достаточно. Позже в Ironic появились такие возможности, что это решение начало закрывать вообще все наши задачи по управлению инфраструктурой в облаке. А раз уж мы справились с этим, то почему бы не сделать на основе служебного инструмента публичный сервис с автоматической подготовкой выделенных серверов?

Шёл 2014 год…
Серверы мы деплоили на коленке через PXE boot и kickstart. Это решение хоть и работало, но имело недостатки:
  • Сети переключались вручную;
  • Выбор сервера и его перевод в загрузку по PXE выполнялся вручную;
  • Сборка рейда и обновление прошивок — тоже manual mode.

Сначала для решения проблемы мы хотели просто написать свой bash-скрипт, который и будет всё делать. К счастью, руки до этого так и не дошли, и мы рассмотрели все существующие на тот момент варианты:
  • MaaS — предлагался как коробочное решение от одной очень солидной компании за не менее солидную сумму;
  • Cobbler — тут нам сказать особо нечего, так как в команде не нашлось инженеров с необходимым знанием технологии;
  • Foreman — казался неплохим решением, тем более что мы использовали Puppet;
  • OpenStack Ironic — хоть инженеров с опытом по этому продукту в команде тогда и не нашлось, но у нас уже был опыт работы с Openstack по виртуализации. Так что ставка была сделана на то, что в будущем мы сможем красиво всё собрать в один OpenStack. Понятное дело, в этом мы глубоко заблуждались, но об этом позже.

В итоге автоматизировать деплой серверов мы решили с помощью Ironic, а эти работы в дальнейшем положили начало куда более масштабному проекту. Рассказываем, как так вышло.

Шаг 1: автоматизируем управление внутренней инфраструктурой облака
Наши решения работают на основе разных технологий Intel: облачные сервисы — на процессорах Intel Xeon Gold 6152, 6252 и 5220, кеш-серверы CDN — на Intel Xeon Platinum, а в апреле 2021 мы также одними из первых в мире начали интеграцию Intel Xeon Scalable 3-го поколения (Ice Lake) в серверную инфраструктуру своих облачных сервисов. Чтобы вручную управлять всем этим пулом железа для сервисных целей облака, ежедневно разворачивать по всему миру серверы с разными конфигурациями и всё это ещё и как-то поддерживать, нам требовался либо целый штат специалистов, либо инструменты автоматизации, которые бы обеспечили высокий темп экспансии в регионы и облегчили жизнь нашим админам. Как уже говорилось, для этих целей мы решили использовать Ironic. На момент внедрения — два года назад — это был уже достаточно зрелый сервис со следующими возможностями:
  • Удалённое управление серверами;
  • Сбор информации о конфигурациях и коммутации ещё не запущенных серверов;
  • Установка ОС на произвольном сервере;
  • Настройка сети с использованием протоколов 802.1q и 802.3ad.

Нас такое решение вполне устраивало, поэтому на нём мы и остановились, а для настройки операционной системы на сервере решили использовать cloud-init. Рабочий процесс был простым и прозрачным:
  • Сначала формировался загрузочный ISO-диск с информацией о настройках сервера, пакетах и сетевых интерфейсах.
  • На физическом сервере запускался процесс исследования с помощью компонента Ironic Inspect.
  • Затем этот сервер Ironic загружал с конфигурационным образом.
  • Начинался процесс автоматической установки CentOS, настраивались сетевые интерфейсы, ставились пакеты.

Подробней весь жизненный цикл можно увидеть на следующей схеме:


Так всё и продолжалось, пока Ironic становился более зрелым продуктом. Со скрипом, но всё же в нём появились новые возможности, в том числе и всё необходимое для автоматизированного управления RAID-контроллерами, обновления прошивок и развёртывания образов системы с произвольных HTTP-ресурсов через интернет. Так что со временем у нас появилось полноценное решение для автоматизации вообще всех задач по управлению инфраструктурой в облаке — им стала связка Ironic с cloud-init и используемой нами CI/CD. Чем не задел на что-то большее?

Шаг 2: планируем создание новой услуги из андерклауда
Сначала мы использовали инструмент только для служебных целей. Он хорошо справлялся с автоматизацией задач по управлению инфраструктурой облака, но этим наши планы не ограничивались: нам также требовалось подготовить решение для провижининга арендуемых заказчиками выделенных серверов. Оно бы пришлось как нельзя кстати, так как упрощало аренду серверов bare metal для потенциальных клиентов, а сомнений в их наличии у нас не было. На тот момент пользователи и без того часто заказывали у нас выделенные серверы — обычно они разворачивали на них продакшн-среды для высоконагруженных приложений, так как «голое железо» оказывалось производительней и безопасней виртуальных машин, к тому же на нём не было «шумных соседей». Вот только времени на подготовку каждого физического сервера у нас уходило в разы больше, ведь для этого всё требовалось делать вручную:
  • Сначала выбирать из пула доступных наиболее подходящий сервер;
  • Затем применять определённую конфигурацию для оборудования (настроить сетевые интерфейсы, RAID-контроллеры);
  • Постоянно поддерживать в актуальной версии системное ПО (firmware или версию BIOS);
  • Загружать и устанавливать операционную систему, выполнять пост-инстал скрипты.

Автоматический провижининг избавил бы нас от лишних сложностей. К тому же его потенциал не ограничивался упрощением подготовки серверов: он вполне мог лечь в основу полноценного облачного сервиса, с помощью которого пользователи будут за несколько минут разворачивать узлы bare metal, а арендовать выделенный сервер будет не сложней виртуального. Так из внутреннего компонента мы решили развивать новую услугу для пользователей облака — Bare-Metal-as-a-Service.

Шаг 3: автоматизируем провижининг выделенных серверов в публичном облаке
С помощью автоматизации мы планировали решить несколько задач: ускорить подготовку выделенных серверов, сделать возможной одновременную работу сразу с несколькими из них, сократить простой между операциями и исключить человеческий фактор. Добиться этого нам удалось с помощью общедоступных инструментов и пары собственных доработок. Объяснить, как всё работает, проще всего на конкретном примере — теперь для того, чтобы сервер стал доступен для заказа клиентом, мы выполняем следующие действия:
  • Заносим сервер в CMDB (сейчас для этого у нас уже есть NetBox).
  • Через Redfish выполняем преднастройку BIOS — активируем загрузку по PXE и настраиваем её режимы, — а также создаём пользователей для удалённого управления.
  • Проверяем работоспособность сервера и передаём управление Ironic.
  • Инженер добавляет сервер в нужную плайсмент-группу.
  • Убеждаемся, что данные в CMDB и Ironic совпадают — в противном случае на этом этапе требуется ручное вмешательство оператора.
  • После успешной проверки данных Ironic выполняет настройку RAID и BIOS, а также первоначальную очистку сервера с помощью ATA Secure Erase или shred в зависимости от того, что поддерживает RAID-контроллер.

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

Шаг 4: добавляем новую услугу в облачную экосистему
Сейчас пользователи часто используют услугу Bare-Metal-as-a-Service в сочетании с другими нашими сервисами. Это позволяет им быстро получить готовую и гибкую инфраструктуру с простым управлением выделенными серверами и виртуальными машинами, приватными и публичными сетями, а также другими облачными решениями. Заказчикам такой подход помогает эффективно и экономично использовать ресурсы, а мы в результате успешно развиваем собственную экосистему сервисов, так как клиенты пользуются сразу комплексом наших решений. Помимо прочего, это открывает для заказчиков новые сценарии использования публичного облака — например, можно держать продакшн-среды на выделенных серверах, а при всплесках нагрузки за минуту разворачивать дополнительные мощности на виртуальных машинах, которые затем можно легко удалить. Чтобы новая услуга стала такой важной частью нашей экосистемы сервисов, после работ над автоматическим провижинингом нам предстояло решить ещё много задач.

Для начала, чтобы пользоваться новым сервисом было просто, заказ выделенных серверов мы сделали схожим с деплоем виртуальных машин — теперь для этого достаточно выбрать нужные характеристики, подключить публичную, приватную или сразу несколько сетей и через несколько минут получить готовый к работе сервер. Это решение уже прошло испытание боем: когда одному нашему клиенту не хватало виртуальных машин, он в тот же день оформил заказ и без проблем переехал на bare metal. С некоторыми другими задачами всё оказалось не так просто — остановимся на паре из них.

Избавляемся от «шумных соседей»
Главное отличие публичного сервиса от внутреннего компонента — наличие уникальных пользователей. Несмотря на то что все серверы живут в одном пуле, заказчикам как-то нужно обеспечить их изолированность друг от друга. Мы добились этого с помощью механизма мультитенантности. Готовые SDN-решения для этого не подходили, так как из-за них нам потребовалось бы ответвляться от существующей инфраструктуры. Нам также нужно было предусмотреть мультиплатформенность, поскольку наши облака распределены по всему миру и сетевое оборудование может варьироваться от региона к региону. В поисках подходящих решений нам пришлось досконально изучить вопрос, оптимальным вариантом оказался Networking-Ansible ML2 Driver. Правда, без ложки дёгтя в нём не обошлось — драйвер не умел объединять порты в MLAG, чего нам очень хотелось. Тогда мы сами научили его нужным образом агрегировать каналы на наших коммутаторах, но тут же столкнулись с другой проблемой при настройке интерфейсов внутри самого физического сервера.

Мы ожидали от cloud-init, что при выборе пользователем нескольких сетей они будут настроены с помощью сабинтерфейсов, но этого почему-то не происходило. Как оказалось, проблема была в том, что cloud-init недополучает из config-drive информацию о VLAN-ах, если порт настраивается транком. К счастью, на просторах opendev мы нашли патч, который мог бы исправить эту проблему. Сложность была в том, что он ещё находился в разработке, так что тут нам опять пришлось поработать напильником, чтобы самим довести патч до ума.

Теперь всё работает следующим образом:
  • Сетевые интерфейсы по умолчанию автоматически агрегируются и в транк перебрасываются как публичные, так и приватные сети. Пользователи же могут сконфигурировать свой ландшафт любым удобным образом, объединяя публичные и приватные сети в своём проекте — это позволяет им максимально эффективно использовать ресурсы;
  • По умолчанию все порты сервера находятся в несуществующей сети, но мы уже знаем в какой коммутатор воткнут каждый из них. Когда пользователь заказывает сервер, портам открывается доступ к PXE-серверам, запускается загрузчик, заливается образ, а дальше порты конфигурируются в целевую схему и сервер отдаётся клиенту.

Получается следующая схема потоков трафика:


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

Пишем драйвер консоли для iDRAC
Без serial console траблшутинг bare metal был бы неполным, так как для пользователя она остаётся единственным способом подключения к серверу, если привычные варианты — SSH и RDP — вдруг оказываются недоступны. Проблема возникла при имплементации сервиса, когда стало понятно, что в Ironic отсутствует поддержка виртуальной консоли iDRAC. Чтобы всё же получить к ней доступ, нам пришлось самим написать драйвер. Для этого мы изучили имеющиеся драйверы в Ironic для работы с консолями iLo и IPMI, а затем написали собственное решение по схожему принципу. Получившийся драйвер отлично справляется со своими задачами, но только в тех случаях, когда образ пользователя умеет отдавать диагностику в COM-порт — к счастью, в современных версиях Linux и Windows проблем с этим не возникает даже из коробки. Вот только с виртуальной консолью проблемы на этом не кончились.

Следующая сложность возникла с проксированием портов самой консоли. За их работу отвечает компонент Nova — nova-serialproxy — принцип работы которого слегка отличается, но в целом схож с компонентом nova-novncproxy. Проблема обнаружилась на одном из этапов работы serial console, который организован следующим образом:
  • Пользователь запрашивает serial console в личном кабинете — создаётся запрос посредством REST API.
  • Компонент nova-api обращается к nova-compute для получения URL с валидным токеном и открытием веб-сокета на подключение.
  • API нашего личного кабинета получает этот URL и делает по нему обращение уже непосредственно в nova-serialproxy.
  • Затем происходит проксирование запроса nova-serialproxy к ironic-conductor на порт физического сервера для подключения к его виртуальной консоли.

Вот наглядное описание этой цепочки действий:


Проблема возникала на четвёртом этапе — иногда в этот момент пользователи в течение непродолжительного времени получали ошибку «Address already in use». Мы не сразу поняли, с чем связано такое поведение, так как обнаружить порт консоли занятым каким-то другим процессом в списке прослушиваемых портов нам никак не удавалось. Первым делом мы решили изучить socat, с помощью которого осуществлялось взаимодействие с виртуальной консолью от контроллера. Однако, найти корень проблемы так и не получалось, в том числе из-за того, что на момент обращения пользователей в службу поддержки ошибки уже не возникало. Но однажды нам повезло: в тот раз проблема никак не решилась сама собой и ещё была актуальна, когда клиент о ней сообщил.

Тогда нам удалось обнаружить, что HAproxy на контроллерах проксирует соединение к БД, где ему для инициализации подключения назначался порт консоли. Решение оказалось довольно простым: мы стали резервировать порты с помощью параметра ядра net.ipv4.ip_local_reserved_ports и выбрали диапазон в плоскости 48 тысяч, где конечный порт для консоли в момент подготовки сервера для аренды автоматически указывался в соответствии с последним октетом iDRAC-адреса.

Шаг 5: запускаем bare metal во всех регионах публичного облака
В результате этих работ из служебного компонента нам удалось сделать полноценный сервис в составе публичного облака. Останавливаться на этом мы не планируем и первым делом расширяем географию присутствия облака: теперь, помимо виртуальных машин, во всех новых регионах мы сразу будем предоставлять и выделенные серверы. Развиваться будет и сам сервис: в ближайшие полтора года мы планируем создать решения на базе серверов bare metal для работы с большими данными и CaaS-сервисами, в том числе с Managed Kubernetes, а также внедрить возможность разворачивать приложения из нашего маркетплейса на выделенных серверах. Подробней обо всём этом мы ещё расскажем отдельно — stay tuned.
gcorelabs.com/ru/cloud/marketplace/

Приглашаем на бесплатный вебинар «Выбор CDN в 2021 году»

Вебинар будет полезен
  • разработчикам игр и SaaS‑приложений
  • техническим директорам и специалистам E‑commerce
  • финтеха
  • ритейла
  • онлайн-медиа
  • индустрии развлечений и других сфер




www.webinar.gcorelabs.com/#registration

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



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

Через полтора месяца сервис успешно работал в люксембургском дата-центре 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

Приглашаем на бесплатный вебинар: выбор облака в 2021 году


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




www.webinar.gcorelabs.com

Локация Cloud в Хабаровске и другие новости G-Core Labs


Как интегрировать видеозвонки в платформу для офлайн- и онлайн-мероприятий: опыт Momento Solutions
gcorelabs.com/ru/cases/momentosolutions

Новый регион G-Core Labs Cloud: Хабаровск
Точки присутствия G‑Core Labs Cloud уже открыты в Люксембурге, Москве, Манассасе и Сингапуре.
Мы запускаем новую edge-локацию нашего облака в Хабаровске.
Новая точка поможет развивать бизнес на Дальнем Востоке России и в азиатском регионе в целом, сократить задержки для конечных пользователей.
Масштабируйте IT-инфраструктуру, ускоряйте процессы разработки, тестирования и вывода новых продуктов на рынок с помощью наших сервисов.


БЛИЖАЙШИЕ ПЛАНЫ
Скоро мы добавим автоматическое развёртывание Kubernetes-кластеров для оркестрации контейнеров.

Следующую edge-локацию мы планируем запустить в Амстердаме.

https://gcorelabs.com

Стражи публичных облаков: как мы внедряли анклавы Intel SGX для защиты чувствительных данных

Как развеять предубеждения потенциальных пользователей относительно безопасности публичных облаков? На помощь приходит технология Intel Software Guard Extensions (Intel SGX). Рассказываем, как мы внедрили её в своём облаке и какие преимущества от нашего решения получила компания Aggregion.


Кратко об Intel SGX и его роли в облаке
Intel Software Guard Extensions (Intel SGX) — набор инструкций ЦП, с помощью которых в адресном пространстве приложения создаются частные защищённые области (анклавы), где размещается код уровня пользователя. Технология обеспечивает конфиденциальность и целостность чувствительных данных. Путём изоляции в анклаве они получают дополнительную защиту как от несанкционированного внешнего доступа, в том числе со стороны провайдера облачных услуг, так и от внутренних угроз, включая атаки со стороны программного обеспечения привилегированного уровня.

Принципы работы. Для хранения кода и данных анклавов технология Intel SGX выделяет область памяти – Processor Reserved Memory (PRM). ЦП защищает её от всех внешних обращений, в том числе от доступа со стороны ядра и гипервизора. В PRM содержится Enclave Page Cache (EPC), состоящий из блоков страниц объёмом 4 КиБ, при этом каждая страница должна принадлежать только одному анклаву, а их состояние фиксируется в Enclave Page Cache Metadata (EPCM) и контролируется ЦП.

Безопасность EPC обеспечивается за счёт Memory Encryption Engine (MEE), который генерирует ключи шифрования, хранящиеся в ЦП. Предполагается, что страницы могут быть расшифрованы только внутри физического ядра процессора.

Преимущества. Intel SGX позволяет повысить уровень доверия к публичному облаку со стороны организаций, использующих в своей работе чувствительные данные (пароли, ключи шифрования, идентификационные, биометрические, медицинские данные, а также информацию, относящуюся к интеллектуальной собственности). Речь идёт о представителях самых разных отраслей — финансового сектора, медицины и здравоохранения, ритейла, геймдева, телекома, медиасферы.

Наш подход к внедрению Intel SGX
Чтобы в публичном облаке G-Core Labs появилась возможность выделять виртуальные машины с анклавами Intel SGX, нам пришлось пройти путь от компиляции патченного ядра KVM и QEMU до написания Python-скриптов в сервисах OpenStack Nova. Вычислительные узлы, которые планировалось использовать для выделения виртуальных машин повышенной безопасности, мы решили определить в отдельный агрегатор — тип вычислительных ресурсов, требующий дополнительной настройки. На таких узлах было необходимо:

Включить поддержку Intel SGX на уровне BIOS.


Поставить патченные QEMU/KVM.
Изначально у нас не было понимания, как это должно работать и что в итоге мы должны прикрутить, чтобы получить ВМ нужной конфигурации. Разобраться с этим вопросом нам частично помогло руководство Intel для разработчиков. С его помощью мы узнали, как подготовить вычислительный узел для работы с SGX и какими дополнительными параметрами должен обладать конфигурационный XML-файл виртуальной машины. Здесь же мы нашли исчерпывающую информацию, как с помощью виртуализации KVM сделать гостевую машину с использованием Intel SGX. Чтобы убедиться, что мы смогли обеспечить поддержку данной технологии, мы использовали два способа:

Проверили секцию /dev/sgx/virt_epc в файле /proc/$PID/smaps:
[root@compute-sgx ~]# grep -A22 epc /proc/$PID/smaps
7f797affe000-7f797b7fe000 rw-s 00000000 00:97 57466526		/dev/sgx/virt_epc
Size:               8192 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
LazyFree:              0 kB
AnonHugePages:         0 kB
ShmemPmdMapped:        0 kB
FilePmdMapped:         0 kB
Shared_Hugetlb:        0 kB
Private_Hugetlb:       0 kB
Swap:                  0 kB
SwapPss:               0 kB
Locked:                0 kB
THPeligible:	0
VmFlags: rd wr sh mr mw me ms pf io dc dd hg

И воспользовались данным shell-скриптом, предварительно поставив SGX-драйвер (все действия осуществлялись внутри ВМ):
[root@sgx-vm ~]# cat check_sgx.sh
#!/bin/bash

METRICS="sgx_nr_total_epc_pages \
    sgx_nr_free_pages \
    sgx_nr_low_pages \
    sgx_nr_high_pages \
    sgx_nr_marked_old \
    sgx_nr_evicted \
    sgx_nr_alloc_pages \
    "
MODPATH="/sys/module/isgx/parameters/"

for metric in $METRICS ; do
    echo "$metric= `cat $MODPATH/$metric`"
done

[root@sgx-vm ~]# curl -fsSL https://raw.githubusercontent.com/scontain/SH/master/install_sgx_driver.sh | bash -s - install -p metrics -p page0

[root@sgx-vm ~]# ./check_sgx.sh
sgx_nr_total_epc_pages= 2048
sgx_nr_free_pages= 2048
sgx_nr_low_pages= 32
sgx_nr_high_pages= 64
sgx_nr_marked_old= 0
sgx_nr_evicted= 0
sgx_nr_alloc_pages= 0

Стоит учитывать, что, если одна страница занимает 4 КиБ, то для 2048 страниц требуется 8 МиБ (2048 x 4 = 8192).

Трудности разработки и их преодоление
Отсутствие какой-либо технической документации по интеграции Intel SGX в OpenStack было нашей основной трудностью на момент внедрения. Поиск привел нас к статье проекта SecureCloud, где был представлен способ управления виртуальными машинами с анклавами SGX.

Найденная информация помогла понять, над чем именно нам предстоит работать. В результате мы сформировали следующие задачи:
  • Добиться от сервиса OpenStack Nova генерации XML-файла с дополнительными параметрами для виртуальных машин с поддержкой Intel SGX.
  • Написать фильтр планировщика OpenStack Nova с целью определения доступной памяти для анклавов на вычислительных узлах и осуществления некоторых других проверок.

Их выполнения было достаточно для интеграции Intel SGX в наше публичное облако.

Кроме того, мы дописали сбор статистики с учетом EPC:
# openstack usage show
Usage from 2020-11-04 to 2020-12-03 on project a968da75bcab4943a7beb4009b8ccb4a:
+---------------+--------------+
| Field         | Value        |
+---------------+--------------+
| CPU Hours     | 47157.6      |
| Disk GB-Hours | 251328.19    |
| EPC MB-Hours  | 26880.02     |
| RAM MB-Hours  | 117222622.62 |
| Servers       | 23           |
+---------------+--------------+


Безопасная среда для запуска контейнеризированных приложений


Научившись выделять виртуальные машины с поддержкой Intel SGX, мы использовали платформу SCONE компании Scontain, чтобы обеспечить возможность безопасного запуска контейнеризированных приложений в случае угроз со стороны привилегированного программного обеспечения. При использовании данного решения для прозрачной защиты файловых систем в средах Docker, Kubernetes и Rancher достаточно наличия процессора Intel с поддержкой SGX и драйвера Linux SGX.

Запуск каждого из контейнеров возможен лишь при наличии файла конфигурации, создаваемого клиентским расширением платформы SCONE. В нём содержатся ключи шифрования, аргументы приложения и переменные среды. Файлы, сетевой трафик и стандартные потоки ввода/вывода (stdin/stdout) прозрачно зашифрованы и недоступны даже для пользователей с правами root.

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

С помощью драйвера SGX для каждого анклава в виртуальном адресном пространстве резервируется до 64 ГБ памяти. Платформа SCONE поддерживает языки программирования C/C++/C#/Rust/Go/Python/Java. За счёт специального компилятора исходный код автоматически (без необходимости дополнительных модификаций) подготавливается к использованию совместно с Intel SGX.

Кейс Aggregion
Завершив все необходимые работы по интеграции Intel SGX, мы подключили к нашему публичному облаку платформу управления распределёнными данными компании Aggregion.

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

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

Принципы безопасной работы на платформе Aggregion. В контуре каждого поставщика чувствительные данные изолируются в анклавы Intel SGX, которые фактически представляют собой чёрные ящики: что происходит внутри, недоступно никому, в том числе и провайдеру облачной инфраструктуры. Проверка первоначального состояния анклава и возможности его использования для хранения конфиденциальной информации осуществляется за счёт удалённой аттестации, когда MrEnclave определяет хеш-значение.

Потенциальная польза для клиентов. Комбинирование баз данных нескольких поставщиков позволяет повысить эффективность совместных рекламных кампаний. При выделении целевой аудитории по заданным параметрам мэтчинг (сопоставление) сегментов выполняется непосредственно внутри контейнеров с поддержкой анклавов Intel SGX. За пределы выводится только конечный результат: например, численность пользователей, соответствующих выбранным атрибутам. Аналогичным образом оценивается эффективность проведенных кампаний: в анклавы выгружаются данные о рекламных показах и совершённых продажах для вычисления прироста покупок целевой группы относительно контрольной, который и выдаётся наружу для дальнейшего использования.


Выводы
Мы понимаем, что Intel SGX не является панацеей по защите данных и можно найти ряд статей, порицающих эту технологию, в том числе и на Хабре. Периодически появляются сообщения об атаках, способных извлечь конфиденциальные данные из анклавов: так, в 2018 году бреши в SGX пробили Meltdown и Spectre, в 2020 году – SGAxe и CrossTalk. В свою очередь компания Intel устраняет выявленные уязвимости с помощью обновлений микрокода процессоров.

Почему же мы всё-таки решили внедрить данную технологию? Мы видим в применении Intel SGX возможность сократить потенциальную область кибератак за счёт создания дополнительного контура защиты облачной инфраструктуры G-Core Labs наряду с уже задействованными технологиями информационной безопасности и тем самым повысить доверие наших пользователей к хранению и обработке конфиденциальных данных. Надеемся, что в будущем нам ещё предстоит поделиться с вами успешными клиентскими кейсами, хотя и не берёмся утверждать, что наши статьи не будут основаны на историях обнаружения и устранения новых уязвимостей.

https://gcorelabs.com

Облачный десант: как мы интегрировали публичное облако с CDN и что из этого получилось

Когда в вашем распоряжении одновременно оказывается мощное облако с инфраструктурой в США, Евросоюзе, СНГ, Азии и Австралии и CDN со 100 точками присутствия в 70+ городах на пяти континентах, решение приходит само собой — нужно их интегрировать! Такая синергия очевидно расширит возможности инфраструктуры. Конечно же, мы не могли упустить такую возможность, но в то же время столкнулись с целым рядом челленджей.

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



Зачем вообще интегрировать облако с CDN
В первую очередь публичное облако — это масштабируемые мощности. Их можно использовать как угодно: для разработки и тестирования сервисов, а также хранения и обработки данных. Мы в G-Core Labs запустили облако в прошлом году и уже успели задействовать его в высоконагруженных проектах. Например, наш давний клиент — Wargaming — использует это решение сразу для нескольких задач:
  • Тестирование новых фич и сервисов разных проектов;
  • Подготовка тестовых прототипов с внешними разработчиками, которым нужен доступ к изолированным настраиваемым и контролируемым ресурсам;
  • Работа онлайн-игры «Калибр» на виртуальных машинах.

Со всем перечисленным облако справляется на ура, но работа на этом не заканчивается. Для чего бы ни были задействованы те или иные мощности, результат их работы ещё нужно доставить до точки назначения. О чём бы ни шла речь — об онлайн-игре или настоящих военных соединениях — тут-то и возникает проблема: что многотонную боевую технику, что тяжёлые данные быстро доставлять в удалённые регионы крайне непросто. Упростить эту задачу позволяет интеграция облака с сетью доставки контента. С помощью CDN транспортабельную часть — статические данные — можно забросить «по воздуху» прямо к точке назначения, а из облака лишь останется отправить «негабаритные» динамические данные. С таким подходом можно смело начинать работу даже на других континентах, так как интеграция позволяет быстрее конкурентов доставлять тяжёлый контент по всему миру.



Сокращай, распределяй, ускоряй: как CDN помогает облаку
Перейдём к конкретике. Мы не понаслышке знаем, что доставлять тяжёлый контент в удалённые регионы прямо из облака выходит долго, а постоянно увеличивать мощность инфраструктуры согласно росту нагрузки бывает накладно. К счастью, помимо публичного облака у нас оказалась и своя CDN, которая даже вошла в Книгу рекордов Гиннеса, обеспечив бесперебойный опыт игры в World of Tanks в период пиковой нагрузки.

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

1. Облачные сервисы находились под постоянной нагрузкой. Пользователи высоконагруженных проектов регулярно запрашивали контент из облаков наших клиентов. Это приводило к высокой нагрузке и долгой отдаче данных. Требовалось решение, которое позволило бы легко сократить количество обращений к источнику. Для этого мы интегрировали серверы публичного облака и кеш-серверы CDN, а также сделали единый интерфейс управления этими сервисами. С его помощью пользователи могут выносить статические данные в нужные точки присутствия сети. Благодаря этому обращения к облаку происходят только при первых запросах контента. Работает это стандартно: CDN забирает данные у источника и отправляет их пользователю, а также ближайшему к нему кеш-серверу, откуда контент и раздаётся при последующих запросах;

2. Данные долго передавались между облаком и CDN. Объединив облако с сетью доставки контента, мы заметили, что задержка при доставке данных могла бы быть меньше. Чтобы сохранить как можно больше драгоценных миллисекунд, пришлось реализовать обмен трафиком между кеш-серверами и облаком внутри опорной сети (backbone);



3. Нагрузка на источник оказывалась неравномерно. Даже после подключения CDN оставшиеся обращения к облаку распределялись неэффективно. Мы исправили это с помощью HTTP(S)-балансировщиков. Теперь в момент запроса контента они определяют из какого именно источника (виртуальной машины или бакета облачного хранилища) следует забирать данные для кеширования;

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

Разобравшись с этими проблемами, мы уже было посчитали работу законченной. Но у облака с CDN на нас были иные планы.

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

Сейчас стандартная конфигурация серверов выглядит следующим образом:
  • Облачные сервисы работают на процессорах Intel Xeon Gold 6152, 6252 и 5220, имеют до 1 ТБ RAM, а также SSD и HDD с тройной репликацией;
  • Кеш-серверы CDN оснащены Intel Xeon Platinum, виртуальными RAID на CPU и SSD D3-S4610.

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

Шилдинг, шардинг и геораспределение: ускоряем доставку контента в экстремальных условиях
Беда не приходит одна. Это особенно актуально, когда речь идёт о глобальных проектах. Отсутствие географически распределённой инфраструктуры, высокие нагрузки из-за множества пользователей со всего мира и море разнородных данных, которые им нужно быстро доставлять, — одному нашему клиенту, крупному медиаресурсу, нужно было разом разобраться со всеми этими сложностями. Немного подробностей:
  • Контент долго шёл до пользователей, а иногда и вовсе до них не доходил из-за высоких задержек и проблем в сети. Сложность заключалась в том, что весь большой пул серверов с данными размещался в одной географической точке;
  • К источнику контента обращались пользователи со всего мира, что вызывало повышенную нагрузку на инфраструктуру и приводило к дороговизне обслуживания, а также медленной отдаче данных;
  • Пользователям требовалось доставлять огромное количество постоянно пополняемого контента, уникального для каждого региона.

Базовыми возможностями интеграции облака с CDN тут было не обойтись. Мы взялись за разработку дополнительных решений.

Как мы придумали «региональный шилдинг»
Это понятие, а теперь уже и действующую услугу, мы ввели специально для решения проблемы с удалённостью источника контента. Из-за того, что все серверы клиента находились в одной географической точке, данные от них долго добирались до пользователей из разных частей света. Ситуацию усложнял тот факт, что в разные регионы нужно было доставлять разный, постоянно пополняемый контент. Простое кеширование данных на edge-серверах проблему бы не устранило — они бы всё равно часто обращались к источнику через полмира.

Мы решили задачу, развернув большой пул кеш-серверов в популярных точках обмена трафика на разных континентах. «Региональные шилдинги» стали своеобразными прослойками между источником и edge-серверами в странах пользователей. Теперь весь востребованный в соответствующих частях света контент сначала попадал на них, а затем передавался кеш-серверам. Таким образом шилдинги разом снизили нагрузку на источник клиента и сократили задержки до конечных пользователей. Клиент, в свою очередь, сэкономил на размещении нескольких пулов серверов с одинаковым контентом в разных частях света, так как при таком принципе работы достаточно было одного источника данных.


Зачем понадобилось шардирование контента
Проблему долгой доставки контента в разные части света региональные шилдинги решили сполна. Однако, теперь возникла новая сложность: поскольку данных у клиента было много и они постоянно обновлялись, их то и дело не оказывалось в кеше edge-серверов, к которым обращались пользователи. Это приводило к тому, что на региональные пулы постоянно сыпалась масса запросов от кеш-серверов, число которых в одной группе достигало 20–30 штук. Чтобы снять с шилдингов часть этой нагрузки и доставлять контент пользователям ещё быстрей, мы добавили возможность забирать нужные данные у ближайшего edge-сервера в пуле.

Теперь кеш-серверы в регионах присутствия начали обращаться к шилдингам лишь тогда, когда данных не оказывалось во всей группе. Причём даже в этих случаях контент сразу же запрашивался именно у того сервера, который его содержал — благодаря шардингу edge-серверы заранее «знали» где лежит конкретный файл, а не опрашивали для этого весь пул региональных шилдингов. Такой принцип работы снизил количество запросов к пулу и позволил эффективно распределять контент по нему вместо того, чтобы хранить копии данных на каждом сервере. В результате шилдинги вмещали больше контента и как следствие оказывали меньшую нагрузку на источник клиента.


Создание такой инфраструктуры не могло не повлечь за собой ещё одной сложности. Учитывая количество кеш-серверов в группах, было бы глупо предположить, что ни один из них не может выйти из строя. В такой ситуации, как и в случае добавления в пул нового сервера, кеш в группах нужно было перераспределять оптимальным образом. Для этого мы реализовали организацию шардированного кеша с алгоритмом консистентного хеширования в блоке upstream в nginx:
upstream cache_servers {
   hash $cache_key consistent;
   server edge1.dc1.gcorelabs.com;
   server edge2.dc1.gcorelabs.com;
   server edge3.dc1.gcorelabs.com;
}


Появление в пуле недоступных серверов также было чревато ещё одной проблемой: другие серверы продолжали посылать к ним запросы и ожидали ответа. Чтобы избавиться от этой задержки, мы написали алгоритм обнаружения таких серверов в пуле. Теперь, благодаря тому что они автоматически переводятся в состояние down в upstream-группе, мы больше не обращаемся к неактивным серверам и не ждём от них данных.

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

Кому пригодилось облако с CDN
Работы по интеграции позади, а продуктом уже пользуются наши клиенты. Делимся, кто из них получает от этого наибольшую отдачу.

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

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

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

https://gcorelabs.com