Posts Tagged uwierzytelnienie

Zabezpieczenie komunikacji pomiędzy serwerem RHQ a agentem monitorującym

W podstawowej konfiguracji komunikacja pomiędzy serwerem RHQ oraz agentami monitorującymi poszczególne systemy nie jest ani szyfrowana ani nie ma zaimplementowanych mechanizmów uwierzytelnienia. Może to prowadzić do wielu problemów związanych z bezpieczeństwem systemów:

  • jest możliwe dodanie do infrastruktury monitorującego nowego agenta i jego rejestracja w serwerze RHQ
  • jest możliwe podsłuchanie ruchu pomiędzy serwerem a agentami (i tym samym poznanie konfiguracji maszyn, być może różnych dodatkowych wrażliwych informacji)
  • istnieje możliwość przechwycenie komunikacji pomiędzy serwerem RHQ a agentem monitorującym oraz takie jej zmodyfikowanie, aby uzyskać wpływ na działanie agenta (a trzeba pamiętać, że agent często pracuje na uprawnieniach użytkownika root)

Oczywiście, takie potencjalne problemy mogą prowadzić tylko do jednego wniosku: taką konfigurację można używać tylko w ramach takiej infrastruktury, która jest kontrolowana w 100% i nikt nie powołany nie może z niej korzystać (czyli jak dla mnie to nigdy :D).

W przypadku serwera RHQ problem zabezpieczenia komunikacji oraz uwierzytelniania pomiędzy nim a agentami jest rozwiązana przy użyciu szyfrowania SSL oraz konfiguracji odpowiednich certyfikatów.

W sytuacji, gdy chcemy skonfigurować tylko szyfrowane połączenie (bez uwierzytelniania agentów) wystarczy tylko włączyć używanie protokołu SSL. Odpowiedni certyfikat powinien być już wygenerowany i domyślnie będzie znajdował się w pliku rhq-server/jbossas/server/default/conf/rhq.keystore.

Ja postaram się przedstawić bardziej zaawansowaną konfigurację, gdzie każdy agent także uwierzytelnia się na podstawie odpowiedniego certyfikatu.

Krok 1: Utworzenie certyfikatów SSL

Aby zarówno serwer RHQ jak agent monitorujący potrafiły zidentyfikować się wzajemnie należy zdefiniować odpowiednie certyfikaty SSL, które pozwolą na ich identyfikację. Zarówno serwer RHQ jak i każdy agent musi posiadać swój własny certyfikat. Można tutaj wykorzystać zarówno istniejące certyfikaty (podpisane np. przez jakieś CA), lub też wygenerować własne korzystając z narzędzia keytool.

Poniższe kroki należy wykonać osobno dla serwera RHQ jak i dla każdego agenta monitorującego, modyfikując odpowiednio parametry:

  1. Utworzenie pliku z certyfikatem oraz kluczami publicznym i prywatnym (należy pamiętać, że operację tę należy wykonać zarówno dla serwera jak i dla każdego agenta monitorującego):
    keytool -genkey -dname "CN=nazwa_hosta.example.com" -keystore nazwa_hosta-keystore.dat\
            -validity 3650 -alias nazwa_hosta -keyalg DSA -storetype JKS\
            -keypass haslo_do_klucza_prywatnego -storepass haslo_do_pliku_z_certyfikatem

    Polecenie to utworzy plik o nazwie nazwa_hosta-keystore.dat, w którym zostanie zapisany certyfikat z podaną nazwą maszyny (ważne, należy użyć odpowiedniej nazwy, przypisanej do danej maszyny na której działa agent lub serwer). Certyfikat będzie dostępu przy użyciu nazwy zdefiniowanej przy użyciu parametru alias, czyli w tym przypadku będzie to nazwa_hosta. Klucz prywatny zostanie zabezpieczony hasłem podanym przy użyciu parametru keypass a cały plik hasłem podanym przy użyciu parametru storepass. Certyfikat będzie miał ważność 10 lat (wartość validity). Podane wartości należy zapamiętać, będą one potrzebne dalej.

  2. Zapisanie utworzonego certyfikatu w osobnym pliku (co umożliwi potem jego import to pliku ze wszystkimi certyfikatami):
    keytool -export -keystore nazwa_host-keystore.dat -alias nazwa_hosta\
            -storetype JKS -storepass haslo_do_pliku_z_certyfikatem -file nazwa_hosta-cert
  3. Dodanie certyfikatu do wspólnego pliku z certyfikatami truststore.dat:
    keytool -import -keystore truststore.dat -alias nazwa_hosta\
            -storetype JKS -filenazwa_hosta-cert -noprompt\
            -keypass haslo_do_klucza_prywatnego -storepass haslo_do_pliku_z_certyfikatem

    Dzięki tej operacji dodamy każdy certyfikat do jednego pliku, dzięki czemu będziemy mogli ich używać w celu uwierzytelnienia agentów.

  4. Można w każdej chwili sprawdzić, czy i jakie certyfikaty znajdują się w pliku truststore.dat:
    keytool -list -keystore truststore.dat -storepass haslo_do_pliku_z_certyfikatem\
            -storetype JKS

