Истечение срока действия: 6 апреля 2021 года

Срок действия TLS-сертификата с поддержкой субдоменов неожиданно для нас истёк 6 апреля 2021 года. Истечение срока действия сертификата — щекотливый момент. Однако мы сочли важным поделиться с вами своей историей в надежде, что вы можете научиться на наших ошибках и улучшить свои системы. Данная ситуация может стать хорошим напоминанием о необходимости выявления ошибок в системах, если вы или ваша организация используете мониторинг сертификатов.

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

Истечение срока действия сертификата повлияло на такие основные компоненты, как системы идентификации и аутентификации, а эти сервисы связаны с другими сервисами во всей нашей экосистеме. Были выявлены или зарегистрированы следующие последствия:

  • Появлялась ошибка входа в учётные записи Epic Games у продуктов, использующих данную форму аутентификации, в том числе у Fortnite, Rocket League, Houseparty, Epic Online Services или Epic Games Store.
  • Отключение со всех платформ от игрового процесса или сервисов в прямом эфире.
  • Не удавалось приобретать предметы в программе запуска Epic Games.
  • Непредсказуемая работа программы запуска Epic Games, начиная от проблем с загрузкой контента и заканчивая нефункционирующим автономным режимом.
  • Продукты Epic Games и маркетинговые сайты, в том числе сайты Unreal Engine, были недоступны, либо производительность на них ухудшилась.
  • Были выявлены многочисленные внутренние проблемы с инструментами, влияющие на способность сотрудников Epic решать или регулировать вопросы.

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


Что же произошло?


Мы имеем три основные последовательности событий:

  1. Сертификат с истёкшим сроком действия вызвал большой сбой в работе вызовов между сервисами серверной части и внутренних средств управления.
  2. Далее произошло неожиданное значительное увеличение трафика к программе запуска Epic Games, нарушение работы программы запуска Epic Games и функций распространения контента.
  3. Некорректная версия сайта Epic Games Store со ссылкой на недействительные продукты и материалы работала в рамках автоматического масштабирования, что привело к ухудшению работы Epic Games Store.

 

1) Истечение срока действия сертификата

Срок действия TLS-сертификата истёк 6 апреля в 12:00 UTC (15:00 МСК). Данный сертификат использовался для внутренней связи в большом объёме через серверную платформу Epic. Мы используем TLS-шифрование между нашими внутренними службами для межсервисных вызовов API и инструментов внутреннего управления. Этот сертификат предназначен для внутренней зоны DNS, которая не является общедоступной. 

Движение трафика между серверными системами было полностью остановлено в 12:00 UTC (15:00 МСК). Спустя 6 минут в 12:06 UTC (15:06 МСК) был зафиксирован инцидент, и мы приступили к решению выявленной проблемы. Несмотря на то что мы получили множество предупреждающих сигналов, мы всегда призываем всех сообщать о любых проблемах в компании. Каждый инцидент определяется нашей круглосуточно работающей командой, которая запускает процесс устранения проблемы. Когда мы получили первый внутренний отчёт об ошибке, наши инструменты и процесс устранения ошибок автоматически запустили канал в Slack, а также для устранения проблемы были приглашены или вызваны соответствующие специалисты.

В 12:12 UTC (15:12 МСК) мы подтвердили, что срок действия сертификата истёк, что, по нашему мнению, могло быть источником проблем. Далее мы начали процесс обновления. В 12:37 UTC (15:37 МСК) сертификат был перевыпущен, и наши серверные службы начали использовать обновлённый сертификат. В течение следующих 5–15 минут балансировщики нагрузки начали автоматически внедрять новый сертификат на внутренние конечные точки соединения. Наши HTTPS-вызовы между сервисами восстановились вместе с интерфейсами управления.

Отследившая этот инцидент команда также решала проблему на текущем этапе: общалась с сотрудниками и вовлекала нужных специалистов. И уже в 12:38 UTC (15:38 МСК) был организован звонок в Zoom для согласования действий сотрудников, работавших над решением проблемы в Slack. Slack хоть и является хорошим инструментом коммуникации, ничто не сравнится с живым общением в реальном времени с помощью голосовой или видеосвязи в экстренных ситуациях. С помощью наших инструментов обновления об инциденте регулярно отправлялись внутренним заинтересованным лицам, чтобы держать их в курсе происходящего. На тот момент более 25 человек напрямую работали над проблемой, и многие другие наблюдали за ней: служба поддержки игроков, сообщество, команды, разработчики и издатели всех наших многочисленных продуктов.

