Remoting WildFly Subsystem Concepts

From NovaOrdis Knowledge Base
Revision as of 07:28, 8 September 2017 by Ovidiu (talk | contribs) (→‎EAP 7 Note)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Internal

EAP 7 Note

In EAP 7, the default remoting connector has changed from "remote" to "http-remoting" and the default remote connection port has changed from 4447 to 8080.

The JNDI provider URL for the default configuration has changed from remote://localhost:4447 to http-remoting://localhost:8080.

The initial context factory class name is org.jboss.naming.remote.client.InitialContextFactory.

JNDI and Remoting

See

JNDI and Remoting

Remoting and the Management Interfaces

EAP 6

TODO: clarify the relationship between the remoting subsystem and the instance's management interfaces. When booting an EAP 6 instance, we get:

org.jboss.as.remoting] (MSC service thread 1-5) JBAS017100: Listening on 127.0.0.1:9999

which indicates that the management interface (9999) and remoting are related.


EAP 7

Security

Remoting connection attempts are authenticated against a configurable set of authentication mechanisms.

The presence of the 'security-realm' attribute in the remoting connector configuration triggers authentication enforcement within the remoting service, by initializing the list of authentication mechanisms to those contributed by the security realm.

For EAP 6:

<subsystem xmlns="urn:jboss:domain:remoting:1.1">
   <connector name="remoting-connector" socket-binding="remoting" security-realm="ApplicationRealm"/>
</subsystem>

For EAP 7:

TODO

The "ApplicationRealm" security realm employs "DIGEST" and "LOCAL" security mechanisms.

For more details on the local authentication mechanism see the local file-based authentication mechanism.

Removing 'security-realm="ApplicationRealm"' from the remoting connector configuration ends up in the installation of the "ANONYMOUS" authentication mechanism, which enforces no authentication.

For more details on configuring security-realm see security-realm.

For more on JBoss 7 security, see WildFly Security Realms.

JBoss Remoting Client-Side Programmatic Login

When JBoss Remoting is used to by a JMX connection, authentication is programmed as described below: "Authentication for Remoting JMX Access".

Threading Model

All invocations arriving on the subsystem's connectors are handled by the subsystem's threads, which are all grouped under the worker thread pool. Various worker thread pool attributes are configured on the worker-thread-pool element. For more details on configuring the thread pool, see:

<worker-thread-pool> Configuration

Also see:

WildFly Threads Subsystem Concepts

Remoting and JMX Access

JBoss Remoting provides the transport of the JSR-160 Java Management Extensions (JMX) Remote API compliant implementation of a JMXConnector that can be used by standard monitoring applications (such as VisualVM) to access the JMX bus. This is why JBoss Remoting configuration and security is relevant when an external JMX client needs access to JBoss.

For practical details on how various JMX clients can connect to WildFly instances, see:

WildFly and JMX

Authentication for Remoting JMX Access

These considerations apply when JBoss Remoting is used to establish an authenticated remote JMX connection to the JBoss server. During connection initialization, JBoss Remoting runtime looks for an environment key named "jmx.remote.credentials" (javax.management.remote.JMXConnector.CREDENTIALS), and expects that the corresponding value is a String[2], which in turn is expected to contain the username on the first position and the password on the second. If org.jboss.remotingjmx.RemotingConnector instance finds this environment entry, the proper UsernamePasswordCallbackHandler is installed by org.jboss.remotingjmx.RemotingConnector.internalRemotingConnect(...) so when an authentication challenge comes from the server, the proper credentials are processed.

Essentially, this is what is needed:

Map<String, Object> environment = new HashMap<>();
String[] payload = new String[] {"my-username", "my-password"};
environment.put(javax.management.remote.JMXConnector.CREDENTIALS, payload);

More details about the server-side digest mechanism used by JBoss can be found here JBoss Authentication Digest Mechanism.