📝 TSD3060 Eksamen 2022-2023

Kontinuasjonseksamen - HTTP/XML/Autentisering/Virtualisering

â„č Om denne eksamenen

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

Oppgave 1 - Kodeforklaring 10%

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.

✅ Sensorveiledning - Overordnet 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-for-linje forklaring

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.

Oppgave 2 - Autentiseringsprosedyre 10%

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.

✅ Sensorveiledning

Hos A (klient - nettleser):

Kode som kjÞrer i nettleseren bruker standard-sprÄkene for klientside koding:

  • HTML for brukergrensesnittet
  • JavaScript for funksjonalitet

Prosess hos A:

  1. Brukergrensesnittet henter inn id og passord fra brukeren ved hjelp av et skjema
  2. FĂžr skjemadataene sendes, blir de lagt i et XML-dokument (som vist i oppgaveteksten)
  3. XML-dokumentet sendes med HTTP POST til serveren

Hos B (server):

  1. Ved mottak av XML-dokumentet blir passordet hashet
  2. Id og passordhashen blir sammenlignet med lagrede verdier
  3. Ved likhet produseres en sesjonsidentifikator
  4. Sesjonsidentifikatoren sendes som informasjonskapsel (cookie) i hodet pÄ HTTP-responsen tilbake til A
  5. Denne sesjonsidentifikatoren vil A bruke i hodet pÄ hver pÄfÞlgende HTTP-forespÞrsel inntil brukeren logger ut (eller sesjonsidentifikatoren gÄr ut pÄ tid)

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.

Oppgave 3 - Implementering av sending 15%

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.

✅ Sensorveiledning

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>
Oppgave 4 - Mottak og sesjon 20%

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.

✅ Sensorveiledning

Det er viktig Ä fÄ med fÞlgende punkter:

  1. XML-dokumentet leses inn fra standard inngang (STDIN), siden det sendes med POST-metoden
  2. Id og passord plukkes ut av XML-dokumentet
  3. Passordet hashes
  4. Id og passordhashen sammenlignes med lagrede verdier. F.eks. ved oppslag i database (vi har brukt SQLite)
  5. NÄr passordhashene er like produseres en sesjonsidentifikator som sendes som informasjonskapsel (cookie) i hodet pÄ HTTP-responsen tilbake til A

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
Oppgave 5 - Autentisert sesjon 20%

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).

✅ Sensorveiledning

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:

  • Tjeneren lagrer den sammen med sesjonens tilstandsinformasjon og evt. utlĂžpstid
  • Klienten lagrer den sammen med tjenerens adresse og evt. utlĂžpstid

Viktig: Tilstanden hÄndteres altsÄ pÄ applikasjonslaget (og ikke pÄ transportlaget hvor HTTP/HTTPS virker).

Oppgave 6 - Same Origin Policy 5%

I forbindelse med web-applikasjoner, brukes retningslinjen for samme opphav (same origin policy).

  • Forklar/vis hva som menes med denne retningslinjen, og
  • forklar (1) hvordan og (2) hvor denne retningslinjen blir hĂ„ndhevet.

✅ Sensorveiledning

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:

  • Protokoll/skjema (f.eks. http)
  • Verten (f.eks. debbie.usn.no)
  • Porten (f.eks. 80)

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-*).

Oppgave 7 - Virtualisering 20%

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.

✅ Sensorveiledning - Mekanismer

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:

  • Isolering av nettverksstacken
  • Isolering av filsystemet
  • Isolering av bruker-ID-er

2. Control Groups (cgroups):

Denne mekanismen lar en administrator begrense ressursbruken til en gruppe prosesser. Dette kan inkludere ressurser som:

  • Minne
  • CPU
  • Disk-I/O
  • NettverksbĂ„ndbredde

✅ Økt sikkerhet

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.