Zaawansowane technologie Javy Wykład 6 (30 marca 2017)

1 Zaawansowane technologie Javy Wykład 6 (30 marca 2017)B...
Author: Daniel Marek
0 downloads 4 Views

1 Zaawansowane technologie Javy Wykład 6 (30 marca 2017)Bezpieczeństwo w Javie

2 Mechanizmy bezpieczeństwa w JavieBezpieczeństwo stanowi integralną część technologii Java od samego jej powstania (aplety). Na platformie Java istnieją trzy zasadnicze mechanizmy zapewniające bezpieczeństwo: cechy samego języka programowania (na przykład sprawdzanie zakresu indeksów tablic, dopuszczanie tylko dozwolonych konwersji typów, brak arytmetyki wskaźników i wiele innych); mechanizm kontroli dostępu nadzorujący działania kodu (dostęp do plików, dostęp do sieci itp.); podpisywanie kodu umożliwiające wykorzystanie standardowych algorytmów kryptograficznych w celu uwierzytelnienia kodu w języku Java, dzięki czemu użytkownicy kodu mogą zawsze ustalić jego autora oraz upewnić się, że kod nie był modyfikowany od momentu jego podpisania.

3 Ładowanie klas Java przekształca kod źródłowy programu w kod wykonywalny maszyny wirtualnej JVM. Kod maszyny wirtualnej umieszczany jest w plikach klas posiadających rozszerzenie .class (każdy taki plik zawiera kod definicji i implementacji jednej klasy lub interfejsu). Pliki klas są ładowane do pamięci a następnie tłumaczone z kodu maszyny wirtualnej na kod maszyny macierzystej, na której wykonywany jest program (mechanizm JIT). Interpreter maszyny wirtualnej ładuje jedynie te pliki klas, które są niezbędne do wykonania programu.

4 Procedury ładowania klasProcedura początkowa/startowa ładuje klasy systemowe (typowo z pliku rt.jar) – stanowi ona integralną część maszyny wirtualnej zazwyczaj zaimplementowaną w języku C/C++. Procedura ładowania rozszerzeń jest używana dla standardowych rozszerzeń maszyny wirtualnej umieszczonej w katalogu jre/lib/ext – jeśli w katalogu tym umieścimy własny plik typu JAR, to procedura rozszerzona odnajdzie zawarte w nim klasy bez konieczności podawania ścieżki dostępu do klas. Systemowa procedura ładowania klas ładuje pliki klas aplikacji, poszukując ich w katalogach i plikach typu JAR i korzystając ze ścieżki dostępu do klas określonej za pomocą zmiennej środowiskowej CLASSPATH lub opcji –cp podanej w wierszu poleceń. Rozszerzona i systemowa procedura ładowania klas zaimplementowane zostały w języku Java – obie są instancjami klasy URLClassLoader.

5 Hierarchia klas ładującychKażda z procedur ładujących, z wyjątkiem procedury początkowej, posiada procedurę nadrzędną. Każda procedura musi najpierw umożliwić załadowanie pliku klasy swojej procedurze nadrzędnej i dopiero próbuje załadować go sama, gdy nie uda się to procedurze nadrzędnej.

6 Ładowanie wtyczek Niektóre programy posiadają modularną architekturę, w której pewne części kodu tworzą opcjonalne wtyczki. Jeśli wtyczki te są umieszczone w plikach JAR, to klasy wtyczek możemy załadować za pomocą instancji klasy URLClassLoader: URL url = new URL("file:///path/to/plugin.jar"); URLClassLoader pluginLoader = new URLClassLoader(new URL[] { url }); Class cl = pluginLoader.loadClass("mypackage.MyClass"); Ponieważ w konstruktorze URLClassLoader nie została wyspecyfikowana żadna procedura nadrzędna, to nadrzędną procedurą ładowania dla pluginLoader będzie systemowa procedura ładowania.

7 Weryfikacja kodu JVM Zanim kod nowej klasy zostanie przekazany przez procedurę ładującą maszynie wirtualnej, najpierw musi zostać sprawdzony przez weryfikator – sprawdza on, czy załadowany kod nie zawiera instrukcji, których wykonanie może przynieść niepożądane skutki. W ten sposób sprawdzany jest kod wszystkich ładowanych klas z wyjątkiem klas systemowych.

