10:34:56,791 FATAL [org.keycloak.services] (ServerService Thread Pool -- 64) org.infinispan.client.hotrod.exceptions.HotRodClientException:Request for messageId=64 returned server error (status=0x85): java.lang.SecurityException: ISPN006017: Unauthorized 'GET' operation
All configuration is made in accordance with the documentation https://www.keycloak.org/docs/10.0/server_installation/#serversetup
An external Infinispan cluster is based on infinispan/server:11.0.3.Final-1 docker image with the following resulting configuration:
infinispan.xml:
<infinispan
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:infinispan:config:11.0 https://infinispan.org/schemas/infinispan-config-11.0.xsd
urn:infinispan:server:11.0 https://infinispan.org/schemas/infinispan-server-11.0.xsd
urn:org:jgroups https://www.jgroups.org/schema/jgroups-4.2.xsd"
xmlns="urn:infinispan:config:11.0"
xmlns:server="urn:infinispan:server:11.0">
<jgroups>
<stack-file name="image-tcp" path="jgroups-tcp.xml"/>
<stack-file name="relay-global" path="jgroups-relay.xml"/>
<stack name="xsite" extends="image-tcp">
<relay.RELAY2 xmlns="urn:org:jgroups" site="test1" max_site_masters="1"
can_become_site_master="true"/>
<remote-sites default-stack="relay-global">
<remote-site name="test1"/>
<remote-site name="test2"/>
</remote-sites>
</stack>
</jgroups>
<cache-container name="default" statistics="true">
<transport cluster="infinispan"
stack="xsite"/>
</cache-container>
<server xmlns="urn:infinispan:server:11.0">
<interfaces>
<interface name="public">
<inet-address value="${infinispan.bind.address:172.21.1.26}"/>
</interface>
</interfaces>
<socket-bindings default-interface="public" port-offset="0">
<socket-binding name="default" port="11222"/>
</socket-bindings>
<security>
<security-realms>
<security-realm name="default">
<properties-realm groups-attribute="Roles">
<user-properties path="users.properties" relative-to="infinispan.server.config.path"
plain-text="true"/>
<group-properties path="groups.properties" relative-to="infinispan.server.config.path"/>
</properties-realm>
</security-realm>
</security-realms>
</security>
<endpoints socket-binding="default" security-realm="default">
<hotrod-connector name="hotrod">
<authentication>
<sasl mechanisms="SCRAM-SHA-512 SCRAM-SHA-384 SCRAM-SHA-256 SCRAM-SHA-1 DIGEST-SHA-512 DIGEST-SHA-384 DIGEST-SHA-256 DIGEST-SHA DIGEST-MD5 PLAIN"
qop="auth" server-name="infinispan"/>
</authentication>
</hotrod-connector>
<rest-connector name="rest">
<authentication mechanisms="DIGEST"/>
</rest-connector>
</endpoints>
</server>
</infinispan>
Keycloak starts with the following startup script:
00:00:03,808 DEBUG [org.keycloak.models.sessions.infinispan.InfinispanAuthenticationSessionProviderFactory] (ServerService Thread Pool -- 67) Registered cluster listeners
00:00:03,810 DEBUG [org.keycloak.models.sessions.infinispan.InfinispanUserSessionProviderFactory] (ServerService Thread Pool -- 67) Will preload sessions with transaction timeout 300 seconds
00:00:03,819 INFO [org.keycloak.models.sessions.infinispan.InfinispanUserSessionProviderFactory] (ServerService Thread Pool -- 67) Remote store configured for cache 'sessions'
00:00:03,832 INFO [org.keycloak.models.sessions.infinispan.InfinispanUserSessionProviderFactory] (ServerService Thread Pool -- 67) Remote store configured for cache 'clientSessions'
00:00:03,836 INFO [org.keycloak.models.sessions.infinispan.InfinispanUserSessionProviderFactory] (ServerService Thread Pool -- 67) Remote store configured for cache 'offlineSessions'
00:00:03,838 INFO [org.keycloak.models.sessions.infinispan.InfinispanUserSessionProviderFactory] (ServerService Thread Pool -- 67) Remote store configured for cache 'offlineClientSessions'
00:00:03,849 INFO [org.keycloak.models.sessions.infinispan.InfinispanUserSessionProviderFactory] (ServerService Thread Pool -- 67) Remote store configured for cache 'loginFailures'
00:00:03,853 DEBUG [org.keycloak.models.sessions.infinispan.InfinispanUserSessionProviderFactory] (ServerService Thread Pool -- 67) Start pre-loading userSessions from persistent storage
00:00:03,862 DEBUG [org.keycloak.models.sessions.infinispan.initializer.OfflinePersistentUserSessionLoader] (ServerService Thread Pool -- 67) Persistent sessions loaded already.
00:00:03,867 DEBUG [org.keycloak.models.sessions.infinispan.InfinispanUserSessionProviderFactory] (ServerService Thread Pool -- 67) Pre-loading userSessions from persistent storage finished
00:00:03,876 DEBUG [org.keycloak.models.sessions.infinispan.InfinispanUserSessionProviderFactory] (ServerService Thread Pool -- 67) Registered cluster listeners
00:00:03,879 DEBUG [org.keycloak.models.sessions.infinispan.InfinispanUserSessionProviderFactory] (ServerService Thread Pool -- 67) Check pre-loading sessions from remote cache 'offlineClientSessions'
00:00:03,883 DEBUG [org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheSessionsLoader] (ServerService Thread Pool -- 67) Sessions already loaded in current DC. Skip sessions loading from remote cache 'offlineClientSessions'
00:00:03,884 DEBUG [org.keycloak.models.sessions.infinispan.InfinispanUserSessionProviderFactory] (ServerService Thread Pool -- 67) Pre-loading sessions from remote cache 'offlineClientSessions' finished
00:00:03,884 DEBUG [org.keycloak.models.sessions.infinispan.InfinispanUserSessionProviderFactory] (ServerService Thread Pool -- 67) Check pre-loading sessions from remote cache 'sessions'
00:00:03,885 DEBUG [org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheSessionsLoader] (ServerService Thread Pool -- 67) Sessions maybe not yet loaded in current DC. Will load them from remote cache 'sessions'
00:00:04,886 DEBUG [org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheSessionsLoader] (ServerService Thread Pool -- 67) Sessions maybe not yet loaded in current DC. Will load them from remote cache 'sessions'
00:00:05,887 DEBUG [org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheSessionsLoader] (ServerService Thread Pool -- 67) Sessions maybe not yet loaded in current DC. Will load them from remote cache 'sessions'
.... The same log records every 1second ...
00:00:13,765 DEBUG [org.keycloak.models.sessions.infinispan.changes.sessions.CrossDCLastSessionRefreshListener] (EE-ManagedExecutorService-default-Thread-3) Received refreshes. Offline true, refreshes: {}.
00:01:03,835 DEBUG [org.keycloak.models.sessions.infinispan.changes.sessions.CrossDCLastSessionRefreshStore] (Timer-2) Sending lastSessionRefreshes for key 'lastSessionRefreshes'. Refreshes: {}
00:01:03,917 DEBUG [org.keycloak.models.sessions.infinispan.changes.sessions.CrossDCLastSessionRefreshStore] (Timer-2) Sending lastSessionRefreshes for key 'lastSessionRefreshes-offline'. Refreshes: {}
00:01:03,944 DEBUG [org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheSessionsLoader] (ServerService Thread Pool -- 67) Sessions maybe not yet loaded in current DC. Will load them from remote cache 'sessions'
00:01:03,993 DEBUG [org.keycloak.models.sessions.infinispan.changes.sessions.PersisterLastSessionRefreshStore] (Timer-2) Updating 0 userSessions with lastSessionRefresh: 1601424003
00:01:04,945 DEBUG [org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheSessionsLoader] (ServerService Thread Pool -- 67) Sessions maybe not yet loaded in current DC. Will load them from remote cache 'sessions'
.... And then again 'Will load them from remote cache 'sessions' until SIGTERM received ...
I found a similar issue https://issues.redhat.com/browse/KEYCLOAK-6783?attachmentOrder=asc. Marek Posolda mentioned: "On JDG side, there needs to be secured HotRod endpoint deployed in addition to default "unsecured" HotRod endpoint", but it seems that Infinispan 11 cannot be configured with 2 different socket-bindings using the same HotRod protocol, the official Keycloak documentation does not mention this nuance and there are no two different endpoints in the Keycloak repository https://github.com/keycloak/keycloak/tree/10.0.2/testsuite/integration-arquillian/servers/cache-server/jboss/common