commit 93367042b937cd2df88d66d4d3e0e22149206b46 Author: Paul Wagener Date: Thu Feb 1 10:01:05 2018 +0100 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..496ee2c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store \ No newline at end of file diff --git a/500.html b/500.html new file mode 100644 index 0000000..2b452eb --- /dev/null +++ b/500.html @@ -0,0 +1 @@ +Internal Server Error diff --git a/bonus.html b/bonus.html new file mode 100644 index 0000000..4fb6061 --- /dev/null +++ b/bonus.html @@ -0,0 +1,23 @@ +{% extends "base.html" %} + +{% block content %} + +

Bonus

+ +
+ Geef een beveiligingsprobleem aan met deze website (source) +
0 punten (je naam vereeuwigd op deze website als hacker)
+ +
+ +
Het daadwerkelijk uitvoeren van dergelijke hacks voor eigen gewin of verstoren van de functionaliteit van de website is niet toegestaan!
+ +

Extra opgave

+ +

Deze opgave leveren geen punten om, maar zijn wel leuk om te maken als je voor de rest alles al af hebt

+ + + +{% endblock %} \ No newline at end of file diff --git a/certificaten.html b/certificaten.html new file mode 100644 index 0000000..9074a98 --- /dev/null +++ b/certificaten.html @@ -0,0 +1,217 @@ +{% extends "base.html" %} + +{% block content %} + +

Certificaten

+ +

Deze week gaan we aan de slag met certificaten. De tool die we daarvoor gaan gebruiken is OpenSSL. + Dit is een veelgebruikt programma waar je vele cryptografische dingen mee kunt doen.

+ +

Op Linux en Mac OS X is deze tool al geïnstalleerd, Windows gebruikers moeten deze nog installeren. Als je zoekt op het internet vindt je verschillende mogelijkheden om dat te doen. Bijvoorbeeld de v.1.1.0f Light versie op deze website. Let op dat je dan op de Windows command line het hele pad moet gebruiken in plaats van alleen 'openssl'. Bijvoorbeeld: C:\OpenSSL-Win32\bin\openssl.exe

+ +

Als je bij het gebruik van OpenSSL errors krijgt, probeer dan eerst je command prompt als Administrator te openen. En als dat ook niet werkt om het volgende commando uit te voeren:

+ + SET OPENSSL_CONF=[pad naar bestand]\openssl.cfg + +
+ +
Wie ben jij? En waarom zou ik jou vertrouwen dat je bent wie je zegt dat je bent?
+ +

Dat zijn vragen die webbrowsers elke dag moeten beantwoorden. Een site kan wel vinden dat het www.rabobank.nl is, maar daarmee weet een browser nog niet zeker dat het ook daadwerkelijk de webserver van de Rabobank is. Misschien zit je eigenlijk te communiceren met een server ergens in Rusland van een persoon die maar al te graag je inlogcodes wil weten.

+ +

Om dit probleem op te lossen zijn er certificaten bedacht en vastgelegd in de X.509 standaard. Certificaten zijn kleine bestandjes waarin een identiteit staat beschreven. Dit is bijvoorbeeld een certificaat van Paul Wagener:

+ + + +

Nu wil jij natuurlijk meteen een eigen certificaat voor jezelf hebben, en dat kan! Met dit alles-in-1 commando maak je een certificaat dat helemaal van jou is:

+ + openssl req -x509 -nodes -newkey rsa:2048 -keyout sleutel.key -out certificaat.crt + +

Dit commando doet een paar dingen tegelijk waar we later op terugkomen. Vul bij emailadres je Avans mailadres in. Nadat je de gevraagde informatie hebt ingevuld staat er in het bestand certificaat.crt jouw certificaat. Met dit commando kan je je nieuwe certificaat bewonderen:

+ + openssl x509 -text -in certificaat.crt + +
+ Kopieer/plak de inhoud van certificaat.crt (inclusief begin en einde -----BEGIN CERTIFICATE-----) + {% include "points.html" with points=answers.answer_openssl_selfsigned_certificate.points max="10" %} + +
+ +

