Skip to content

Commit 864d575

Browse files
committed
Ensure support of the transport-nio by security plugin
Signed-off-by: Andriy Redko <[email protected]>
1 parent 9498793 commit 864d575

File tree

17 files changed

+1038
-28
lines changed

17 files changed

+1038
-28
lines changed

modules/transport-netty4/src/test/java/org/opensearch/http/netty4/Netty4HttpClient.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,13 +315,11 @@ private static class CountDownLatchHandlerHttp2 extends AwaitableChannelInitiali
315315

316316
private final CountDownLatch latch;
317317
private final Collection<FullHttpResponse> content;
318-
private final boolean secure;
319318
private Http2SettingsHandler settingsHandler;
320319

321320
CountDownLatchHandlerHttp2(final CountDownLatch latch, final Collection<FullHttpResponse> content, final boolean secure) {
322321
this.latch = latch;
323322
this.content = content;
324-
this.secure = secure;
325323
}
326324

327325
@Override

plugins/transport-nio/build.gradle

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ dependencies {
5050
api "io.netty:netty-handler:${versions.netty}"
5151
api "io.netty:netty-resolver:${versions.netty}"
5252
api "io.netty:netty-transport:${versions.netty}"
53+
api "io.netty:netty-transport-native-unix-common:${versions.netty}"
5354
}
5455

