Австралійський експерт з кібербезпеки, засновник популярного сервісу Have I Been Pwned Трой Хант розповів у своєму блозі, як необачність при користуванні хмарними сервісами коштувала йому зайві $8000. Редактор AIN.UA підготувала скорочений варіант тексту.


Я завжди був і лишаюся переконаним прихильником хмари. Я створив Have I Been Pwned (HIBP) як хмарний сервіс, що користався з переваг типу Azure Table Storage, аби сильно знижувати вартість і водночас мати неймовірні рівні продуктивності, які раніше були мені недосяжні. Я багато писав про те, як створювати великі речі за небагато грошей, виступав із лекціями про це. Одна з них була про те, як я «хакнув» вартість хмари для себе. Тож лише справедливим було би написати і про зворотне: як мої платежі за хмарні послуги «хакнули» мене.

  • Усе почалося з мого грудневого рахунку за Azure, що був сильно вищий за норму. Він прийшов ще 10 січня, але уся сім’я окрім мене звалилась із коронавірусом, тож пройшло ще днів десять, перш ніж я звернув на нього увагу. З часом виявилося, що все — ще гірше, але ми дійдемо й до цього.
Тут і надалі скріншоти з сайту troyhunt.com
  • Настав час розібратись, і перше, що я зробив: глянув детальніше аналіз витрат на Azure, який розбиває загальний рахунок на рахунки за окремі сервіси. HIBP складається з багатьох компонентів, включаючи сайт, реляційної бази даних, сховища і т.п. Одразу ж виокремився один із цих сервісів:
  • Перший рядочок — це 98% вартості пропускної здатності для усіх сервісів, не лише для HIBP, але й для усього іншого, що в мене працює в Azure. Це — вихідна пропускна здатність для даних, що надсилаються поза межі інфраструктури Azure, що коштує $0,014 австралійських доларів за ГБ (біля $0,010 — ред.). Зазвичай йдеться про речі типу трафіку на сайти. Але це — акаунт мого сховища, до чого тут воно? Усе почалося, коли користування сягло до небес:
  • Це сталося 20 грудня 2021 року. Я одразу зрозумів, що сталося: запуск Pwned Password для ФБР разом із сотнями мільйонів нових паролів, наданих Національною агенцією з боротьби зі злочинністю (йдеться саме про «хакнуті» паролі, бази яких для перевірки і збирають сервіси Ханта — ред.). Щось тоді змінилося і мені потрібно було йти глибше, детальніше роздивитись дані з пропускної здатності. Ось дані за чотири години:
  • Кожен з цих піків позначав сплеск у трафіку в 17,3 ГБ. Не зовсім лінійне розподілення, але сплески доволі регулярні. Уже на цей момент я починав розуміти, що вижирає пропускну здатність: завантажувальні хеші з Pwned Passwords. Але їх мала кешувати нода Cloudflare, саме тому я міг дозволити собі надавати цей сервіс безкоштовно. Ось у чому була проблема? Я пішов ще глибше, розглядаючи кожен запит, і включаючи діагностику для акаунту.
{
   "time":"2022-01-20T06:06:24.8409590Z",
   "resourceId":"/subscriptions/[subscription id]/resourceGroups/default-storage-westus/providers/Microsoft.Storage/storageAccounts/pwnedpasswords/blobServices/default",
   "category":"StorageRead",
   "operationName":"GetBlob",
   "operationVersion":"2009-09-19",
   "schemaVersion":"1.0",
   "statusCode":200,
   "statusText":"Success",
   "durationMs":690285,
   "callerIpAddress":"172.68.132.54:13300",
   "correlationId":"c0f0a4c6-601e-010f-80c2-0d2a1c000000",
   "identity":{
      "type":"Anonymous"
   },
   "location":"West US",
   "properties":{
      "accountName":"pwnedpasswords",
      "userAgentHeader":"Mozilla/5.0 (Windows NT; Windows NT 10.0; de-DE) WindowsPowerShell/5.1.14393.4583",
      "etag":"0x8D9C1082643C213",
      "serviceType":"blob",
      "objectKey":"/pwnedpasswords/passwords/pwned-passwords-sha1-ordered-by-count-v8.7z",
      "lastModifiedTime":"12/17/2021 2:51:39 AM",
      "serverLatencyMs":33424,
      "requestHeaderSize":426,
      "responseHeaderSize":308,
      "responseBodySize":18555441195,
      "tlsVersion":"TLS 1.2"
   },
   "uri":"https://downloads.pwnedpasswords.com/passwords/pwned-passwords-sha1-ordered-by-count-v8.7z",
   "protocol":"HTTPS",
   "resourceType":"Microsoft.Storage/storageAccounts/blobServices"
}
  • Ось у чому була проблема. Ці запити з’являлись у логах регулярно, щоразу випалюючи діру розміром із 17,3 ГБ у моєму гаманці. Ця IP-адреса також належить Cloudflare, тож трафік точно проходив крізь їхню інфраструктуру, і мав кешуватися. Що ж із цього приводу говорить дашборд Cloudflare?
  • Це забагато даних як на 24 години, тож поглянемо ще глибше.
  • Знову ці заархівовані хеші. На цій стадії я не розумів, чому це відбувається. Я просто знав, що це спустошує мій гаманець, тож ввімкнув фаєрвол на Cloudflare. І трафік тут же просів.
  • Проблема була зрозуміла: Cloudflare не ловив те, що мав би. Але причина була неясна. Я почав передивлятись усі свої налаштування, приміром, те, що стосувалося політики кешування на піддомені downloads. Наче все добре, нічого не змінилося.
  • Тож я глянув на властивості самого файла у сховищі Azure. І там не було значення CacheControl. Але його ж не було і в будь-яких попередніх zip-файлах. У відчаї я звернувся до друга у Cloudflare і нарешті з’ясувалася правда. Він проглянув дані, і виявив, що справді Cloudflare не кешує ці файли. Але також знайшов налаштування у моєму тарифному плані, що обмежувало максимальний розмір файлу для кешування 15 ГБ, а ці файли були більші.
  • І тоді я згадав про це, і перевірив проблему за даними Azure Storage Explorer. Також стало ясно, чому вона виникла саме зараз (до кінця грудня значно виріс розмір архівованого файла — ред.):
  • Тож, знаючи, у чому проблема, я поміняв налаштування:
  • Я також прибрав прямі лінки на завантаження із сайту і лишив тільки торенти. З того часу Cloudflare підняв ліміт у 15 ГБ, тож я відновив лінки для тих, кому незручний торент. Кризу завершено. Але скільки вона мені коштувала? 11 000 у австралійських доларах або ж 8000 у американських.
  • Я завжди говорив про те, наскільки ефективною та недорогою може бути хмарна інфраструктура, але ця історія про те, наскільки вам може «прилетіти» від цього. Я мав би пильніше моніторити трафік на Azure, адже він там дорогий. Тож на майбутнє я налаштував там повідомлення про те, коли обсяги трафіку перевищують певний ліміт. Якби я додумався до цього місяць тому, не було би цих витрат.
  • Також я налаштував на Azure і обмеження по бюджету на місяць:

Вартість послуг часто непомітно повзе нагору, коли ви навіть не звертаєте увагу. Я мав би пильніше слідкувати за цим і мав би набагато раніше налаштувати сповіщення про перевищення певного рівня вартості.

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