Een certificaat heeft ook altijd een verstrekker (issuer). Dit is de persoon of bedrijf die het certificaat heeft gemaakt en daarmee garant staat dat de identiteit die op het certificaat staat ook klopt. In jouw certificaat staat dat je over jezelf hebt gezegd dat je bent wie je zegt dat je bent. Niet echt betrouwbare informatie dus... Iedereen zou precies datzelfde certificaat kunnen maken.

+ +

Het wordt pas interessant en betrouwbaar als andere partijen het certificaat verstrekken en zo kunnen zeggen dat ze de gegevens van het certificaat gecontroleerd hebben. + Als jij die verstrekker vertrouwt dat hij zijn werk goed doet met de correctheid van certificaten controleren. Dan vertrouw je ook indirect de gegevens op het certificaat. + Zo hoef je maar een handjevol verstrekkers te vertrouwen om bijna alle websites op het internet te kunnen vertrouwen.

+ +

Elke besturingssysteem heeft een lijst van basis verstrekkers die ze impliciet vertrouwen, deze lijst kan je bekijken en veranderen door in je geavanceerde browserinstellingen op zoek te gaan naar een knop 'Beheer certificaten' (te vinden in het Advanced -> Certificates tabblad in Firefox).

+ +

+ +

+ Hoeveel basis verstrekkers vertrouwt jouw systeem? (je mag ook ongeveer een antwoord geven als het lastig tellen is) + {% include "points.html" with points=answers.answer_openssl_number_of_issuers.points max="5" %} + +
+ +
+ Bekijk het certificaat van Facebook, welk bedrijf heeft dit certificaat verstrekt? + {% include "points.html" with points=answers.answer_openssl_facebook_issuer.points max="5" %} + +
+ +

Hint: Het certificaat kan je in alle browsers bekijken door op het slot-ikoontje te klikken

+ +

Mag ik uw handtekening?

+ +

Zo'n certificaat wat je aan jezelf hebt verstrekt vertrouwd natuurlijk niemand. We moeten eerst iemand vinden die jouw certificaat wil ondertekenen.

+ +

Er is een speciaal bestandsformaat om aan een verstrekker te vragen of hij jouw certificaat wil ondertekenen: .csr. Dat staat voor Certificate Signing Request. Een soort van bedelbrief die je rond kan sturen met je certificaat waar nog een verstrekker bij moet.

+ +

Je kan onderstaand commando gebruiken om je eigen gemaakte certificaat als basis te gebruiken voor zo'n Certificate Signing Request:

+ + openssl x509 -x509toreq -in certificaat.crt -signkey sleutel.key -out certificaat_verzoek.csr + +

Zo'n verzoekje kan je vervolgens bij een certificaat autoriteit zoals Thawte of VeriSign inleveren. Voor een paar honderd euro zijn ze dan bereid om hun handtekening eronder te zetten.

+ +

Om deze les relatief goedkoop te houden heeft deze site ook een certificaat autoriteit waar je certificaten kan laten ondertekenen: Certificaat Autoriteit. Gebruik deze site om jouw certificaat te laten ondertekenen

+ +
+ Bekijk het certificaat wat je hebt teruggekregen. Welke persoon heeft dit certificaat aan jou verstrekt? + {% include "points.html" with points=answers.answer_openssl_site_issuer.points max="5" %} + +
+ +
+ Plak jouw ondertekende certificaat in onderstaand tekstveld (inclusief begin en einde -----BEGIN CERTIFICATE-----) + {% include "points.html" with points=answers.answer_openssl_signed_cert.points max="10" %} + +
+ +

Zelf verstrekken

+ +
Sometimes, the only one you can trust is yourself.
+ +

Om zelf verstrekker te spelen heb je helemaal geen speciale certificaten nodig. Je kan namelijk gewoon je eigen certificaat en sleutel gebruiken die je aan het begin van de les hebt gemaakt. Vraag een medestudent om een Certificate Signing Request van zijn certificaat te geven en onderteken dat met je eigen certificaat. Zoek op internet het commando op waarmee je dat kan doen.

+ +
+ Plak de inhoud van het certificaat van een medestudent, waar je zelf verstrekker van bent. (inclusief begin en einde -----BEGIN CERTIFICATE-----) + {% include "points.html" with points=answers.answer_openssl_sign_other.points max="10" %} + +
+ +

