Як забезпечити безпеку REST API

Web Application Programming Interface (APIs) забезпечує back-end для сучасних веб- та мобільних додатків. REST APIs є найпоширенішим типом веб API для вебсервісів і мікросервісів, а запити веб API становлять понад 80% всього вебтрафіку, в наслідок чого, вони дедалі частіше стають ціллю для кіберзлочинців.

У цій публікації містяться практичні рекомендації для виявлення вразливостей в інтерфейсах вебдодатків та забезпечення безпеки REST API.

Що таке REST API?

REST (Representational State Transfer) — це стиль архітектури програмного забезпечення для веброзробки, який найчастіше використовується для зв’язку по протоколу HTTP. RESTful APIs (або просто REST APIs) дозволяє вебклієнтам і серверам взаємодіяти з величезною різноманітністю вебресурсів.

Як правило, REST APIs використовують стандартні HTTP команди (методи) і коди станів. Дані переважно в форматі JSON, проте використання REST — умова необов’язкова. Існують інші, більш стандартизовані формати веб API — SOAP (на основі XML) і GraphQL (який дозволяє виконувати запити API, подібні до бази даних).

Варто пам’ятати, що REST APIs не фіксує дані про стан системи, як і сам HTTP протокол, тобто вони не зберігають жодної інформації про поточні з’єднання чи сеанси. Вебсервіси RESTful передбачають різні способи доступу до ресурсів і керування ними, тоді як управління сеансами має здійснюватися за допомогою додатків. Саме тут виникає проблема пов’язана з безпекою, оскільки вразливе програмне забезпечення робить можливим атаки через API.

Два рівні безпеки REST API

Перш ніж перейти до технічних деталей, слід звернути увагу на одну важливу річ. Веб API надає спосіб доступу до вебдодатка, тому потрібно думати про безпеку на двох рівнях: доступ до API, а потім і доступ до додатка. Безпека на рівні API означає, що потрібно налаштувати процес автентифікації, авторизації та надання доступу, таким чином, щоб лише авторизовані клієнти могли використовувати інтерфейс і виконувати лише дозволені операції. На рівні додатку потрібно переконатися, що кінцеві точки (тобто всі URl, які використовуються для доступу до інтерфейсу) не є вразливими для атак, які проходять через або в обхід інтерфейсу. Розглянемо, як можна забезпечити безпеку REST API на цих двох рівнях.

Забезпечення безпечного доступу до API

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

  • Безпека з’єднання

Безпека починається з самого HTTP-з’єднання. Безпечний REST APIs захищає лише кінцеві точки HTTPS, забезпечує шифрування всіх зв’язків API за допомогою SSL/TLS. Це дозволяє клієнтам аутентифікувати службу, і в той самий час, захищає облікові дані API та дані що передаються від атак типу «man-in-the-middle» та інших способів перехоплення трафіку.

  • Контроль доступу

Більшість веб APIs доступні лише для автентифікованих користувачів, часто тому, що вони приватні або вимагають реєстрації чи оплати. Оскільки REST APIs не мають стану, весь контроль доступу та аутентифікація обробляються локальними кінцевими точками. Найпоширеніші методи автентифікації REST API:

  • Базова автентифікація HTTP: облікові дані надсилаються безпосередньо в header HTTP і конвертуються в код у форматі Base64 без шифрування. Цей метод автентифікації користувача є найпростішим і найлегшим у реалізації. Однак він також є найменш безпечним, оскільки надсилає конфіденційну інформацію у вигляді простого тексту. З цієї причини, його слід використовувати лише в поєднанні з HTTPS, щоб забезпечити шифрування трафіку.
  • Вебтокени JSON (JWT): облікові дані та інші параметри доступу надсилаються як структури даних JSON. Ці маркери доступу можуть бути підписані криптографічно і є кращим способом контролю доступу до REST APIs.
  • OAuth: стандартні механізми OAuth 2.0 можна використовувати для аутентифікації та авторизації. OpenID Connect забезпечує безпечну автентифікацію через OAuth 2.0. Google API, наприклад, також використовує OAuth 2.0.
  • Авторизація користувача на основі ключів API

Ключі API надають спосіб контролювати доступ до загальнодоступних служб REST. Оператори загальнодоступних вебсервісів можуть використовувати ключі API, щоб застосувати обмеження швидкості для запитів API та запобігати атаки типу denial-of-service (DoS). Якщо компанія надає комерційні послуги та має декілька цінових планів, вона може використовувати ключі API, щоб надавати певний рівень доступу, що відповідає конкретному пакету послуг, придбаному користувачем.

  • Обмеження клієнта API

