Išsamus vadovas, kaip apsaugoti savo FastAPI aplikacijas naudojant CORS ir esmines saugumo antraštes, užtikrinant patikimą apsaugą nuo įprastų interneto pažeidžiamumų.
FastAPI Saugumas: CORS ir Saugumo Antraštės Patikimoms API
Šiandieninėje tarpusavyje susijusioje skaitmeninėje erdvėje, API apsauga yra svarbiausia. FastAPI, modernus, aukštos kokybės interneto karkasas, skirtas API kūrimui su Python, siūlo puikius įrankius ir funkcijas patikimoms saugumo priemonėms įgyvendinti. Šis išsamus vadovas nagrinėja du svarbiausius FastAPI saugumo aspektus: Cross-Origin Resource Sharing (CORS) ir saugumo antraštes. Suprasdami ir įgyvendindami šias technikas, galite žymiai pagerinti savo API apsaugą nuo įprastų interneto pažeidžiamumų.
CORS (Cross-Origin Resource Sharing) Supratimas
CORS yra naršyklės saugumo mechanizmas, kuris apriboja tinklalapių užklausas į kitą domeną nei tas, kuris aptarnavo tinklalapį. Ši politika galioja siekiant užkirsti kelią kenkėjiškoms svetainėms gauti prieigą prie neskelbtinų duomenų iš kitų svetainių be tinkamo leidimo. Be CORS, nesąžininga svetainė galėtų potencialiai pateikti neteisėtas užklausas į jūsų API prisijungusio vartotojo vardu, o tai galėtų sukelti duomenų pažeidimus ar kitus saugumo išnaudojimus.
Kodėl CORS yra Būtinas?
Įsivaizduokite scenarijų, kai vartotojas yra prisijungęs prie savo internetinės bankininkystės paskyros. Tuo pačiu metu jie lankosi kenkėjiškoje svetainėje. Be CORS, kenkėjiška svetainė galėtų potencialiai vykdyti JavaScript kodą, kuris siunčia užklausas į vartotojo bankininkystės API, pervesdamas lėšas į užpuoliko sąskaitą. CORS to neleidžia, pagal numatytuosius nustatymus įgyvendindamas tos pačios kilmės politiką.
Kaip Veikia CORS
Kai naršyklė pateikia užklausą iš skirtingos kilmės (užklausą į kitą kilmę nei dabartinis puslapis), ji pirmiausia atlieka „preflight“ užklausą naudodama HTTP OPTIONS metodą. Ši „preflight“ užklausa patikrina serverį, kad nustatytų, ar tikroji užklausa yra leidžiama. Serveris atsako antraštėmis, nurodančiomis, kurios kilmės, metodai ir antraštės yra leidžiamos. Jei naršyklė nustato, kad užklausa yra leidžiama pagal serverio atsakymą, ji tęsia su tikrąja užklausa. Priešingu atveju užklausa blokuojama.
„Kilmé“ apibrėžiama protokolu (pvz., HTTP arba HTTPS), domenu (pvz., example.com) ir prievadu (pvz., 80 arba 443). Du URL laikomi tos pačios kilmės tik tuo atveju, jei visi trys iš šių komponentų visiškai atitinka.
CORS Konfigūravimas FastAPI
FastAPI supaprastina CORS konfigūravimo procesą naudojant CORSMiddleware. Galite pridėti šią tarpinę programinę įrangą prie savo FastAPI aplikacijos, kad įgalintumėte CORS ir nurodytumėte leidžiamas kilmes, metodus ir antraštes.
Štai pagrindinis pavyzdys, kaip įgalinti CORS FastAPI:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
origins = [
"http://localhost",
"http://localhost:8080",
"https://example.com",
"https://*.example.com", # Leisti visiems example.com subdomenams
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/")
async def read_root():
return {"message": "Hello, World!"}
Šiame pavyzdyje:
allow_origins: nurodo kilmių, kurioms leidžiama teikti užklausas iš skirtingos kilmės, sąrašą. Naudojant["*"]leidžiamos visos kilmės, o tai paprastai nerekomenduojama gamybos aplinkoms. Vietoj to nurodykite tikslias kilmes, kurios turėtų būti leidžiamos.allow_credentials: nurodo, ar leidžiama įtraukti kredencialus (pvz., slapukus, autorizacijos antraštes) į užklausas iš skirtingos kilmės. Nustatant šį parametrą įTrue, reikia, kadAccess-Control-Allow-Originantraštė būtų nustatyta į konkrečią kilmę, o ne į*.allow_methods: nurodo HTTP metodų, kurie yra leidžiami užklausoms iš skirtingos kilmės, sąrašą. Naudojant["*"]leidžiami visi metodai. Galite apriboti tai iki konkrečių metodų, tokių kaip["GET", "POST", "PUT", "DELETE"], kad užtikrintumėte didesnį saugumą.allow_headers: nurodo HTTP antraščių, kurios leidžiamos užklausose iš skirtingos kilmės, sąrašą. Naudojant["*"]leidžiamos visos antraštės. Apsvarstykite galimybę apriboti tai tik reikalingomis antraštėmis, kad padidintumėte saugumą.
Geriausia CORS Konfigūravimo Praktika
- Venkite naudoti
["*"]allow_originsgamyboje: Tai atveria jūsų API užklausoms iš bet kurios kilmės, o tai gali būti saugumo rizika. Vietoj to aiškiai išvardykite leidžiamas kilmes. - Būkite konkretūs su leidžiamais metodais ir antraštėmis: Leiskite tik tuos metodus ir antraštes, kurių iš tikrųjų reikia jūsų aplikacijai.
- Supraskite
allow_credentialspasekmes: Jei leidžiate kredencialus, įsitikinkite, kad suprantate saugumo pasekmes ir atitinkamai sukonfigūruokite savo serverį. - Reguliariai peržiūrėkite savo CORS konfigūraciją: Kadangi jūsų aplikacija tobulėja, jūsų CORS konfigūraciją gali reikėti atnaujinti, kad atspindėtų leidžiamų kilmių, metodų ar antraščių pokyčius.
Saugumo Antraščių Įgyvendinimas
Saugumo antraštės yra HTTP atsakymo antraštės, kurios pateikia naršyklei instrukcijas, kaip elgtis apdorojant jūsų svetainę ar API. Jos padeda sumažinti įvairius interneto pažeidžiamumus, tokius kaip Cross-Site Scripting (XSS), Clickjacking ir kitos atakos. Teisingas šių antraščių nustatymas yra labai svarbus norint apsaugoti jūsų FastAPI aplikaciją.
Įprastos Saugumo Antraštės ir Jų Svarba
Content-Security-Policy (CSP): Ši antraštė yra galingas įrankis, skirtas užkirsti kelią XSS atakoms. Ji leidžia apibrėžti šaltinių, iš kurių naršyklei leidžiama įkelti tokius išteklius kaip scenarijai, stilių lapai ir paveikslėliai, baltąjį sąrašą.X-Frame-Options: Ši antraštė apsaugo nuo Clickjacking atakų, neleisdama jūsų svetainei būti įterptai į rėmą kitoje svetainėje.Strict-Transport-Security (HSTS): Ši antraštė priverčia naršyklę visada naudoti HTTPS, kai pasiekiate jūsų svetainę, užkertant kelią žmogaus įsibrovimo atakoms.X-Content-Type-Options: Ši antraštė neleidžia naršyklei interpretuoti failų kaip kitokio MIME tipo nei tas, kuris deklaruotasContent-Typeantraštėje, sumažinant MIME sniffing pažeidžiamumus.Referrer-Policy: Ši antraštė kontroliuoja, kiek referrer informacijos (ankstesnio puslapio URL) siunčiama su užklausomis.Permissions-Policy(anksčiau Feature-Policy): Ši antraštė leidžia jums valdyti, kurias naršyklės funkcijas (pvz., kamera, mikrofonas, geografinė vieta) leidžiama naudoti jūsų svetainėje.
Saugumo Antraščių Nustatymas FastAPI
Nors FastAPI neturi įmontuotos tarpinės programinės įrangos, skirtos specialiai saugumo antraštėms nustatyti, galite lengvai tai pasiekti naudodami pasirinktinę tarpinę programinę įrangą arba trečiosios šalies biblioteką, tokią kaip starlette-security, arba tiesiogiai nustatydami antraštes savo atsakymuose.
Pavyzdys naudojant pasirinktinę tarpinę programinę įrangą:
from fastapi import FastAPI, Request, Response
from starlette.middleware import Middleware
from starlette.responses import JSONResponse
app = FastAPI()
async def add_security_headers(request: Request, call_next):
response: Response = await call_next(request)
response.headers["Content-Security-Policy"] = "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; object-src 'none'; media-src 'self'; frame-ancestors 'none'; upgrade-insecure-requests; block-all-mixed-content;"
response.headers["X-Frame-Options"] = "DENY"
response.headers["X-Content-Type-Options"] = "nosniff"
response.headers["Referrer-Policy"] = "strict-origin-when-cross-origin"
response.headers["Strict-Transport-Security"] = "max-age=31536000; includeSubDomains; preload"
response.headers["Permissions-Policy"] = "geolocation=(), camera=(), microphone=()"
return response
app.middleware("http")(add_security_headers)
@app.get("/")
async def read_root():
return {"message": "Hello, World!"}
Šiame pavyzdyje add_security_headers tarpinė programinė įranga pridedama prie FastAPI aplikacijos. Ši tarpinė programinė įranga perima kiekvieną užklausą ir prideda nurodytas saugumo antraštes prie atsakymo. Aptarkime antraštes:
Content-Security-Policy: Tai sudėtinga antraštė, kuri apibrėžia leidžiamus šaltinius įvairiems išteklių tipams. Šiame pavyzdyje ji leidžia išteklius iš tos pačios kilmės ('self'), įterptus scenarijus ir stilius ('unsafe-inline'- naudokite atsargiai), duomenų URI paveikslėliams (data:) ir neleidžia object elementų (object-src 'none'). Ji taip pat nustatoframe-ancestors 'none', kad apsaugotų nuo clickjacking.upgrade-insecure-requestsnurodo naršyklei atnaujinti visus nesaugius (HTTP) URL į HTTPS.block-all-mixed-contentneleidžia naršyklei įkelti jokio mišraus turinio (HTTP turinio HTTPS puslapyje). Labai svarbu pritaikyti šią antraštę, kad ji atitiktų jūsų konkrečios aplikacijos poreikius. Netinkamos CSP konfigūracijos gali sugadinti jūsų svetainę.X-Frame-Options: Nustatyta įDENY, kad puslapis nebūtų įrėmintas jokio domeno. ArbaSAMEORIGINleidžia įrėminti tik tam pačiam domenui.X-Content-Type-Options: Nustatyta įnosniff, kad būtų išvengta MIME sniffing.Referrer-Policy: Nustatyta įstrict-origin-when-cross-origin, kad būtų siunčiama kilmė (protokolas + pagrindinis kompiuteris) kaip referrer, kai naršoma į kitą kilmę, ir jokia referrer, kai naršoma į tą pačią kilmę.Strict-Transport-Security: Nustato politiką, kuri priverčia naršyklę naudoti HTTPS nurodytą laikotarpį (max-age).includeSubDomainsužtikrina, kad visi subdomenai taip pat būtų apsaugoti HTTPS.preloadleidžia domenui būti įtrauktam į HSTS preload sąrašą, kuris yra įdiegtas naršyklėse. Atminkite, kad norint naudotipreload, jūsų svetainė turi būti pateikta ir priimta į HSTS preload sąrašą.Permissions-Policy: Nurodo, kurias funkcijas (pvz., geografinė vieta, kamera, mikrofonas) leidžiama naudoti naršyklėje. Šiame pavyzdyje visos jos yra neleidžiamos.
Pagrindiniai Saugumo Antraščių Aspektai:
- Atsargiai pritaikykite
Content-Security-Policy: Tai yra sudėtingiausia saugumo antraštė ir labai svarbu ją tinkamai sukonfigūruoti, kad nepažeistumėte savo svetainės. Naudokite CSP generatorių arba validator, kad sukurtumėte saugią ir veiksmingą politiką. - Patikrinkite savo saugumo antraštes: Naudokite internetinius įrankius, tokius kaip SecurityHeaders.com, kad patikrintumėte savo svetainės saugumo antraštes ir nustatytumėte galimas problemas.
- Stebėkite savo saugumo antraštes: Reguliariai stebėkite savo saugumo antraštes, kad užtikrintumėte, jog jos vis dar veiksmingos ir kad nereikia jokių pakeitimų.
- Apsvarstykite galimybę naudoti turinio pristatymo tinklą (CDN): Daugelis CDN siūlo įmontuotas saugumo antraščių valdymo funkcijas, kurios gali supaprastinti saugumo antraščių nustatymo ir priežiūros procesą.
Be CORS ir Saugumo Antraščių
Nors CORS ir saugumo antraštės yra būtinos API saugumui, tai nėra vienintelės priemonės, kurių turėtumėte imtis. Kiti svarbūs saugumo aspektai apima:
- Autentifikavimas ir Autorizacija: Įgyvendinkite patikimus autentifikavimo ir autorizacijos mechanizmus, kad užtikrintumėte, jog tik autorizuoti vartotojai gali pasiekti jūsų API. Apsvarstykite galimybę naudoti OAuth 2.0 arba JWT (JSON Web Tokens) autentifikavimui.
- Įvesties Tikrinimas: Patikrinkite visą vartotojo įvestį, kad išvengtumėte įpurškimo atakų (pvz., SQL įpurškimo, XSS).
- Spartos Ribojimas: Įgyvendinkite spartos ribojimą, kad išvengtumėte paslaugos trikdymo (DoS) atakų.
- Registravimas ir Stebėjimas: Registruokite visas API užklausas ir stebėkite savo API, ar nėra įtartinos veiklos.
- Reguliarūs Saugumo Auditai: Atlikite reguliarius saugumo auditus, kad nustatytumėte ir pašalintumėte galimus pažeidžiamumus.
- Nuolat Atnaujinkite Priklausomybes: Reguliariai atnaujinkite savo FastAPI versiją ir visas jos priklausomybes, kad pataisytumėte saugumo pažeidžiamumus.
Išvada
Jūsų FastAPI API apsauga reikalauja daugialypio požiūrio. Teisingai įgyvendindami CORS ir nustatydami atitinkamas saugumo antraštes, galite žymiai sumažinti įvairių interneto pažeidžiamumų riziką. Nepamirškite reguliariai peržiūrėti ir atnaujinti savo saugumo konfigūraciją, kad neatsiliktumėte nuo kylančių grėsmių. Visapusiškos saugumo strategijos, įskaitant autentifikavimą, įvesties tikrinimą, spartos ribojimą ir stebėjimą, laikymasis yra labai svarbus kuriant patikimas ir saugias API, kurios apsaugo jūsų vartotojus ir jūsų duomenis. Šių priemonių įgyvendinimas, nors ir gali būti sudėtingas, yra būtina investicija siekiant užtikrinti ilgalaikį jūsų aplikacijų saugumą ir stabilumą šiandieninėje grėsmių aplinkoje.