Tip: zorg ervoor dat jouw certificaat standaard wordt geinstalleerd op alle besturingsystemen. Dan kan je goud geld verdienen met het ondertekenen van andere certificaten ;)

+ +

Websites beveiligen

+ +

Leuk die certificaten, maar laten we niet vergeten dat we er ook nog wat nuttigs mee kunnen doen. Namelijk onze internetverbindingen beveiligen. Om hiermee te oefenen moet je deze virtual machine downloaden. Het wachtwoord van deze VM is sec2. We hebben een aantal dingen gewijzigd hierin:

+ + + +

Controleer eerst of de site http://www.security2.nl in jouw VM te bereiken is, en via https://www.security2.nl/ nog niet te bereiken is. Je gaat de site in de volgende opgaven beveiligen met SSL, om dat te doen moeten we eerst SSL aanzetten in Apache met de volgende commando's:

+ + sudo a2enmod ssl
+sudo a2ensite default-ssl
+sudo service apache2 reload
+ +

Hint: Commando's vul je in in het programma 'Terminal'

+ +

De site is nu ook via https:// bereikbaar, maar Apache heeft een ongeldig dummy certificaat gebruikt om de site te beveiligen. Om het werkend te krijgen moeten we eerst de volgende stappen uitvoeren:

+ +
    +
  1. Maak een geheel nieuwe certificaat/sleutel combo aan met het commando bovenaan de pagina. Je mag alles invullen zoals je wil, behalve de Common Name / Server FQDN. Die moet www.security2.nl zijn.
  2. +
  3. Laat het certificaat hier weer ondertekenen
  4. +
  5. Kopieer het sleutel bestand en het ondertekende certificaat naar de VM
  6. +
  7. Voer het volgende commando uit: sudo gedit /etc/apache2/sites-available/default-ssl.conf om de standaard SSL configuratie aan te passen.
  8. +
  9. Verander in dit bestand de SSLCertificateFile en SSLCertificateKeyFile zodat ze naar jouw certificaat en sleutel bestand wijzen
  10. +
  11. Maak je wijzigingen actief door de configuratie opnieuw in te laden: sudo service apache2 reload
  12. +
+ +

Als je alles goed hebt gedaan is de site nu met SSL beveiligd! Controleer of je de site in de VM nu kan bereiken via https://www.security2.nl/ (Alleen Chrome werkt, certificaat is niet aan Firefox toegevoegd). Als je een groen slotje krijgt mag je de volgende vraag beantwoorden:

+ +
+ Plak de inhoud van het .crt bestand dat je hebt gebruikt om de website te beveiligen met een groen slotje. (inclusief begin en einde -----BEGIN CERTIFICATE-----) + {% include "points.html" with points=answers.answer_openssl_ssl_cert.points max="10" %} + +
+ +
+ Maak een screenshot van het groene slotje en de details van het certificaat en upload die naar imgur. Plak de URL naar die screenshot als antwoord. + {% include "points.html" with points=answers.answer_openssl_screenshot.points max="10" %} + +
+ + + +

Let's Encrypt

+ + + +

Let op, deze opdracht is dit jaar 0 punten waard omdat Avans een beveiliging heeft toegevoegd zodat het niet meer mogelijk is subdomeinen van avans.nl met Let's Encrypt te beveiligen.

+ +

Sinds 2015 is er een nieuwe speler op de markt die gratis certificaten verstrekt, mits je kan bewijzen dat jouw website van jouw is natuurlijk. Dit gaat met behulp van de command-line letsencrypt tool die automatisch certificaten maakt en ondertekend voor jouw website. Deze tool hebben we al voor je geinstalleerd in de VM.

+ +

We gaan nu sec1.aii.avans.nl beveiligen, niet deze website die je nu aan het bekijken bent, maar weer de localhost die in de VM draait. Maar nu gaan we hem met behulp van Let's Encrypt beveiligen.

+ +

Tip:Je mag voor deze opdracht ook een eigen domein dat je hebt beveiligen! Let even op dat de commando's dan niet overal exact hetzelfde zijn. Zeker als je geen Apache gebruikt.

+ +

