Konfigurowanie i korzystanie z listy allowlist JMS

Informacje te informują użytkownika o tym, jak działa lista allowlist i jak można je skonfigurować, korzystając z funkcji zawartych w IBM® MQ classes for JMS w celu wygenerowania pliku allowlist, zawierającego listę typów komunikatów ObjectMessages, które aplikacja może przetwarzać.

Zanim zaczniesz

Ważne:

Tam, gdzie to możliwe, termin lista zaakceptowanych (allowlist) jest stosowany w miejsce terminu biała lista (whitelist). [MQ 9.2.1, grudzień 2020]W przypadku produktu IBM MQ 9.0 i nowszych wersji obejmuje to nazwy właściwości systemowych produktu Java , o których mowa w tym temacie (com.ibm.mq.jms.*). Nie trzeba zmieniać żadnej istniejącej konfiguracji. Dotychczasowe nazwy właściwości systemowych również będą działać.

Przed rozpoczęciem tej czynności należy zapoznać się z przeczytaniem i zrozumieniem opcji Allowlisting concepts .

Informacje o zadaniu

Jeśli włączono funkcję allowlistingu, produkt IBM MQ classes for JMS korzysta z tej funkcji w następujący sposób:
  • Gdy aplikacja chce wysłać obiekt ObjectMessage, może on utworzyć go na jeden z dwóch sposobów:
    • Metoda session.createObjectMessage (Serializable), przechodząc do obiektu, który ma być zawarty w komunikacie.
    • Metoda session.createObjectMessage () służy do tworzenia pustego komunikatu ObjectMessage, a następnie wywoływania obiektu ObjectMessage.setObject (Serializable) w celu zapisania obiektu, który ma zostać wysłany w obrębie obiektu ObjectMessage.

    Jeśli zostaną wywołane metody Session.createObjectMessage (Serializable) lub ObjectMessage.setObject (Serializable), klasy dla usługi JMS sprawdzają, czy przekazany obiekt jest typu, który jest wymieniony na liście allowlist.

    Jeśli jest to typ wymieniony, obiekt jest przekształcany do postaci szeregowej i zapisywany w komunikacie ObjectMessage. Jeśli jednak obiekt jest typu, którego nie ma na liście allowlist, IBM MQ classes for JMS zgłasza wyjątek JMSException zawierający komunikat:
    JMSCC0052: Wystąpił wyjątek podczas serializowania obiektu:
    ' java.io.InvalidClassException: < klasa_obiektu>; Klasa nie może być serializowana 
    lub z deserializacją, ponieważ nie została uwzględniona na liście allowlist '< allowlist>'.
    z powrotem do aplikacji.
    Ważne: Jeśli wyjątek jest zgłaszany z metody Session.createObjectMessage (Serializable), obiekt ObjectMessage nie zostanie utworzony. Podobnie, jeśli wyjątek JMSException jest zgłaszany z metody ObjectMessage.setObject (Serializable), obiekt nie zostanie dodany do obiektu ObjectMessage.
  • Jeśli aplikacja odbierze obiekt ObjectMessage, wywołuje metodę ObjectMessage.getObject (), aby uzyskać obiekt w nim zawarty. Po wywołaniu tej metody IBM MQ classes for JMS sprawdza typ obiektu zawartego w obiekcie ObjectMessage, aby sprawdzić, czy ten obiekt jest typu określonego na liście allowlist.
    Jeśli tak, obiekt jest deserializowany i zwracany do aplikacji. Jeśli jednak obiekt jest typu, którego nie ma na liście allowlist, IBM MQ classes for JMS zgłasza wyjątek JMSException zawierający komunikat:
    JMSCC0053: Wystąpił wyjątek podczas deserializacji komunikatu: 
    ' java.io.InvalidClassException: < klasa_obiektu>; Klasa może nie być 
    serializowane lub zerializowane, ponieważ nie zostały uwzględnione w 
    allowlist '< allowlist>'. '.
    z powrotem do aplikacji.
Załóżmy na przykład, że aplikacja zawiera następujący kod, aby wysłać obiekt ObjectMessage zawierający obiekt o typie java.net.URI:

java.net.URL testURL = new java.net.URL("https://www.ibm.com/");
ObjectMessage msg = session.createObjectMessage(testURL);
sender.send(msg);
Ponieważ opcja allowlisting nie jest włączona, aplikacja jest w stanie pomyślnie umieścić komunikat w wymaganym miejscu docelowym.
Jeśli zostanie utworzony plik o nazwie C:\allowlist.txt zawierający pojedynczą pozycję java.net.URL, a następnie zostanie uruchomiony ponownie aplikację z zestawem właściwości systemu Java:
-Dcom.ibm.mq.jms.allowlist=file:/C:/allowlist.txt
Funkcja allowlist jest włączona. Aplikacja nadal może utworzyć i wysłać obiekt ObjectMessage zawierający obiekt o typie java.net.URI, ponieważ ten typ jest określony na liście allowlist.
Jeśli jednak plik allowlist.txt zostanie zmieniony w taki sposób, że plik zawiera pojedynczą pozycję java.util.Calendar, ponieważ funkcja listy allowlist jest nadal włączona, podczas wywołań aplikacji:
ObjectMessage msg = session.createObjectMessage(testURL);
IBM MQ classes for JMS sprawdź listę allowlist i sprawdź, czy nie zawiera ona wpisu dla klasy java.net.URI.

W związku z tym zgłaszany jest wyjątek JMSException zawierający komunikat JMSCC0052 .

Podobnie, załóżmy, że istnieje inna aplikacja, która odbiera komunikaty ObjectMessages przy użyciu tego kodu:

ObjectMessage message = (ObjectMessage)receiver.receive(30000);
if (message != null) {
    Object messageBody = objectMessage.getObject();
    if (messageBody instanceof java.net.URI) {
      :    :    :    :    :    :    :

Jeśli opcja allowlisting nie jest włączona, aplikacja jest w stanie odbierać komunikaty ObjectMessages zawierające obiekt dowolnego typu. Następnie aplikacja sprawdza, czy obiekt jest typu java.net.URL przed wykonaniem odpowiedniego przetwarzania.

Jeśli aplikacja jest teraz uruchomiona z właściwością systemową Java :
-Dcom.ibm.mq.jms.allowlist=java.net.URL
ustaw, funkcja allowlistingu jest włączona. Gdy aplikacja wywołuje:
Object messageBody = objectMessage.getObject();
Metoda ObjectMessage.getObject () zwraca tylko obiekty o typie java.net.URL.

Jeśli obiekt znajdujący się w obiekcie ObjectMessage nie jest tego typu, metoda ObjectMessage.getObject () zgłasza wyjątek JMSException zawierający komunikat JMSCC0053 . Następnie aplikacja musi zdecydować, co należy zrobić z komunikatem. Na przykład komunikat może zostać przeniesiony do kolejki niedostarczonych komunikatów dla tego menedżera kolejek.

Aplikacja zwraca tylko normalnie, jeśli obiekt wewnątrz obiektu ObjectMessage ma typ java.net.URL.

Procedura

  1. Uruchom aplikację, która przetwarza komunikaty ObjectMessages, z podanymi następującymi właściwościami systemu Java:
    -Dcom.ibm.mq.jms.allowlist.discover=true
    -Dcom.ibm.mq.jms.allowlist=file:/<path to your allowlist file>    
    
    Po uruchomieniu aplikacji program IBM MQ classes for JMS tworzy plik, który zawierał typy obiektów, które przetwarzana jest aplikacja.
  2. Po przetworzeniu przez aplikację przykładowej próbki komunikatów ObjectMessage należy zatrzymać ją w określonym czasie.
    Plik allowlist zawiera teraz listę wszystkich typów obiektów zawartych w obiekcie ObjectMessages przetwarzanego przez aplikację w czasie jego działania.
    Jeśli aplikacja została uruchomiona przez wystarczającą ilość czasu, lista ta zawiera wszystkie możliwe typy obiektów zawartych w komunikatach ObjectMessage, które mogą być obsługiwane przez aplikację.
  3. Restartuj aplikację z następującym zestawem właściwości systemowych:
    -Dcom.ibm.mq.jms.allowlist=file:/<path to your allowlist file>  
    Dzięki temu możliwe jest włączenie opcji allowlisting, a jeśli program IBM MQ classes for JMS wykryje komunikat ObjectMessage typu, który nie znajduje się na liście allowlist, zostanie zgłoszony wyjątek JMSException zawierający komunikat JMSCC0052 lub JMSCC0053 .