Indhold - [[#Hvorfor Python?|Hvorfor Python?]] - [[#Hvorfor Python?#Python og IT-sikkerhed: En Uundværlig Forbindelse|Python og IT-sikkerhed: En Uundværlig Forbindelse]] - [[#Python og IT-sikkerhed: En Uundværlig Forbindelse#Automatisering af Sikkerhedsopgaver:|Automatisering af Sikkerhedsopgaver:]] - [[#Python og IT-sikkerhed: En Uundværlig Forbindelse#Håndtering af Netværkssikkerhed:|Håndtering af Netværkssikkerhed:]] - [[#Python og IT-sikkerhed: En Uundværlig Forbindelse#Sårbarhedstest og Eksploitering:|Sårbarhedstest og Eksploitering:]] - [[#Python og IT-sikkerhed: En Uundværlig Forbindelse#Dataanalyse og Trusselsvurdering:|Dataanalyse og Trusselsvurdering:]] - [[#Python og IT-sikkerhed: En Uundværlig Forbindelse#Samarbejde og Fællesskab:|Samarbejde og Fællesskab:]] - [[#Hvorfor Python?#Datatyper i Python|Datatyper i Python]] - [[#Datatyper i Python#Numeriske Datatyper:|Numeriske Datatyper:]] - [[#Datatyper i Python#Tekstuelle Datatyper:|Tekstuelle Datatyper:]] - [[#Datatyper i Python#Sekvens Datatyper:|Sekvens Datatyper:]] - [[#Datatyper i Python#Mapping Datatyper:|Mapping Datatyper:]] - [[#Datatyper i Python#Boolske Datatype:|Boolske Datatype:]] - [[#Datatyper i Python#Mængde Datatype:|Mængde Datatype:]] - [[#Datatyper i Python#NoneType:|NoneType:]] - [[#Hvorfor Python?#Python lister|Python lister]] - [[#Python lister#Øvelse / Opgave 1|Øvelse / Opgave 1]] - [[#Python lister#Python list metoder|Python list metoder]] - [[#Python lister#Opgave 2|Opgave 2]] - [[#Hvorfor Python?#Tuples|Tuples]] - [[#Tuples#Eksempel: Sikkerhedskonfiguration med Tuples|Eksempel: Sikkerhedskonfiguration med Tuples]] - [[#Hvorfor Python?#Dictionaries|Dictionaries]] - [[#Hvorfor Python?#Python Funktioner|Python Funktioner]] - [[#Hvorfor Python?#Læsning og skrivning af filer:|Læsning og skrivning af filer:]] - [[#Læsning og skrivning af filer:#Navigering gennem Filsystemet:|Navigering gennem Filsystemet:]] - [[#Læsning og skrivning af filer:#Håndtering af Undtagelser:|Håndtering af Undtagelser:]] # Hvorfor Python? Vi har valgt at bruge programmeringssproget Python gennem hele studieforløbet, og dette valg er ikke tilfældigt. Tværtimod er det bevidst, da Python udgør en afgørende komponent inden for it-sikkerhed. Her vil jeg forsøge at belyse, hvorfor vi har truffet dette valg, og hvorfor det er afgørende for jer som studerende at investere tid i at udvikle jeres færdigheder inden for Python. ## Python og IT-sikkerhed: En Uundværlig Forbindelse Python, et alsidigt og kraftfuldt programmeringssprog, har etableret sig som en hjørnesten inden for it-sikkerhed. Dets popularitet i branchen skyldes ikke kun dens enkelhed og læsbarhed, men også dens omfattende støtte til tredjepartsbiblioteker og moduler, hvilket gør det til det ideelle værktøj for it-sikkerhedspersonale. ### Automatisering af Sikkerhedsopgaver: Python giver mulighed for automatisering af gentagne opgaver og arbejdsgange. Dette er afgørende inden for it-sikkerhed, hvor hastighed og nøjagtighed er altafgørende. Ved at skrive scripts kan sikkerhedspersonale effektivt udføre opgaver som loganalyse, sårbarhedsskanning og overvågning. ### Håndtering af Netværkssikkerhed: Python har fremragende biblioteker til netværkssikkerhed, fx. [[Scapy - intro]] hvilket gør det muligt for sikkerhedspersonale at udvikle værktøjer til overvågning af netværkstrafik, opdagelse af indtrængninger og implementering af sikre kommunikationsprotokoller. ### Sårbarhedstest og Eksploitering: Ved at kombinere Python med værktøjer som Metasploit kan sikkerhedseksperter udføre sårbarhedstest og penetrationstest for at identificere og løse potentielle risici i it-infrastrukturen. ### Dataanalyse og Trusselsvurdering: Python's omfattende støtte til dataanalysebiblioteker som Pandas og NumPy gør det muligt for sikkerhedsteams at analysere store datamængder og identificere trusselsmønstre. Dette er afgørende for proaktivt at håndtere sikkerhedstrusler. ### Samarbejde og Fællesskab: Python har en stor og engageret udviklerfællesskab, hvilket betyder, at der er et væld af ressourcer, tutorials og værktøjer tilgængelige. Sikkerhedspersonale kan drage fordel af dette fællesskab for at holde sig opdaterede med de seneste sikkerhedstrusler og løsninger. At lære Python som en it-sikkerhedsperson er ikke kun en nødvendighed, men det åbner også dørene for kreativ problemløsning og innovation inden for sikkerhedsdomænet. Det er en kompetence, der ikke kun gør dig mere effektiv, men også rustet til at møde de konstante udfordringer i den komplekse verden af it-sikkerhed. Så lad os komme i gang og dykke ned i verden af Python og opdage, hvordan dette sprog kan forstærke dine it-sikkerhedsfærdigheder. >[!info] **info** >Jeg har også oprettet en [[Jupyter Notebook]] som er lavet via Google Colab du kan tilgå den via følgende link: https://colab.research.google.com/drive/1HBtDNni2Y8Hma7I5p6eMJL1BVyGNOX2l#scrollTo=f7rwarELaazR ## Datatyper i Python Ligesom i mange andre programmeringssprog, spiller datatyper en central rolle i behandlingen og manipulationen af data. Datatyper definerer, hvilken type data et objekt kan indeholde, og hvilke operationer der kan udføres på det. Python understøtter flere indbyggede datatyper, herunder: ### Numeriske Datatyper: - int: Heltal uden decimaler, f.eks. 5 eller -23. - float: Decimaltal, f.eks. 3.14 eller -0.5. ### Tekstuelle Datatyper: - str: Sekvens af karakterer, repræsenteret med enkelt- eller dobbelt citationstegn, f.eks. "Python" eller 'Hello World!'. ### Sekvens Datatyper: - list: En ordenet samling af elementer, der kan ændres. Eksempel: [1, 2, 3]. - tuple: En ordenet samling af elementer, der ikke kan ændres. Eksempel: (1, 2, 3). ### Mapping Datatyper: - dict: En samling af nøgle-værdi-par. Hvert element indeholder en nøgle og en tilsvarende værdi. Eksempel: {'navn': 'John', 'alder': 25}. ### Boolske Datatype: - bool: Representere sandt eller falsk. Kan være enten True eller False. ### Mængde Datatype: - set: En samling af unikke elementer uden en bestemt rækkefølge. Eksempel: {1, 2, 3}. ### NoneType: - None: En særlig type, der repræsenterer fraværet af en værdi. Bruges ofte som en pladsholder. At forstå og vælge de rette datatyper er afgørende for at skrive effektiv og fejlfri Python-kode. Python er også dynamisk typet, hvilket betyder, at datatyper tildeles automatisk, og du behøver ikke deklarere dem eksplicit. Denne fleksibilitet gør Python til et kraftfuldt værktøj til datahåndtering og manipulation. ## Python lister Lister i Python svarer til strukturer som dynamiske vektorer i programmeringssprog som C og C++. Vi kan udtrykke literals ved at omringe deres elementer mellem et par klammer og adskille dem med kommaer. Det første element i en liste har indeks 0. Lister i Python bruges til at gemme sæt af relaterede elementer af samme eller forskellige typer. Derudover er en liste en mutabel datastruktur, hvilket betyder, at listen kan ændres efter oprettelsen. For at oprette en liste i Python skal du blot omringe en kommasepareret sekvens af elementer med firkantede parenteser []. For eksempel oprettes en liste med svarkoder som følger: ```python >>> response = [200, 403, 400, 500] ``` Et indeks `liste[indeks]` bruges til at få adgang til et element i en liste. En indeks er et heltal, der angiver positionen af et element i en liste. Det første element i en liste starter altid ved indeks 0. ```python >>> responses[0] 200 >>> responses[1] 400 ``` Python list er en [**Sequence Types**](https://docs.python.org/3/library/stdtypes.html#typesseq) så vi kan for eksempel spørger til indhold i en liste: ```python >>> 403 in response True >>> 303 not in response True ``` Ligeledes har vi en række [indbygget funktioner](https://docs.python.org/3/library/functions.html) i python som kan være nyttige: ```python >>> len(response) 4 ``` Altså kan vi ved at bruge metoden `len()` få et tal for omfang af listen, i dette tilfælde indeholder listen 4 elementer med indeks fra 0 til 3. Vi kan også lave en sortering af listen ```python >>> sorted(response) [200, 400, 403, 500] >>> sorted(response, reverse = True) [500, 403, 400, 200] ``` ### Øvelse / Opgave 1 >[!question]- Spørgsmål / øvelse klik for mere >Fremsøg [[RFC]] 9110 *HTTP Semantics* find afsnittet om **status codes** (afsnit 15) og lav en liste med minimum 10 mulige status codes. Nu er opgaven at finde frem til det største tal i listen og hvilket indeks dette tal har i listen? Python har en række indbygget funktioner, mon ikke der er hjælp at hente der? >[Bulilt-in fuctions](https://docs.python.org/3/library/functions.html) > > Find øvelse / opgaven i canvas og upload et link til din Google Colab [[Jupyter Notebook]] hvor du har udført ovenstående opgave eller upload det program du har skrevet for at udføre opgaven. Programmet kan med fordel indeholde kommentar som vil hjælpe med at forstå forløb af programmet. Løs og indsend ovenstående opgave inden du går videre. ### Python list metoder [Python list methods](https://www.w3schools.com/python/python_lists_methods.asp) giver os altså nogle gode muligheder for at arbejde med data. Nu vil vi kigge på `append(), index() og remove()` Jeg vil benytte [common ports cheat sheet](https://packetlife.net/media/library/23/common_ports.pdf) som kan hentes via [packetlife.net](https://packetlife.net/) som drives af Jeremy Stretch hovedperson og lead maintainer af [netbox](https://docs.netbox.dev/en/stable/) Hop over i [Jupyter Notebook](https://colab.research.google.com/drive/1HBtDNni2Y8Hma7I5p6eMJL1BVyGNOX2l#scrollTo=bps7y5GD2v7I) i colabs fra Google da det er lidt nemmere at udføre kode og se resultatet der. Hvis du læser gennem kode eksemplerne og gerne afprøver dem selv, vil du blive sendt her tilbage igen så du er klar til opgave 2. ### Opgave 2 Der er tydeligvis noget galt med følgende program ```python protocol_list = ["FTP", "HTTP", "SNMP", "SSH"] elements_to_check = "SSH" for i in range(len(protocol_list)): if elements_to_check in protocol_list: print(f"Element {elements_to_check} er fundet i listen med index {i}") break ``` Jeg får følgende output: ```python Element SSH er fundet i listen med index 0 ``` Din opgave er nu at få rettet programmet til (eller skrevet et helt nyt) sådan at jeg kan søg efter en protocol i listen og få oplysninger retur om denne er i listen og i så fald, hvilken placering (index) denne protokol har i listen. Find øvelse / opgaven i canvas og upload et link til din Google Colab [[Jupyter Notebook]] hvor du har udført ovenstående opgave eller upload det program du har skrevet il at udføre opgaven. Programmet kan med fordel indeholde kommentar som vil hjælpe med at forstå forløb af programmet. ## Tuples Ligesom lister er tuple-klassen i Python en datastruktur, der kan gemme elementer af forskellige typer. Sammen med list- og range-klasserne er det en af ​​sekvenstyperne i Python, med den særegenhed, at de er uforanderlige. Dette betyder, at dens indhold ikke kan ændres, efter det er blevet oprettet. Generelt set opretter du en tuple i Python ved simpelthen at definere en sekvens af elementer adskilt af kommaer. Indeks bruges til at få adgang til et element i en tuple. Et indeks er et heltal, der angiver positionen af et element i en tuple. Det første element i en tuple starter altid ved indeks 0. ```python >>> tuple = ("FTP", "SSH", "HTTP", "Telnet") >>> tuple[0] 'FTP' ``` Forsøger jeg mig med et element som ikke er tilstede vil jeg få en IndexError ```python >>> tuple[5] Traceback (most recent call last): File "<input>", line 1, in <module> IndexError: tuple index out of range ``` Jeg vil heller ikke kunne lave om på et element i en tuple som jeg jo kan i en liste; Se mere her i min [Jupyter Notebook](https://colab.research.google.com/drive/1HBtDNni2Y8Hma7I5p6eMJL1BVyGNOX2l#scrollTo=SJ3Tk-E2Q4Bp) **Yderligere information:** Tupler er nyttige, når du har data, der ikke bør ændres, for eksempel koordinater, konstante værdier eller data, der skal bevares i en uforanderlig tilstand. Forskellen mellem lister og tupler (ud over uforanderligheden) er, at tupler oprettes ved at bruge parenteser () i stedet for firkantede parenteser [] som for lister. Tuple-brugen kan optimere kode og sikre, at visse data forbliver uændrede, hvilket kan være afgørende i visse situationer inden for it-sikkerhed og andre programmeringsområder. ### Eksempel: Sikkerhedskonfiguration med Tuples I softwareudvikling er sikkerhedskonfiguration afgørende for at beskytte et system mod potentielle trusler. Forestil dig, at du arbejder på implementeringen af et sikkerhedsrammeverk for en applikation, og du har brug for at definere en række konfigurationer, der skal være uforanderlige for at sikre systemets stabilitet og sikkerhed. Her kan tuples være nyttige. Lad os oprette en tuple til at repræsentere sikkerhedsindstillinger for brugeradgang: ```python # Sikkerhedsindstillinger for brugeradgang sikkerhedsindstillinger = ( "stærkt_adgangskode", True, # To-faktor-autentificering aktiveret ["IP-adresse1", "IP-adresse2"], # Tilladte IP-adresser {"bruger1": "rolle1", "bruger2": "rolle2"} # Brugerroller ) ``` I dette eksempel indeholder tuplen flere elementer, der repræsenterer forskellige aspekter af sikkerhedsindstillingerne: - Adgangskodepolitik: En stærk adgangskode er defineret som en tekststreng. - To-faktor-autentificering: En boolean-værdi indikerer, om denne funktion er aktiveret. - Tilladte IP-adresser: En liste over tilladte IP-adresser. - Brugerroller: En dictionary, der mapper brugernavne til roller. Fordelen ved at bruge en tuple her er, at sikkerhedsindstillingerne ikke kan ændres efter oprettelsen, hvilket sikrer, at de grundlæggende sikkerhedsmekanismer forbliver uændrede. Dette kan være vigtigt for at undgå utilsigtede ændringer, der kan kompromittere systemets sikkerhed. Anvendelsen af tupler i sikkerhedsindstillinger understreger vigtigheden af uforanderlighed i situationer, hvor bestemte konfigurationsparametre skal bevares i en konstant tilstand for at opretholde systemets sikkerhed. ## Dictionaries **Python's dictionary** data structure er sandsynligvis den vigtigste i hele sproget og tillader os at associere værdier med nøgler. Python's dict-klasse er en map-type, der mapper nøgler til værdier. I modsætning til sekventielle typer (liste, tuple, range eller streng), der indekseres af et numerisk indeks, indekseres dictionaries af nøgler. Blandt de vigtigste træk ved dictionaries kan vi fremhæve: - **Foranderlig type:** Dictionaries er foranderlige, hvilket betyder, at deres indhold kan ændres, efter de er blevet oprettet. Denne fleksibilitet er gavnlig ved håndtering af dynamiske datastrukturer, såsom dem der ofte stødes på i sikkerheds konfigurationer. - **Bevarelse af rækkefølge:** Dictionaries bevarer rækkefølgen, hvori nøgle-værdipar indsættes. Dette betyder, at den rækkefølge, hvori du tilføjer nøgle-værdipar til dictionary, opretholdes. Denne funktion er særligt nyttig, når man håndterer scenarier, hvor rækkefølgen af elementer betyder noget, såsom bevarelse af rækkefølgen af sikkerheds konfigurationer eller vedligeholdelse af en specifik sekvens i netværksrelaterede data. I Python er der flere måder at oprette en dictionary på. Den enkleste er at omslutte en sekvens af kommaseparerede nøgle:værdi-par i krøllede parenteser { }. I dette eksempel vil vi definere tjenestenavnet som nøglen og portnummeret som værdien. **Eksempel: Oprettelse af en Dictionary for Netværkskonfiguration** ```python # Oprettelse af en dictionary for netværkskonfiguration net_config = { "HTTP": 80, "HTTPS": 443, "SSH": 22, "FTP": 21 } # Udskrivning af dictionary print(net_config) ``` I dette eksempel bruges en dictionary til at mappe servicenavne til de tilsvarende portnumre. Dette kunne være relevant i it-sikkerhedssammenhæng, hvor nøje konfiguration af netværksadgang er afgørende. Ved at bruge en dictionary kan vi hurtigt slå op, hvilken port der er tildelt til en bestemt service. ```python >>> net_config['FTP'] 21 ``` Se meget mere her [Jupyter Notebook](https://colab.research.google.com/drive/1HBtDNni2Y8Hma7I5p6eMJL1BVyGNOX2l#scrollTo=dW32ElFyULd2) ## Python Funktioner En funktion er en blok af kode, der udfører en specifik opgave, når funktionen kaldes. Du kan bruge funktioner til at gøre din kode genanvendelig, bedre organiseret og mere læsbar. Funktioner kan have parametre og returværdier. Der er mindst fire grundlæggende typer af funktioner i Python: - Indbyggede fuktioner (bulit-in) som vi er stødt på et par gange nu. - Funktioner, der stammer fra forudinstallerde moduler. - Brugerdefinerede funktioner: Disse er skrevet af dig, og du bruger dem frit i Python. - Lambda-funktionen: Dette tillader os at oprette anonyme funktioner, der er konstrueret ved hjælp af udtryk som f.eks. produkt = lambda x, y: x * y, hvor lambda er et nøgleord i Python, og x og y er funktionsparametre. Python-funktioner defineres ved hjælp af nøgleordet `def` efterfulgt af funktionsnavnet og funktionsparametrene. Funktionens krop består af Python-udsagn, der skal udføres. Du har mulighed for at returnere en værdi til funktionskaldet ved slutningen af funktionen, eller hvis du ikke tildele en returværdi, vil den som standard returnere værdien `None`. For eksempel kan vi definere en funktion, der returnerer `True`, hvis elementværdien findes i ordbogen, og `False` hvis ikke den findes. ```python def is_contained(dictionary,item): for key,value in dictionary.items(): if value == item: return True return False dictionary = {1:100,2:200,3:300} print(is_contained(dictionary,200)) print(is_contained(dictionary,300)) print(is_contained(dictionary,350)) ``` ## String formatting i Python Python har gennem årene udviklet flere måder at formatere strings på, hvilket giver forskellige muligheder og fordele i forskellige situationer. Denne notebook gennemgår udviklingen fra de ældre metoder til de nyere, mere kraftfulde og sikre alternativer, der blev introduceret med Python 3.6. Du kan læse mere om det samt se eksampler i denne [Jupyter notebook:](https://colab.research.google.com/drive/1aINiNILpmuExVpYYwl2AdToi4Boh-qF-?usp=sharing) ## Læsning og skrivning af filer: Når du arbejder med filer i Python, kan du åbne en fil i forskellige tilstande, såsom læsemodus ('r'), skrivemodus ('w'), eller tilføjelsesmodus ('a'). Læsning af filer giver dig mulighed for at få adgang til indholdet, skrivning lader dig overskrive eller oprette nye filer, mens tilføjelse giver mulighed for at tilføje indhold til eksisterende filer uden at slette det eksisterende. ```python # Eksempel: Åbning af en fil i læsemodus og udskrivning af indholdet with open('eksempelfil.txt', 'r') as fil: indhold = fil.read() print(indhold) ``` ### Navigering gennem Filsystemet: Python har indbyggede moduler som os og os.path, der giver dig mulighed for at arbejde med filsystemet. Du kan navigere gennem mapper, tjekke filtyper, og udføre operationer som at skabe eller slette filer og mapper. ```python import os # Eksempel: Få nuværende arbejdsmappe og udskriv det nuværende_mappe = os.getcwd() print("Nuværende arbejdsmappe:", nuværende_mappe) ``` ### Håndtering af Undtagelser: Når du arbejder med filer, er det vigtigt at tage højde for potentielle undtagelser, såsom filen, der ikke findes, eller manglende rettigheder. Dette kan gøres ved hjælp af blokken try-except. ```python try: with open('eksempelfil.txt', 'r') as fil: indhold = fil.read() print(indhold) except FileNotFoundError: print("Filen blev ikke fundet.") except Exception as e: print(f"En fejl opstod: {e}") ``` Lad os Prøve det i [Jupyter Notebook](https://colab.research.google.com/drive/1HBtDNni2Y8Hma7I5p6eMJL1BVyGNOX2l#scrollTo=HdpQ8STte5Cj)