Po wykonaniu powyższych operacji dla każdego agenta monitorującego i serwera RHQ będziemy dysponowali zarówno zdefiniowanymi dla każdego z nich kluczami prywatnymi jak i plikiem z certyfikatami, dzięki czemu będzie możliwe sprawdzenie ich tożsamości.

Aby ułatwić sobie kolejne kroki, stworzyłem prosty skrypt, które dokładnie wykona wszystkie powyższe kroki dla każdej maszyny. Skrypt należy zapisać w pliku o nazwie create_cert.sh a następnie wywoływać z dwoma parametrami: aliasem klucza oraz pełną nazwą maszyny, czyli np. tak:

./create_cert.sh nazwa_hosta nazwa_hosta.example.com

Skrypt tworzący klucze create_cert.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash

ALIAS=$1
HOSTNAME=$2

KEYPASS="haslo"
STOREPASS="haslo"
KEYSTORE="${ALIAS}-keystore.dat"
CERTSTORE="${ALIAS}-cert"
TRUSTSTORE="truststore.dat"

echo -n "Create SSL Cert for $ALIAS...   "
keytool -genkey -dname "CN=$HOSTNAME" -keystore ${KEYSTORE}\
        -validity 3650 -alias $ALIAS -keyalg DSA -storetype JKS\
        -keypass ${KEYPASS} -storepass ${STOREPASS}
echo "done"

echo "Export certficate"
keytool -export -keystore ${KEYSTORE} -alias ${ALIAS}\
        -storetype JKS -storepass super_haslo -file ${CERTSTORE}

echo -n "Import certificate to ${TRUSTSTORE}...  "
keytool -import -keystore ${TRUSTSTORE} -alias ${ALIAS}\
        -storetype JKS -file ${CERTSTORE} -noprompt\
        -keypass ${KEYPASS} -storepass ${STOREPASS}
echo "done"

echo "Certificate list"
keytool -list -keystore ${TRUSTSTORE} -storepass ${STOREPASS}\
        -storetype JKS

Oczywiście, należy zdefiniować w skrypcie odpowiednie hasło.

Krok 2: Dystrybucja kluczy

Odpowiednie pliki z kluczami są już utworzone, należy je teraz skopiować na odpowiednie maszyny. Należy skopiować zarówno plik ze wszystkimi certyfikatami oraz specyficzny dla każdego agenta plik z kluczem prywatnym. Należy zwrócić szczególną uwagę na to, aby odpowiednie pliku umieścić na odpowiednich maszynach.

  • Instalacja certyfikatu na serwerze RHQ
    Najprościej będzie umieścić plik z certyfikatem serwera (o nazwie nazwa_hosta-keystore.dat) oraz truststore.dat w katalogu konfiguracyjnym serwera JBoss, w ramach którego pracuje RHQ. Czyli kopiujemy te pliki do katalogu rhq-server/jbossas/server/default/conf. Oczywiście można je umieścić w dowolnym innym miejscu, należy tylko pamiętać aby serwer RHQ miał możliwość ich odczytania.

    Należy jeszcze tak zmienić parametry dostępu do tych plików, aby tylko właściciel procesu RHQ miał możliwość ich odczytu.

  • Instalacje certyfikatu w agencie monitorującym
    Plik z kluczem prywatnym (nazwa_hosta-keystore.dat) oraz truststore.dat należy także umieścić w katalogu conf danego agenta, czyli w katalogu rhq-agent/conf. Dzięki temu, plik ten nie zostanie usunięty podczas procesu automatycznej aktualizacji agenta. Jeszcze raz powtórzę: należy skopiować odpowiedni plik nazwa_hosta-keystore.dat do odpowiedniego agenta.

