Kontinuasjonseksamen - HTTP/XML/Autentisering/Virtualisering
Type: Blandet teori og implementering - HTTP POST, XML, sesjoner, cookies, SOP, virtualisering
Fokus: Autentiseringsprosedyrer, sesjonshÄndtering, sikkerhet
Metode: Skriv egne svar fĂžrst, sammenlign deretter med sensorveiledning
FĂžlgende melding sendes fra avsender A til mottaker B i forbindelse med autentisering mot en web-tjeneste:
1: POST /hemmelighetsdatabase/login HTTP/1.1 2: Host: www.hemmelignettsted.no 3: 4: <?xml version="1.0"?> 5: <bruker> 6: <id> 007 </id> 7: <passord> 700 </passord> 8: </bruker>
Gi en forklaring av koden â bĂ„de (1) en overordnet forklaring av hensikten med koden og (2) en detaljert linje-for-linje-forklaring.
Koden er en HTTP POST-forespÞrsel fra avsender A til mottaker B med formÄl Ä autentisere seg mot en web-tjeneste som inneholder en hemmelig database. ForespÞrselen inneholder brukerinformasjon i form av en ID og passord i XML-format.
Linje 1: POST /hemmelighetsdatabase/login HTTP/1.1
Angir at dette er en HTTP POST-forespĂžrsel som indikerer at avsender A Ăžnsker Ă„ sende informasjon til web-tjenesten. hemmelighetsdatabase/login er URL-en som identifiserer endepunktet for tjenesten. HTTP/1.1 angir versjonen av HTTP-protokollen som brukes i forespĂžrselen.
Linje 2: Host: www.hemmelignettsted.no
Angir navnet pÄ vertsmaskinen som avsender A prÞver Ä koble seg til.
Linje 3: (Tom linje)
Markerer slutten av HTTP-hodet og starten pÄ HTTP-kroppen.
Linje 4: <?xml version="1.0"?>
Angir at resten av dokumentet vil vĂŠre i XML-format, og at versjonen av XML som brukes er 1.0.
Linje 5: <bruker>
Indikerer at resten av elementene er informasjon om en bruker.
Linje 6: <id>007</id>
Angir brukerens ID, som er satt til 007. ID-en er lukket inne i et XML-element som heter id.
Linje 7: <passord>700</passord>
Angir brukerens passord, som er satt til 700. Passordet er lukket inne i et XML-element som heter passord.
Linje 8: </bruker>
Avslutter XML-elementet bruker, som startet pÄ linje 5, og inneholder all brukerinformasjon i meldingen.
Skriv et eksempel som viser hvordan meldingen brukes i autentiseringsprosedyren. Pass pÄ Ä fÄ med beskrivelse av teknologi/sprÄk som brukes bÄde hos A og B. Begrunn valg av teknologi/sprÄk i eksempelet.
Hos A (klient - nettleser):
Kode som kjÞrer i nettleseren bruker standard-sprÄkene for klientside koding:
Prosess hos A:
Hos B (server):
Valg av teknologi for server (B):
Det er mye mer Ă„ velge mellom for tjenerside-koden. Vi har i undervisningen brukt CGI med shell-skript (pedagogiske grunner). Normalt sett brukes dette ikke. Mer utbredt er f.eks. Node, Java, PHP, etc.
Forklar og vis med pseudokode/kode hvordan du ville implementert kode som produserer og sender meldingen. Begrunn valg av teknologi/sprÄk. Ta gjerne utgangspunkt i eksemplet du skrev i oppgave 2.
Teknologi: Standard-sprÄkene for web er HTML for brukergrensensnittet og JavaScript for funksjonalitet.
<!doctype html>
<html>
<head>
<title> Login </title>
<meta charset="utf-8">
<script>
function login() {
// Lager referanser til elementer i HTML-dokumentet
let id = document.querySelector('#id').value;
let pw = document.querySelector('#pw').value;
let res = document.querySelector('#respons');
// Lager XML-dokument til kroppen av HTTP-forespĂžrselen
let HTTPkropp = '<?xml version="1.0"?><bruker><id>' + id
HTTPkropp += '</id><passord>' + pw + '</passord></bruker>';
// ALTERNATIV 1: Sender POST-forespĂžrsel med fetch()
let basis = 'http://www.hemmelignettsted.no/hemmelighetsdatabase/';
let url = new URL('login', basis);
fetch( url, { method: 'POST', body: HTTPkropp } )
.then( respons => respons.text() )
.then( http_kropp => res.innerHTML = http_kropp )
// ALTERNATIV 2: Sender POST-forespĂžrsel med XMLHttpRequest()
/*
let h = new XMLHttpRequest();
let url = 'http://www.hemmelignettsted.no/hemmelighetsdatabase/login'
h.open('POST', url, true); // asynkron = true
h.setRequestHeader('Content-type','application/xml');
h.onload = function() {
document.getElementById('respons').innerHTML = h.responseText;
};
h.send(HTTPkropp);
*/
}
</script>
</head>
<body>
Id: <input id='id' type=text > <br/>
Passord: <input id='pw' type=text > <br/>
<button onclick=login()> Login </button>
<div id='respons'></div> // her kommer responsen
</body>
</html>
Forklar og vis med et eksempel hvordan B (1) mottar meldingen og (2) fullfÞrer autentiseringen og oppretter en sesjon. Bruk kode/pseudokode i svaret. Begrunn valg av teknologi/sprÄk. Ta gjerne utgangspunkt i eksempler fra oppgave 2 og/eller 3.
Det er viktig Ä fÄ med fÞlgende punkter:
Teknologi: Vi har i undervisningen brukt CGI med shell-skript (pedagogiske grunner). Normalt sett brukes ikke dette. Mer utbredt er f.eks. Node, Java, PHP, etc.
Eksempel (pseudokode/CGI-shell):
#!/bin/sh
# Les XML-dokumentet fra STDIN
XML=$(head -c "$CONTENT_LENGTH")
# Plukk ut id og passord fra XML
ID=$(echo "$XML" | xmllint --xpath "/bruker/id/text()" -)
PW=$(echo "$XML" | xmllint --xpath "/bruker/passord/text()" -)
# Hash passordet
HASH=$(echo -n "$PW" | sha256sum | cut -d' ' -f1)
# Sjekk mot database
STORED_HASH=$(echo "SELECT passord FROM brukere WHERE id='$ID'" | sqlite3 db.db)
if [ "$HASH" = "$STORED_HASH" ]; then
# Generer sesjonsID
SESJON_ID=$(uuidgen)
# Lagre sesjonsID i database
echo "INSERT INTO sesjoner VALUES ('$SESJON_ID','$ID')" | sqlite3 db.db
# Send cookie til klient
echo "Set-Cookie: sesjonsid=$SESJON_ID; Path=/; HttpOnly"
echo "Content-type: text/plain"
echo
echo "Innlogget"
else
echo "Content-type: text/plain"
echo
echo "Feil brukernavn eller passord"
fi
Etter vellykket autentisering gis den autentiserte tilgang til database-innhold via et REST-API. Forklar og vis med et eksempel hvordan teknologi bĂ„de hos A og B sĂžrger for at pĂ„fĂžlgende kommunikasjon gjĂžres i en autentisert sesjon â til tross for at kommunikasjonen gĂ„r over HTTP/HTTPS (som er tilstandslĂžs og dermed ikke har innebygd stĂžtte for sesjoner).
Etter vellykket autentisering er det produsert en sesjonsidentifikator som skal brukes av klienten i pÄfÞlgende HTTP-forespÞrsler for Ä angi at de tilhÞrer en pÄgÄende og autentisert sesjon.
Fra server til klient (ved innlogging):
Dette gjĂžres ved en linje i HTTP-responsens hode som i eksemplet under:
Set-Cookie: sesjonsid=asdflkjsdlfjksldkfj;
Fra klient til server (pÄfÞlgende requests):
I HTTP-forespĂžrsler fra klienten, som hĂžrer til sesjonen, legges en linje i hodet:
Cookie: sesjonsid=asdflkjsdlfjksldkfj;
Lagring:
BÄde klienten og tjeneren mÄ lagre sesjonsidentifikatoren:
Viktig: Tilstanden hÄndteres altsÄ pÄ applikasjonslaget (og ikke pÄ transportlaget hvor HTTP/HTTPS virker).
I forbindelse med web-applikasjoner, brukes retningslinjen for samme opphav (same origin policy).
Hva er Same Origin Policy?
Retningslinjen gĂ„r ut pĂ„ at nettlesere (web browsers) i utgangspunktet begrenser mulighetene for skript Ă„ kommunisere med fremmed kode â webtjenester/-tjenere som har et annet opphav (origin) enn skriptet selv.
Opphav bestemmes av:
Hvor og hvordan hÄndheves det?
Dette hÄndheves i rÄdende nettlesere, ved at kommunikasjon med fremmed kode kun tillates i visse tilfeller/unntak, som kan bestemmes/settes av utviklerne.
CORS (Cross-Origin Resource Sharing):
I emnet har vi sett pÄ eksempler/oppgaver hvor vi har brukt mekanismen Cross-origin resource sharing (CORS), for Ä lage slike unntak. I CORS gir den fremmede tjeneren nettleseren tillatelser (av typen Access-Control-*).
I linux-kjernen finnes flere mekanismer som brukes for Ä fÄ til virtualisering pÄ operativsystemnivÄ (ofte kalt konteinere). Nevn disse og forklar hvordan de bidrar til virtualiseringen.
Forklar hvordan bruk av virtualisering pÄ operativsystemnivÄ kan Þke sikkerheten i en web-tjeneste.
To hovedmekanismer for virtualisering pÄ operativsystemnivÄ i Linux-kjernen:
1. Namespaces:
Denne mekanismen lar en prosess oppleve en isolert og begrenset versjon av systemressursene som den kan bruke. Dette inkluderer blant annet:
2. Control Groups (cgroups):
Denne mekanismen lar en administrator begrense ressursbruken til en gruppe prosesser. Dette kan inkludere ressurser som:
1. Isolasjon:
Ved Ä kjÞre hver web-tjeneste i sin egen virtuelle maskin eller konteiner, kan man sikre at en eventuell kompromittering av en tjeneste ikke pÄvirker andre tjenester. Dette kan hindre en angriper fra Ä spre seg til andre deler av systemet.
2. Ressursbegrensning:
Ved Ă„ bruke cgroups kan man begrense mengden ressurser som en tjeneste kan bruke. Dette kan forhindre at en tjeneste bruker opp alle systemressursene og dermed gjĂžr systemet utilgjengelig for andre tjenester eller brukere.
3. Redusert angrepsflate:
Mange tjenester pÄ web er organisert ved hjelp av mikrotjenester, der flere uavhengige enkelt-tjenester fungerer sammen i et stÞrre system. Siden disse enkelt-tjenestene fÄr en veldig begrenset oppgave, er veldig mye av det som fÞlger med i en standard operativsystem-distribusjon unÞdvendig.
Konteinere er velegnet til Ă„ sette opp et strippet kjĂžremiljĂž, med kun nĂždvendig funksjonalitet. Jo mindre kodemengde/kompleksitet, desto fĂŠrre feil/bugs/sĂ„rbarheter â og dermed bedre sikkerhet.