Przy użyciu serwera aplikacji JBoss AS bardzo łatwo jest utworzyć klaster. Serwer ten wspiera automatyczne wykrywanie poszczególnych maszyn, które uczestniczą w danym klastrze. Konfiguracja polega na uruchomieniu serwera przy użyciu profilu opartego o profil all
i podaniu kilku parametrów:
Powyższe poleceniu uruchomić instancję serwera JBoss przy następujących parametrach:
-c node1
– nazwa profilu jaki ma zostać uruchomiony (profili musi obsługiwać tworzenia klastrów, czyli najprościej powinien być kopią profiluall
lubproduction
-b jboss1
– adres IP z którym ma zostać związana dana instancja serwera aplikacji-Djboss.messaging.ServerPeerID=1
– numer dla JMS (unikalny w ramach klastra)-g CLUSTER
– nazwa klastra-u 239.255.100.100
– adres multicastowy, który będzie używany do komunikacji między serwerami-m 1234
– port adresu multicastowego
Aby dane instancje JBossa zaczęły współpracować ze sobą w ramach klastra, parametry -g
, -u
oraz -m
muszą mieć taką samą wartość. Jak widać, nie ma tutaj miejsca na żadne uwierzytelnienie poszczególnych węzłów klastra. Jeżeli ktokolwiek będzie w stanie wpiąć maszynę do danej sieci fizycznej oraz poznać te parametry, będzie mógł się bez problemu wpiąć w klaster na równoprawnych warunkach.
Przy domyślnej konfiguracji JBossa musimy zapewnić fizyczne bezpieczeństwo naszej sieci wewnętrznej oraz przy pomocy innych narzędzi dbać o to, aby nie pojawiły się w niej żadne nie pożądane komputery. Sprawa może zacząć się komplikować, gdy zaczniemy używać klastra w sieci rozległej lub tez nie takiej, której nie ufamy w 100% czy też nie mamy nad nią pełnej kontroli.
Pozostaje wtedy zainteresować się różnymi metodami uwierzytelniania poszczególnych serwerów. Niestety, nie udało mi się znaleźć dokładnej dokumentacji na ten temat. Duża część informacji opiera się na testach oraz obejrzeniu kodu źródłowego pozwalającego na tego typu operacje.
Co trzeba wiedzieć na wstępie
Za obsługę komunikacji między poszczególnymi węzłami serwera aplikacji JBoss odpowiada biblioteka JGroups.Posiada ona szereg właściwości takich jak: automatyczne tworzeni klastra, przesyłanie wiadomości pomiędzy nimi, obsługuje zarówno protokołu UDP jak i TCP. Więcej informacji można znaleźć na stronie domowej JGroups.
Protokół transportujący wiadomości składa się z kilku różnych warstw. Każda z nich odpowiada za realizację określonych funkcji (takiej jak wykrywanie serwerów, dzielenie komunikatu na mniejsze części, łączenie go z powrotem w całości i inne). Warstwy te współpracują ze sobą. Dlatego też dodanie uwierzytelniania serwerów sprowadza się do dodania kolejnej warstwy w protokole transportującym, która będzie pilnowała czy dany komunikat może zostać przyjęty od danego serwera czy też do niego wysłany.
W przypadku serwera JBoss AS konfiguracja znajduje się w pliku: $JBOSS_HOME/server/node1/deploy/cluster/jgroups-channelfactory.sar/META-INF/jgroups-channelfactory-stacks.xml
i to ten plik będzie trzeba edytować w celu dodania uwierzytelnienia dla grupy klastrów.
Bazową klasą używana do autentykacji jest org.jgroups.auth.AuthToken
. Wszystkie moduły dziedziną po niej i rozszerzają ja o własne metody i parametry potrzebne do przeprowadzenie uwierzytelnienia. Aby włączyć dany moduł, należy w pliku jgroups-channelfactory-stacks.xml
umieścić taki wpis:
83 84 85 | <VIEW_SYNC avg_send_interval="10000"/> <AUTH auth_class="klasa odpowiedzialna za uwierzytelnienie" parametr="wartość" /> |
Jedynym wymaganym tutaj argumentem jest auth_class
, który wskazuje na klasę, jaka ma zostać użyta do uwierzytelnienia. Wszystkie pozostałe argumenty zostaną przekazane do tej klasy. Dlatego też ich postać jest już zależna od konkretnego modułu uwierzytelnia, należy się skonsultować z dokumentacją do każdej klasy i sprawdzić w niej jakie wartości muszą one przyjmować.
Uwierzytelnienie na podstawie adresu IP
Za uwierzytelnienie na podstawie adresu IP odpowiada klasa o nazwie FixedMembershipToken
. Pozwala ona na zdefiniowanie listy adresów IP oraz numerów, które są używane przez poszczególne komputery w klastrze. Definicja wygląda następująco:
84 85 86 | <AUTH auth_class="org.jgroups.auth.FixedMembershipToken" fixed_members_value="192.168.3.21*192.168.3.22" fixed_members_seperator="*"/> |
Jak widać klasa ta przyjmuje dwa parametry:
fixed_members_value
– pozwala na określenie adresów IP serwerów wchodzących w składa klastra, poszczególne adresy są rozdzielna znakiem separatora podanym w drugim parametrze, można także podać numer portu w formacie: 192.168.3.21/1234;fixed_members_seperator
– znak separatora, który rozdziela poszczególne adresy IP, w przykładzie znak*
Podany opis konfiguracji musi znaleźć się na wszystkich węzłach klastra. Każda instancja serwera JBoss będzie się porozumiewała tylko z tymi maszynami, które znajdują się w jej spisie.
Uwierzytelnienie na podstawie hasła
Chyba najprostsza metoda uwierzytelniania poszczególnych serwerów w klastrze: użycie hasła. Wszystkie serwery uczestniczące w klastrze muszą mieć skonfigurowane to samo hasło dostępu, na tej podstawie następuje uwierzytelnienie. Za przeprowadzenie tego testu odpowiada klasa SimpleToken
i jej definicja wygląda następująco:
84 85 | <AUTH auth_class="org.jgroups.auth.SimpleToken" auth_value="haslo_klastra"/> |
Jedynym obowiązkowym parametrem w tej metodzie jest auth_value
gdzie definiujemy hasło.
Uwierzytelnianie przy użyciu preshared token
Kolejny sposób uwierzytelniania przy użyciu preshared token jest udostępniony przez klasę MD5Token
. Pozwala on na zdefiniowanie tokenu oraz hasła dostępu:
84 85 86 | <AUTH auth_class="org.jgroups.auth.MD5Token" token_hash="0425823a38b591b104ca0c3fcf1f3d9d" auth_value="haslo_klastra"/> |
Parametry token_hash
i auth_value
i definiują odpowiednio token (zakodowany przy użyciu MD5 lub SHA) oraz hasło. Na wszystkich węzłach klastra muszą być podane takie same wartości tych parametrów.
Uwierzytelnienie przy użyciu certyfikatu X509
Ostatnią dostępną metodą nieuwierzytelnienia poszczególnych węzłów klastra jest użycie certyfikatu X509. Za przeprowadzenie tego sposobu uwierzytelnienia odpowiada klasa X509Token
. Pozwala ona na zdefiniowania miejsca z którego można pobrać certyfikat.
Przykład komendy definiującej nowy certyfikat przy użycia polecenia keytool
:
Poszczególne polecenia oznaczają:
-genkeypair
– generowanie pary kluczy, prywatnego i publicznego-dname "cn=JBoss Key 1, ou=JBoss, c=PL"
– nazwa certyfikatu w standardzie X509-alias jboss
– nazwa certyfikatu na podstawie której będzie on identyfikowany w magazynie kluczy-keyalg RSA
– algorytm użyty do generowania kluczy-keypass haslo_klucza
– hasło na klucz prywatny-keystore keystore
– plik z magazynem kluczy-storepass haslo_magazynu
– hasło dostępu do pliku z magazynem kluczy
A oto definicja XML pozwalająca na użycie wygenerowanego certyfikatu:
84 85 86 87 88 89 90 | <AUTH auth_class="org.jgroups.auth.X509Token" auth_value="haslo_klastra" keystore_path="keystore" keystore_password="haslo_magazynu" cert_password="haslo_klucza" cert_alias="jboss" cipher_type="RSA"/> |
Znaczenie poszczególnych parametrów:
auth_value
– hasło używane przez klastrykeystore_path
– ścieżka do magazyny kluczykeystore_password
– hasło do magazyny kluczycert_password
– hasło do certyfikatucert_alias
– nazwa certyfikatucipher_type
– typ certyfikatu
Należy pamiętać, że wszystkie węzły klastra muszą korzystać z tego samego certyfikatu.
Źródła
- JGroups and authentication – or how AUTH came to be
- Authentication
- JGroupsProtocolCommonProperties
- Securing Cluster: JGroup AUTH
- Secure traffic in JBoss cluster
- JGroupsAUTH
- How to make authentication with X509Token work?
- AUTH: X.509 issue with keystore
- AUTH – X509Token authentication failure
- Class MD5Token
- Class SimpleToken
- Class X509Token
- Class FixedMembershipToken
- Class AuthToken
- JGroups – A Toolkit for Reliable Multicast Communication
- Cluster authorization with pattern matching