Krok 3: Konfiguracja serwera RHQ

Teraz czas na odpowiednią konfigurację serwera RHQ, czyli włączenie szyfrowania i uwierzytelnienia. Najlepiej jest wyłączeń serwer przed przystąpieniem do realizacji kolejnych kroków.

Zaczynamy od edycji pliku konfiguracyjnego serwera rhq-server/bin/rhq-server.properties:

  • włączenie korzystania z SSL poprzez zdefiniowania transportu jako sslservlet:
    64
    65
    66
    67
    rhq.communications.connector.transport=sslservlet
    rhq.communications.connector.bind-address=
    rhq.communications.connector.bind-port=
    rhq.communications.connector.transport-params=/jboss-remoting-servlet-invoker/ServerInvokerServlet
  • konfiguracja magazynów z kluczami dla połączeń przychodzących:
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    # Server-side SSL Security Configuration for HTTPS thru Tomcat
    # These are used for browser https: access and for incoming messages from agents over sslservlet transport
    # [you cannot use ${x} variables - see https://jira.jboss.org/jira/browse/JBWEB-74]
    rhq.server.tomcat.security.client-auth-mode=true
    rhq.server.tomcat.security.secure-socket-protocol=TLS
    rhq.server.tomcat.security.algorithm=SunX509
    rhq.server.tomcat.security.keystore.alias=alias_klucza_dla_serwera
    rhq.server.tomcat.security.keystore.file=conf/nazwa_hosta_keystore.dat
    rhq.server.tomcat.security.keystore.password=haslo
    rhq.server.tomcat.security.keystore.type=JKS
    rhq.server.tomcat.security.truststore.file=conf/truststore.dat
    rhq.server.tomcat.security.truststore.password=haslo
    rhq.server.tomcat.security.truststore.type=JKS

    Powyższa konfiguracja umożliwia odszyfrowanie wiadomości przychodzących od agentów. Jednocześnie pozwoli także na uwierzytelnienie tych agentów, ponieważ będzie można odczytać tylko te wiadomości od tych agentów, których klucze publiczne znajdują się w pliku truststore.dat. Jednocześnie będzie można określić, jaki agent dana informację wysłał.

  • konfiguracja magazynów z kluczami dla połączeń wychodzących:
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    # Client-side SSL Security Configuration (for outgoing messages to agents)
    rhq.server.client.security.secure-socket-protocol=TLS
    rhq.server.client.security.keystore.file=${jboss.server.home.dir}/conf/nazwa_hosta-keystore.dat
    rhq.server.client.security.keystore.algorithm=SunX509
    rhq.server.client.security.keystore.type=JKS
    rhq.server.client.security.keystore.password=haslo
    rhq.server.client.security.keystore.key-password=haslo
    rhq.server.client.security.keystore.alias=nazwa_hosta
    rhq.server.client.security.truststore.file=${jboss.server.home.dir}/conf/truststore.dat
    rhq.server.client.security.truststore.algorithm=SunX509
    rhq.server.client.security.truststore.type=JKS
    rhq.server.client.security.truststore.password=haslo
    rhq.server.client.security.server-auth-mode-enabled=true

    Dzięki tej konfiguracji będzie można komunikować się z agentami tak, aby byli oni pewni że nadawcą jest serwer RHQ.

Krok 4: Konfiguracja agenta monitorującego

Ostatnim elementem będzie konfiguracja agenta monitorującego. Istnieją trzy sposoby na jakie można skonfigurować agenta:

  1. Uruchomić konfigurowanie agenta w trybie zaawansowanym, można to zrobić uruchamiając go z następującymi parametrami --cleanconfig --setup --advanced.
  2. Uruchomić agenta w trybie console a następnie wydać polecenie setup advanced.
  3. Bezpośrednio zmodyfikować plik konfiguracyjny conf/agent-configuration.xml i następnie uruchomić agenta z przełącznikiem cleanconfig.