Controleer eerst dat https://sec1.aii.avans.nl/ in de VM een fout geeft, dat komt omdat het certificaat van de vorige opdracht nog steeds van www.security2.nl is (als je de vorige opdracht goed hebt gedaan, anders krijg je misschien een andere fout). De browser ziet dat dat niet hetzelfde domein is en geeft terecht een error.

+ +

We gaan beginnen met het aanvragen van een certificaat. Dit doen we met het volgende commando: + + sudo letsencrypt certonly --manual --staging + +

Even een korte uitleg van dit commando:

+ + + +

Als je dit commando voor de eerste keer uitvoert wordt er gevraagd naar je e-mailadres, daar kan je invullen wat je wil. Voor het domein gaan we sec1.aii.avans.nl invullen. Als je je eigen domein wil beveiligen vul je hier uiteraard je eigen domein in.

+ + + +

Let's Encrypt vraagt daarna om een bestandje op de server te zetten in een hele specifieke map (.well-known/acme-challenge) op de echte sec1.aii.avans.nl server. Normaliter zou dit een probleem zijn, want dat kan alleen als je toegang hebt tot de server. Maar speciaal voor jullie is er een pagina waar je de code kan kopieren en er voor zorgen dat het bestandje 10 minuten lang op onze server wordt gehost!

+ + + +

Nadat de challenge is geslaagd zal Let's Encrypt nog een melding geven over dat de self-verification failed (in de VM wijst sec1.aii.avans.nl immers naar de localhost, en niet naar het bestandje op de echte server). Maar dat kan je negeren, als het goed is gegaan staan de certificaten nu in de map /etc/letsencrypt/live/sec1.aii.avans.nl!. + + + +

Met dit commando kan je je nieuwe certificaat bekijken:

+ + sudo gedit /etc/letsencrypt/live/sec1.aii.avans.nl/fullchain.pem + +
+ Plak de inhoud van het fullchain.pem certificaat voor sec1.aii.avans.nl. (inclusief alle begin en einde -----BEGIN CERTIFICATE-----) + {% include "points.html" with points=answers.answer_openssl_letsencrypt_fullchain.points max="0" %} + +
+ +

Stel het default-ssl.conf configuratie bestand van Apache nu zo in dat het de certificaten van Let's Encrypt gebruikt:

+ + + +

Sla het bestand op, reload Apache en als het goed is heb je nu een beveiligde https://sec1.aii.avans.nl/, helemaal gratis en voor niets!

+ + + +

Het zal je misschien opvallen dat de verstrekker Fake is, dat komt omdat we de --staging optie hebben gebruikt. In de VM is deze toegevoegd als iets dat we kunnen vertrouwen (en dus een groen slotje oplevert), maar in de echte wereld is dat niet zo. Zorg er dus bij je eigen website zo dat je niet de --staging optie gebruikt als je voor de echie certificaten aan het maken bent

+ + + +
+ Maak een screenshot van het groene slotje en de details van het certificaat (zoals hierboven, maar natuurlijk niet letterlijk dat plaatje, dat hebben we door) en upload die naar imgur. Plak de URL naar die screenshot als antwoord. + {% include "points.html" with points=answers.answer_openssl_letsencrypt_screenshot.points max="0" %} + +
+ +{% endblock %} diff --git a/encryptie.html b/encryptie.html new file mode 100644 index 0000000..ec40a8b --- /dev/null +++ b/encryptie.html @@ -0,0 +1,222 @@ +{% extends "base.html" %} + +{% block content %} + +

Encryptie & Signen

+ +

Deze week gaan we nog een laagje dieper en kijken naar (a)symmetrische encryptie, sleutels, signen en PGP.

+ +

Symmetrische encryptie

+ +

Dat encryptie betekent dat je bestandjes of tekst versleuteld wist je waarschijnlijk al, maar wist je ook dat er twee soorten encryptie zijn? Symmetrische en assymetrische encryptie zijn verschillende technieken die je beide in tandem kan gebruiken om je bestanden, berichten en verbindingen te beveiligen.

+ +