8 Weryfikacja kodu JVM Weryfikator sprawdza między innymi, czy:zmienne zostały zainicjowane przed ich użyciem, wywołania metod odpowiadają typom referencji obiektów, nie zostały naruszone zasady dostępu do składowych i metod o dostępie prywatnym, dostęp do zmiennych lokalnych odbywa się za pomocą stosu, nie nastąpiło przepełnienie stosu. Jeśli którakolwiek z wymienionych kontroli da wynik negatywny, to przyjmuje się, że kod klasy jest uszkodzony i nie jest on wykonywany.

9 Menedżery bezpieczeństwa i pozwoleniaPo załadowaniu na maszynę wirtualną kodu klasy sprawdzonego przez weryfikator, do akcji wkracza menadżer bezpieczeństwa. Menedżer bezpieczeństwa jest pomocniczą klasą, która sprawdza czy określone operacje są dozwolone w danej aplikacji. Do sprawdzanych operacji należą: utworzenie nowej procedury ładującej, zatrzymanie maszyny wirtualnej, dostępu do składowej innej klasy z użyciem mechanizmu refleksji, dostęp do pliku, otwarcie połączenie poprzez gniazdko sieciowe, uruchomienie zadania wydruku, dostęp do schowka systemowego, dostęp do kolejki zdarzeń AWT, otwarcie okna najwyższego poziomu.

10 Menedżery bezpieczeństwa i pozwoleniaDomyślnie podczas uruchamiania aplikacji platformy Java nie jest zainstalowany żaden menedżer bezpieczeństwa i wobec tego wszystkie wymienione wyżej operacje są dozwolone. Natomiast program appletviewer służący do uruchamiania apletów natychmiast instaluje własnego menedżera bezpieczeństwa, który jest bardzo restrykcyjny.

11 Bezpieczeństwo na platformie JavaŹródło kodu posiada dwie właściwości: lokalizację kodu (określoną za pomocą adresu URL kodu apletu lub adresu URL pliku JAR); certyfikat (jeśli jest dostępny, stanowi gwarancję, że kod nie został naruszony). Polityka bezpieczeństwa to uniwersalny mechanizm przydzielania praw na platformie Java umożliwia przyporządkowanie różnym źródłom kodu odmiennych zbiorów pozwoleń. Pozwolenie to dowolna właściwość, która kontrolowana jest przez menadżera bezpieczeństwa.

12 Bezpieczeństwo na platformie Java

13 Bezpieczeństwo na platformie JavaNa przykład następująca instancja klasy FilePermission pozwala na odczyt i zapis dowolnego pliku w katalogu /tmp: FilePermission p = new FilePermission("/tmp/*", "read,write"); Domyślna implementacja klasy Policy odczytuje pozwolenia z pliku pozwoleń. Powyższe pozwolenie możemy wyrazić w takim pliku w następujący sposób: permission java.io.FilePermission "/tmp/*", "read,write";

14 Bezpieczeństwo na platformie Java

15 Pliki polityki bezpieczeństwaMenedżer polityki czyta zawartość plików polityki, na którą składają się instrukcje określające przyporządkowanie pozwoleń do źródeł kodu. Pliki polityki umieszczamy w określonych miejscach struktury katalogów – domyślnie określone są dwa takie miejsca: plik java.policy w katalogu domowym platformy Java, plik .java.policy w katalogu domowym użytkownika (zwróćmy uwagę na kropkę rozpoczynającą nazwę pliku).

16 Pliki polityki bezpieczeństwaNie należy ciągle zmieniać zawartości standardowych plików polityki – zamiast tego należy podać wprost nazwy plików polityki dla każdej z aplikacji. W tym celu należy umieść pozwolenia w osobnym pliku polityki o nazwie, na przykład, MyApp.policy; Mamy następnie dwie możliwości zastosowania tego pliku: Można skonfigurować właściwość systemową wewnątrz metody main naszej aplikacji: System.setProperty("java.security.policy", "MyApp.policy"); jeśli określając plik polityki podamy dwa znaki równości (==) zamiast jednego, to dla naszej aplikacji zostanie wykorzystana wyłącznie zawartość podanego pliku polityki, a zawartość standardowych plików polityki zostanie zignorowana. Można też uruchomić maszynę wirtualną Java w następujący sposób: java –Djava.security.policy=MyApp.policy MyApp W przypadku apletów skorzystamy z polecenia: appletviewer –J-Djava.security.policy=MyApplet.policy MyApplet.html

17 CDN

18 Literatura (JavaBeans)C.S.Horstmann, G.Cornell: Java. Techniki zaawansowane. Wydanie 9. Rozdział 9: Bezpieczeństwo. Wydawnictwo HELION, Gliwice 2013. Security Features in Java SE: https://docs.oracle.com/javase/ tutorial/security/