График количества запросов в минуту к одной микрослужбе во время остановки работы сертификата и при полном его восстановлении.

 

Сопутствующие факторы


Зоны DNS для данной внутренней связи между сервисами не контролировались активно службами мониторинга сертификатов, это было нашей ошибкой. Наши службы мониторинга сертификатов покрывают полностью все пространства имён DNS, а не отдельные конечные точки или сертификаты, конфигурация для данной внутренней зоны отсутствовала. Поэтому мы переместили эту зону в нашу новую среду для мониторинга, где можно было бы устранить данный пробел. До этого инцидента мы также начали работать над проектом по глобальному включению и настройке AWS Config для наших многочисленных учётных записей. Такая глобальная настройка позволяет добавить правило AWS Config, позволяющее глубоко эшелонированной защите оповещать об истечении срока действия сертификата

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

Используемый сертификат с поддержкой субдоменов между сервисами был установлен в сотнях различных производственных сервисов. Именно поэтому последствия были обширными. Мы используем ACM (AWS Certificate Manager) от AWS для управления данным сертификатом, что позволило нам быстро продлить и применить этот сертификат к сотням производственных сервисов за считанные минуты. Проблема с истечением срока действия не является ошибкой ACM от AWS, а была связана с нашим управлением данным сертификатом. Мы будем работать над охватом наших сертификатов, в том числе над совершенствованием процессов управления сертификатами совместно с ACM от AWS.

 

2) Значительное увеличение трафика к программе запуска Epic Games.

Большинство наших сервисов было восстановлено сразу после продления сертификата, однако программа запуска Epic Games осталась практически недоступной.

В 12:46 UTC (15:46 МСК), вслед за выпуском сертификата, всплеск количества запросов превысил допустимый уровень трафика ключевой серверной службы, обеспечивающей работу клиента программы запуска Epic Games. Повышенный объём запросов был вызван ошибкой, связанной с повторными попытками, наблюдаемой только в случаях системного сбоя. За эти годы мы проделали большую работу по обеспечению отказоустойчивости программы запуска Epic Games, однако данный случай увеличения количества запросов стал неожиданным. Достигнутый лимит отслеживания подключений стал причиной ограничения доступа на наши хосты, и пакеты разбрасывались, что затрудняло восстановление, даже когда наш парк серверных приложений увеличился на 250%. Сервисы программы запуска Epic Games подверглись каскадному сбою и полному отключению, и для восстановления потребовалось ограничение трафика на серверную часть, а затем постепенное восстановление трафика с одновременным увеличением лимитов на отслеживание подключений.

Большое количество клиентов программы запуска Epic Games генерировало десятки миллионов подключений к серверной службе программы запуска Epic Games, и работа компонентов систем программы запуска Epic Games ухудшалась из-за нагрузки. Необходимо было перераспределить трафик на серверную часть, чтобы восстановить работу системы. Обычно в случае пиковых нагрузок для этой службы доступны дополнительные ресурсы, однако они не позволяли ей обрабатывать даже 28-кратную нагрузку, которую мы наблюдали в начале отключения.

График количества запросов в минуту к нашему внутреннему балансировщику нагрузки программы запуска Epic Games. Первоначально трафик увеличился в 28 раз, а последний всплеск в 15:12 UTC (18:12 МСК) в 40 раз превысил норму.


Хотя количество запросов было в 28 раз больше обычного, само количество подключений к серверной службе программы запуска Epic Games исчерпало доступную возможность для отслеживания подключений, что привело к потере пакетов и, в конечном итоге, к ухудшению связи с внутренними узлами. Внутренняя нагрузка на подключение увеличилась в 3200 раз по сравнению с нормальной. Прирост TCP-соединений был значительно выше, чем количество запросов.

График количества новых подключений в минуту к нашему внутреннему балансировщику нагрузки программы запуска Epic Games с увеличением количества подключений в 3200 раз по сравнению с обычным пиковым значением.

 

Сопутствующие факторы


Истёкший TLS-сертификат вызвал сбой, который привел к непредвиденной работе программы запуска. Внутренняя проверка показала, что повторная попытка клиента использовала линейную логику повторных попыток вместо ожидаемого экспоненциального отката. Дополнительная непредвиденная ошибка также привела к тому, что шаблон запроса от миллионов клиентов программы запуска Epic Games постоянно и бесконечно повторял попытку до получения ответа. Эти две ошибки привели к непредвиденным шаблонам вызова по всей нашей клиентской базе. По сути наши собственные клиенты подвергали нас DDoS-атакам, и мы усердно работаем над исправлением ошибок в обновлении программы запуска Epic Games. 

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