Stel, Alice wil een geheim bericht versturen naar Bob. Alice kan het bericht geheim maken door het door een encryptiealgoritme te halen. Dit neemt het bericht van Alice en een geheime sleutel als input. De sleutel is in dit geval een random string die alleen Alice weet. Het algoritme encrypt het bericht naar een gecodeerde versie. Zonder de sleutel te hebben is het onmogelijk om terug te rekenen wat het originele bericht was. Alice stuurt met een gerust hart dit gecodeerde bericht via internet delen, zonder bang te zijn dat iemand het kan lezen.

+ + + +

Alice wil het bericht aan Bob sturen, om ervoor te zorgen dat Bob het bericht kan ontcijferen heeft Alice hem de geheime sleutel van tevoren gegeven. Bob kan het gecodeerde bericht samen met dezelfde geheime sleutel die Alice heeft gebruikt door het bijbehorende decryptie algoritme halen om de originele data weer terug te krijgen.

+ +

Bob kan op dezelfde manier ook berichten naar Alice sturen die Alice weer kan ontcijferen. Zolang de sleutel geheim blijft kunnen Alice en Bob veilig met elkaar communiceren.

+ + + +

We kunnen met OpenSSL (zie vorige week als je dat nog niet hebt geinstalleerd) ook encrypten en decrypten met verschillende soorten encryptie algoritmes. Met onderstaande commando kunnen we bijvoorbeeld een bestand ontsleutelen.

+ + openssl enc -aes-256-cbc -base64 -d -in geheim.aes256 -out nietmeergeheim.txt + +

Een hele mond vol, laten we eens kijken wat alle argumenten betekenen:

+ + + + + +

Een systeembeheerder heeft een geheim staan in dit bestandje wat hij met aes-256-cbc heeft versleuteld. Helaas voor hem heeft hij een niet zo hele sterke sleutel gekozen: Ab12345. Gebruik OpenSSL om dit bestandje te ontsleutelen.

+ +
+ Wat is de geheime code die in dit versleutelde bestandje staat? + {% include "points.html" with points=answers.answer_encryption_decrypt.points max="10" %} + +
+ +

Hint: Als je een bad decrypt error krijgt heb je waarschijnlijk een OpenSSL versie die lager is dan 1.1.0. In dat geval moet je de optie `-md sha256` toevoegen.

+ +
+ Versleutel de tekst "Avans Hogeschool" met het aes-256-cbc algoritme in base64 mode. Plak de versleutelde tekst in het tekstveld, gebruik Ab12345 als wachtwoord. + {% include "points.html" with points=answers.answer_encryption_encrypt.points max="10" %} + +
+ +

Hint: Je kan dit commando gebruiken: openssl enc -aes-256-cbc -base64 -in avans.txt -out avansgeheim.aes256.txt

+ +

Asymmetrische encryptie

+ +

Bij symmetrische encryptie gebruiken Alice en Bob allebei dezelfde sleutel om het bestand te versleutelen en te ontsleutelen. Maar hun communicatie is alleen veilig als ze de sleutel in het geheim afspreken en zolang ze de sleutel geheim houden. Dit probleem is opgelost bij asymmetrische encryptie algoritmes, waarbij je twee sleutels gebruikt. Eén publieke en één privé sleutel.

+ +

Bij een asymmetrisch encryptiealgoritme kan je niet zelf een random sleutel kiezen, deze moet je genereren met een speciaal key-generation algoritme. Deze geeft random twee sleutels terug die een opmerkelijke relatie met elkaar hebben. Om ze uit elkaar te halen noemen we ze hier de groene en de rode sleutel, maar het maakt in de praktijk niet uit welke sleutel welke is.

+ + + +

Om een bestandje te versleutelen nemen we bijvoorbeeld de groene sleutel en gebruiken we die om het bestandje te versleutelen. Maar we kunnen het bestand nu niet meer ontsleutelen met de groene sleutel. Met alleen de bijbehorende rode sleutel kan je nu het bestand ontsleutelen. Andersom werkt ook, bestanden die je met de rode sleutel versleuteld, zijn enkel en alleen met de groene sleutel te ontsleutelen.

+ + + +

Dit lijkt allemaal wat omslachtig en onhandig, en asymmetrische encryptie is ook nog eens honderden keren langzamer dan symmetrische encryptie. Waarom zouden we dit gebruiken?

