Gezien dit over serverside programmeren gaat, zet ik dit topic hier neer.
Ik ben bezig met beveiliging van een authenticatie systeem, wat via PHP werkt. Nu is dit een SSO systeem. Omdat dit een authenticatie systeem is, wil ik dit zo veilig mogelijk hebben. Nu is er 1 probleem waar ik wat moeite mee heb en dat is het voorkomen van session hijacking.
De meeste van jullie weten waarschijnlijk wel, dat een standaard PHP sessie makkelijk te hijacken is. Je grijpt een session cookie van iemand (eigenlijk alleen de session id) en je bent binnen. De bekende if ($_SESSION["loggedin"]) werkt zelf niet daartegen.
Nu heb je in PHP de functie, session_regenerate_id(true). Deze functie hergenereerd je sessie id. Dit verkleind enorm de tijd op waarop iemand je sessie kan hijacken. Dit komt omdat hij bij elke keer bij het laden een nieuwe sessie id krijgt, waardoor de oude ongeldig wordt. Nu is dat een redelijk goede beveiliging. Maar stel nu dat bij de laatste handeling die de gebruiker doet op de site, de cookie wordt gejat, dan krijgt de aanvaller alsnog een geldige id.
Nu kun je de sessie ook nog aan een IP koppelen. Ik neem meteen ook maar even mee dat je de sessie ook aan useragent, accept language, accept charset, etc zou koppelen. Dus dan heb je een identiteit te pakken die bijna zeker aan jouw browser is gekoppeld. Maar nu komt het probleem:
Stel je zit in een groot bedrijf. Dit bedrijf zit achter een NAT router. Bedrijf heeft allemaal gestandariseerde software. Dit betekend dat bij dit bedrijf, bij elke PC de volgende gegevens gelijk zijn: extern ip, useragent, accept language, accept charset, nog wat browser specifieke dingen.
Stel ze gebruiken geen proxy die X-forwarded-for meegeeft, dus aan intern IP kun je ze ook niet aan herkennen. Als conclusie uit dit laatste stukje kun je trekken, dat elke PC, binnen het bedrijfs netwerk, gelijk is voor de webserver. Ze hebben allemaal dezelfde identiteit. Dus de IP
koppeling en andere browser checks die gekoppeld zijn aan de sessie komen ze door.
Als ze nu in dit geval, de laatste cookie van de gebruiker jatten, vanuit het bedrijfsnetwerk, dan kunnen ze gewoon verder met de sessie. Dit omdat ze alle checks gewoon doorkomen.
Nu zou je ook nog met een idle timeout kunnen werken, waardoor de tijd, dat de cookie gejat kan worden, nog kleiner wordt. Maar het kan nog steeds.
Cookie encrypten helpt ook geen zak, want dat geeft alleen een andere representatie van de cookie, in plaats van dat het echt helpt.
Uiteraard is een zowat verplichte beveiliging, anti- Session Fixation (http://en.wikipedia.org/wiki/Session_fixation).
XSS (Cross Site Scripting) moet natuurlijk ook gewoon beveiligd worden, maar dit valt onder input validation. Die wil ik zowieso erg streng maken.
Nu zeg ik er even bij dat dit SSO systeem WEB only is, dus niet iets als kerberos ofzo, wat ook systemen in het netwerk identificeerd. Ga er ook maar even van uit dat we niet altijd controlle hebben over het netwerk.
Nu kun je met SSL client certificaten gaan werken. Dit neemt echter administratief veel werk met zich mee. Daarnaast heb ik, zoals ik al zei, weinig controlle over het netwerk waar de client op werkt. Ik mag dus ook niet altijd iets installeren daar.
Hoe kun je toch voorkomen, dat mensen binnen het netwerk (achter NAT), toch niet de sessie kunnen overnemen van de collega?
Het probleem wat er namelijk is, je hebt namelijk geen 100% zekere identiteit van de specifieke PC. Dit is ook wel logisch, vanwege privacy redenen. Anders kon Google wel heel makkelijk een profiel van je schetsen, wat ze nu overigens ook heel goed kunnen.
Hoe gaan jullie met dit probleem om?
Houd er wel even rekening mee dat het SSO is, dus ook niet bedoeld is om voor elke pagina opnieuw te authenticeren. Uiteraard gaan erg belangrijke pagina's, zoals wachtwoord wijziging, wel met de vraag om nog een keer je wachtwoord in te voeren.
Ik ben bezig met beveiliging van een authenticatie systeem, wat via PHP werkt. Nu is dit een SSO systeem. Omdat dit een authenticatie systeem is, wil ik dit zo veilig mogelijk hebben. Nu is er 1 probleem waar ik wat moeite mee heb en dat is het voorkomen van session hijacking.
De meeste van jullie weten waarschijnlijk wel, dat een standaard PHP sessie makkelijk te hijacken is. Je grijpt een session cookie van iemand (eigenlijk alleen de session id) en je bent binnen. De bekende if ($_SESSION["loggedin"]) werkt zelf niet daartegen.
Nu heb je in PHP de functie, session_regenerate_id(true). Deze functie hergenereerd je sessie id. Dit verkleind enorm de tijd op waarop iemand je sessie kan hijacken. Dit komt omdat hij bij elke keer bij het laden een nieuwe sessie id krijgt, waardoor de oude ongeldig wordt. Nu is dat een redelijk goede beveiliging. Maar stel nu dat bij de laatste handeling die de gebruiker doet op de site, de cookie wordt gejat, dan krijgt de aanvaller alsnog een geldige id.
Nu kun je de sessie ook nog aan een IP koppelen. Ik neem meteen ook maar even mee dat je de sessie ook aan useragent, accept language, accept charset, etc zou koppelen. Dus dan heb je een identiteit te pakken die bijna zeker aan jouw browser is gekoppeld. Maar nu komt het probleem:
Stel je zit in een groot bedrijf. Dit bedrijf zit achter een NAT router. Bedrijf heeft allemaal gestandariseerde software. Dit betekend dat bij dit bedrijf, bij elke PC de volgende gegevens gelijk zijn: extern ip, useragent, accept language, accept charset, nog wat browser specifieke dingen.
Stel ze gebruiken geen proxy die X-forwarded-for meegeeft, dus aan intern IP kun je ze ook niet aan herkennen. Als conclusie uit dit laatste stukje kun je trekken, dat elke PC, binnen het bedrijfs netwerk, gelijk is voor de webserver. Ze hebben allemaal dezelfde identiteit. Dus de IP
koppeling en andere browser checks die gekoppeld zijn aan de sessie komen ze door.
Als ze nu in dit geval, de laatste cookie van de gebruiker jatten, vanuit het bedrijfsnetwerk, dan kunnen ze gewoon verder met de sessie. Dit omdat ze alle checks gewoon doorkomen.
Nu zou je ook nog met een idle timeout kunnen werken, waardoor de tijd, dat de cookie gejat kan worden, nog kleiner wordt. Maar het kan nog steeds.
Cookie encrypten helpt ook geen zak, want dat geeft alleen een andere representatie van de cookie, in plaats van dat het echt helpt.
Uiteraard is een zowat verplichte beveiliging, anti- Session Fixation (http://en.wikipedia.org/wiki/Session_fixation).
XSS (Cross Site Scripting) moet natuurlijk ook gewoon beveiligd worden, maar dit valt onder input validation. Die wil ik zowieso erg streng maken.
Nu zeg ik er even bij dat dit SSO systeem WEB only is, dus niet iets als kerberos ofzo, wat ook systemen in het netwerk identificeerd. Ga er ook maar even van uit dat we niet altijd controlle hebben over het netwerk.
Nu kun je met SSL client certificaten gaan werken. Dit neemt echter administratief veel werk met zich mee. Daarnaast heb ik, zoals ik al zei, weinig controlle over het netwerk waar de client op werkt. Ik mag dus ook niet altijd iets installeren daar.
Hoe kun je toch voorkomen, dat mensen binnen het netwerk (achter NAT), toch niet de sessie kunnen overnemen van de collega?
Het probleem wat er namelijk is, je hebt namelijk geen 100% zekere identiteit van de specifieke PC. Dit is ook wel logisch, vanwege privacy redenen. Anders kon Google wel heel makkelijk een profiel van je schetsen, wat ze nu overigens ook heel goed kunnen.
Hoe gaan jullie met dit probleem om?
Houd er wel even rekening mee dat het SSO is, dus ook niet bedoeld is om voor elke pagina opnieuw te authenticeren. Uiteraard gaan erg belangrijke pagina's, zoals wachtwoord wijziging, wel met de vraag om nog een keer je wachtwoord in te voeren.