Щоб мінімізувати ризики безпеки, оператори служби REST повинні обмежити запити API мінімальним набором можливостей, необхідних для служби. Це починається з обмеження підтримуваних методів HTTP, щоб переконатися, що неправильно налаштовані клієнти або зловмисники не можуть виконувати жодних дій за межами специфікації API та дозволеного рівня доступу. Наприклад, якщо API дозволяє лише запити GET, POST та всі інші типи запитів мають бути відхилені з кодом відповіді 405 Method not allowed.

Захист програм, які використовують API

Як тільки клієнт веб API отримав доступ, потрібно захистити базову вебпрограму від некоректних та шкідливих вхідних даних. Запити та відповіді REST API також можуть містити конфіденційні дані, які потребують належного рівня захисту.

  • Конфіденційні дані

Виклики API часто включають облікові дані, ключі API, токени сеансу та іншу конфіденційну інформацію. Якщо включати їх безпосередньо в URL-адреси, ці деталі можуть зберігатися в журналах вебсервера та бути втраченими, якщо журнали отримують кіберзлочинці. Щоб уникнути витоку конфіденційної інформації, вебсервіси RESTful повинні завжди надсилати її в заголовках HTTP-запитів або в body запиту (для запитів POST і PUT).

  • Перевірка типу вмісту

Як частина накладення обмежень для клієнта API, служби REST повинні точно визначати дозволені типи вмісту та відхиляти всі запити, які не мають правильних декларацій у заголовках HTTP. Це означає, що необхідно ретельно прописати дозволені типи у заголовках Content-Type та Accept разом із набором символів (де це можливо). Якщо сервіс містить JavaScript або інший скриптовий код, потрібно встановити той самий тип вмісту в header та body запиту, наприклад application/javascript. Це допомагає захистити header від атак типу «ін’єкція». Аналогічно, якщо кінцева точка ніколи не повертає HTML, встановлення правильного типу вмісту зменшує ризик того що відповідь буде аналізуватися як HTML.

  • Безпечні заголовки у відповідях

Можна встановити додаткові header-и для безпеки HTTP, щоб додатково обмежити тип і обсяг запитів. Вони повинні охоплювати маркер X-Content-Type-Options: nosniff для запобігання атак типу cross-site scripting (XSS) на основі MIME sniffing та X-Frame-Options: deny для запобігання спробам клікджекінгу в старих браузерах. Якщо служба не підтримує міждоменні запити, слід вимкнути CORS (Cross-Origin Resource Sharing) у header відповідей. Якщо такі виклики є очікуваною поведінкою, потрібно встановити header CORS, який точно буде вказувати на дозволені джерела.

  • Перевірка введення

APIs розроблено для автоматичного доступу без взаємодії з користувачем, тому особливо важливо переконатися, що всі введення є дійсними та очікуваними. Будь-які запити, які не відповідають специфікації API, мають бути відхилені. Ось деякі загальні вказівки щодо перевірки введення REST API :

  • Використовувати вбудовані функції перевірки та кодування, якщо вони доступні.
  • За замовчуванням розглядати всі параметри, об’єкти та інші вхідні дані як ненадійні.
  • Завжди перевіряти розмір запиту, довжину вмісту та тип вмісту.
  • Використовувати strong typing для параметрів API (якщо підтримується).
  • Щоб запобігти SQL-ін’єкції, потрібно уникати створення запитів вручну – замість цього використовувати параметризовані запити.
  • Використовувати значення параметрів з білого списку та введення рядкових даних (string inputs), де це можливо (а не створювати чорний список).
  • Записувати та відстежувати всі помилки перевірки введення, щоб виявити спроби заповнення облікових даних.

Чому безпека REST API так важлива

Веб APIs є основою сучасної веб- та мобільної розробки. Він дозволяє програмам і службам обмінюватися даними між апаратною частиною та програмними платформами. І хоча SOAP APIs все ще використовуються, а GraphQL все частіше застосовують в додатках для big data, на REST APIs припадає понад 80% усіх загальнодоступних веб APIs. Він забезпечує бек-енд для більшості мобільних додатків та пристроїв IoT і дозволяє легко їх інтегрувати із системою.

Оскільки він застосовує ті ж технології, що й вебдодатки, REST APIs може бути вразливим до тих же самих атак. Однак APIs не призначений для ручного доступу, тому його може бути важко контролювати, особливо якщо деякі кінцеві точки та функції незадокументовані.

Тестування безпеки API вимагає точних автоматизованих інструментів для забезпечення повного покриття. Поряд із провідними в галузі функціями тестування безпеки вебдодатків, сканер вразливостей Invicti також дозволяє сканувати REST APIs на вразливості «out-of-the-box» з підтримкою всіх популярних методів аутентифікації (включаючи OAuth2) та автоматичного перезапису URL-адрес.

Джерело

Підписатися на новини