Problematika zabezpečení REST rozhraní

Petr

Problematika zabezpečení REST rozhraní
« kdy: 11. 06. 2018, 16:09:00 »
Vždycky když musím použít nějakou věc a zdá se mi až moc složitá, přemýšlím, jak udělat to samé co nejvíc Keep it simple.

Use case je takovýto. Mám nějaký backend, jedno v čem napsaný, a chci mu zaheslovat REST. Frontend je zcela zvlášť, v javascriptu. První věc, která mě napadla, úplně primitivní, je udělat tohle:

GET https://localhost:8080/login

Do http-body dám heslo a username. Protože je to https, http-body bude zašifrované a můžu tam tedy to heslo natvrdo poslat.

Response na ten GET bude klíč, securityKey, který budu následně vždy přidávat do http-body jako parametr. Opět, https se postará, že klíč nebude viditelný odposlouchávačům. V backendu tam dám něco na způsob design patternu Filter Chain pro zpracování requestů a vždy se podívám, jestli klíč v http-body je aktuálně validní klíč a když není, vrátím error msg.

No a to je všechno, v základu to je hotové. Můžu pak dodělávat drobnosti, jakože klíč bude mít časově omezenou platnost, která se obnoví při každém dalším requestu s tímto klíčem, ale to už jsou opravdu jen detaily zajišťující komfort uživatele.

Další věc, jako třeba uložení klíče někam do Cookies pro případ, že se znovu otevře Browser, už si bude řešit ten frontend sám, opět, jedná se o detail spadající do kategorie komfort pro uživatele. Securita tak jak jsem ji popsal mi přijde zcela hotová a snad je i bezpečná.

No a tohle je Keep it simple řešení. Přesto, Security v praxi bývají docela molochy a mám teď na mysli Spring Boot Security, která mi zhoršila start aplikace tak o 15% a o dalších 15% mi zvětšila výstupní Jar-with-dependencies.

Takže si říkám, co je tam asi tak všechno u velkých SW potřeba udělat pro to zabezpečení a proč to nejde takhle jednoduše?


Petr

Re:Problematika zabezpečení REST rozhraní
« Odpověď #1 kdy: 11. 06. 2018, 16:14:26 »
Já neříkám, že SPring Security je špatná. Uvedu takový příklad s autem. Člověk si může jít koupit auto kategorie škoda Fabia a to bude mít z moderních věcí ABS a elekrická stahovací okénka. Nebo si může koupit BMW za 3 mega, které bude mít nejrůznější elektroniku: měření tlaku v pneumatikách, různá blikátka a pípátka, klimatizaci, posilovače brzd, elektronické naklápění sedadel a já nevím co všechno ještě.

Chápu, že někteří lidi majít přesně tohle rádi a chtějí to. Nechci tady rozjíždět flame. Já jako člověk takové věci rád nemám, protože se kazí a jsou s nimi problémy, zvyšují celkovou komplikovanost a nepřehlednost, zvyšují exponenciálně cenu.

Tak si říkám, jestli to takto není i v případě Spring Secuiity a dalších takových komplikovaných frameworků. Jestli to není už moc komplikovaná věc ALA elektronické naklápěcí autosedačky. A přemýšlím, jestli to nejde nějak jednodušeji, prostě spokojit se se starým dobrým manuálním naklápěním sedaček.

Petr

Re:Problematika zabezpečení REST rozhraní
« Odpověď #2 kdy: 11. 06. 2018, 16:19:38 »
Protože co se mi teď stalo je, že si potřebuju udělat jednoduchou aplikaci, použil jsem Spring Boot a Java platformu a myslím si, že kvůli právě těm věcem ala elektronické autosedačky jsem to musel dělat třeba 2x tak dlouho, než by mi to zabralo s něčím jednodušším.

Teď mám jednoduchou apku, která má asi 7 tříd, ale výstupní JAR má 33MB. Na vzdálený server to kopíruju tak 1 minutu. Ano, já vím, že si můžu nastavit různé remote věci, nainstalovat tam Jenkins atd., jenže to jsou další hodiny a hodiny práce. Třeba 2h jsem zabil zjišťováním, proč se nemůžu přihlásit do konzole od databáze. Zjistil jsem ,že to blokuje automaticky předkonfigurovaná Spring Boot Security. Pak jsem zjišťoval, proč to blokuje a jak tomu zamezit. No a rázem z toho byly 2h strávené nad tímto problémem, které jsem už mohl věnovat něčemu jinému.

Re:Problematika zabezpečení REST rozhraní
« Odpověď #3 kdy: 11. 06. 2018, 18:07:34 »
Skoro to vypadá, že nechcete řešit problematiku zabezpečení REST rozhraní, ale postěžovat si, jak jsou věci složité  :) Ta složitost se prostě postupně nabalí a vnikne z toho knihovna nebo framework. Používejte minimalistické frameworky a máte po problému (ale jen dokud vám bude stačit jejich funkčnost).

Jose D

  • *****
  • 709
    • Zobrazit profil
Re:Problematika zabezpečení REST rozhraní
« Odpověď #4 kdy: 11. 06. 2018, 18:16:22 »
triviální způsob jak vyřešit REST zabezpečení je neřešit ho v aplikaci, ale aplikaci schovat za https nginx proxy, kde provedeš ověření přistupu..