Sposoby pierwszy i drugi wymagają odpowiedzi na szereg pytań, ja przedstawię co należy zmodyfikować w pliku konfiguracyjnym.

  • konfiguracja połączenia z serwerem:
    120
    121
    122
    123
    <entry key="rhq.agent.server.transport"        value="sslservlet" />
    <entry key="rhq.agent.server.bind-port"        value="7443" />
    <entry key="rhq.agent.server.bind-address"     value="rhq-server.example.com" />
    <entry key="rhq.agent.server.transport-params" value="/jboss-remoting-servlet-invoker/ServerInvokerServlet" />
  • konfiguracja łączności agenta monitorującego
    885
    886
    887
    <entry key="rhq.communications.connector.rhqtype"          value="agent" />
    <entry key="rhq.communications.connector.transport"        value="sslsocket" />
    <entry key="rhq.communications.connector.bind-port"        value="16163" />
  • konfiguracja łączności z serwerem – włączenie korzystania z uwierzytelnienia (parametr client-auth-mode) oraz definicja dostępu do certyfikatów:
    931
    932
    933
    934
    935
    936
    937
    938
    939
    940
    941
    942
    <entry key="rhq.communications.connector.security.secure-socket-protocol" value="TLS" />
    <entry key="rhq.communications.connector.security.keystore.file"          value="conf/nazwa_hosta-keystore.dat" />
    <entry key="rhq.communications.connector.security.keystore.algorithm"     value="SunX509" />
    <entry key="rhq.communications.connector.security.keystore.type"          value="JKS" />
    <entry key="rhq.communications.connector.security.keystore.password"      value="haslo" />
    <entry key="rhq.communications.connector.security.keystore.key-password"  value="haslo" />
    <entry key="rhq.communications.connector.security.keystore.alias"         value="nazwa_hasla" />
    <entry key="rhq.communications.connector.security.truststore.file"        value="conf/truststore.dat" />
    <entry key="rhq.communications.connector.security.truststore.algorithm"   value="SunX509" />
    <entry key="rhq.communications.connector.security.truststore.type"        value="JKS" />
    <entry key="rhq.communications.connector.security.truststore.password"    value="haslo" />
    <entry key="rhq.communications.connector.security.client-auth-mode"       value="need" />
  • konfiguracja łączności z klientem – włączenie korzystania z uwierzytelnienia (parametr server-auth-mode-enabled) oraz konfiguracja dostępu do plików z certyfikatami:
    944
    945
    946
    947
    948
    949
    950
    951
    952
    953
    954
    955
    <entry key="rhq.agent.client.security.secure-socket-protocol"   value="TLS" />
    <entry key="rhq.agent.client.security.keystore.file"            value="conf/nazwa_hosta-keystore.dat" />
    <entry key="rhq.agent.client.security.keystore.algorithm"       value="SunX509" />
    <entry key="rhq.agent.client.security.keystore.type"            value="JKS" />
    <entry key="rhq.agent.client.security.keystore.password"        value="haslo" />
    <entry key="rhq.agent.client.security.keystore.key-password"    value="haslo" />
    <entry key="rhq.agent.client.security.keystore.alias"           value="nazwa_hosta" />
    <entry key="rhq.agent.client.security.truststore.file"          value="conf/truststore.dat" />
    <entry key="rhq.agent.client.security.truststore.algorithm"     value="SunX509" />
    <entry key="rhq.agent.client.security.truststore.type"          value="JKS" />
    <entry key="rhq.agent.client.security.truststore.password"      value="haslo" />
    <entry key="rhq.agent.client.security.server-auth-mode-enabled" value="true" />

Oczywiście, należy te wpisy dostosować do własnych potrzeb (w szczególności dotyczy to zdefiniowania odpowiednich haseł). Po wprowadzeniu modyfikacji, należy zatrzymać agenta i uruchomić go przy użyciu następującej komendy:

rhq-agent/bin/rhq-agent.sh --cleanconfig

Spowoduje ona uruchomienie agenta oraz uruchomienie jego procesu konfiguracji. Należy odpowiedzieć na pierwsze pytania, poczekać aż agent połączy się z serwerem i jeżeli nie wystąpiły żadne błędy to wszystko powinno działać OK.

Jeżeli wystąpiły błędy, to trzeba je zanalizować i próbować zmienić wpisy w pliku konfiguracyjnym. Jeżeli pierwsze uruchomienie powiodło się, można już uruchomić agenta przy użyciu skryptu uruchomieniowego.

Pozostaje teraz skonfigurowanie pozostałych agentów i możemy się cieszyć szyfrowaną transmisją między serwerem RHQ a agentami.

Źródła