Первоначально причина сбоя в отслеживании соединений не была понятна. Сигнал тревоги сработал во время инцидента для программы запуска Epic Games, и, несмотря на то что несколько команд знакомы со значением данного оповещения, его описание и содержание уведомления были недостаточно ясными. Также не было известно, что данная ошибка приведёт к потере пакетов для любого соединения, в том числе подключения к внутреннему кластеру Redis. Команде пришлось изрядно потрудиться, чтобы понять причины ухудшения подключения к кластеру Redis. Предполагалось, что это было связано с механизмами кэширования. Позже выяснилось, что это было связано с потерей пакетов из-за перегрузки в системе отслеживания соединений с участием нескольких сотен тысяч соединений. Позже в ходе инцидента мы повысили ограничения на отслеживание подключений до более чем одного миллиона на узел, но увеличение отслеживания подключений в нашей системе не происходит мгновенно, и на восстановление потребовалось некоторое время. Мы будем работать над тем, чтобы оповещения были понятнее, и предупреждать о серьёзных проблемах с сетью, пока они не будут решены. 

Масштабирование привело к тому, что новые узлы мгновенно достигли пределов отслеживания соединений. Поскольку наш парк был перегружен соединениями, что приводило к серьезной потере пакетов, нам нужно было уменьшить общий трафик для него и медленно увеличивать разрешённый трафик. Сначала мы попытались использовать WAF (брандмауэр веб-приложений) от AWS для ограничения подмножества входящего трафика, однако наша конфигурация не позволяла ограничить достаточный объём трафика. Но это не является проблемой WAF от AWS, а связано с нашим внутренним набором правил. Затем в целях экономии времени мы использовали целевые веса нашего балансировщика нагрузки AWS для перераспределения трафика, что, наряду с увеличением лимитов отслеживания подключений, в конечном итоге оказалось успешным. Использование WAF в данном сценарии задержало восстановление сервисов программы запуска Epic Games, но не по вине AWS. Мы разработаем стандартный процесс для срочного сброса нагрузки трафика в подобных критических ситуациях с использованием WAF от AWS, целевых весов балансировщика нагрузки или других технологий AWS.

 

3) Недействительные ресурсы сайта Epic Games Store

В 15:12 UTC (18:12 МСК), после того как обновился наш сертификат и восстановилась программа запуска Epic Games, мы приступили к разблокировке всех клиентов Epic Games Store. Из-за продолжительного простоя количество клиентов, запрашивающих контент из Epic Games Store, было значительно больше обычного, и этот объём начал естественным образом увеличиваться. Мы начали оценку последствий около 15:30 UTC (18:30 МСК).

Поначалу всё шло нормально, но затем нам стали поступать внутренние отчёты о проблемах вёрстки и ошибках в магазине, которые мы смогли подтвердить и воспроизвести. Подробнее изучив вопрос, мы обнаружили, что веб-клиент, с помощью которого посетители epicgames.com взаимодействуют с Epic Games Store, пытается получить уникальный идентификатор ресурса, отсутствующий в нашей сети доставки содержимого. Мы провели проверку и выяснили, что версии контейнера на всех наших серверах совпадают. Но если это так, то как у одной и той же версии приложения могли оказаться разные значения статических файлов? 

Здесь явно что-то было не так. Это был очень запутанный период инцидента. В конечном счёте выяснилось, что многие из получаемых нами сигналов (например, об используемых версиях) были ложными. Мы смогли соотнести повышение нагрузки на серверную часть Epic Games Store с увеличивающимся количеством «ошибок 403» в нашей сети доставки содержимого, и это привело нас к необходимости более подробно изучить новые устройства нашей сети. Быстро передав содержимое на новых локальных устройствах, мы обнаружили, что они возвращают неверное содержимое. Отследив источник проблемы, мы обнаружили неожиданную принудительную отправку контейнера на новый процесс непрерывной интеграции и автоматизированной доставки (CI/CD). Эта отправка произошла за день до этого и никак не была связана со всем, с чем мы сталкивались ранее во время инцидента. И хотя результаты были неожиданными, после обнаружения этой проблемы мы смогли оперативно откатить версию контейнера, прервать работу устройств с ошибкой и восстановить трафик.

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

 

Сопутствующие факторы


Недействительный сертификат привёл к проблемам программы запуска Epic Games и создал шквал запросов к Epic Games Store, в результате которых нагрузка на системы Epic Games Store резко увеличилась. Сам по себе рост нагрузки был ожидаемым — мы готовы к нему и приветствуем повышенный интерес наших пользователей.

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

