1 Witold Posiewała Dr inż. Politechnika Rzeszowska Wykład 8 LDAP w C OpenSSL
2 LDAP z poziomu języka C Biblioteki/procedury dostępne z OpenLDAP (w PLD wymagana instalacja openldap-devel): ldap lber (przy prostych zastosowaniach można ją pominąć – zawiera Basic Encoding Rules)
3 LDAP z poziomu języka C Inicjacja struktury LDAP i połączenie z serwerem Funkcja ldap_init W pliku ldap.h można odnaleźć strukturę LDAP – funkcja zwraca wskaźnik do niej. Host może być listą: #include LDAP ldap_init(char *host, int port); #include LDAP ldap_init(„master_addr slave_addr master_addr:10234”, int port);
4 LDAP z poziomu języka C Bindowanie Proste bindowanie - funkcja ldap_simple_bind_s ld jest wskaźnikiem zwróconym przez ldap_init Parametr who określa dn użytkownika bindującego się (w standardowym formacie rozdzielonym przecinkami np: uid=stud,dc=podyp,dc=pl Funkcja zwraca nr błędu (ldap_perror) – jeśli OK zwróci LDAP_SUCCESS Istnieje bliźniacza funkcja ldap_simple_bind pozwalająca na realizację asynchronicznego procesu – zwraca id komunikatu (obsługa w ldap_result) #include int ldap_simple_bind_s(LDAP *ld, const char *who, const char *passwd);
5 LDAP z poziomu języka C Bindowanie Bindowanie podstawowe - funkcja ldap_bind_s Pozwala za pomocą zmiennej method określić metodę autoryzacji – zwykła metoda method=LDAP_AUTH_SIMPLE – dostępne także: LDAP_AUTH_SASL, LDAP_AUTH_KRBV4, LDAP_AUTH_KRBV41, LDAP_AUTH_KRBV42. #include int ldap_bind_s(LDAP *ld, const char *who, const char *cred, int method);
6 LDAP z poziomu języka C Odbindowanie/rozłączenie funkcja ldap_unbind, ldap_unbind_s Rozłącza i unieważnia strukturę ld #include int ldap_unbind_s(LDAP *ld);
7 Obsługa błędów Funkcje obsługi błędów ldap_perror działa podobnie jak perror przekształcając numer błędu w komunikat uzupełniony dodatkowym napisem ldap_err2string podobnie ale zwraca wskaźnik do napisu Umieszcza w strukturze LDAP kod błędu (może być więc używany dalej w działaniu programu) #include char *ldap_err2string( int err ); void ldap_perror( LDAP *ld, const char *s ) int ldap_result2error( LDAP *ld, LDAPMessage *res, int freeit )
8 Przykład i nt main( int argc, char *argv[] ) { LDAP *ld; int res; int authmethod = LDAP_AUTH_SIMPLE; char *ldap_host = "192.168.5.105"; char *user_dn = "uid=stud,dc=podyp,dc=pl"; char *user_pw = "viga"; int version = LDAP_VERSION3; if ((ld = ldap_init(ldap_host, LDAP_PORT)) == NULL ) { perror( "Failure of ldap_init" ); exit( EXIT_FAILURE ); } if (ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, &version) != LDAP_SUCCESS) { printf("ldap_set_option error\n"); return 1; } if (ldap_simple_bind_s(ld, user_dn, user_pw) != LDAP_SUCCESS ) { ldap_perror( ld, "Failure of ldap_bind" ); exit( EXIT_FAILURE ); }else{printf("OK\n");} res = ldap_unbind_s(ld); if (res != 0) { fprintf(stderr, "ldap_unbind_s failed: %s\n", ldap_err2string(res)); exit( EXIT_FAILURE ); } return EXIT_SUCCESS; } /* main */
9 LDAP - Perl A to już w laboratorium :)
10 OpenSSL - Wstęp Model zagrożeń opracowany przez Microsoft :) - STRIDE (określa luki bezpieczeństwa): ● S (Spoofing Identity) – podszywanie się pod inną osobę przy pomocy nieautoryzowanego dostępu do jej danych identyfikacyjnych, ● T (Tampering with Data) – złośliwa modyfikacja danych, ● R (Repudiation) – możliwość wyparcia się przeprowadzenia określonej akcji przez jej autora, ● I (Information Disclosure) – dotarcie do informacji przez osobę niemającą odpowiednich uprawnień, ● D (Denial of Service) – uniemożliwienie skorzystania z usługi bądź systemu przez uprawnionego użytkownika, ● E (Elevation of Privilege) – nieautoryzowane zwiększenie przywilejów użytkownika.
11 Wstęp Przy pomocy OpenSSL możemy zwiększyć poziom bezpieczeństwa w trzech podstawowych obszarach: ● szyfrowanie danych. Utrudnia to przede wszystkim nieautoryzowany dostęp do danych (I) oraz wynikającą z tego ich złośliwą modyfikację (T), ● szyfrowanie kanału komunikacyjnego – I, T, ● infrastruktura klucza publicznego – S, I, T, R.
12 Wstęp OpenSSL oparte jest na liberalnej licencji BSD. OpenSSL dostępny jest na wiele systemów operacyjnych, w tym systemy: Unix, Linux, Windows, MacOS. Biblioteki OpenSSL dostępne są w C, Javie, Perlu, Pythonie, PHP...
13 Historia OpenSSL wywodzi się z projektu SSLeay Twórcami obu pakietów są: Eric A. Young oraz Tim J. Hudson. ● Pierwsza stabilna wersja SSLeay pojawiła się w 1995r – wersje 0.6.x. ● Zawieraławsparcie jedynie protokołu SSL (Secure Sockets Layer) w wersji 2. ● w wersji 0.8.x dodano wsparcie protokołu SSL w wersji 3, ● w wersji 0.9.0 (1998r.) - wsparcie protokołu TLS (Transport Layer Security) w wersji 1. ● W grudniu 1998r roku zaprzestano rozwoju biblioteki SSLeay. Pojawiła się bezpośrednio na niej bazująca - pierwsza wersja biblioteki OpenSSL, oznaczona numerem 0.9.1c. ● Obecnie dostępna jest wersja 1.0.0a (listopad 2010) – w PLD th występuje właśnie ta wersja – ze względu na wagę pakietu każda dystrybucja powinna dążyć do jak najszybszych aktualizacji
14 Źródła informacji Oficjalna strona internetowa – http://www.openssl.org Listy mailingowe – openssl-dev – openssl-users Pozycje książkowe – J. Viega, M. Messier, P. Chandra, Network Security with OpenSSL, O’Reilly, 2002 – J. Viega, M. Messier, C i C++. Bezpieczne programowanie. Receptury, O’Reilly, 2005 Kod źródłowy biblioteki Ogromna liczba poradników dostępna jest w internecie
15 Wersja pod Windows dostępna jest także wersja dla Windows:
16 Wykorzystywanie Open SSL Bibliotekę OpenSSL można wykorzystać na kilka sposobów za pomocą komponentów: biblioteka libssl – obsługująca protokół SSL/TLS, biblioteka libcrypto – zawierająca obsługę algorytmów kryptograficznych oraz PKI, narzędzie linii komend openssl – pozwalające na wykorzystanie z linii komend głównie funkcjonalności oferowanej przez bibliotekę libcrypto. OpenSSL można wykorzystać do zadań: administracyjnych (zarówno przygotowując skrypty powłoki, jak i w interaktywnej pracy z konsolą) odwoływać się do API pisząc własne programy.
17 Składniki OpenSSL libssl: Obsługuje funkcjonalność związaną z protokołem SSL/TLS SSL (Secure Socket Layer) SSL 1.0: 1994, Netscape, niepublikowana SSL 2.0: 1995, Netscape, luki bezpieczeństwa SSL 3.0: 1996, P. Kocher, kompatybilność z SSL 2.0 TLS (Transport Layer Security) - bezpośredni sukcesor SSL 3.0, kompatybilny wstecz TLS 1.0: 1999, standard IETF (RFC 2246) TLS 1.1: jeszcze nie zatwierdzony TLS 1.2: pierwsza wersja draft – marzec 2006r.
18 SSL – jak działa Połączenie SSL dzielimy na dwie fazy Uzgadniania Transferu danych
19 SSL – jak działa - uzgadnianie uzgadnianie przeglądarka wysyła żądanie w którym zawarta jest wersja protokołu uzupełniona o liczbę losową r1 Serwer odpowiada certyfikatem serwera (wraz z jego kluczem publicznym) i liczbą losową r2 Przeglądarka sprawdza poprawność certyfikatu następnie generuje łańcuch r3, który zostaje zaszyfrowany kluczem uzyskanym od serwera O tej chwili serwer i przeglądarka dysponują zestawem trzech liczb r1, r2, r3 tylko im znanym Na podstawie tych cyfr obliczają klucze szyfrowania symetrycznego To nie wszystko, po wyliczeniu kluczy szyfrowania symetrycznego zarówno serwer jak i przeglądarka wyliczają klucze MAC na podstawie wszystkich komunikatów, uzgodnień przeprowadzanych do tej pory. Przeglądarka i serwer wymieniają się kluczami MAC i na tej podstawie stwierdzają identyczność informacji po obu stronach.
20 SSL – jak działa - transfer danych Transfer danych: Podczas fazy transferu komunikaty dzielone są na fragmenty Dla każdego fragmentu wyliczany jest MAC i szyfrowany z fragmentem do przesłania Odbiorca rozszyfrowuje za pomocą klucza symetrycznego komunikat i wylicza MAC Jeżeli MAC przesłany przez nadawcę nie jest taki sam jak obliczony wykrywana jest utrata integralności danych
21 SSL obecnie SSL w wersji 3 jest kompatybilne wstecz z wersją poprzednią. Obecnie protokół SSL rozwijany jest jako TLS (Transport Layer Security) przez ciało standaryzujące Internet Engineering Task Force (IETF). Jest on kompatybilny wstecz z SSL w wersji 3 (a zatem również pośrednio z SSL 2.0). Protokół TLS 1.0 opisany jest przez dokument RFC 2246. Kolejne wersje (1.1 oraz 1.2) znajdują się w trakcie procesu standaryzacyjnego.
22 Szyfrowanie danych - libcrypto Biblioteka kryptograficzna szyfrowanie symetryczne algorytmy Blowfish, DES, IDEA, RC4, RC5 szyfrowanie asymetryczne, negocjacja kluczy algorytmy Diffiego-Helmana, DSA, RSA. Szyfrowanie asymetryczne jest o wiele wolniejsze od symetrycznego (charakteryzuje się o wiele większymi długościami klucza), ale unika problemu bezpiecznej wymiany kluczy transmisyjnych. PKI – infrastruktura klucza publicznego standard X509, X509v3 podpisy cyfrowe i funkcje skrótu HMAC, MD4, MD5, RIPEMD-160, MDC2, SHA-1, SHA-256 PRNG -generator liczb pseudolosowych
23 Składnia polecenia openssl Wykorzystuje libcrypto i libssl (cenne bowiem może być traktowane jako podstawowe źródło informacji o bibliotekach) Składnia: openssl Tryby pracy interaktywny $ openssl openSSL> version wsadowy openssl version
24 Składnia polecenia openssl Postać ogólna: openssl command [ options ] [ arguments ] Listowanie dostępnych komend (standardowych, wykorzystywanych do obliczania funkcji skrótu,używanych do szyfrowania danych): openssl [ list-standard-commands | list- message-digest-commands | list-cipher- commands ]
25 Składnia polecenia openssl Sprawdzanie dostępności komendy: openssl no-command [ options ] $ openssl no-sha1 sha1 $ openssl no-sha256 no-sha256 $
26 OpenSSL - przykłady Obliczanie funkcji skrótu, podpisy cyfrowe $ openssl dgst –sha256 file.txt $ openssl dgst –sha512 –out dgst.txt –hex -c file.txt $ openssl dgst –dss1 –sign key.pem –out signed.bin file.txt Szyfrowanie symetryczne $ openssl enc –des3 –in file.txt –out cipher.bin $ openssl enc -d –des3 –in cipher.bin –out file.txt
27 OpenSSL - przykłady Szyfrowanie asymetryczne Generowanie klucza prywatnego $ openssl genrsa –out key.pem –des3 1024 Generowanie klucza publicznego na podstawie klucza prywatnego $ openssl rsa -in key.pem -out public.pem -outform PEM -pubout Szyfrowanie kluczem publicznym $ openssl rsautl –encrypt -inkey public.pem -pubin -in file.txt -out cipher.bin Deszyfrowanie kluczem prywatnym $ openssl rsautl -decrypt -inkey key.pem -in cipher.bin -out file.txt Uwaga! Maksymalna długość pliku szyfrowanego = długość klucza – 11 bajtów
28 OpenSSL – dostarczanie haseł Wiele komend OpenSSL wymaga podania hasła zabezpieczającego. Jest ono istotne zwłaszcza w przypadku generacji klucza prywatnego Najbezpieczniej ale niewygodnie: Enter pass phrase for... Jeśli istnieje konieczność zautomatyzowania zadań. Istnieją różne metody dostarczania haseł za pomocą passin oraz passout. Każda z nich stanowi mniej lub bardziej bezpieczny kompromis między wygodą a poziomem zabezpieczeń.
29 OpenSSL – dostarczanie haseł stdin – umożliwia pobranie hasła z pliku przy pomocy operatora przekierowania „
30 OpenSSL – dostarczanie haseł Przykłady: Używanie passin $ echo tajnehaslo>openssl rsautl -encrypt -inkey./key.pem - passin stdin -in dokument.tex -out dokument.ssl $ openssl rsa –in key.pem –passin env:SSL_PASS –pubout $ openssl rsa –in key.pem –passin file:pass.txt –pubout $ openssl enc –des3 –in cipher.bin –out file.txt –pass fd:4 Używanie passout (nowe hasło w nowym materiale) $ openssl genrsa -out key.pem -passout stdin -des3 1024
31 Problem - atak man in the middle Przebieg: Łączymy się z bankiem Po drodze jednak pakiety zostają przechwycone (np. przez nieuczciwego administratora bramy) Skutkiem tego zamiast od nas do banku trafia żądanie od intruza Bank w drugiej fazie SSL handshake przesyła intruzowi certyfikat (w tym klucz publiczny) Intruz sam preparuje odpowiedź dla klienta. Przedstawia sfałszowany certyfikat serwera, w którym zamienia klucz publiczny serwera na wygenerowany przez siebie i podpisuje certyfikat komplementarnym kluczem prywatnym. Klient otrzymuje certyfikat nie wiedząc o tym fakcie. Sprawdzamy podpis – ponieważ został wygenerowany przy pomocy klucza prywatnego napastnika, weryfikacja przy pomocy nadesłanego klucza publicznego napastnika udaje się. W trzeciej fazie SSL handshake uzgadniamy klucze symetryczne z napastnikiem (myśląc, że po drugiej stronie znajduje się bank). Podobnie atakujący uzgadnia klucze symetryczne z bankiem przekonanym, że wymiana kluczy następuje z nami. Ostatecznie napastnik w pełni kontroluje ruch pomiędzy nami a bankiem
32 Rozwiązanie - PKI Zaufana strona trzecia: CA (Certification Authority) Zaufana strona trzecia – urząd certyfikacyjny (certification authority, CA) potrafi powiązać konkretny klucz publiczny z unikalną nazwą podmiotu, określaną mianem nazwy wyróżniającej (distinguished name, DN). Czyni to przy pomocy certyfikatu podpisanego przy pomocy swojego klucza prywatnego. Klucz publiczny wystawcy certyfikatu jest oczywiście jawny i każdy, kto chce przy jego pomocy sprawdzić tożsamość podmiotu, na który wystawiono certyfikat, powinien klucz ten przedtem pobrać lub co najmniej zweryfikować przy pomocy zaufanego medium (napastnik może próbować podstawić swoją parę kluczy publiczny – prywatny jako klucze strony trzeciej). Jeśli bank podpisał certyfikat za pomocą CA (klucz publiczny CA posiadamy już wcześniej) będziemy w stanie stwierdzić, że certyfikat został podrobiony bo nie będzie się zgadzał z certyfikatem otrzymanym od CA.
33 Budowa własnego CA Rodzaje centrów certyfikacyjnych publiczne (np. VeriSign, Thawtee, Certum...) prywatne (np. w ramach jednostki organizacyjnej) Budujemy CA przygotowanie środowiska konfiguracja polityki CA generacja certyfikatu głównego Korzystamy z CA wydawanie certyfikatów unieważnianie certyfikatów
34 przygotowanie środowiska Ustalenie ścieżki nadrzędnej (domyślnie w PLD to /etc/openssl, my jednak utworzymy własny katalog) – np. /root/ca Zawartość ścieżki nadrzędnej mkdir /root/ca cd /root/ca mkdir certs mkdir private chmod 700 private echo 01 > serial touch index.txt Plik konfiguracyjny (najlepiej przekopiować przykładowy z /etc/openssl/openssl.cfg) – np. /root/ca/openssl_ca.cfg
35 przygotowanie środowiska - openssl.conf Sekcja [ca] Za pomocą komendy openssl ca Możemy wybierać centrum certyfikacji (określając parametry aktywnego centrum) Jeśli nie zostanie wykonane to polecenie wybrane zostanie centrum domyślne zdefiniowane w sekcji [ca] przez zmienną default_ca W pliku konfiguracyjnym należy więc co najmniej ustawić default_ca Wartość default_ca kieruje konfiguracje centrum do sekcji o tej samej nazwie: [ moje_ca ] [ ca ] default_ca = moje_ca
36 przygotowanie środowiska - openssl.conf Sekcja [moje_ca] [ moje_ca ] dir = /root/ca certs = $dir/certs crl_dir = $dir/crl # Where the issued crl are kept database = $dir/index.txt # database index file. #unique_subject = no # Set to 'no' to allow creation of # several certificates with same subject. new_certs_dir = $dir/newcerts # default place for new certs. certificate = $dir/cacert.pem # The CA certificate serial = $dir/serial # The current serial number crlnumber = $dir/crlnumber # the current crl number # must be commented out to leave a V1 CRL crl = $dir/crl.pem # The current CRL private_key = $dir/private/cakey.pem# The private key RANDFILE = $dir/private/.rand
37 przygotowanie środowiska - openssl.conf Sekcje polityki CA i rozszerzeń: match – oznacza, że wartość pola w żądaniu certyfikatu musi być identyczna jak w nazwie wyróżniającej głównego certyfikatu CA. supplied – pole musi występować w żądaniu certyfikatu, ale jego wartość nie jest w żaden szczególny sposób ograniczona, optional – pole może, ale nie musi, występować w żądaniu certyfikatu. basicConstraints - do jakich celów będą mogły być wykorzystane certyfikaty (CA:false – nie mogą być używane jako CA) policy = moje_ca_policy X509_extensions = moje_ca_extensions [ moje_ca_policy ] countryName = supplied stateOrProvinceName = supplied localityName = supplied organizationName = match organizationalUnitName = optional emailAddress = optional [moje_ca_extensions] basicConstraints = CA:false
38 przygotowanie środowiska - openssl.conf Wystawienie certyfikatu głównego openssl req [ req ] distinguished_name = moje_ca_dn x509_extensions = moje_ca_root_extensions default_bits = 2048 default_keyfile = /root/ca/private/ca_key.pem prompt = no
39 przygotowanie środowiska - openssl.conf Sekcja [moje_ca_dn] Gdy nie ustawimy prompt=no field_name = field_name_default = field_name_min = field_name_max = Przykład: Przy prompt=no ustawiamy field_name = CountryName = Wprowadź kod nazwy kraju countryName_default = PL countryName_min = 2 countryName_max = 2
40 przygotowanie środowiska - openssl.conf Sekcja [moje_ca_dn] - przykład distinguished_name = moje_ca_dn x509_extensions = moje_ca_root_extensions [ moje_ca_dn ] countryName = PL stateOrProvinceName = Podkarpacie localityName = Rzeszow organizationName = Politechnika Rzeszowska organizationUnitName = Wydział Certyfikatów commonName = Moje CA emailAddress = [email protected] [ moje_ca_root_extensions ] basicConstraints = CA:true
41 Generowanie CA Generowanie certyfikatu głównego Przełącznik -x509 powoduje, że zamiast żądania certyfikatu zostanie wygenerowany certyfikat główny Podgląd certyfikatu głównego polecenie x509 służy do podpisywania certyfikatów ale także może służyć do wyświetlenia certyfikatu noout wyłącza wyświetlanie części zaszyfrowanej $ export OPENSSL_CONF=/root/ca/openssl.cnf $ openssl req -x509 -newkey rsa:2048 -days 365 -out cacert.pem -outform PEM $ openssl x509 –in cacert.pem –text -noout
42 Generowanie CA
43 Generowanie żądania certyfikatu Żądanie powinno być generowane na komputerze klienta (dzięki temu klucz prywatny będzie naprawdę prywatny) Jeśli mamy wcześniej wygenerowany klucz prywatny Żądanie możemy wyświetlić za pomocą: $ openssl req –newkey rsa:1024 –keyout mykey.pem –keyform PEM –out myreq.pem –outform PEM $ openssl req -new -key key.pem -out myreq.pem $ openssl req -noout -text -in./myreq.pem
44 Podpisywanie żądania certyfikatu Podpisywanie certyfikatu w centrum (po przekazaniu pliku myreg.pem) $ openssl ca -in myreq.pem –notext –out client_cert.pem
45 Wynik w CA i Propozycja Po podpisaniu certyfikatu: Jak ułatwić życie klientom Utworzyć dla klienta plik openssl.cfg i przekazać mu go wraz z instrukcją - wykonaj: $ openssl req –newkey rsa:1024 –keyout mykey.pem –keyform PEM –out myreq.pem –outform PEM –config openssl.cfg
46 Narzędzia klikane OpenCA (www.openca.org) systemy POSIXowe oparty na OpenSSL, OpenLDAP, Apache Project, Apache mod_ssl OpenXPKI (www.openca.info)www.openca.info GOSSL tylko Windows wymaga Visual Works VM
47 Narzędzia klikane