Әкімшілік субдомен CSRF-ны тоқтатпайды: іске қосу алдында төрт тексеру
Жаңа хост атауы — жаңа origin, көбіне сол сайт, сондықтан same-site cookie файлдары мен қарапайым формалар одан өтеді. Токендерді, қақпаны және авторизацияны тексеріңіз.
Әкімшілік интерфейсті admin.example.com-қа көшіру нақты жақсарту: ол әкімшілік cookie файлдарын жалпыға ашық беттерден алыс ұстайды, екі қосымшаға бөлек кэш береді және қатаңырақ желілік саясатты бір хост атауына бағыттауға мүмкіндік береді. Бірақ бұл CSRF бақылауы емес және жалпыға ашық сайттың кодын жүйеге кірген әкімшінің алдында ашық ұстауға қауіпсіз етпейді. Бөлу браузер шекара деп санайтынды өзгертеді, сервер тексеретінді емес, сондықтан жұмысты бітті деп айтпас бұрын осы төрт тексеруді орындаңыз.
Origin мен сайтты екі бөлек сөз ретінде оқыңыз
Origin — схема, хост және порт, сондықтан https://www.example.com мен https://admin.example.com әртүрлі origin. Сайт SameSite мағынасында схема қосу тіркелетін домен, сондықтан бұл екі хост атауы әдетте бір сайт. Осы айырмашылық — бүкіл тұзақ: SameSite атрибуты ағайынды субдомендер арасында көмектеспейді, өйткені браузер сұранысты мүлде сайтаралық деп санамайды. Әкімшілік интерфейсті шынымен басқа тіркелетін доменге, мысалы admin-example.net-ке бағыттаңыз, сонда сұраныс шынымен сайтаралық болады, және дәл сол жерде SameSite=Lax немесе Strict сенуге болатын жұмысты бастайды.
Мұны пайымдаумен емес, браузерде тексеріңіз.
Жалпыға ашық сайтты жүктеңіз, әзірлеуші құралдарын ашыңыз және браузер әкімшілік хостқа бағытталған сұранысқа қандай cookie қосатынын қараңыз. Егер cookie-де Domain атрибуты болмаса, ол тек хостқа тиесілі және өз атауында қалады; егер Domain=example.com болса, ол әр ағайынға барады, және жаңа субдомен сол cookie үшін ештеңе бермеді.
Жауапты оқуды сұраныс жіберуден бөліңіз
Бірдей origin саясаты origin-дар арасында жауаптарды оқуды шектейді. Ол сұраныстың жіберілуін тоқтатпайды және браузерде бар тіркелу деректерін форманың алып жүруіне кедергі жасамайды. Қарапайым сұраныс, форма мазмұнының түрімен немесе қарапайым GET-пен, алдын ала тексерусіз жеткізіледі; содан кейін CORS шақырушы скрипттің жауапты оқи алатынын шешеді. CSRF толығымен жіберу жағында өмір сүреді.
Сондықтан серверге күйді өзгертетін операциялар үшін айқын тексеру қажет. Сессияға байланған синхрондау токені немесе серверде салыстырылатын қосарланған жіберу cookie-і бұл жағдайды жабады; Origin немесе Referer салыстыруын екінші қақпа ретінде қосуға тұрарлық, бірақ жалғыз емес, өйткені әр сұраныс тақырыпшаны алып жүрмейді және әр прокси оны сақтамайды. OWASP-тың CSRF алдын алу жөніндегі нұсқаулығы SameSite-ты бірнеше қабаттың бірі деп дәл осы себепті санайды.
Желілік қақпаның шын мәнінде нені дәлелдейтінін шешіңіз
Әкімшілік хосттың алдындағы VPN шығуларының рұқсат тізімі жақсы бақылау және әлсіз сәйкестендіру мәлімдемесі. Ол сұраныстың VPN беретін мекенжайдан келгенін дәлелдейді, оны сол шығудағы барлығы бөлісе алады, және оның артында қандай адам немесе құрылғы тұрғанын айтпайды. Оны кіру сүзгісі ретінде қарастырыңыз, аутентификация ретінде емес.
Оны сұраныс деңгейіндегі тексерулерден тәуелсіз ұстаңыз. Егер тізім шабуылдаушы мен күйді өзгертетін соңғы нүкте арасындағы жалғыз нәрсе болса, бір қате конфигурацияланған маршрут, бір split-tunnel клиенті немесе бір қарызға алынған ноутбук бақылауды толығымен жояды.
Күтілетін диапазондардан тыс бас тартуларды да журналға жазыңыз. Олардың атылуы біреудің жаңа салған шекараңызды зерттеп жатқанының ең пайдалы белгісі, ал тыныштық сүзгіге мүлде жетпейтінінің белгісі.
Cookie файлдарын, кіруді және авторизацияны айқын ұстаңыз
Cookie ауқымы нәтиженің көп бөлігін шешеді. Ата-аналық доменнің cookie-і әкімшілік хостқа жіберіледі, сондықтан жалпыға ашық сайттағы скрипт енгізу әкімшінің сессиясымен әрекет ете алады; тек хосттікі ғана мұны істей алмайды. Тек хосттің формасын таңдаңыз, Secure атрибутын қосыңыз және платформа қолдаса __Host- префиксін пайдаланыңыз, өйткені бұл префикс Secure, Path=/ және Domain атрибутының болмауын талап етеді. Cookie құтысын емес, жауап тақырыпшасын оқыңыз: Set-Cookie: __Host-admin_session=...; Secure; Path=/; HttpOnly; SameSite=Lax, Domain атрибутынсыз. Браузер Domain бар __Host- cookie-ін лақтырып тастайды, сондықтан ағайынды хосттарда әлі көрінетін cookie префикстің ешқашан қолданылмағанының дәлелі.
Содан кейін авторизацияны серверде, әр сұраныс үшін, әр әкімшілік соңғы нүктеде ұстаңыз, тек кіру кезінде емес. Рұқсат етілген желіден келген сұраныс әлі де аутентификацияланып, сұраған операциясына авторизациялануы керек; хост атауы әрекет етуші тұлға емес. Егер жалпыға ашық және әкімшілік қосымшалар кіру ағынын немесе сессия қоймасын бөліссе, сол байланысты жазып қойыңыз, өйткені бұл жалпыға ашық сайттың қатесінен әкімшілік әрекетке дейінгі ең қысқа жол.
Бөлуден кейін шекараны қайта тексеріңіз
Теріс тесттерді іске қосыңыз, тек жағымды жолды емес: токенсіз сайтаралық форма қабылданбауы керек, басқа сессияның токені қабылданбауы керек және ешбір GET күйді өзгертпеуі керек. Cookie атрибуттарын әзірлеуші құралдарында тексеріңіз, Origin тексеруінің сәйкес келмейтін сұраныста іске қосылатынын растаңыз және сүзгінің жұмысын көру үшін әкімшілік хостты VPN диапазонының сыртынан қолданып көріңіз.
Бұлардың ешқайсысы әкімшілік қосымшаның ішіндегі XSS ақауын жоймайды. Бөлек хост атауы нақты құндылығы бар браузер жағындағы оқшаулау шекарасы және қауіпсіз емес кодтың орындалуын болдырмаудың немесе сервер жағындағы сұраныстарды қорғаудың орнын баспайды. Бөлуден кейін тізім көрінгеннен қысқа: бөлек origin, тек хосттік cookie файлдары, әр өзгерісте токен, сәйкестік ретінде сенімсіз кіру сүзгісі және әр сұраныс үшін шешілетін авторизация.