Tags: , , , , , , ,

Definiowanie uprawnień dostępu w serwerze RHQ

Serwer RHQ umożliwia definiowanie uprawnień dostępu do poszczególnych zasobów, które są monitorowane. Możliwa jest także odpowiednia granulacja tych uprawnień, zarówno ze względu na dostępu do poszczególnych usług jak i operacji jakie można na nich wykonywać.

Model uwierzytelniania w RHQ opiera się o role, które są miejscem łączącym operacje jakie można wykonać wraz z odpowiednimi użytkownikami oraz grupami.

Celem będzie uzyskanie następującej sytuacji: utworzenie nowego użytkownika, który będzie miał możliwość monitorowania wszystkich zasobów oraz możliwość pełnej kontroli nad skryptami startowymi agentów monitorujących.

Rodzaje uprawnień w RHQ

Poszczególne uprawnienia dzielą sią na dwie grupy: globalne i dotyczące zasobów.

W przypadku uprawnień globalnych, są dostępne następujące zezwolenia:

  • Manage security (users/roles) – pozwala na modyfikowanie ustawień związanych z zarządzaniem rolami oraz użytkownikami. W praktyce użytkownik z tą rolą ma kontrolę nad całym systemem (zawsze może sobie odpowiednią rolę samodzielnie).
  • Manage inventory (resources/groups) – pozwala na wykonywania dowolnych akcji na każdym zasobie, niezależnie od innych uprawnień jakie mogą być skonfigurowane.
  • Administer RHQ Server settings – pozwala na modyfikowanie konfiguracji serwera RHQ

Uprawnienia do zasobów odnoszą się tylko do zasobów, które są dodanie do danej roli. Są dostępne następujące zezwolenia:

  • Modify – pozwala na modyfikacje opis zasobów w serwerze RHQ (czyli np. jego nazwy), nie umożliwia konfiguracji zasobu;
  • Delete – pozwala na usunięcie danego zasobu z serwera;
  • Create Child – pozwala na dodanie nowego zasobu potomnego;
  • Alerts – pozwala na zarządzanie alarmami;
  • Measurements – pozwala na niemodyfikowanie sposobów w jakie zbierane są informacje z monitoringu;
  • Content
  • Control – pozwala na wykonywanie akcji w ramach zasobów
  • Configure – pozwala na modyfikację konfiguracji danego zasobu

Tak się prezentuje rola super użytkownika:

RHQ Server - Super User Role

RHQ Server - Super User Role

Utworzenie grup zasobów

Ponieważ konkretne uprawnienia są przydzielane do grup, to najpierw należy zdefiniować dwie grupy, obie dynamiczne:

  • Agent Laucher Script – lista agentów działających w ramach systemu monitorującego
  • Wszystkie platformy – wszystkie platformy jakie są podłączone do serwera monitorującego

O sposobie definicji grupy dynamicznej oraz jak zdefiniować pierwszą grupę można przeczytać w tym wpisie: Definiowanie grupy usług w serwerze RHQ.

Definicja grupy obejmującej wszystkie zasoby powinna wyglądać następująco:

RHQ Server - definicja grupy "Wszystkie platformy"

Utworzenie ról dla grup

Po zdefiniowaniu odpowiednich grup zasobów przychodzi czas na zdefiniowanie odpowiednich uprawnień do nich. Robi się to poprzez utworzenie ról, w których będzie można powiązać zasoby i uprawnienia do nich przypisane.

Wyświetlenie listy dostępnych ról i ekranu pozwalającego na zarządzanie nimi jest możliwe po wybranie z menu pozycji Administration->Security->Roles:

RHQ Server - role

RHQ Server - role

Po wybranie tej pozycji z menu zostanie wyświetlona lista wszystkich dostępnych ról w systemie:

RHQ Server - lista dostępnych ról

RHQ Server - lista dostępnych ról

Domyślnie w RHQ są dostępne dwie specjalne role:

  • Super User Role – rola super użytkownika, osoba przypisana do tej roli ma dostęp do wszystkich elementów serwera monitorującego RHQ, roli tej nie można modyfikować
  • All Resources Role – rola ta daje dostęp do wszystkich zasobów serwera, ale nie umożliwia modyfikowania uprawnień użytkowników, ról czy też konfiguracji serwera

Definicja nowej roli jest możliwa po wybraniu przycisku NEW.

