Перейти до вмісту
EuroVPSEuroVPS

Origin IP за CDN: як він витікає і як його закрити

Сканування публічного hostname перевіряє edge CDN. Origin зазвичай можна виявити з DNS самого домену, тож знайдіть його, проскануйте саме його і прив’яжіть до CDN.

Автор EuroVPS EngineeringМашинне відділення

6 хв читання
У цій статті 5 розділів
Коротко
  • Сканування публічного hostname проходить через CDN і звітує про CDN. Воно нічого не каже про сервер за ним.
  • Адресу origin зазвичай публікує сам домен: запис SPF, хости MX, субдомен без proxy, сертифікат у transparency logs, заголовок Received у вихідній пошті.
  • Знайдіть її так, як це зробив би зловмисник, зафіксуйте її, проскануйте сам сервер ззовні, а потім обмежте firewall origin діапазонами адрес CDN і вимагайте автентифікації для origin pulls, щоб адреса була марною, навіть коли вона відома.

Парадні двері та чорний хід

CDN або хмарний WAF стоїть перед сервером і обслуговує hostname. Спрямуйте сканер на цей hostname, і запит піде на edge: TLS edge, заголовки edge, rate limits і правила edge. Зелений звіт є звітом про edge. Origin, справжній сервер, це сканування не торкнулося, і все, що він відкриває напряму, залишається відкритим для кожного, хто дістається до нього за адресою, а не за іменем.

Що скануєтьсяЩо перевіряєтьсяЩо це доводить про origin
Публічний hostname, через CDNEdge: його WAF, TLS і rate limitsНічого
Зафіксована адреса originСам сервер, так, як до нього дістається зловмисникЧого може торкнутися незнайомець з інтернету

Звідки витікає origin

Адреса рідко буває добре схована, бо домен публікує її для інших потреб. Запис SPF є найпоширенішим випадком. Політика SPF, яка використовує механізм a, уповноважує власний запис A домену надсилати пошту, а цей запис A і є origin за CDN. Механізм mx вказує на поштові хости, які часто розташовані в тому самому діапазоні. Буквальний ip4: прописує її відкритим текстом.

TERMINAL
$ dig +short TXT example.com
"v=spf1 a mx ip4:<address> include:_spf.<mail-provider> ~all"
$ dig +short MX example.com
$ dig +short A mail.example.com ftp.example.com staging.example.com origin.example.com

Крім SPF: субдомени, які ніколи не ставили за CDN (mail, ftp, панель керування, staging, голий origin host), що резолвляться прямо на сервер. Certificate transparency logs, які фіксують кожен сертифікат, виданий для імені, включно з тим, що стоїть на origin host. Бази passive DNS, які зберігають запис A з часів до появи CDN. Заголовки Received у будь-якій пошті, яку надсилає вебсервер, і які називають хост, з якого вона вийшла. І функції застосунку, що змушують сервер з’єднуватися назовні на запит, як-от pingbacks і тести webhook, які показують адресу з’єднання тому, хто приймає виклик.

Зафіксуйте origin і проскануйте те, що сканує зловмисник

Щойно адреса відома, змусьте інструменти ігнорувати CDN. curl робить це для кожного запиту. Сканери, які цього не вміють, отримують запис у hosts file. Запускайте це з машини, яка не перебуває у вашій мережі і не входить у жоден allowlist, якому довіряє origin, бо сканування з довіреної адреси звітує про те, що бачать довірені адреси.

TERMINAL
# per request, no hosts-file change
$ curl --resolve example.com:443:<address> -sI https://example.com/

# for tools without --resolve
$ echo "<address>  example.com" | sudo tee -a /etc/hosts

Ведіть у результаті дві колонки. Колонка інфраструктури: які порти відповідають, які версії TLS приймаються, чи видають banners назви програмного забезпечення. Колонка застосунку: endpoints без автентифікації, що перелічують користувачів, файли debug або логи, читабельні у web root, адміністративні шляхи, доступні без другого фактора, компоненти, що відстають від своєї поточної версії. Посилена машина, яка обслуговує відкритий застосунок, не є безпечним сайтом, і дві колонки не усереднюються в один вердикт.

