# 🔑 SSH Key-based Authentication – Øvelse > [!info] Om denne Ăžvelse > **Tid:** 45–60 minutter > **Form:** Parvis – begge studerende genererer hver sit nĂžglepar og logger ind selvstĂŠndigt > **MĂ„l:** Generere SSH-nĂžglepar, dele public keys med hans via Canvas grupperum, logge ind pĂ„ en fĂŠlles Ubuntu-server i [UpCloud](https://upcloud.com/) – og bagefter undersĂžge hvad der sker i logfilerne nĂ„r nogen forsĂžger at bryde ind. --- > [!tip] LĂŠringsmĂ„l > Hvad kan du nĂ„r du er fĂŠrdig med denne Ăžvelse? > - Generere et SSH-nĂžglepar med `ssh-keygen` i terminal / PowerShell > - Forklare forskellen pĂ„ **public key** og **private key** – og hvad der mĂ„ deles > - Etablere en SSH-forbindelse til en remote server vha. key-based authentication > - LĂŠse og fortolke systemlogfiler med `cat`, `tail`, `grep` og `tail -f` > - Identificere et konkret logon-forsĂžg i `auth.log` ud fra en reel hĂŠndelse --- > [!abstract] Baggrund > I er ved at forbinde jer til en **Ubuntu 24.04 LTS**-server der kĂžrer pĂ„ **UpCloud** i et europĂŠisk datacenter. > > UpCloud krĂŠver at en SSH public key uploades **inden** en maskine (VM) kan oprettes. Password-login til root er deaktiveret som standard. Det er et bevidst designvalg der fjerner den letteste angrebsvej: automatiserede brute force-angreb mod password-login. > > **Begge** i bodymakker teamet genererer deres eget nĂžglepar. Begge nĂžgler installeres pĂ„ den samme server – sĂ„ I kan logge ind uafhĂŠngigt af hinanden med jeres respektive nĂžgler. --- ## Del 1 – Begge genererer hvert sit SSH-nĂžglepar > [!note] Begge udfĂžrer disse trin – uafhĂŠngigt og pĂ„ jeres egne maskiner --- ### Trin 1 – Åbn terminal **macOS / Linux:** Åbn `Terminal` **Windows:** Åbn `PowerShell` eller `Windows Terminal` VerificĂ©r at SSH er tilgĂŠngeligt: ```powershell ssh ``` Du bĂžr se noget i stil med: ```powershell usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file] [-J destination] [-L address] [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-P tag] [-p port] [-Q query_option] [-R address] [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]] destination [command [argument ...]] ``` > [!warning] Hvis ssh ikke findes pĂ„ Windows >Vil du fĂ„ dette output >```powershell >PS C:\Users\hans> ssh ssh: The term 'ssh' is not recognized as a name of a cmdlet, function, script file, or executable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. >``` >Du skal nu installere OpenSSH pĂ„ din maskine ser mere hos [MS learn](https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse?tabs=powershell&pivots=windows-11) >```powershell >Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*' >``` >```powershell >Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0 >``` --- ### Trin 2 – Generer dit nĂžglepar KĂžr fĂžlgende – erstat `dit-navn@skole` med din skolemail: ```bash ssh-keygen -t ed25519 -C "dit-navn@skole" ``` Du vil blive spurgt om tre ting: **1. Placering:** ``` Enter file in which to save the key (~/.ssh/id_ed25519): ``` Tryk **Enter** for standardplacering. **2. Passphrase:** ``` Enter passphrase (empty for no passphrase): ``` VĂŠlg en passphrase du kan huske – eller tryk **Enter** for ingen (acceptabelt i ĂžvelsessammenhĂŠng). Ta' en hurtig snak i makkerparret om hvad tilfĂžjelse af et password tilfĂžjer af sikkerhed. **3. Gentag passphrase:** Tast igen og tryk **Enter**. --- ### Trin 3 – VerificĂ©r filerne **macOS / Linux:** ```bash ls -la ~/.ssh/ ``` **Windows (PowerShell):** ```powershell dir $env:USERPROFILE\.ssh\ ``` Du bĂžr se to filer: - `id_ed25519` → **din private nĂžgle** – forlader aldrig din maskine - `id_ed25519.pub` → **din public key** – den du deler --- ### Trin 4 – Se din public key **macOS / Linux:** ```bash cat ~/.ssh/id_ed25519.pub ``` **Windows (PowerShell):** ```powershell Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub ``` Output ser nogenlunde sĂ„dan ud: ``` ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... dit-navn@skole ``` > [!danger] Vigtigt > Del **udelukkende** indholdet af `.pub`-filen. > Del **aldrig** indholdet af `id_ed25519` (uden `.pub`) – med nogen, nogensinde. ever! punktum! --- ## Del 2 – Del jeres public keys med HH > [!note] Begge uploader hver sin public key > GĂ„ ind i jeres **Canvas-grupperum** og indsĂŠt indholdet af jeres `.pub`-fil. > Skriv dit navn tydeligt over din nĂžgle sĂ„ jeg ved hvem der ejer hvilken. > > Jeg opretter en Ubuntu-VM pĂ„ UpCloud med **begge nĂžgler installeret**. > **I fĂ„r en IP-adresse tilbage** – vent pĂ„ besked. --- **Mens I venter – diskutĂ©r:** Find link i Canvas til at indsende jeres svar > [!question] Refleksion > **SpĂžrgsmĂ„l 1:** Hvad ville der ske, hvis I ved en fejl indsatte den private nĂžgle i stedet for `.pub`-filen? > > **SpĂžrgsmĂ„l 2:** Begge jeres public keys installeres pĂ„ samme server. Betyder det at I kan se hinandens private nĂžgler? Forklar hvorfor eller hvorfor ikke. --- ## Del 3 – Log ind pĂ„ serveren NĂ„r I har modtaget en IP-adresse, logger **begge** ind – fra jeres egen laptop: ```bash ssh root@<IP-ADRESSE> ``` > [!warning] FĂžrste gang I forbinder > SSH spĂžrger om I stoler pĂ„ serveren: > ``` > The authenticity of host '...' can't be established. > ED25519 key fingerprint is SHA256:... > Are you sure you want to continue connecting (yes/no)? > ``` > Skriv `yes` og tryk **Enter**. VerificĂ©r at I begge kan logge ind selvstĂŠndigt: **Hvem er I logget ind som?** ```bash whoami ``` **Er I begge pĂ„ serveren pĂ„ samme tid?** ```bash who ``` Log ud fra serveren. ForsĂžg hvor Ă©n af jer tilgĂ„r internettet via et hotspot via en mobil telefon. Gentag ovenstĂ„ende inspektion af hvem som er logget ind og hvilke oplysninger i kan se. Hvad har ĂŠndret sig? --- ## Del 4 – UndersĂžg logfilerne > [!abstract] Baggrund > Linux/ubuntu logger alle autentificeringshĂŠndelser i `/var/log/auth.log` – SSH-loginforsĂžg, vellykkede logins, fejlede forsĂžg og meget mere. I skal nu lĂŠre tre mĂ„der at lĂŠse denne fil pĂ„, fra overblik til live overvĂ„gning. --- ### 4a – Overblik med cat `cat` udskriver hele filens indhold: ```bash sudo cat /var/log/auth.log | less ``` Brug **pil op/ned** til at navigere, `q` for at afslutte. Hvad ser I? NotĂ©r jeres fĂžrste observationer: Hvad sker der hvis du anvender `more` i stedet for `less` --- ### 4b – De seneste hĂŠndelser med tail `tail` viser de **sidste linjer** af en fil: ```bash sudo tail -10 /var/log/auth.log ``` **SpĂžrgsmĂ„l:** Ser I mislykkede SSH-loginforsĂžg? Fra hvilke IP-adresser, og hvad forsĂžger de at logge ind med? > [!info] Det I sandsynligvis ser > Selv en splinterny server vil have modtaget automatiserede angrebsforsĂžg inden for de fĂžrste minutter efter opstart. Bots scanner kontinuerligt alle public IP-adresser pĂ„ port 22 og prĂžver kendte brugernavne som `root`, `admin`, `test`, `ubuntu`. > Dette er **path of least resistance** i praksis – og netop det key-based authentication beskytter imod. --- ### 4c – FiltrĂ©r med grep `grep` finder kun de linjer der matcher et mĂžnster: **Alle mislykkede forsĂžg:** ```bash sudo grep "Failed password" /var/log/auth.log ``` **Alle vellykkede logins:** ```bash sudo grep "Accepted publickey" /var/log/auth.log ``` **Ukendte brugernavne der er forsĂžgt:** ```bash sudo grep "Invalid user" /var/log/auth.log ``` **KombinĂ©r tail og grep:** ```bash sudo tail -100 /var/log/auth.log | grep "Invalid user" ``` > NotĂ©r brugernavne der forsĂžges, antal forsĂžg og IP-adresser I finder: --- ### 4d – Live overvĂ„gning med tail -f `tail -f` holder filen Ă„ben og viser **nye linjer lĂžbende i realtid**: ```bash sudo tail -f /var/log/auth.log ``` Lad kommandoen kĂžre i baggrunden. **Én person holder `tail -f` kĂžrende. Den anden Ă„bner en ny terminal** og logger ind pĂ„ serveren igen: ```bash ssh root@<IP-ADRESSE> ``` **SpĂžrgsmĂ„l:** Hvad ser den der overvĂ„ger loggen? Find linjen der viser det vellykkede login og skriv den ned: Tryk **Ctrl + C** for at stoppe `tail -f` nĂ„r I er klar til at gĂ„ videre. --- ## Del 5 – GruppeĂžvelse: Find brugernavnet i loggen > [!note] Koordinering > Find sammen med en nabo-gruppe og fortĂŠller hvem der starter som "angribere" og hvem der starter som "forsvarere". Nabo-gruppen forsĂžger at logge ind pĂ„ **jeres** server, og I skal finde ud af hvad de kaldte sig. --- ### Forsvarer-rollen – jeres gruppe Start live-overvĂ„gning af jeres log: Jeres opgave er at **identificere det brugernavn** nabo-gruppen bruger nĂ„r de forsĂžger at logge ind. Hvilken kommando anvender du til ovenstĂ„ende? --- ### Angriber-rollen – nabo-gruppen gĂžr dette mod jeres server De vĂŠlger et vilkĂ„rligt brugernavn – **et tilfĂŠldigt ord, ikke et rigtigt brugernavn** – fx `pirat`, `ninja`, `hacker`, `kaffe`. De aftaler det internt og fortĂŠller det **ikke** til jer. De forsĂžger at logge ind pĂ„ jeres server: ```bash ssh <valgt-brugernavn>@<JERES-IP-ADRESSE> ``` Login fejler – det er meningen. Det efterlader alligevel et spor i jeres log. --- **Hvad var brugernavnet nabo-gruppen valgte?** **Hvilken linje i loggen afslĂžrede det?** Er der en mĂ„de at se linjenummer pĂ„? Hvordan henter i bedst en kopi af auth.log ned pĂ„ jeres egen maskine til "offline" analyse og efterforskning? --- ### Skift roller Nu bytter I. I vĂŠlger et brugernavn og forsĂžger at logge ind pĂ„ nabo-gruppens server. De overvĂ„ger deres log og skal finde jer. **Det brugernavn I valgte:** **Fandt de det? Hvor hurtigt?** --- ## Del 6 – Afsluttende refleksion *(ca. 5 min)* **SpĂžrgsmĂ„l 1** I sĂ„ at serveren allerede var under angreb fra bots kort efter opstart. Hvad fortĂŠller det jer om vigtigheden af at deaktivere password-login fra sekund Ă©t? **SpĂžrgsmĂ„l 2** Brugernavnet optrĂ„dte i klartekst i `auth.log`. Hvad er implikationen for en administrator – hvad bĂžr man gĂžre med den slags logfiler over tid? **SpĂžrgsmĂ„l 3** Hvilken risikobehandlingsstrategi svarer det til at UpCloud tvinger key-based authentication frem som eneste mulighed? Og hvad er restrisikoen – hvad beskytter SSH-nĂžgler **ikke** imod? --- > [!success] Tjekliste – er I i mĂ„l? > > - ☐ Vi har begge genereret vores eget Ed25519-nĂžglepar > - ☐ Vi har begge uploadet vores public key via Canvas-grupperum > - ☐ Vi har begge logget ind selvstĂŠndigt pĂ„ serveren med vores egne nĂžgler > - ☐ Vi har undersĂžgt auth.log med `cat`, `tail` og `grep` > - ☐ Vi har brugt `tail -f` til live overvĂ„gning og set vores eget login dukke op > - ☐ Vi har identificeret nabo-gruppens valgte brugernavn fra loggen > - ☐ Vi kan forklare hvad en linje i auth.log betyder --- > [!cite] Kilder og videre lĂŠsning > - A. Sequeira, *CompTIA Network+ N10-009 Cert Guide*, Kap. 6 – Secure a Network in a Cloud Environment > - OpenSSH dokumentation: https://www.openssh.com/manual.html > - UpCloud – SSH key authentication guide: https://upcloud.com/docs/guides/use-ssh-keys-authentication/ > - Ubuntu – System logs reference: https://ubuntu.com/server/docs/about-system-logging