5556
tasks.named("dependencyLicenses").configure {
@@ -151,10 +152,6 @@ thirdPartyAudit {
151152
'io.netty.internal.tcnative.SessionTicketKey',
152153
'io.netty.internal.tcnative.SniHostNameMatcher',
153154

154-
// from io.netty.channel.unix (netty)
155-
'io.netty.channel.unix.FileDescriptor',
156-
'io.netty.channel.unix.UnixChannel',
157-
158155
'reactor.blockhound.BlockHound$Builder',
159156
'reactor.blockhound.integration.BlockHoundIntegration'
160157
)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
d1171bb99411f282068f49d780cedf8c9adeabfd

plugins/transport-nio/src/internalClusterTest/java/org/opensearch/http/nio/NioPipeliningIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public void testThatNioHttpServerSupportsPipelining() throws Exception {
6161
TransportAddress[] boundAddresses = httpServerTransport.boundAddress().boundAddresses();
6262
TransportAddress transportAddress = randomFrom(boundAddresses);
6363

64-
try (NioHttpClient nettyHttpClient = new NioHttpClient()) {
64+
try (NioHttpClient nettyHttpClient = NioHttpClient.http()) {
6565
Collection<FullHttpResponse> responses = nettyHttpClient.get(transportAddress.address(), requests);
6666
assertThat(responses, hasSize(5));
6767

plugins/transport-nio/src/main/java/org/opensearch/http/nio/HttpReadWriteHandler.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
package org.opensearch.http.nio;
3434

35+
import org.opensearch.common.Nullable;
3536
import org.opensearch.common.unit.TimeValue;
3637
import org.opensearch.http.HttpHandlingSettings;
3738
import org.opensearch.http.HttpPipelinedRequest;
@@ -44,6 +45,8 @@
4445
import org.opensearch.nio.TaskScheduler;
4546
import org.opensearch.nio.WriteOperation;
4647

48+
import javax.net.ssl.SSLEngine;
49+
4750
import java.io.IOException;
4851
import java.util.ArrayList;
4952
import java.util.List;
@@ -58,6 +61,7 @@
5861
import io.netty.handler.codec.http.HttpObjectAggregator;
5962
import io.netty.handler.codec.http.HttpRequestDecoder;
6063
import io.netty.handler.codec.http.HttpResponseEncoder;
64+
import io.netty.handler.ssl.SslHandler;
6165

6266
public class HttpReadWriteHandler implements NioChannelHandler {
6367

@@ -77,6 +81,17 @@ public HttpReadWriteHandler(
7781
HttpHandlingSettings settings,
7882
TaskScheduler taskScheduler,
7983
LongSupplier nanoClock
84+
) {
85+
this(nioHttpChannel, transport, settings, taskScheduler, nanoClock, null /* no SSL/TLS */);
86+
}
87+
88+
HttpReadWriteHandler(
89+
NioHttpChannel nioHttpChannel,
90+
NioHttpServerTransport transport,
91+
HttpHandlingSettings settings,
92+
TaskScheduler taskScheduler,
93+
LongSupplier nanoClock,
94+
@Nullable SSLEngine sslEngine
8095
) {
8196
this.nioHttpChannel = nioHttpChannel;
8297
this.transport = transport;
@@ -85,6 +100,11 @@ public HttpReadWriteHandler(
85100
this.readTimeoutNanos = TimeUnit.MILLISECONDS.toNanos(settings.getReadTimeoutMillis());
86101

87102
List<ChannelHandler> handlers = new ArrayList<>(8);
103+
104+
if (sslEngine != null) {
105+
handlers.add(new SslHandler(sslEngine));
106+
}
107+
88108
HttpRequestDecoder decoder = new HttpRequestDecoder(
89109
settings.getMaxInitialLineLength(),
90110
settings.getMaxHeaderSize(),

plugins/transport-nio/src/main/java/org/opensearch/http/nio/NioHttpServerTransport.java

Lines changed: 49 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.apache.logging.log4j.Logger;
3737
import org.opensearch.OpenSearchException;
3838
import org.opensearch.action.support.PlainActionFuture;
39+
import org.opensearch.common.Nullable;
3940
import org.opensearch.common.network.NetworkService;
4041
import org.opensearch.common.settings.ClusterSettings;
4142
import org.opensearch.common.settings.Settings;
@@ -47,6 +48,7 @@
4748
import org.opensearch.http.AbstractHttpServerTransport;
4849
import org.opensearch.http.HttpChannel;
4950
import org.opensearch.http.HttpServerChannel;
51+
import org.opensearch.http.nio.ssl.SslUtils;
5052
import org.opensearch.nio.BytesChannelContext;
5153
import org.opensearch.nio.ChannelFactory;
5254
import org.opensearch.nio.Config;
@@ -56,11 +58,15 @@
5658
import org.opensearch.nio.NioSocketChannel;
5759
import org.opensearch.nio.ServerChannelContext;
5860
import org.opensearch.nio.SocketChannelContext;
61+
import org.opensearch.plugins.SecureHttpTransportSettingsProvider;
5962
import org.opensearch.telemetry.tracing.Tracer;
6063
import org.opensearch.threadpool.ThreadPool;
6164
import org.opensearch.transport.nio.NioGroupFactory;
6265
import org.opensearch.transport.nio.PageAllocator;
6366

67+
import javax.net.ssl.SSLEngine;
68+
import javax.net.ssl.SSLException;
69+
6470
import java.io.IOException;
6571
import java.net.InetSocketAddress;
6672
import java.nio.channels.ServerSocketChannel;
@@ -97,6 +103,7 @@ public class NioHttpServerTransport extends AbstractHttpServerTransport {
97103

98104
private volatile NioGroup nioGroup;
99105
private ChannelFactory<NioHttpServerChannel, NioHttpChannel> channelFactory;
106+
private final SecureHttpTransportSettingsProvider secureHttpTransportSettingsProvider;
100107

101108
public NioHttpServerTransport(
102109
Settings settings,
@@ -109,6 +116,34 @@ public NioHttpServerTransport(
109116
NioGroupFactory nioGroupFactory,
110117
ClusterSettings clusterSettings,
111118
Tracer tracer
119+
) {
120+
this(
121+
settings,
122+
networkService,
123+
bigArrays,
124+
pageCacheRecycler,
125+
threadPool,
126+
xContentRegistry,
127+
dispatcher,
128+
nioGroupFactory,
129+
clusterSettings,
130+
null,
131+
tracer
132+
);
133+
}
134+
135+
public NioHttpServerTransport(
136+
Settings settings,
137+
NetworkService networkService,
138+
BigArrays bigArrays,
139+
PageCacheRecycler pageCacheRecycler,
140+
ThreadPool threadPool,
141+
NamedXContentRegistry xContentRegistry,
142+
Dispatcher dispatcher,
143+
NioGroupFactory nioGroupFactory,
144+
ClusterSettings clusterSettings,
145+
@Nullable SecureHttpTransportSettingsProvider secureHttpTransportSettingsProvider,
146+
Tracer tracer
112147
) {
113148
super(settings, networkService, bigArrays, threadPool, xContentRegistry, dispatcher, clusterSettings, tracer);
114149
this.pageAllocator = new PageAllocator(pageCacheRecycler);
@@ -127,6 +162,7 @@ public NioHttpServerTransport(
127162
this.reuseAddress = SETTING_HTTP_TCP_REUSE_ADDRESS.get(settings);
128163
this.tcpSendBufferSize = Math.toIntExact(SETTING_HTTP_TCP_SEND_BUFFER_SIZE.get(settings).getBytes());
129164
this.tcpReceiveBufferSize = Math.toIntExact(SETTING_HTTP_TCP_RECEIVE_BUFFER_SIZE.get(settings).getBytes());
165+
this.secureHttpTransportSettingsProvider = secureHttpTransportSettingsProvider;
130166

131167
logger.debug(
132168
"using max_chunk_size[{}], max_header_size[{}], max_initial_line_length[{}], max_content_length[{}],"
@@ -178,17 +214,24 @@ protected HttpServerChannel bind(InetSocketAddress socketAddress) throws IOExcep
178214
return httpServerChannel;
179215
}
180216

181-
protected ChannelFactory<NioHttpServerChannel, NioHttpChannel> channelFactory() {
182-
return new HttpChannelFactory();
217+
protected ChannelFactory<NioHttpServerChannel, NioHttpChannel> channelFactory() throws SSLException {
218+
SSLEngine engine = null;
219+
if (secureHttpTransportSettingsProvider != null) {
220+
engine = secureHttpTransportSettingsProvider.buildSecureHttpServerEngine(settings, this)
221+
.orElseGet(SslUtils::createDefaultServerSSLEngine);
222+
}
223+
224+
return new HttpChannelFactory(engine);
183225
}
184226

185227
protected void acceptChannel(NioSocketChannel socketChannel) {
186228
super.serverAcceptedChannel((HttpChannel) socketChannel);
187229
}
188230

189231
private class HttpChannelFactory extends ChannelFactory<NioHttpServerChannel, NioHttpChannel> {
232+
private final SSLEngine engine;
190233

191-
private HttpChannelFactory() {
234+
private HttpChannelFactory(@Nullable SSLEngine engine) {
192235
super(
193236
tcpNoDelay,
194237
tcpKeepAlive,
@@ -199,6 +242,7 @@ private HttpChannelFactory() {
199242
tcpSendBufferSize,
200243
tcpReceiveBufferSize
201244
);
245+
this.engine = engine;
202246
}
203247

204248
@Override
@@ -209,7 +253,8 @@ public NioHttpChannel createChannel(NioSelector selector, SocketChannel channel,
209253
NioHttpServerTransport.this,
210254
handlingSettings,
211255
selector.getTaskScheduler(),
212-
threadPool::relativeTimeInMillis
256+
threadPool::relativeTimeInMillis,
257+
engine
213258
);
214259
Consumer<Exception> exceptionHandler = (e) -> onException(httpChannel, e);
215260
SocketChannelContext context = new BytesChannelContext(
@@ -244,6 +289,5 @@ public NioHttpServerChannel createServerChannel(
244289
httpServerChannel.setContext(context);
245290
return httpServerChannel;
246291
}
247-
248292
}
249293
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
*
4+
* The OpenSearch Contributors require contributions made to
5+
* this file be licensed under the Apache-2.0 license or a
6+
* compatible open source license.
7+
*
8+
* Modifications Copyright OpenSearch Contributors. See
9+
* GitHub history for details.
10+
*/
11+
package org.opensearch.http.nio.ssl;
12+
13+
import org.opensearch.OpenSearchSecurityException;
14+
15+
import javax.net.ssl.SSLContext;
16+
import javax.net.ssl.SSLEngine;
17+
18+
import java.security.NoSuchAlgorithmException;
19+
20+
public class SslUtils {
21+
private static final String[] DEFAULT_SSL_PROTOCOLS = { "TLSv1.3", "TLSv1.2", "TLSv1.1" };
22+
23+
private SslUtils() {
24+
25+
}
26+
27+
public static SSLEngine createDefaultServerSSLEngine() {
28+
try {
29+
final SSLEngine engine = SSLContext.getDefault().createSSLEngine();
30+
engine.setEnabledProtocols(DEFAULT_SSL_PROTOCOLS);
31+
engine.setUseClientMode(false);
32+
return engine;
33+
} catch (final NoSuchAlgorithmException ex) {
34+
throw new OpenSearchSecurityException("Unable to initialize default server SSL engine", ex);
35+
}
36+
}
37+
38+
public static SSLEngine createDefaultClientSSLEngine() {
39+
try {
40+
final SSLEngine engine = SSLContext.getDefault().createSSLEngine();
41+
engine.setEnabledProtocols(DEFAULT_SSL_PROTOCOLS);
42+
engine.setUseClientMode(true);
43+
return engine;
44+
} catch (final NoSuchAlgorithmException ex) {
45+
throw new OpenSearchSecurityException("Unable to initialize default client SSL engine", ex);
46+
}
47+
}
48+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
*
4+
* The OpenSearch Contributors require contributions made to
5+
* this file be licensed under the Apache-2.0 license or a
6+
* compatible open source license.
7+
*/
8+
9+
/**
10+
* SSL supporting utility classes
11+
*/
12+
package org.opensearch.http.nio.ssl;

plugins/transport-nio/src/main/java/org/opensearch/transport/nio/NioTransport.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import org.opensearch.nio.NioSelector;
5353
import org.opensearch.nio.NioSocketChannel;
5454
import org.opensearch.nio.ServerChannelContext;
55+
import org.opensearch.plugins.SecureTransportSettingsProvider;
5556
import org.opensearch.telemetry.tracing.Tracer;
5657
import org.opensearch.threadpool.ThreadPool;
5758
import org.opensearch.transport.TcpTransport;
@@ -87,6 +88,32 @@ protected NioTransport(
8788
CircuitBreakerService circuitBreakerService,
8889
NioGroupFactory groupFactory,
8990
Tracer tracer
91+
) {
92+
this(
93+
settings,
94+
version,
95+
threadPool,
96+
networkService,
97+
pageCacheRecycler,
98+
namedWriteableRegistry,
99+
circuitBreakerService,
100+
groupFactory,
101+
null,
102+
tracer
103+
);
104+
}
105+
106+
protected NioTransport(
107+
Settings settings,
108+
Version version,
109+
ThreadPool threadPool,
110+
NetworkService networkService,
111+
PageCacheRecycler pageCacheRecycler,
112+
NamedWriteableRegistry namedWriteableRegistry,
113+
CircuitBreakerService circuitBreakerService,
114+
NioGroupFactory groupFactory,
115+
SecureTransportSettingsProvider secureTransportSettingsProvider,
116+
Tracer tracer
90117
) {
91118
super(settings, version, threadPool, pageCacheRecycler, circuitBreakerService, namedWriteableRegistry, networkService, tracer);
92119
this.pageAllocator = new PageAllocator(pageCacheRecycler);

0 commit comments

Comments
 (0)