Прив’яжіть origin до CDN

Структурне виправлення робиться на origin, а не на edge. Вебпорти відповідають лише опублікованим діапазонам адрес CDN, а все інше відхиляється за замовчуванням. На хості з firewalld:

TERMINAL
# load the CDN's published ranges into an ipset, then allow only them on 443
$ firewall-cmd --permanent --new-ipset=cdn-v4 --type=hash:net
$ firewall-cmd --permanent --ipset=cdn-v4 --add-entries-from-file=cdn-ranges-v4.txt
$ firewall-cmd --permanent --zone=public --remove-service=http
$ firewall-cmd --permanent --zone=public --remove-service=https
$ firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source ipset="cdn-v4" port port="443" protocol="tcp" accept'
$ firewall-cmd --reload
$ firewall-cmd --ipset=cdn-v4 --get-entries

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

Діапазони адрес є першим замком, але не єдиним. Більшість CDN можуть автентифікувати свої pulls до origin клієнтським сертифікатом. Вимагайте його на вебсервері, щоб запит з діапазону CDN, який не пред’являє сертифікат, усе одно відхилявся. Потім усуньте витоки, що залишилися: запис SPF, який називає лише хости, що надсилають пошту, жодних субдоменів без proxy, що вказують на origin, і, де це практично, нова адреса origin після встановлення замка, бо стара залишається в passive DNS безстроково.

Перевірте ззовні

Повторіть зафіксоване сканування з тієї самої недовіреної точки. Origin відмовляє у з’єднанні на 443, а hostname і далі обслуговується через CDN. Повторюйте після кожної зміни діапазонів або конфігурації вебсервера. Як перетворити це на постійну перевірку, а не на разову дію, йдеться у статті доведіть, що закрито, ззовні.

TERMINAL
$ curl --resolve example.com:443:<address> -m 5 -sI https://example.com/ ; echo "exit $?"
exit 28
# a timeout (28) or a refused connection (7) is the correct answer from the locked origin

Прямі відповіді

Чи захищає CDN мій origin-сервер?+

Лише для трафіку, який проходить через нього. WAF, TLS і rate limits застосовуються на edge. Запит, зроблений напряму на адресу origin, не зустрічає жодного з них, тому origin має відхиляти все, що не є CDN.

Як зловмисник знаходить origin IP за CDN?+

Найчастіше з DNS самого домену: запис SPF з механізмами a, mx або ip4, хости MX у тому самому діапазоні, субдомени, які ніколи не проксіювалися. А також із certificate transparency logs, історії passive DNS і заголовків пошти, яку надсилає сервер. Виходьте з того, що її знайдуть, і закрийте origin так, ніби це вже сталося.

У чому різниця між скануванням hostname і скануванням origin?+

Hostname резолвиться на CDN, тому сканування перевіряє edge. Origin є сервером. Фіксація адреси origin через curl --resolve або запис у hosts file, з мережі, якій origin не довіряє, перевіряє те, що перевіряє зловмисник.

Щойно origin прив’язано до CDN, чи має ще значення витік через SPF?+

Вебпорти більше не відповідають, але адреса все ще відома, і будь-який інший сервіс на ній (SSH, пошта, панель керування) залишається досяжним, якщо його теж не обмежити. Звузьте запис SPF до справжніх поштових хостів, перенесіть origin на свіжу адресу, де це практично, і додайте решту сервісів до allowlist.

Хочете, щоб origin знайшов, зафіксував і закрив хтось, хто працює ззовні вашої мережі?

Поговоріть з інженером.

Поговоріть з інженером (shell cta.talkToEngineer)

Ви дійшли до кінця.

Застосуйте прочитане на практиці

Що ви запускаєте?

Розкажіть нам про навантаження, трафік і вимоги до відновлення. Почніть з конструктора сервера або обговоріть деталі з інженером.

Написано інженерами, які будують і експлуатують інфраструктуру, про яку йдеться.
Поговоріть з інженером
XIn

Залишилося 6 хв