Identyfikacja i autoryzacja. Poradnik administratora i inżyniera DevOps - Jerzy Wawro Gogolin

Kompleksowy przewodnik po rozwiązaniach uwierzytelniających Ten podręcznik jest przeznaczony przede wszystkim dla administratorów i deweloperów systemów informatycznych. Dotyka niezwykle istotnego zagadnienia, przed którym stoją inżynierowie DevOps: jak sprawić, by poprzez autoryzację chronić …

od 59,40 Najbliżej: 21 km

Liczba ofert: 1

Oferta sklepu

Opis

Kompleksowy przewodnik po rozwiązaniach uwierzytelniających Ten podręcznik jest przeznaczony przede wszystkim dla administratorów i deweloperów systemów informatycznych. Dotyka niezwykle istotnego zagadnienia, przed którym stoją inżynierowie DevOps: jak sprawić, by poprzez autoryzację chronić dostęp do danych i serwisów, gdy programy komunikują się ze sobą - często bez udziału człowieka? Autor wyjaśnia teoretyczne podstawy i prezentuje praktyczne rozwiązania z wykorzystaniem technologii kontenerów Docker. Ta technologia bowiem doskonale nadaje się do testowania i prezentowania licznych przykładów zawartych w podręczniku. Książka opisuje nowoczesne rozwiązania, kluczowe dla rozwoju systemów informatycznych w Polsce. Dla osób posługujących się językiem Python jest to pozycja niezbędna. Poznaj fundamentalne różnice między identyfikacją, autoryzacją a uwierzytelnianiem i sposoby ich implementacji Dowiedz się, jaką rolę odgrywają szyfry i algorytmy ważne w procesie uwierzytelnienia Opanuj wiedzę dotyczącą technologii i metod związanych z ochroną serwerów, a także funkcjonowania ich najważniejszych elementów, takich jak poczta (SMTP), VPN, LDAP, Kerberos, PAM Zapoznaj się z nowoczesnymi metodami uwierzytelniania, takimi jak weryfikacja dwuetapowa, standardy SAML i OAuth 2 Zobacz, jak te rozwiązania zostały zastosowane w usługach wprowadzanych przez polskie prawo, w tym e-Doręczenia, KWIE, KSeF Spis treści: Rozdział 1. Wprowadzenie 1.1. Uwagi redakcyjne 1.1.1. DevOps 1.1.2. Grupa docelowa 1.1.3. Programy i prawa autorskie 1.2. Wprowadzenie do tematu książki 1.2.1. O różnicy między identyfikacją a upoważnieniem 1.2.2. Uwierzytelnianie 1.2.3. Ochrona tożsamości 1.2.4. Tokeny 1.2.5. Jednokrotne logowanie a potrzeba standaryzacji Rozdział 2. DevOps i Docker - praktyczne wprowadzenie 2.1. Czym jest DevOps 2.2. Infrastruktura jako kod 2.2.1. Wirtualizacja 2.2.2. Konteneryzacja Rozdział 3. Docker 3.1. Podstawowe komendy 3.1.1. Budowanie obrazu kontenera 3.1.2. Lista obrazów w systemie 3.1.3. Uruchomienie nowego kontenera 3.1.4. Zatrzymanie kontenera 3.1.5. Lista kontenerów obecnych w systemie 3.1.6. Pobierz obraz z rejestru 3.1.7. Usunięcie obrazu 3.2. Tworzenie sieci Rozdział 4. Szyfry w procesie uwierzytelnienia 4.1. Szyfrowanie symetryczne 4.2. Szyfrowanie asymetryczne 4.3. Funkcje haszujące (funkcje skrótu) 4.4. Podsumowanie 4.5. Szyfry blokowe 4.5.1. Podsumowanie 4.6. Hasła i funkcje skrótu 4.6.1. Funkcje skrótu w Pythonie 4.7. Szyfry asymetryczne i certyfikaty 4.7.1. Transmisja z wykorzystaniem szyfrowania asymetrycznego 4.7.2. Certyfikaty 4.7.3. Inne zastosowania 4.8. Docker CA 4.8.1. Dockerfile 4.8.2. Skrypt entrypoint.sh 4.8.3. Przykład konfiguracji openssl (plik openssl.cnf) 4.8.4. Skrypt serwera TCP (server.py) 4.8.5. Generowanie i podpisywanie certyfikatów przez TCP/IP Rozdział 5. Algorytmy, z którymi warto się zapoznać 5.1. Protokół Diffiego-Hellmana (DH) 5.1.1. Wprowadzenie 5.1.2. Podstawy matematyczne 5.1.3. Zasada działania protokołu 5.1.4. Bezpieczeństwo 5.1.5. Implementacja 5.1.6. Ostrzeżenia i zalecenia 5.1.7. Literatura uzupełniająca 5.2. Algorytm RSA 5.2.1. Funkcja Eulera (?(n)) 5.2.2. Twierdzenie Eulera 5.2.3. Szyfr wykładniczy 5.2.4. Generowanie kluczy 5.2.5. Implementacja edukacyjna w Pythonie 5.2.6. Uwagi dotyczące implementacji 5.2.7. Podsumowanie 5.3. Protokół Needhama-Schroedera 5.3.1. Kluczowe założenia 5.3.2. Wersje protokołu 5.3.3. Przebieg protokołu (wersja symetryczna) 5.3.4. Bezpieczeństwo. Zalety protokołu 5.3.5. Znane zagrożenia 5.3.6. Przykład implementacji 5.3.7. Związek z Kerberosem 5.3.8. Literatura i zasoby 5.3.9. Podsumowanie Rozdział 6. TLS (TRANSPORT LAYER SECURITY) 6.1. Podstawy TLS 6.1.1. Ewolucja z SSL do TLS 6.1.2. Architektura w modelu OSI 6.1.3. Szczegółowy proces uzgadniania (Handshake) 6.2. Praktyczna konfiguracja serwerów 6.2.1. Nginx - szczegółowa konfiguracja 6.2.2. Apache - szczegółowa konfiguracja 6.3. Zarządzanie certyfikatami 6.3.1. Tworzenie łańcucha certyfikatów 6.3.2. Generowanie różnych typów certyfikatów 6.3.3. Konwersja formatów i paczka PFX 6.4. Szyfrowanie, deszyfrowanie i podpisywanie 6.4.1. Szyfrowanie i deszyfrowanie plików 6.4.2. Podpisywanie i weryfikacja wiadomości 6.4.3. Dodatkowe informacje 6.5. Konfiguracja dla różnych usług 6.5.1. Postfix (SMTP) 6.5.2. Dovecot (IMAP/POP3) 6.5.3. Git 6.6. Rozwiązywanie problemów 6.6.1. Typowe błędy i rozwiązania 6.6.2. Zaawansowana diagnostyka 6.7. Automatyzacja i zarządzanie 6.7.1. Certbot (Lets Encrypt) 6.7.2. Skrypty monitorujące 6.7.3. Zaawansowane techniki 6.7.4. Najlepsze praktyki bezpieczeństwa 6.7.5. Dodatkowe informacje i zasoby 6.8. Dwustronne SSL (mTLS) 6.8.1. Wprowadzenie 6.9. Przykładowa implementacja 6.9.1. Certyfikat serwera 6.9.2. Certyfikat klienta 6.9.3. Testowanie połączenia 6.9.4. Implementacja klienta 6.9.5. Najlepsze praktyki 6.9.6. Dodatkowe zasoby 6.10. Podstawy OpenSSL 6.10.1. Możliwości OpenSSL 6.10.2. Wersja i konfiguracja 6.10.3. Najczęściej używane opcje 6.10.4. Podawanie haseł 6.10.5. Silniki kryptograficzne 6.10.6. Wymagania systemowe 6.10.7. Generowanie haszy haseł 6.10.8. Generowanie losowych danych 6.10.9. Szyfrowanie i deszyfrowanie plików 6.10.10. Generowanie kluczy 6.10.11. Podpisywanie i weryfikacja wiadomości 6.10.12. Testowanie serwerów SSL/TLS 6.10.13. Diagnostyka certyfikatów 6.10.14. Generowanie certyfikatów 6.10.15. Konfiguracja własnego CA (Debian/Ubuntu) 6.10.16. Algorytm Diffiego-Hellmana (zaawansowane) 6.10.17. Podsumowanie 6.10.18. Dodatkowe zasoby 6.11. Przykłady zastosowania 6.11.1. Szyfrowanie plików 6.11.2. Bezpieczna wymiana plików z użyciem kryptografii i Dockera Rozdział 7. Elementy ochrony infrastruktury IT 7.1. Bezpieczeństwo systemu Linux 7.1.1. Najważniejsze zalecenia 7.1.2. Mechanizmy jądra Linuksa 7.2. Bezpieczeństwo infrastruktury 7.2.1. Zarządzanie dostępem i uwierzytelnianiem 7.2.2. Zarządzanie siecią i infrastrukturą 7.2.3. Ochrona danych 7.2.4. Zarządzanie serwerami 7.2.5. Polityki i procedury organizacyjne 7.3. Wazuh 7.4. Logowanie do systemów 7.4.1. Wymagania wobec haseł 7.4.2. Rozwój systemów logowania 7.5. Dodatkowe zasoby Rozdział 8. Pluggable Authentication Modules 8.1. Wprowadzenie do PAM 8.2. Konfiguracja PAM 8.2.1. Typ modułu - module-type 8.2.2. Reakcja na wynik zwrócony przez moduł - control-flag 8.2.3. module-path - pełna ścieżka do modułu 8.2.4. arguments - opcjonalne parametry 8.3. Moduły 8.3.1. Popularne moduły 8.3.2. Własne moduły Najlepsze praktyki Dodatkowe informacje Rozdział 9. LDAP 9.1. Standardy i zalety LDAP 9.2. Instalacja OpenLDAP Krok 1. Instalacja pakietów Krok 2. Schematy (schema) Krok 3. Konfiguracja klienta i serwera Krok 4. Ustawienia bazy Krok 5. Test i start Krok 6. Dodawanie obiektów 9.3. Uwierzytelnienie z LDAP 9.3.1. Konfiguracja NSS 9.3.2. Konfiguracja PAM 9.4. Buforowanie nazw 9.4.1. NSCD 9.4.2. SSSD 9.5. Logowanie z programów 9.6. Połączenia szyfrowane 9.7. Replikacja 9.8. Zmiana hasła 9.9. Backup i restore 9.10. Monitoring i logging 9.11. Integracja z Kerberos 9.12. Program do zmiany hasła (Samba) 9.13. Źródła Rozdział 10. SASL - wspólny język uwierzytelniania 10.1. Jak działa SASL 10.2. Mechanizmy SASL 10.3. Przykład w praktyce: SMTP 10.4. SASL na Linuksie 10.4.1. Fragment konfiguracji Postfiksa 10.4.2. Fragment konfiguracji saslauthd z LDAP 10.5. SASL w chmurze 10.6. Bezpieczeństwo 10.7. Monitoring i debugowanie 10.8. Alternatywy i przyszłość 10.9. Podsumowanie Rozdział 11. SSH - zdalny dostęp do konsoli 11.1. Podstawowe pliki konfiguracyjne 11.2. Klucze SSH 11.3. Protokół SSH 11.4. Zdalne logowanie z kluczem 11.4.1. Klucze z hasłem 11.4.2. Wyłączanie haseł 11.5. Zdalne wykonanie programu 11.6. SSH w programach 11.6.1. Obsługa kluczy hosta (weryfikacja serwera) 11.6.2. Przykład: uwierzytelnianie kluczem (zalecana praktyka) 11.6.3. Przykład z AutoAddPolicy (tylko do testów) 11.7. Bezpieczeństwo i nowoczesne narzędzia 11.7.1. Analiza 11.7.2. Konfiguracja serwera 11.8. Konfiguracja Windows 11.9. Więcej informacji Rozdział 12. VPN - wirtualna sieć prywatna 12.1. Poziomy bezpieczeństwa 12.2. Przykład 1. Bez autoryzacji i szyfrowania 12.3. Przykład 2. Ze wspólnym kluczem 12.4. Przykład 3. Z certyfikatami (PKI) 12.4.1. Instalacja i konfiguracja 12.4.2. Generowanie kluczy i certyfikatów 12.5. Konfiguracja firewalla 12.6. Uruchamianie i testowanie 12.7. Routing 12.8. Klienci graficzni 12.9. Bezpieczeństwo i dobre praktyki 12.10. Więcej informacji 12.11. Przykład: Docker VPN 12.11.1. Definicja obrazu Dockera 12.11.2. Pliki konfiguracyjne 12.11.3. Skrypt entrypoint.sh 12.11.4. Budowa i uruchamianie 12.11.5. Firewall i routing w hoście Dockera 12.11.6. Logi i debugowanie 12.11.7. Przykład: zdalny dostęp do bazy danych 12.11.8. Więcej informacji Rozdział 13. Poczta 13.1. Architektura Postfiksa 13.2. Postfix i SSL/TLS 13.3. SMTP i SASL 13.3.1. /etc/postfix/main.cf 13.3.2. /etc/postfix/master.cf 13.3.3. Dovecot (IMAP/POP3S) 13.4. Wirtualne skrzynki - PostfixAdmin 13.4.1. Instalacja bazy 13.4.2. Instalacja PostfixAdmina 13.4.3. MySQL i konta wirtualne 13.4.4. PAM z MariaDB 13.4.5. Skrypt zmiany hasła 13.5. Anty-spam i antywirus 13.6. PGP/GPG 13.6.1. Testowanie szyfrowania 13.6.2. WKD (Web Key Directory) 13.7. Bezpieczeństwo i dobre praktyki 13.8. Więcej informacji 13.9. Przykład: Docker - filtr poczty 13.9.1. Dockerfile i uruchamianie Rozdział 14. Integracja systemów Windows i Linux 14.1. Wprowadzenie 14.2. Scenariusz A. Samba jako kontroler domeny Active Directory 14.2.1. Wymagania wstępne 14.2.2. Inicjalizacja domeny (Provisioning) 14.2.3. Konfiguracja DNS 14.2.4. Zarządzanie domeną 14.2.5. Bezpieczeństwo w domenie AD 14.2.6. Redundancja kontrolerów domeny 14.3. Integracja serwerów Linux z domeną AD (klient SSSD) 14.4. Scenariusz B. Samba jako PDC w stylu NT4 (Legacy) 14.4.1. Konfiguracja serwera PDC 14.4.2. Konfiguracja klienta (Winbind) 14.4.3. Diagnostyka Winbind 14.5. Czego unikać (antywzorce bezpieczeństwa) 14.6. Skalowalność i ograniczenia 14.7. Samba dla ekspertów 14.7.1. Integracja PDC z backendem OpenLDAP 14.7.2. Synchronizacja między Active Directory a OpenLDAP 14.7.3. Problem replikacji haseł 14.7.4. Zmiana hasła w Active Directory z Linuksa 14.7.5. SASL i synchronizacja haseł LDAP z wykorzystaniem Samba4 AD i OpenLDAP 14.7.6. Rozwiązywanie problemów 14.7.7. Bezpieczeństwo 14.7.8. Literatura uzupełniająca 14.8. Kerberos i GSSAPI 14.8.1. Przepływ uwierzytelniania Kerberos 14.8.2. Konfiguracja MIT Kerberos 14.8.3. GSSAPI 14.8.4. Bezpieczeństwo 14.8.5. Rozwiązywanie problemów Rozdział 15. Organizacja pracy administratora sieci 15.1. Wykorzystanie skryptów 15.2. Ansible 15.3. Docker Ansible 15.3.1. Jak to wykonać w praktyce Rozdział 16. Magazyny sekretów 16.1. ssh-agent 16.1.1. gpg-agent 16.1.2. Bezpieczeństwo agentów 16.2. Plik z hasłami 16.2.1. KeePass 16.2.2. Alternatywne rozwiązania 16.2.3. Próba standaryzacji - SPIFFE 16.3. Sekrety w Docker Swarm 16.3.1. Wymagania 16.3.2. Inicjalizacja klastra Swarm 16.3.3. Tworzenie sekretów i zarządzanie nimi 16.3.4. Przykładowy skrypt Pythona 16.3.5. Dockerfile 16.3.6. Uruchomienie usługi Swarm 16.3.7. Najlepsze praktyki bezpieczeństwa 16.3.8. Częste problemy 16.3.9. Porównanie sekretów Swarm dla Linuksa i Windowsa 16.3.10. Źródła 16.4. Sekrety Kubernetesa Rozdział 17. Standardy identyfikacji i autoryzacji w aplikacjach internetowych 17.1. Krótkie wprowadzenie do komunikacji internetowej 17.1.1. HTTP 17.1.2. Struktury danych 17.1.3. Sposoby przesyłania danych z protokołem HTTP 17.1.4. Algorytm analizy zapytania HTTP 17.1.5. RPC 17.1.6. RESTful 17.1.7. GraphQL 17.1.8. Apache Thrift 17.1.9. Podsumowanie 17.2. Proste metody zabezpieczeń 17.2.1. Poufny URL 17.2.2. Nie wyświetlaj swoich katalogów 17.2.3. Zabroń indeksowania robotom 17.2.4. Uwierzytelnianie za pomocą hasła 17.2.5. Hasło w JavaScripcie (przykład edukacyjny) 17.2.6. Ciasteczka i sesje 17.2.7. Bezpieczny przykład z sesjami PHP 17.2.8. Nowoczesne metody uwierzytelniania 17.2.9. Podsumowanie 17.3. CORS (Cross-Origin Resource Sharing) 17.3.1. Wprowadzenie 17.3.2. Same-Origin Policy (SOP) 17.3.3. Mechanizm działania CORS 17.3.4. Implementacja CORS 17.3.5. Ważne uwagi dotyczące bezpieczeństwa 17.3.6. Rozwiązywanie problemów z CORS 17.3.7. Podsumowanie Rozdział 18. Standardy uwierzytelniania 18.1. Rys historyczny 18.1.1. OpenID 2.0 18.1.2. OAuth 1.0 18.2. OAuth 2.0 18.2.1. Role w OAuth 2.0 18.2.2. Główne scenariusze (granty) pozyskania tokena 18.3. OAuth 2.0 - szczegóły scenariuszy (grantów) 18.3.1. Authorization Code Grant 18.3.2. Implicit Grant (przestarzały) 18.3.3. Resource Owner Password Credentials Grant (niezalecany) 18.3.4. Client Credentials Grant 18.3.5. Refresh Token Grant 18.3.6. Authorization Code Grant z rozszerzeniem PKCE 18.3.7. Podsumowanie wyboru grantu 18.3.8. Informacje uzupełniające 18.4. Identyfikacja i autoryzacja z OpenID Connect 18.4.1. Idea OpenID Connect 18.4.2. Przepływy (Flows) 18.4.3. Scenariusze (główne przepływy) 18.4.4. Dodatkowe parametry żądania autoryzacji 18.4.5. Źródła i implementacje 18.5. SAML 18.6. CAS (Central Authentication Service) 18.6.1. Wprowadzenie 18.6.2. Podstawowe pojęcia 18.6.3. Architektura i przepływ uwierzytelniania 18.6.4. Obsługiwane protokoły i rozszerzenia 18.6.5. System wtyczek i modułów 18.6.6. Konfiguracja i wdrażanie 18.6.7. Zalety CAS 18.6.8. Wdrożenia 18.6.9. Dokumentacja i zasoby 18.6.10. Porównanie z innymi rozwiązaniami Rozdział 19. Weryfikacja dwuetapowa 19.1. Algorytm TOTP 19.2. Klucze sprzętowe 19.2.1. Autentykator 19.2.2. Mechanizm komunikacji CTAP2 19.2.3. Szczegóły techniczne - konfiguracja i uzgadnianie kluczy 19.2.4. Wykorzystanie MFA z WebAuthn w praktyce 19.2.5. Dodatkowe informacje Rozdział 20. Rozwój systemów uwierzytelniania 20.1. Środowisko dewelopera 20.1.1. Wykorzystanie OpenAPI 20.1.2. Narzędzia ekosystemu OpenAPI 20.1.3. Zaawansowane funkcje OpenAPI 3.x 20.1.4. Najlepsze praktyki dla OpenAPI 20.1.5. Integracja z systemami uwierzytelniania 20.1.6. Monitoring i zarządzanie API 20.1.7. Podsumowanie 20.2. Zastosowanie Postmana 20.3. Przykłady użycia Postmana 20.4. Polecane strony z przykładami i materiałami 20.4.1. Keycloak 20.4.2. Keycloak jako obraz Dockera lub pod w Kubernetesie 20.4.3. Rekomendowane dobre praktyki produkcyjne 20.5. Mozilla SOPS 20.5.1. Wprowadzenie 20.5.2. Instalacja SOPS 20.5.3. Konfiguracja GPG 20.5.4. Podstawowe użycie SOPS 20.5.5. Zaawansowana konfiguracja z plikiem .sops.yaml 20.5.6. Użycie z Age (nowoczesna alternatywa dla GPG) 20.5.7. Docker z SOPS 20.5.8. Integracja z CI/CD 20.5.9. Najlepsze praktyki i bezpieczeństwo 20.5.10. Rozwiązywanie problemów 20.5.11. Alternatywne mechanizmy szyfrowania 20.5.12. Podsumowanie 20.6. Wstęp do tworzenia aplikacji z wykorzystaniem chmurowych dostawców tożsamości 20.6.1. Wprowadzenie 20.6.2. Microsoft Azure 20.6.3. Chmura Googlea 20.6.4. Facebook Graph API 20.6.5. Bezpieczeństwo 20.6.6. Rozwiązywanie problemów 20.6.7. Podsumowanie 20.7. Projekt OAuth2-SDK Rozdział 21. Prawo i technologia 21.1. Certyfikaty i podpisy elektroniczne 21.1.1. Definicje podpisu 21.1.2. Podpisy zaufane 21.2. SAML w systemach eID 21.2.1. Wprowadzenie 21.2.2. Architektura i przepływ uwierzytelniania 21.2.3. Wymagania implementacyjne i najlepsze praktyki 21.2.4. Federacje i metadane 21.2.5. Zarządzanie kluczami i zgodność 21.2.6. Przydatne biblioteki i narzędzia 21.2.7. Podsumowanie 21.3. Elektroniczny dowód osobisty i Węzeł Krajowy 21.3.1. Wprowadzenie 21.3.2. Struktura certyfikatów w e-dowodzie 21.3.3. Bezpieczeństwo i separacja certyfikatów 21.3.4. Infrastruktura klucza publicznego (PKI) 21.3.5. Węzeł Krajowy (login.gov.pl) 21.4. Podpisywanie dokumentów elektronicznych 21.4.1. Wprowadzenie 21.4.2. Algorytmy kryptograficzne 21.4.3. Standard XAdES - zaawansowane podpisy XML 21.4.4. Praktyczne implementacje w Pythonie 21.4.5. Nowoczesne formaty podpisów 21.4.6. Podpisy w chmurze - rewolucja w uwierzytelnianiu 21.4.7. Integracja z systemami enterprise 21.4.8. Bezpieczeństwo i zgodność prawna 21.4.9. Weryfikacja podpisów elektronicznych 21.4.10. Przyszłość podpisów elektronicznych 21.4.11. Podsumowanie 21.5. e-Doręczenia 21.5.1. Wprowadzenie 21.5.2. Adresacja bazowa 21.5.3. Procedura uzyskania dostępu 21.5.4. Wybrane funkcje API 21.5.5. Typowe błędy API 21.5.6. Bezpieczeństwo i autoryzacja 21.5.7. Przykładowa implementacja 21.5.8. Krok 1. Wygenerowanie i podpisanie tokena tożsamości klienta (JWT) 21.5.9. Krok 2. Wymiana JWT na token dostępu (Access Token) 21.5.10. Dokumentacja dodatkowa 21.6. Krajowy System e-Faktur (KSeF API 2.0) 21.6.1. Certyfikat kwalifikowany 21.6.2. Algorytm uwierzytelniania certyfikatem w KSeF 2.0 21.6.3. Aplikacja testowa w C 21.6.4. Wysyłanie faktur 21.6.5. Dodatkowe informacje Źródła O autorze: Jerzy Wawro jest inżynierem z bogatym doświadczeniem we wdrażaniu i w utrzymaniu dużych systemów informatycznych. Zajmuje się optymalizacją i cyfryzacją procesów w przedsiębiorstwach i na uczelniach, rozwojem e-learningu i nauczania zdalnego, a także sztuczną inteligencją. Brał udział w wielu projektach realizowanych w nowoczesnych technologiach, w tym w projekcie kryptograficznej waluty niefiducjarnej e-Talar. Jest autorem licznych publikacji i projektów otwartych między innymi popularnego podręcznika Uczymy się programować w Pythonie. Założyciel i prezes fundacji Galicea, która promuje zastosowania technologii dla rozwoju społecznego ( galicea.pl ).

Specyfikacja

Podstawowe informacje

Autor
  • Jerzy Wawro
Wydawnictwo
  • Helion
Okładka
  • Miękka
Rok wydania
  • 2026
Ilość stron
  • 344
Tematyka
  • Programowanie
ISBN
  • 9788328935389