Re:Problematika zabezpečení REST rozhraní
« Odpověď #5 kdy: 11. 06. 2018, 19:01:52 »
Tak ta slozitost tam je no, z meho pohledu je Spring taky uz tak nejak prerostly a kdyz v nem nejsi porad, tak po nejake dobe musis zase do docs. Ja ohledne REST migruju ke GraphQL, Spring podporuje (to mimo tema).

Ohledne Nginx zde zminovaneho se z nej stava opravdu swiss knife a obsahuje napr. i modul pro OAuth2 https://github.com/bitly/oauth2_proxy

Kazdopadne stale existuje dalsi mnozstvi tzv API Gateways, ktere jsou reseni all in one s webovym rozhranim reportem do databaze (audit), filtrovani nevalidnich pozadavku, apod.:
Oracle API Gateway - enterprise placena
IBM ma take produkt myslim

Open source:
https://gravitee.io/
https://apiumbrella.io/
https://getkong.org/
https://tyk.io/

Re:Problematika zabezpečení REST rozhraní
« Odpověď #6 kdy: 11. 06. 2018, 19:16:03 »
Samozrejme v enterprise systemech je stale bezne BASIC AUTH (jmeno heslo) pokud jsou systemy na vnitrni sity a nebavime se o bankovnich systemech. Pokud ti staci jmeno heslo, tak mrkni sem treba:
https://www.devglan.com/spring-security/spring-boot-security-rest-basic-authentication

Youda

Re:Problematika zabezpečení REST rozhraní
« Odpověď #7 kdy: 11. 06. 2018, 19:33:13 »
Pristup BASIC auth na HTTPS a header X_AUTHENTICATION_TOKEN je naprosty standard u REST API.

Akorat se obvykle pouziva disjunktne, bud mas BASIC auth u vsech callu (coz je ostatne jenom jeden request header), nebo si implementujes REST sluzbu login, ktera vrati token a ten strkas bud do headeru requestu nebo do JSON payloadu requestu.

Spring security tohle vsechno zvladne s prstem v nose a rychly google mi vyblil hned nejaky stackoverflow odkaz (ani jsem to necet):
https://stackoverflow.com/questions/42354138/spring-security-token-based-authentication?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

Ze ma WARko se zabudovanym SpringWS 30 mega je snad jedno, nepises to pro jednocipy. V realu se z toho pouzije kousek.
Muzes zamozrejme pouzit jiny, lehci framework nebo si to napsat cele, nevidim ale prinos takoveho pocinani.

Re:Problematika zabezpečení REST rozhraní
« Odpověď #8 kdy: 11. 06. 2018, 19:39:23 »
co je špatného na basic auth a proč se nemůže použít u bankovních systémů?


Youda

Re:Problematika zabezpečení REST rozhraní
« Odpověď #9 kdy: 11. 06. 2018, 19:39:48 »
Ale samozrejme, nasazovat Spring security ma smysl, pokud mam Springovy projekt a SpringSecurity je jenom dalsim modlem Spring ekosystemu.
Pokud mam nejakou srandaapku na holem JAX-RS v Jersey, tak nema smysl tam cpat Spring buldozer a proste si do toho jersey napis authfilter a hotovo.

Youda

Re:Problematika zabezpečení REST rozhraní
« Odpověď #10 kdy: 11. 06. 2018, 19:42:42 »
co je špatného na basic auth a proč se nemůže použít u bankovních systémů?

Typl bych si ze duvodem bude, ze basic auth nepodporuje logout.

Kit

Re:Problematika zabezpečení REST rozhraní
« Odpověď #11 kdy: 11. 06. 2018, 19:51:30 »
co je špatného na basic auth a proč se nemůže použít u bankovních systémů?

Typl bych si ze duvodem bude, ze basic auth nepodporuje logout.

Logout se v basic auth dá udělat, ale když místo odhlášení jen zavřeš okno, tak zůstaneš přihlášen.

Re:Problematika zabezpečení REST rozhraní
« Odpověď #12 kdy: 11. 06. 2018, 21:20:54 »
co je špatného na basic auth a proč se nemůže použít u bankovních systémů?

Tak credential je pouze enkodovane v Base64 a posila se po lince. Samozrejme TLS to prekryje, ale dalsi problemy jsou napr.:
- Heslo se posila stale dokola pro kazdy request v hlavicce
- Chybi dalsi rozsirene protekce jako Nonce, TTL, request timestamp, apod.pro zamezeni reply utoku

Ale jako, pokud se jedna o interni systemy, tak to nemusi byt problem, pokud se o dalsi bezpecnost staraji firewally, nebo dalsi prvky. Samozrejme stale to plati pouze pro TLS secured pripojeni.

.

Re:Problematika zabezpečení REST rozhraní
« Odpověď #13 kdy: 12. 06. 2018, 00:45:51 »
Důrazně doporučuji nic nevymýšlet, věřte, že s nějvětší pravděpodobností to jen pos...te. Pro zabezpečení API se nejčastěji používá Basic authentication nebo JWT. Obojí je standardizované, jednoduché a nerozumím tomu, proč by implementace měla zabírat 33MB. Na obojí najdete plný pytel knihoven a bude vám to fungovat napříč jazyky a implementacemi (frameworky). Jestli si kvůli autentizaci taháte nějakou obří knihovnu, doporučuji se zamyslet, zda ji opravdu potřebujete.

Eržika

Re:Problematika zabezpečení REST rozhraní
« Odpověď #14 kdy: 12. 06. 2018, 08:22:45 »
Důrazně doporučuji REST api nezabezpečovat. Ušetříte si tím hromadu starostí, které to zabezpečení přinese.