Summary

Dokument zawiera podstawowe zagadnienia z zakresu bezpieczeństwa informacji. Omówione są takie tematy jak poufność, integralność i dostępność danych, szyfrowanie symetryczne i asymetryczne oraz podpisy elektroniczne.

Full Transcript

Bezpieczeństwo informacji 1. Podstawowe elementy modelu CIA (poufność, integralność, dostępność). Poufność  Zapewnienie, że dane są dostępne tylko dla uprawnionych osób / systemów.  Kontrola tego, jakie dane są gromadzone i przechowywane.  Kategoryzacja danych wg. tego, komu mogą być uj...

Bezpieczeństwo informacji 1. Podstawowe elementy modelu CIA (poufność, integralność, dostępność). Poufność  Zapewnienie, że dane są dostępne tylko dla uprawnionych osób / systemów.  Kontrola tego, jakie dane są gromadzone i przechowywane.  Kategoryzacja danych wg. tego, komu mogą być ujawnione.  Nadawanie użytkownikom minimalnych uprawnień, zwiększanie dopiero, jeśli jest taka potrzeba.  Zmniejsza wpływ błędów ludzi na bezpieczeństwo danych, np. zhackowany pracownik ujawnia tylko część danych, bo nie miał dostępu do większej ilości. Integralność  Zapewnienie, że dane nie zostały zmienione ani uszkodzone przez osoby nieuprawnione  Kontrola integralności danych  Zapobieganie Nieautoryzowanej modyfikacji informacji  Sposoby ochrony integralności: o Szyfrowanie danych o Korzystanie z certyfikatów o Rejestrowanie pełnej historii operacji na danych Dostępność  Zapewnienie, że dane są dostępne dla uprawnionych użytkowników w odpowiednim czasie i miejscu  Zabezpieczenie na wypadek awarii sprzętu, przerwy w dostawie prądu, katastrofy naturalne, ataki hackerskie  Sposoby zapewnienia dostępności: o Zapasowe serwery o Kopie zapasowe danych o Plany awaryjne na wypadek przerw w działaniu systemów o Wykorzystywanie systemów bardziej odpornych na ataki i awarie 2. Podstawy szyfrowania: algorytmy symetryczne i asymetryczne. Symetryczne Wykorzystuje ten sam klucz do szyfrowania i deszyfrowania Szybkie, efektywne Wyzwaniem jest bezpieczna wymiana klucza Przykładowe algorytmy: AES, DES, 3DES Służy do szyfrowania danych "w spoczynku" (np. na dysku twardym) oraz do szyfrowania dużych ilości danych przesyłanych przez sieć (np. VPN). Asymetryczne Wykorzystuje parę kluczy dla każdej ze stron komunikacji:  Klucz publiczny  Klucz prywatny Nadawca szyfruje wiadomość kluczem publicznym odbiorcy. Odbiorca, posiadający odpowiadający klucz prywatny, może odszyfrować wiadomość. Bezpieczna wymiana kluczy, ponieważ klucz publiczny może być udostępniony publicznie Umożliwia weryfikację nadawcy i integralności wiadomości (pewność, że nie została zmieniona) Wolniejsze działanie Obciążenie obliczeniowe Przykładowe algorytmy: RSA, ECC, DSA Stosowane jest do bezpiecznej wymiany kluczy symetrycznych (np. w protokole TLS/SSL, używanym w HTTPS), do tworzenia podpisów cyfrowych oraz do identyfikacji i uwierzytelniania użytkowników. 3. Podpis elektroniczny i infrastruktura klucza publicznego (PKI). Podpis elektroniczny służy do identyfikacji osoby składającej podpis. Rodzaje:  Zwykły - np. imię i nazwisko pod emailem czy zeskanowany podpis odręczny, ograniczona moc prawna.  Zaawansowany - jednoznacznie powiązany z osobą składającą podpis, nie zawsze ma wymóg kwalifikowanego urządzenia.  Kwalifikowany - składany za pomocą kwalifikowanego urządzenia, opiera się na kwalifikowanym certyfikacie podpisu elektronicznego, zawsze wykorzystuje PKI. Ma prawną równoważność z podpisem własnoręcznym i niezaprzeczalność. Działanie PKI: 1. Generowanie par kluczy użytkownika – prywanty i publiczny 2. Żądanie certyfikatu (CSR - Cer ficate Signing Request) przez użytkownika; żądanie zawiera jego klucz publiczny i dane identyfikacyjne 3. Weryfikacja tożsamości przez CA (Urząd Certyfikacji): urząd na podstawie CSR weryfikuje tożsamość użytkownika 4. Wydanie certyfikatu przez CA po udanej weryfikacji 5. Użytkownik używa klucza prywatnego do podpisania dokumentu 6. Odbiorca weryfikuje podpis za pomocą certyfikatu CA 4. Metody uwierzytelniania. Jednoskładnikowe - np. tylko hasło, tylko PIN; niski poziom bezpieczeństwa, większa podatność na ataki Dwuskładnikowe / Wieloskładnikowe - gwarantuje większe bezpieczeństwo, wymaga co najmniej 2 z 3 czynników uwierzytelniających:  Coś, co wiesz (Knowledge factor): Hasło, PIN, odpowiedź na pytanie kontrolne.  Coś, co masz (Possession factor): Token sprzętowy, karta inteligentna, smar on, kod SMS, aplikacja uwierzytelniająca (np. Google Authen cator, Authy).  Coś, czym jesteś (Inherence factor): Dane biometryczne (odcisk palca, rozpoznawanie twarzy, skan tęczówki, głos). 5. Podstawy bezpieczeństwa fizycznego i logicznego. Bezpieczeństwo fizyczne: Kontrola dostępu do budynków, pomieszczeń za pomocą zamków, kart dostępu, strażników etc. Monitoring Systemy alarmowe: antywłamaniowe, przeciwpożarowe, zalaniowe Ochrona środowiskowa: zapewnienie odpowiedniej temperatury / wilgotności / zasilania awaryjnego dla urządzeń IT. Bezpieczeństwo logiczne: Uwierzytelnianie – weryfikacja tożsamości użytkowników Autoryzacja – przyznawanie odpowiednich uprawnień dostępu Szyfrowanie danych Firewall – kontrola ruchu sieciowego IDS/IPS – wykrywanie ataków sieciowych Kopie zapasowe Disaster recovery – testowanie procedur odzyskiwania danych w razie awarii 6. Główne rodzaje cyberataków i metody obrony przed nimi.  Phishing: wyłudzanie informacji poprzez podszywanie się pod zaufane podmioty.  Malware: Obejmuje wirusy, trojany, ransomware i inne programy, których celem jest uszkodzenie systemu, kradzież danych lub przejęcie kontroli nad urządzeniem.  Ataki DDoS: przeciążenie serwera poprzez zalewanie ogromną ilością zapytań, uniemożliwiając normalny dostęp.  Ataki Man-in-the-Middle (MITM): przechwytywanie komunikacji między dwoma stronami, modyfikując przesyłane dane.  Ataki SQL Injec on: wstrzykiwanie złośliwego kodu SQL do zapytań baz danych, co może umożliwić dostęp do poufnych informacji.  Ataki Cross-Site Scrip ng (XSS): wstrzykiwanie złośliwych skryptów do stron internetowych, co może umożliwić kradzież ciasteczek (cookies) lub przekierowanie użytkownika na fałszywe strony.  Ransomware: szyfruje dane ofiary i żąda okupu za ich odszyfrowanie.  Ataki na hasła (brute-force, słownikowe): Próby odgadnięcia haseł poprzez testowanie wielu kombinacji znaków lub popularnych haseł  Ataki na łańcuch dostaw: ataki na oprogramowanie dostarczane przez dostawców, aby zainfekować docelowe systemy. Metody obrony:  Szkolenia z cyberbezpieczeństwa  Silne hasła i menedżery haseł  Uwierzytelnianie dwuskładnikowe  Aktualizowanie oprogramowania  Antywirusy  Firewall – kontrola ruchu sieciowego  IDS/IPS – wykrywanie ataków sieciowych  Kopie zapasowe – ochrona w przypadku ransomware lub awarii Języki skryptowe 1. Wbudowane typy, klasy i struktury danych oraz ich różne odmiany. Zakresy zmiennych (funkcja, moduł, domknięcie, itd.). Typy danych:  int – liczby całkowite  float – zmiennoprzecinkowe  str – ciągi znaków Klasy i obiekty:  klasa – szablon do tworzenia obiektów  obiekt – instancja klasy  dziedziczenie – klasy pochodne dziedziczą atrybuty i metody po klasach bazowych  polimorfizm – zdolność obiektów różnych klas do reagowania na to samo wywołanie metody w różny sposób Struktury danych:  list – zmienne sekwencje elementów, mogą zawierać różne typy danych  tuple (krotki) – niezmienne sekwencje elementów, nie mogą być modyfikowane po utworzeniu  dict (słowniki) – zbiory par klucz-wartość  queue (kolejki) – FIFO (First In, First Out)  stack (stosy) – LIFO (Last In, First Out) Zasięgi zmiennych:  Zasięg globalny: Zmienne zdefiniowane na poziomie głównego skryptu są dostępne z dowolnego miejsca w kodzie.  Zasięg lokalny: Zmienne zdefiniowane wewnątrz funkcji są dostępne tylko wewnątrz tej funkcji.  Zasięg zamknięty (closure): Zmienne nieglobalne, które są dostępne dla funkcji zagnieżdżonych. Moduł – plik zawierający definicje funkcji, zmiennych i klas. Użycie: import moj_modul moj_modul.nazwa_funkcji(arg) Domknięcie (closure) to funkcja, która "zapamiętuje" swoje leksykalne środowisko. Oznacza to, że funkcja wewnętrzna ma dostęp do zmiennych z funkcji zewnętrznej, nawet jeśli funkcja zewnętrzna już się zakończyła. Przykład: def tworz_funkcje(x): def wewnetrzna(): print(x) # x jest zmienną wolną return wewnetrzna f = tworz_funkcje(10) f() # Wyświetli 10 2. Sterowanie przebiegiem programu i różne aspekty wykorzystania pętli.  Pętla while: Wykonuje blok instrukcji tak długo, jak warunek początkowy jest spełniony. Dobra. gdy nie znamy z góry liczby iteracji.  Pętla for: Służy do iterowania po elementach sekwencji (listy, krotki, słowniki, itd.). Jest bardziej czytelna i wygodna w przypadku znanej liczby iteracji. Aspekty wykorzystania pętli:  Warunek zatrzymania: określony warunek, który spowoduje jej zakończenie  Inkrementacja/dekrementacja: wewnątrz pętli modyfikujemy zmienną sterującą, aby zbliżyć się do spełnienia warunku zatrzymania.  Słowa kluczowe break i continue: Służą do modyfikowania standardowego przebiegu pętli. break przerywa pętlę całkowicie, a continue przechodzi do następnej iteracji.  Złożone warunki: z wykorzystaniem operatorów logicznych.  Zagnieżdżone pętle: pozwala na iterowanie po wielowymiarowych strukturach danych. 3. Funkcje i podstawowy mechanizm obsługi parametrów, słowa kluczowe. Funkcje rekurencyjne w języku Python. Parametry – zmienne przekazywane do funkcji Parametry domyślne: Mają przypisaną wartość domyślną, jeśli nie zostanie podana wartość przy wywołaniu funkcji. Funkcja rekurencyjna to funkcja, która wywołuje samą siebie. Jest to potężne narzędzie do rozwiązywania problemów, które można podzielić na mniejsze podproblemy tego samego typu. Warunki rekurencji:  Przypadek bazowy: Warunek, który powoduje zakończenie rekurencji.  Krok rekurencyjny: Wywołanie funkcji z mniejszym podproblemem. czytelna mniejsza wydajność 4. Wyrażenia listowe i generatorowe. Filtrowanie i transformacja danych. Wyrażenia listowe  Składnia: [wyrażenie for element in sekwencja if warunek]  Działanie: Tworzą nową listę, stosując podane wyrażenie do każdego elementu sekwencji, opcjonalnie filtrując elementy na podstawie warunku.  Przykład: liczby = [1, 2, 3, 4, 5] kwadraty = [x**2 for x in liczby] # [1, 4, 9, 16, 25] Wyrażenia generatorowe  Składnia: (wyrażenie for element in sekwencja if warunek)  Działanie: Podobne do wyrażeń listowych, ale zwracają generator, który generuje elementy na żądanie. To bardziej wydajne dla dużych zbiorów danych.  Przykład: generator_kwadratow = (x**2 for x in liczby) Filtrowanie i transformacja danych  Filtrowanie: Wybieramy tylko elementy spełniające warunek. parzyste = [x for x in liczby if x % 2 == 0]  Transformacja: Modyfikujemy każdy element. kwadraty_parzystych = [x**2 for x in liczby if x % 2 == 0] Zastosowania  Tworzenie nowych list  Filtrowanie danych  Mapowanie danych  Redukcja danych 5. Wykorzystanie funkcji anonimowych (np. w sortowaniu danych). Funkcje anonimowe (lambda) jednowierszowe funkcje definiowane w miejscu użycia. Nie mają nazwy i służą do prostych operacji. Często są używane jako argumenty innych funkcji, np. przy sortowaniu, filtrowaniu czy mapowaniu. Składnia: lambda argumenty: wyrażenie lista = [3, 1, 4, 1, 5, 9] lista.sort(key=lambda x: -x) # Sortowanie malejąco 6. Obsługa plików. Serializacja obiektów. Tworzenie modułów i pakietów. Obsługa plików funkcja open(), tryb otwarcia ('r' - read, 'w' - write). with open('plik.txt', 'r') as plik: 'with' zapewnia automatyczne zamknięcie pliku po zakończeniu operacji. Serializacja - proces konwersji obiektu na ciąg bajtów, który można zapisać do pliku lub przesłać przez sieć. Moduł pickle umożliwia ten proces. Moduł – plik zawierający definicje funkcji, zmiennych i klas. Pakiet - zbiór modułów zorganizowany w hierarchii katalogów. Każdy podkatalog w pakiecie jest traktowany jako podpakiet. 7. Dekoratory funkcji i domknięcia, funkcje jako obiekty pierwszej klasy. Domknięcie (closure) to funkcja, która "zapamiętuje" swoje leksykalne środowisko. Oznacza to, że funkcja wewnętrzna ma dostęp do zmiennych z funkcji zewnętrznej, nawet jeśli funkcja zewnętrzna już się zakończyła. Przykład: def tworz_funkcje(x): def wewnetrzna(): print(x) # x jest zmienną wolną return wewnetrzna f = tworz_funkcje(10) f() # Wyświetli 10 Dekorator funkcji to funkcja, która wykonuje dodatkowe czynności przed i/lub po wywołaniu oryginalnej funkcji. Zastosowanie: Rejestrowanie wywołań funkcji Pomiar czasu wykonania Walidacja argumentów Funkcje jako obiekty pierwszej klasy  Mogą być przypisane do zmiennych  Mogą być przekazane jako argumenty do innych funkcji  Mogą być zwracane jako wynik innych funkcji 8. Podstawowa obsługa wyjątków (konstrukcja try-except). try: # Kod, który może wygenerować wyjątek except TypWyjatku: # Kod obsługi wyjątku else: # Kod, gdy operacja się udała finally: # Kod, który ma się wykonać niezależnie od tego, czy operacja się udała  Można mieć wiele bloków except dla różnych typów wyjątków  Można użyć exept bez podawania typu wyjątku, aby obsłużyć wszystkie wyjątki  Można przechwycić informacje o błędzie except Exception as e: print(f"Wystąpił błąd: {e}") 9. Dopasowanie wzorców z użyciem match/case. Analogiczne działanie do switch z innych języków. Składnia: x = 10 match x: case 10: print("x jest równe 10") case 20: print("x jest równe 20") case _: print("x jest inne") Możliwości:  Sprawdzenie typów: case str(s): print(f"x to string: {s}")  Rozpakowanie sekwencji punkt = (10, 20) match punkt: case (x, y): print(f"x: {x}, y: {y}") case (x, y, z): print(f"x: {x}, y: {y}, z: {z}")  Dopasowanie do słowników osoba = {"imie": "Jan", "wiek": 30} match osoba: case {"imie": imie, "wiek": wiek}: print(f"Imię: {imie}, Wiek: {wiek}")  If wewnątrz case case n if n > 10: print("x jest większe od 10") czytelność zwięzłość dopasowanie do wzorców Programowanie obiektowe 2 1. Własne klasy, tworzenie instancji obiektów, pojęcie konstruktora/inicjalizatora, metody i atrybuty instancyjne w języku Python. Atrybuty i metody klasowe w języku Python. Definiowanie klasy  Słowo kluczowe class  Konwencja nazewnicza: PascalCase Tworzenie instancji (obiektu) auto = Samochod() Konstruktor (__init__) Konstruktor to specjalna metoda __init__(), która wywoływana jest automatycznie podczas tworzenia obiektu. Służy do inicjalizacji atrybutów instancyjnych: class Samochod: def __init__(self, marka, model): # atrybuty instancyjne: self.marka = marka self.model = model Metody instancyjne Metody instancyjne to funkcje zdefiniowane wewnątrz klasy, które operują na danej instancji. Każda metoda instancyjna musi przyjmować self jako pierwszy argument, np.: class Samochod: def wyswietl_info(self): print(f"Samochód:{self.marka} {self.model}") Atrybuty klasowe Atrybuty klasowe są współdzielone przez wszystkie instancje klasy. Przykład: class Samochod: liczba_kol = 4 # Atrybut klasowy Można je odczytać poprzez Samochod.liczba_kol lub auto.liczba_kol, ale zmiana ich wartości w jednej instancji nie wpływa na inne instancje. Metody klasowe Metody klasowe operują na klasie, a nie na instancji. Są oznaczone dekoratorem @classmethod i przyjmują cls jako pierwszy argument: class Samochod: liczba_kol= 4 @classmethod def zmien_liczbe_kol(cls, nowa_wartosc): cls.liczba_kol= nowa_wartosc Metody statyczne Metody statyczne są niezależne od klasy i instancji – działają jak zwykłe funkcje umieszczone w klasie. Są oznaczone dekoratorem @staticmethod i nie przyjmują self ani cls: class Samochod: @staticmethod def informacje_o_paliwie(): print"Większość samochodów używa benzyny lub diesla.") 2. Pojęcie obiektu w języku Python. Sposoby reprezentacji obiektów w języku Python. Pojęcie obiektu iterowalnego i iteratora w języku Python. Pojęcie obiektu W Pythonie wszystko jest obiektem – liczby, ciągi znaków, listy, a nawet funkcje i moduły. Każdy obiekt posiada:  Tożsamość – unikalny identyfikator (id(obiektu))  Typ – określa, jakie operacje można na nim wykonać (type(obiektu))  Stan – przechowywane dane (atrybuty)  Zachowanie – metody, które definiują sposób działania obiektu Sposoby reprezentacji obiektów Python oferuje kilka sposobów reprezentacji obiektów:  str(obiekt): zwraca czytelną dla użytkownika reprezentację obiektu  repr(obiekt): zwraca dokładną reprezentację, która może być użyta do odtworzenia obiektu  format(obiekt): pozwala na formatowanie tekstowe (np. f"{obiekt}")  bytes(obiekt): zwraca sekwencję bajtów dla niektórych obiektów Przykład: class Samochod: def __init__(self, marka, model): self.marka = marka self.model = model def __str__(self): return f"Samochód: {self.marka} {self.model}" def __repr__(self): return f"Samochod('{self.marka}', '{self.model}')" auto = Samochod("Toyota", "Corolla") print(str(auto)) # Samochód: Toyota Corolla print(repr(auto)) # Samochod('Toyota', 'Corolla') Obiekt iterowalny i iterator  Obiekt iterowalny to obiekt, który można przeglądać element po elemencie (np. listy, krotki, słowniki).  Iterator to obiekt, który implementuje metody __iter__() i __next__().  Każdy iterator jest obiektem iterowalnym. Przykład iteratora: class Licznik: def __init__(self, max): self.max = max self.wartosc = 0 def __iter__(self): return self def __next__(self): if self.wartosc >= self.max: raise StopIteration self.wartosc += 1 return self.wartosc licznik = Licznik(3) for liczba in licznik: print(liczba) # 1, 2, 3 Funkcja iter() i next()  iter(obiekt) zwraca iterator, jeśli obiekt jest iterowalny  next(iterator) pobiera kolejny element iteratora lub zgłasza wyjątek StopIteration Przykład użycia iter() i next(): lista = [1, 2, 3] it = iter(lista) print(next(it)) # 1 print(next(it)) # 2 print(next(it)) # 3 3. Właściwości w języku Python - zastosowania i sposób tworzenia. Przeciążenie operatorów w języku Python. Właściwości w Pythonie  Właściwości to specjalne atrybuty klasy, które pozwalają kontrolować dostęp do wartości.  Służą do ukrywania implementacji i dodawania walidacji przy odczycie/zapisie.  Tworzy się je za pomocą property(fget, fset, fdel, doc) lub dekoratora @property.  Przykładowe zastosowanie: class Osoba: def __init__(self, imie): self._imie = imie @property def imie(self): return self._imie.capitalize()  Właściwości mogą przesłaniać atrybuty instancji i są częścią tzw. deskryptorów. Przeciążenie operatorów  Python pozwala na przeciążanie operatorów w klasach użytkownika poprzez metody specjalne (__add__, __sub__ itp.).  Nie można przeciążać operatorów dla typów wbudowanych ani tworzyć nowych operatorów.  Przykład przeciążenia operatora dodawania (+): class Liczba: def __init__(self, wartosc): self.wartosc = wartosc def __add__(self, other): return Liczba(self.wartosc + other.wartosc)  Obsługiwane są operatory arytmetyczne (+, -, *, /), logiczne (&, |, ^), przypisania (+=, -=) i porównania (==, !=, ).  Istnieją metody zwierciadlane (__radd__, __rsub__), które obsługują operacje, gdy obiekt znajduje się po prawej stronie wyrażenia. 4. Dziedziczenie i agregacja/kompozycja w języku Python. Działanie funkcji super(). Protokoły, interfejsy i abstrakcyjne klasy bazowe w języku Python. Dziedziczenie w Pythonie  Pozwala na tworzenie nowych klas na podstawie istniejących.  Klasa pochodna dziedziczy metody i atrybuty klasy bazowej.  Można rozszerzać lub nadpisywać metody klasy bazowej.  Przesłanianie metod umożliwia dostosowanie ich do specyfiki nowej klasy. Przykład: class Pojazd: def poruszaj_sie(self): print("Pojazd się porusza.") class Samochod(Pojazd): def poruszaj_sie(self): print("Samochód jedzie.") Agregacja i kompozycja  Agregacja: klasa zawiera inne obiekty jako atrybuty, ale mogą one istnieć niezależnie.  Kompozycja: obiekt jest ściśle powiązany z obiektem nadrzędnym i nie istnieje samodzielnie. Przykład agregacji: class Silnik: def uruchom(self): print("Silnik uruchomiony.") class Samochod: def __init__(self, silnik): self.silnik = silnik silnik = Silnik() auto = Samochod(silnik) auto.silnik.uruchom() # Silnik uruchomiony. Działanie funkcji super()  Pozwala na odwołanie się do metod klasy bazowej.  Przydatna przy wielokrotnym dziedziczeniu i unikaniu powielania kodu.  Wywoływanie metody klasy nadrzędnej: class Pojazd: def __init__(self, kolor): self.kolor = kolor class Samochod(Pojazd): def __init__(self, kolor, marka): super().__init__(kolor) self.marka = marka  super() pomaga w rozwiązaniu problemu "rombu" w wielokrotnym dziedziczeniu. Protokoły i interfejsy  Protokoły w Pythonie to nieformalne interfejsy, określające zestaw metod, które obiekt powinien implementować.  Python wykorzystuje "kacze typowanie" – jeśli obiekt ma odpowiednie metody, może być użyty w danym kontekście.  Klasy abstrakcyjne (ABC) zapewniają formalne interfejsy i mogą wymuszać implementację metod. Abstrakcyjne klasy bazowe (ABC)  Nie mogą być instancjonowane, służą jako szablony dla klas pochodnych.  Definiowane za pomocą abc.ABC i metod oznaczonych dekoratorem @abstractmethod.  Używane do zapewnienia spójnego interfejsu w hierarchii klas. Przykład: from abc import ABC, abstractmethod class Zwierze(ABC): @abstractmethod def dzwiek(self): pass class Pies(Zwierze): def dzwiek(self): return "Hau!" 5. Python jako język wspierający paradygmat funkcyjny. Cechy programowania funkcyjnego w Pythonie  Python wspiera styl funkcyjny, choć nie jest językiem stricte funkcyjnym.  Funkcje są traktowane jako obiekty pierwszoklasowe – mogą być przekazywane jako argumenty i zwracane przez inne funkcje.  Wspiera niemutowalne struktury danych i operacje bez efektów ubocznych. Funkcje wyższego rzędu  Mogą przyjmować jako argumenty inne funkcje i zwracać funkcje.  Przykład: def zastosuj(funkcja, wartosc): return funkcja(wartosc) print(zastosuj(abs, -5)) # 5 Funkcje anonimowe (lambda)  Krótkie funkcje jednowierszowe, używane w wyrażeniach: kwadrat = lambda x: x ** 2 print(kwadrat(4)) # 16 Wbudowane funkcje funkcyjne  map(funkcja, iterowalny): stosuje funkcję do każdego elementu: print(list(map(lambda x: x * 2, [1, 2, 3]))) # [2, 4, 6]  filter(funkcja, iterowalny): filtruje elementy na podstawie warunku: print(list(filter(lambda x: x % 2 == 0, [1, 2, 3, 4]))) # [2, 4]  reduce(funkcja, iterowalny): redukuje zbiór do jednej wartości (functools.reduce). Rekurencja w Pythonie  Python wspiera rekurencję, ale ma ograniczenie głębokości stosu (sys.getrecursionlimit()).  Przykład: def silnia(n): return 1 if n == 0 else n * silnia(n - 1) Funkcje czyste i niemutowalność  Funkcje czyste (bez efektów ubocznych) są zalecane w stylu funkcyjnym.  Niemutowalne kolekcje (tuple, frozenset) wspierają ten paradygmat. 6. Deskryptory, ich rodzaje i zastosowania w języku Python oraz pojęcie metaklas. Deskryptory – definicja i zastosowanie  Deskryptor to klasa implementująca metody __get__(), __set__() i __delete__() w celu kontrolowania dostępu do atrybutów.  Używane w Pythonie do obsługi właściwości (@property), metod (@staticmethod, @classmethod) i walidacji danych. Rodzaje deskryptorów  Przesłaniające (__set__() lub __delete__() zaimplementowane) – nadpisują wartości instancji.  Nieprzesłaniające (tylko __get__()) – działają jak właściwości tylko do odczytu.  Metody jako deskryptory – funkcje w klasach są deskryptorami, co pozwala np. na dynamiczne wywoływanie metod. Przykład deskryptora walidującego dane: class PozytywnaLiczba: def __set__(self, instance, value): if value < 0: raise ValueError("Liczba musi być dodatnia") instance.__dict__['liczba'] = value class Konto: saldo = PozytywnaLiczba() k = Konto() k.saldo = 100 # OK k.saldo = -10 # ValueError Metaklasy – pojęcie i zastosowanie  Metaklasa to klasa definiująca sposób tworzenia innych klas.  Domyślną metaklasą w Pythonie jest type, ale można tworzyć własne metaklasy do kontroli nad procesem tworzenia klas. Przykład własnej metaklasy: class Meta(type): def __new__(cls, name, bases, dct): print(f"Tworzenie klasy: {name}") return super().__new__(cls, name, bases, dct) class Klasa(metaclass=Meta): pass # Tworzenie klasy: Klasa Zastosowanie metaklas  Automatyczna rejestracja klas.  Wymuszanie określonych metod i atrybutów.  Dynamiczna modyfikacja klas podczas ich tworzenia. Systemy operacyjne 1. Struktury systemów operacyjnych. Struktura monolityczna: wszystkie komponenty zintegrowane w jednym bloku (jądrze), który działa w trybie uprzywilejowanym – ma bezpośredni dostęp do sprzętu wydajność prosta implementacja trudne modyfikacje awaria jednego komponentu może spowodować awarię całego systemu Przykład: wczesne systemy UNIX, MS-DOS Struktura warstwowa: system podzielony na warstwy, każda implementuje określoną funkcjonalność i korzysta z usług warstwy niżej. Warstwa najwyższa to interfejs użytkownika, warstwa 0 to sprzęt. modularność – łatwe modyfikacje testowanie i debugowanie – każda warstwa może być testowana niezależnie niższa wydajność trudność w zdefiniowaniu idealnego podziału na warstwy Przykład: system THE Maszyny wirtualne: umożliwiają uruchamianie wielu systemów operacyjnych na jednym fizycznym komputerze, każdy system gościa działa w izolowanym środowisku (maszyna wirtualna) izolacja – awaria jednego systemu nie wpływa na inne konsolidacja zasobów – możliwość uruchomienia wielu systemów na jednym komputerze elastyczność – łatwe wdrażanie i testowanie nowych systemów niższa wydajność niż przy natywnym uruchamianiu systemu Przykłady: VMware, VirtualBox Współczesne systemy mają hybrydowe struktury. 2. Zarządzanie procesami. 1. Definicja i cel  Proces: Uruchomiony program wraz z jego kontekstem (stan CPU, pamięć, otwarte pliki).  Cel: Umożliwienie współbieżnego działania wielu programów poprzez alokację i kontrolę zasobów systemowych (CPU, pamięć, I/O). 2. Podstawowe koncepcje  Wątek: Jednostka wykonywania w ramach procesu, współdzieląca przestrzeń adresową procesu.  PID: Unikalny identyfikator procesu.  Przestrzeń adresowa: Obszar pamięci wirtualnej przydzielony procesowi.  Kontekst procesu: Stan procesora i inne informacje potrzebne do wznowienia wykonywania procesu. 3. Stany procesu  Nowy: Proces jest tworzony.  Gotowy: Proces oczekuje na przydzielenie mu CPU.  Uruchomiony: Proces jest aktualnie wykonywany przez CPU.  Oczekujący: Proces oczekuje na jakieś zdarzenie (np. I/O).  Zakończony: Proces zakończył swoje działanie. 4. Operacje na procesach  Tworzenie: System operacyjny tworzy nowy proces (często jako kopię procesu macierzystego).  Kończenie: Proces kończy swoje działanie i zwalnia zajęte zasoby.  Komunikacja międzyprocesowa (IPC): Mechanizmy umożliwiające wymianę danych i synchronizację między procesami (potoki, sygnały, pamięć współdzielona, kolejki komunikatów, gniazda).  Synchronizacja: Mechanizmy zapobiegające konfliktom dostępu do współdzielonych zasobów (semafory, muteksy, monitory). 5. Planowanie procesów  Algorytmy planowania: Decydują, który proces w danym momencie będzie korzystał z CPU (FIFO, Round Robin, priorytetowe, SJF, SRTF, kolejki wielopoziomowe).  Przełączanie kontekstu: Zapisywanie stanu jednego procesu i ładowanie stanu innego procesu. 3. Synchronizacja procesów. Współbieżność procesów wymaga synchronizacji dla bezpiecznego dostępu do wspólnych zasobów. Bez niej, dane mogą ulec uszkodzeniu, a program działać niepoprawnie. Mechanizmy synchronizacji:  Semafory: "Flagi" kontrolujące dostęp. Proces "podnosi flagę" (zajmuje semafor), aby uzyskać dostęp.  Muteksy: "Klucze" do zasobu. Tylko jeden proces może posiadać "klucz" (zająć muteks) naraz.  Monitory: Zaawansowane narzędzie łączące muteksy i oczekiwanie na warunki. Problemy:  Zakleszczenie: Dwa lub więcej procesów czeka na siebie nawzajem, blokując się.  Wyścig: Wynik zależy od nieprzewidywalnej kolejności dostępu do zasobu. 4. Zarządzanie zasobami pamięci operacyjnej. System operacyjny zarządza pamięcią RAM, aby umożliwić współbieżne działanie wielu procesów. Kluczowe zadania:  Alokacja: Przydzielanie procesom odpowiedniej ilości pamięci.  Odzyskiwanie: Zwalnianie pamięci, gdy procesy kończą działanie.  Ochrona: Zapewnienie, że procesy nie mogą zakłócać pamięci innych procesów.  Współdzielenie: Umożliwienie procesom współdzielenia fragmentów pamięci (np. bibliotek). Techniki zarządzania:  Stronicowanie: Dzielenie pamięci na małe, równe strony.  Segmentacja: Dzielenie pamięci na segmenty o różnej wielkości.  Wymiana (swapping): Przenoszenie fragmentów pamięci na dysk, aby zwolnić miejsce dla innych procesów. Pamięć wirtualna:  Tworzy iluzję, że każdy proces ma dostęp do dużej ilości pamięci, niezależnej od RAM.  Umożliwia uruchamianie programów większych niż dostępna pamięć RAM. 5. Zarządzanie pamięcią masową. Pamięć masowa (dyski twarde, SSD) służy do trwałego przechowywania danych. System operacyjny zarządza tymi zasobami, aby umożliwić efektywny dostęp do danych przez programy. Kluczowe zadania:  Organizacja: Strukturyzacja danych na dysku (systemy plików).  Alokacja: Przydzielanie miejsca na dysku dla plików i katalogów.  Zarządzanie wolnym miejscem: Śledzenie, które bloki dysku są wolne, a które zajęte.  Ochrona: Zapewnienie bezpieczeństwa danych (uprawnienia dostępu).  Optymalizacja: Poprawa wydajności dostępu do danych (defragmentacja). Systemy plików:  Hierarchiczna struktura: Pliki i katalogi ułożone w drzewiastej strukturze.  Metadane: Informacje o plikach (nazwa, rozmiar, data modyfikacji).  Typy systemów plików: FAT32, NTFS, ext4, APFS i inne, różniące się funkcjonalnością i wydajnością. Operacje na plikach:  Tworzenie  Usuwanie  Odczyt  Zapis  Zmiana nazw Dodatkowe zagadnienia:  Partycjonowanie: Dzielenie dysku na logiczne partycje.  Formatowanie: Przygotowanie partycji do użytku przez system plików.  RAID: Technologie łączenia wielu dysków w celu zwiększenia wydajności lub bezpieczeństwa.  Archiwizacja: Tworzenie kopii zapasowych danych. 6. System plików. System plików to sposób, w jaki system operacyjny organizuje i zarządza danymi na nośnikach pamięci masowej. Podstawowe funkcje systemu plików:  Organizacja danych: System plików strukturyzuje dane w postaci plików i katalogów, tworząc hierarchiczną strukturę.  Zarządzanie przestrzenią dyskową: System plików śledzi, które bloki dysku są zajęte, a które wolne, i alokuje miejsce dla nowych plików.  Nazewnictwo i dostęp: System plików nadaje nazwy plikom i katalogom oraz kontroluje dostęp do nich (uprawnienia).  Integralność danych: System plików dba o integralność danych, chroniąc je przed uszkodzeniem. Elementy systemu plików:  Pliki: Zbiory danych o określonej nazwie i typie.  Katalogi: Kontenery, które mogą zawierać pliki i inne katalogi.  Metadane: Informacje o plikach (nazwa, rozmiar, data utworzenia, uprawnienia). Rodzaje systemów plików:  FAT32: starsze systemy, szeroka kompatybilność, limit wielkości pliku 4GB  NTFS: Windows  ext4: Linux  APFS: Apple 7. Bezpieczeństwo i ochrona w systemach operacyjnych. Zagrożenia:  Ataki na hasła (bruteforce): Próby odgadnięcia haseł za pomocą słownikowych ataków lub ataków siłowych.  Ataki typu "man-in-the-middle": Przechwytywanie komunikacji między użytkownikiem a serwerem.  Ataki typu "denial of service" (DoS): Przeciążenie systemu, aby uniemożliwić jego normalne działanie.  Ataki typu "SQL injec on": Wstrzykiwanie złośliwego kodu SQL do zapytań baz danych.  Ataki typu "cross-site scrip ng" (XSS): Wstrzykiwanie złośliwego kodu do stron internetowych. Sposoby zapobiegania:  Kontrola dostępu: Ograniczenie dostępu do zasobów tylko dla uprawnionych użytkowników.  Uwierzytelnianie: Weryfikacja tożsamości użytkowników (hasła, biometria).  Szyfrowanie: Ochrona danych przed nieautoryzowanym dostępem (szyfrowanie dysku, komunikacji).  Zapory sieciowe: Kontrola ruchu sieciowego (blokowanie niebezpiecznych połączeń).  Systemy wykrywania i zapobiegania włamaniom (IDS/IPS): Monitorowanie i blokowanie podejrzanej aktywności.  Regularne aktualizacje: Systemu i oprogramowania antywirusowego.  Silne hasła: Unikalne, trudne do odgadnięcia hasła, menedżery haseł.  Edukacja: Szkolenia dla użytkowników na temat phishingu i bezpieczeństwa.  Backupy: Regularne kopie zapasowe danych.  Monitorowanie: Ciągłe monitorowanie systemu i sieci.  Testy penetracyjne: Regularne testowanie systemu w celu identyfikacji luk.

Use Quizgecko on...
Browser
Browser