Aplikacje www laboratorium Konfigurowanie zabezpieczeń w oparciu o JAAS w serwerze GlassFish Zabezpieczanie aplikacji webowych z wykorzystaniem JASS jest w podstawowych zastosowaniach procesem dwuetapowym. Krok 1 polega na skonfigurowaniu odpowiednich domen tożsamości (realms) na serwerze GF oraz utworzeniu bazy użytkowników. Etap 2 polega na wprowadzeniu zmian w deskryptorze aplikacji (web.xml). 1. Do autoryzacji wykorzystane zostanie podejście bazujące na plikach. W pierwszym kroku należy utworzyć nową dziedzinę (strefę, realm) bezpieczeństwa na serwerze. Strefa określa sposób uwierzytelnienia i zbiór uprawnionych użytkowników. W celu utworzenia nowej strefy należy zalogować się na serwer aplikacji. Wybieramy zakładkę Services, węzeł Servers, Glassfish i z menu podręcznego wybieramy View Admin Console. W otwartej przeglądarce logujemy się jako admin (password: adminadmin). Po lewej stronie wybieramy z drzewa wybieramy Configuration -> Security -> Realms. Trzy domeny są już zdefiniowane domyślnie: admin-realm, file i certificate. 2. W oknie po prawej wybieramy przycisk New. W nowotworzonej domenie wpisujemy:
Name: WAI_realm - określa nazwę zasobu do wykorzystania z poziomu aplikacji z pomocą usług JNDI. Class Name: com.sun.enteriprise.security.auth.realm.file.filerealm JAASContext: filerealm KeyFile: ${com.sun.aas.instanceroot}/config/wai-keyfile - plik w którym przechowywane są dane o użytkownikach Assign Group: users - nazwa grupy do której przynależą użytkownicy Zatwierdzamy dane klikając OK 3. Po powrocie do ekranu z listą domen, wybieramy domenę WAI_realm. Klikamy na przycisk Manage Users i dodajemy użytkowników klikając New.
4. Wpisujemy dane: User ID student, Group List users oraz dwukrotnie hasło, które zapamiętujemy (np. student). Zatwierdzamy użytkownika klikając OK. Czynności powtarzamy w celu stworzenia następnych użytkowników. Czynności kończymy wciskając Save i restartując serwer (w prawym górnym rogu). To wszystko co trzeba wykonać na serwerze aplikacji. Druga część to skonfigurowanie aplikacji webowej. Główną zaletą bezpieczeństwa opartego JAAS, jest to, że identyczny zbiór z użytkownikami i grupami, może być wykorzystany do kilku aplikacji. Druga zaleta, to fakt, że nie trzeba tworzyć własnego systemu zabezpieczeń na każdej stronie webowej i sprawdzać czy użytkownik jest już zalogowany. Bezpieczeństwo jest opisane w sposób deklaratywny w plikach web.xml. 5. Spośród kilku dostępnych metod uwierzytelniania w aplikacjach webowych, najprostszą jest HTTP Basic authentication (przekazywanie danych w nagłówkach http). W dalszej części spróbujemy wykorzystać tę metodę. W tym celu edytujemy plik web.xml, w celu określenia metody uwierzytelnienia i domeny (realm), dla której dokonujemy uwierzytelnia. Wpisujemy do
<login-config> <auth-method>basic</auth-method> <realm-name>wai_realm</realm-name> </login-config> 6. Kolejnym krokiem jest zabezpieczenie katalogu lub konkretnej strony. Są to tzw. składowe (reguły) bezpieczeństwa security constrains. Dodajemy do naszej aplikacji (węzeł Web Pages) podkatalog secure i przenosimy tam stronę index.jsp. Jednocześnie w katalogu głównym dodajemy stronę login.jsp (na razie z domyślną zawartością. 7. W pliku web.xml dodajemy <security-constraint> <web-resource-collection> <web-resource-name>bezpieczne WAI </web-resource-name> <url-pattern>/secure/*</url-pattern> <http-method>get</http-method> <http-method>post</http-method> </web-resource-collection> <auth-constraint> <role-name>student</role-name> </auth-constraint> </security-constraint> Można to również uzyskać przez zaznaczenie i wpisanie odpowiednich parametrów w kreatorze. Parametr URL pattern /* oznacza, że wszystkie strony wymagają poprawnego zalogowania, przez użytkownika, który należy do grupy Student. 8. Mapowanie ról pomiędzy rolami z naszej aplikacji, a serwera aplikacji dokonuje się wpisują odpowiedni alias w serwerze aplikacji lub, dla GlassFisha w pliku sun-web.xml w katalogu WEB-INF <security-role-mapping> <role-name>student</role-name> <group-name>users</group-name> </security-role-mapping> 9. Przetestuj aplikację sprawdząjąc jej działanie dla obu stron. 10. W celu wykorzystania uwierzytelnienia opartego o formularze należy zmodyfikować plik web.xml. zmieniamy metodę uwierzytelnienia z BASIC na FORM i wskazujemy stronę z formularzem logowania: <login-config> <auth-method>form</auth-method> <realm-name>wai2_realm</realm-name> <form-login-config> <form-login-page>/login.jsp</form-login-page> <form-error-page>/loginerror.jsp</form-error-page> </form-login-config> </login-config>
11. Kolejnym krokiem jest utworzenie strony logowania. Strona ta musi zawierać formularz z nazwą akcji j_security_check i nazwą użytkownika oraz hasłem jako j_username i j_password. Przykładowy fragment kodu strony login.jsp: <form method="post" action="j_security_check"> <table> <tr><td>użytkownik:</td> <td><input type="text" name="j_username" /></td></tr> <tr><td>hasło:</td> <td><input type="password" name="j_password" /></td></tr> <tr><td><input type="submit" value="zaloguj" /></td></td></tr> </table> </form> 12. Przetestuj aplikację. 13. Kolejną modyfikacją jest zmiana źródła bazy użytkowników z plikowej na bazodanową JDBC Realm. W tym celu musimy założyć odpowiednią bazę danych: z użytkownikami i grupami. Zakładamy tworząc w mysql u bazę app i tabele: Create database app; create table USERTABLE(USERID varchar(20), PASSWORD varchar(20)); create table GROUPTABLE(USERID varchar(20), GROUPID varchar(20)); oraz dane insert into USERTABLE(USERID,PASSWORD) values ('wai', 'secret'); insert into GROUPTABLE(USERID,GROUPID) values ('wai', 'users'); 14. Uwaga: hasła są nie zaszyfrowane tylko i wyłącznie dla uproszczenia testowania. W rzeczywistych aplikacjach należy je zaszyfrować. 15. Zakładamy nowe źródło danych jdbc/wai_security na serwerze aplikacji (patrz ćwiczenie serwety i JDBC) i odpowiednią pulę połączeń. 16. Zamiast źródła plikowego wybieramy com.sun.enterprise.security.auth.realm.jdbc.jdbcrealm. i ustawiamy odpowiednie parametry jaas-context jdbcrealm Datasource-jndi jdbc/wai_security user-table app.usertable user-name-column userid password-column password group-table app.grouptable group-name-column groupid digest-algorithm none database-user root database-password xamppwne 17. Testujemy aplikację