Недавнее изменение в нашем процессе непрерывной интеграции и автоматизированной доставки (CI/CD) для Epic Games Store содержало ошибку конфигурации, которая привела к неожиданному обновлению элемента приложения. Модификация нашего процесса CI/CD отменила эти неожиданные изменения и исправила проблему. Изменение в подходе к управлению версиями защитит нас в случае повторного возникновения подобных ситуаций.


Временная шкала

  • 12:00 UTC (15:00 МСК) — истекло действие внутреннего сертификата
  • 12:06 UTC (15:06 МСК) — мы получили отчёт об инциденте и начали действия по его урегулированию
  • 12:15 UTC (15:15 МСК) — подготовлено первое сообщение для пользователей
  • 12:21 UTC (15:21 МСК) — получены подтверждения от разных отделов о множестве крупных сбоев в работе сервиса
  • 12:25 UTC (15:25 МСК) — начался перевыпуск сертификата
  • 12:37 UTC (15:37 МСК) — получено подтверждение, что сертификат перевыпущен
  • 12:46 UTC (15:46 МСК) — получено подтверждение о восстановлении работы некоторых служб
  • 12:54 UTC (15:54 МСК) — функция отслеживания соединений обнаружила ошибку службы программы запуска Epic Games
  • 13:41 UTC (16:41 МСК) — узлы службы программы запуска Epic Games перезапущены
  • 15:05 UTC (18:05 МСК) — повышены лимиты отслеживания соединений для службы программы запуска Epic Games
  • 15:12 UTC (18:12 МСК) — появились первые признаки восстановления работы службы программы запуска Epic Games
  • 15:34 UTC (18:34 МСК) — рост нагрузки на веб-службу Epic Games Store
  • 15:59 UTC (18:59 МСК) — получены первые отчёты об отсутствующих ресурсах в Epic Games Store
  • 16:57 UTC (19:57 МСК) — обнаружена проблема несоответствия версий веб-службы Epic Games Store
  • 17:22 UTC (20:22 МСК) — версия веб-службы Epic Games Store исправлена
  • 17:35 UTC (20:35 МСК) — полное восстановление работы


Что дальше?

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

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

Мы незамедлительно перекрыли проблемный участок своей обновлённой системой мониторинга сертификатов, а также проанализировали все существующие известные нам сертификаты. Тем не менее, мы собираемся провести ещё более тщательный поиск возможных пробелов в нашей системе мониторинга сертификатов и добавить средства, которые обеспечат нам запас прочности на будущее, например мониторинг AWS Config для всех сертификатов на основе AWS Certificate Manager. Кроме того, мы примем меры для уменьшения последствий при потенциальном возникновении проблем с любым конкретным сертификатом.

Мы детально изучим конфигурации клиентских запросов нашей программы запуска Epic Games и в срочном порядке исправим некоторые ошибки, обнаруженные в ходе проверки, а также улучшим нашу способность реагировать на значительное повышение трафика. Навсегда увеличив лимиты таблиц отслеживания соединений для наших серверов, мы сможем справиться с аналогичной нагрузкой без серьёзной потери пакетов. Если вы используете большие парки серверов, эта ситуация может послужить хорошим напоминанием о необходимости проверить лимиты таблиц отслеживания соединений, а также тревожным сигналом, если вы используете эту функцию netfilter. Кроме того, мы будем рады, если это послужит вам живым напоминанием о необходимости проверять логику повторных попыток в ваших клиентских программах, а в частности то, как они могут вести себя в сочетании с продолжительным отключением служб.

Что касается Epic Games Store, мы выпустили исправление, которое должно предотвратить модификацию работающего объекта приложения, и в рамках этого выявили и исправили ошибку в системе генерации файлов.

Надеемся, что этот отчёт об инциденте позволил вам лучше разобраться в том, что случилось 6 апреля. А также надеемся, что эта информация пролила свет на то, что нам удалось выяснить и улучшить, и поможет остальным избежать подобных проблем.


Присоединяйтесь к нам!

Эта статья написана нашей командой инженеров по обеспечению надёжности при всеобъемлющей поддержке и помощи других технических отделов Epic.

Вам нравится решать подобные проблемы? Вам нравятся игры и игровые сервисы? Epic непрерывно ищет талантливых сотрудников. Мы нанимаем специалистов с различными наборами навыков и компетенций по всему миру! Если вас интересуют наши открытые вакансии, посетите карьерный центр Epic Games.

Эта статья помогла вам или показалась интересной? Поделитесь с нами своим мнением: public-incident-response@epicgames.com.