RHQ Server - definicja nowej roli

RHQ Server - definicja nowej roli

Podczas definiowania nowej roli należy przede wszystkim zdefiniować jej nazwę (unikalną w ramach serwera RHQ) oraz odpowiednie uprawnienia. Dostępne uprawnienia zostały już powyżej opisane.

W naszym przypadku definiujemy nazwę roli jako RHQ Agent i przypisujemy tej roli wszystkie uprawnienia z grupy Resource Permissions a następnie zatwierdzamy nową rolę.

W tym momencie dysponujemy już zdefiniowaną rolę, ale jeszcze nie wskazaliśmy jakich zasobów ma ona dotyczyć. W związku z tym czas teraz na wybór w grupie Assigned Groups przycisku ADD TO LIST. Zostanie wyświetlona strona, która pozwoli na przypisanie grup zasobów do danej roli.

Należy wybrać z listy rolę DynaGroup - Agent Laucher Script i zatwierdzić wybór. Po zatwierdzeniu, grupa ta powinna wyglądać następująco:

RHQ Server - dodanie grup zasobów do roli

RHQ Server - dodanie grup zasobów do roli

Analogicznie należy utworzyć drugą rolę, o nazwie Monitorowanie serwerów. Jej definicja powinna wyglądać następująco:

RHQ Server - definicja roli Monitorowanie serwerów

RHQ Server - definicja roli Monitorowanie serwerów

Tym sposobem dysponujemy dwoma rolami, które definiują dostęp do agentów monitorujących oraz wszystkich innych zasobów. Teraz pozostaje utworzyć odpowiedniego użytkownika, który będzie z nich korzystał.

Utworzenie nowego użytkownika

Ostatnim elementem będzie utworzenie nowego użytkownika, który będzie należał do dwóch zdefiniowanych grup.

Wyświetlenie strony pozwalającej na zarządzanie użytkownikami jest możliwe poprzez wybranie następującej pozycji z menu: Administration->Security->Users:

RHQ Server - zarządzanie użytkownikami

RHQ Server - zarządzanie użytkownikami

Zostanie wyświetlona strona z listą zdefiniowanych użytkowników. Dodanie nowego użytkownika jest możliwe po wybraniu przycisku NEW. Pozwoli to na zdefiniowanie podstawowych informacji o nowym użytkowniku systemu:

  • Name – imię i nazwisko użytkownika
  • Email – mail
  • Password – hasło dostępu użytkownika
  • Username – login użytkownika
  • Phone – nr telefony
  • Department – dział
  • Enable Login – wyłącznie konta (wyłączenie uniemożliwi logowanie na to konto)

Przykładowa definicja użytkownika:

RHQ Server - definiowanie nowego użytkownika

RHQ Server - definiowanie nowego użytkownika

Po zatwierdzeniu danych użytkownika przechodzimy do strony pozwalającej na wybór ról, jakie mają z danym użytkownikiem zostać skojarzone. Należy wybrać role RHQ Agent oraz Monitorowanie serwerów. Po zatwierdzeniu definicja użytkownika powinna prezentować się następująco:

RHQ Server - zdefiniowany użytkownik

RHQ Server - zdefiniowany użytkownik

Od tej chwili Jan Kowalski może się zalogować do systemu, otrzyma dostęp do monitorowania wszystkich serwerów oraz usług, ale modyfikować będzie mógł tylko zachowanie agentów monitorujących.

Źródła

Tags: , , ,

JBoss Cluster – zabezpieczenie komunikacji między serwerami

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:

$ ./run.sh -c node1 -b jboss1 -Djboss.messaging.ServerPeerID=1 -g CLUSTER -u 239.255.100.100  -m 1234

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ą profilu all lub production
  • -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:

keytool -genkeypair -dname "cn=JBoss Key 1, ou=JBoss, c=PL" -alias jboss -keyalg RSA -keypass haslo_klucza -keystore keystore -storepass haslo_magazynu

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 klastry
  • keystore_path – ścieżka do magazyny kluczy
  • keystore_password – hasło do magazyny kluczy
  • cert_password – hasło do certyfikatu
  • cert_alias – nazwa certyfikatu
  • cipher_type – typ certyfikatu

Należy pamiętać, że wszystkie węzły klastra muszą korzystać z tego samego certyfikatu.

Źródła

Tags: , , , , , , , , , , , ,