+ +

Asymmetrische encryptie vormt de basis van het public-private key systeem. Nadat we een sleutel-paartje hebben gegenereerd geven we één sleutel weg aan alles en iedereen, dat is de publieke sleutel die iedereen kan gebruiken. De andere bijbehorende sleutel bewaren we op de geheimste plek die je maar kan bedenken en geef je onder geen enkele omstandigheid aan iemand anders.

+ + + +

Als Alice nu een geheim bericht aan Bob wil versturen kan ze dit versleutelen door gebruik te maken van Bob's publieke sleutel. Het versleutelde bericht is enkel en alleen te ontsleutelen met Bob's bijbehorende private sleutel. Alice weet dus zeker dat alleen Bob het kan lezen.

+ + + +

Als Alice het bericht met haar private key zou versleutelen ontstaat er een andere interessante eigenschap: Iedereen kan het bericht ontsleutelen, dat is te doen met de bijbehorende publieke sleutel. Maar je weet dan wel zeker dat het bericht van Alice afkomstig is, want alleen zij heeft de private sleutel waarmee het bericht in de eerste plaats versleuteld is. + + +

+ Hoe kan Alice één bericht naar Bob versturen zodat de volgende dingen tegelijkertijd gelden: +
    +
  1. Alleen Bob kan het bericht lezen
  2. +
  3. Bob weet zeker dat het bericht van Alice is
  4. +
+ Leg uit in welke volgorde Alice en Bob encrypten, decrypten en versturen en met welke sleutels. Je mag er van uit gaan dat ze elkaars publieke sleutel weten en dat Bob niet de enige is met Alice's publieke sleutel. +
+ {% include "points.html" with points=answers.answer_encryption_securesend.points max="10" %} + +
+ +

Hint: het is natuurlijk mogelijk om een versleuteld bericht nog een keer te versleutelen.

+ + + +

WhatsApp beweert dat alle berichten end-to-end versleuteld verstuurd worden. Daarmee zou niemand de berichten kunnen lezen die via hun servers verstuurd worden, zelfs zij zelf niet. Alleen de afzender en de ontvanger kunnen de berichten lezen.

+ +

Om dat te controleren kan je bij de contactinformatie van elke chat klikken op 'Encryptie', je krijgt dan een QR code en een lijst van cijfers. Als de cijfers allemaal hetzelfde zijn zou je zeker moeten weten dat berichtjes alleen door jou en de andere persoon gelezen kunnen worden.

+ + + +
+ Zoek op internet welke informatie er in de QR code staat. Hoe kan WhatsApp met die informatie garanderen dat alleen jullie twee de chat kan lezen? + {% include "points.html" with points=answers.answer_encryption_whatsapp.points max="10" %} + +
+ + +

GPG

+ +

Genoeg theorie, we gaan aan de slag met concrete encryptiealgoritmes. En wel met de OpenPGP (Pretty Good Privacy) standaard. Een veel gebruikt open source programma die deze standaard implementeert is GPG (GNU Privacy Guard). Met dit programma kunnen we sleutelparen maken, bestanden encrypten/decrypten en versleutelde berichten versturen.

+ +

Om het makkelijker te maken om publieke sleutels uit te wisselen kan GPG gebruik maken van een keyserver. Dit is een speciale server die een lijst van publieke sleutels bijhoud. Voor onderstaande opdrachten hebben we onze eigen keyserver ingericht op sec1.aii.avans.nl. Deze werkt niet als je de opdrachten thuis maakt. De Avans firewall blokkeert poort 11371 waarop deze server werkt. Als je thuis de opdrachten wilt maken kan je het beste inloggen op een PANO-box VM. Daar werkt het wel.

+ +

GPG kan je hier voor Windows downloaden, na het installeren kan je in je CMD alle commando's typen. Als je Linux of Mac OS X gebruikt hoef je niks te doen, GPG is standaard geïnstalleerd.

+ + + + gpg --help + +

Met bovenstaande commando zie je alle dingen die je met GPG kan doen. We gaan niet meer alle commando's voorkauwen, je bent inmiddels handig genoeg om die zelf te bedenken. Een paar handige opties om te onthouden:

+ +