Skip to content

Commit f4705b2

Browse files
authored
[Backport] [2.x] Switch to built-in security transports from core (#4119) (#4174)
Backport of #4119 to `2.x`
1 parent 80cee28 commit f4705b2

15 files changed

+509
-706
lines changed

src/main/java/org/opensearch/security/OpenSearchSecurityPlugin.java

+29-18
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import java.util.List;
4545
import java.util.Map;
4646
import java.util.Objects;
47+
import java.util.Optional;
4748
import java.util.Set;
4849
import java.util.concurrent.atomic.AtomicReference;
4950
import java.util.function.BiFunction;
@@ -112,6 +113,8 @@
112113
import org.opensearch.plugins.ExtensionAwarePlugin;
113114
import org.opensearch.plugins.IdentityPlugin;
114115
import org.opensearch.plugins.MapperPlugin;
116+
import org.opensearch.plugins.SecureSettingsFactory;
117+
import org.opensearch.plugins.SecureTransportSettingsProvider;
115118
import org.opensearch.repositories.RepositoriesService;
116119
import org.opensearch.rest.RestController;
117120
import org.opensearch.rest.RestHandler;
@@ -148,8 +151,8 @@
148151
import org.opensearch.security.dlic.rest.validation.PasswordValidator;
149152
import org.opensearch.security.filter.SecurityFilter;
150153
import org.opensearch.security.filter.SecurityRestFilter;
151-
import org.opensearch.security.http.SecurityHttpServerTransport;
152-
import org.opensearch.security.http.SecurityNonSslHttpServerTransport;
154+
import org.opensearch.security.http.NonSslHttpServerTransport;
155+
import org.opensearch.security.http.SecureHttpServerTransport;
153156
import org.opensearch.security.http.XFFResolver;
154157
import org.opensearch.security.identity.SecurityTokenManager;
155158
import org.opensearch.security.privileges.PrivilegesEvaluator;
@@ -165,11 +168,11 @@
165168
import org.opensearch.security.securityconf.DynamicConfigFactory;
166169
import org.opensearch.security.setting.OpensearchDynamicSetting;
167170
import org.opensearch.security.setting.TransportPassiveAuthSetting;
171+
import org.opensearch.security.ssl.OpenSearchSecureSettingsFactory;
168172
import org.opensearch.security.ssl.OpenSearchSecuritySSLPlugin;
169173
import org.opensearch.security.ssl.SslExceptionHandler;
170174
import org.opensearch.security.ssl.http.netty.ValidatingDispatcher;
171175
import org.opensearch.security.ssl.transport.DefaultPrincipalExtractor;
172-
import org.opensearch.security.ssl.transport.SecuritySSLNettyTransport;
173176
import org.opensearch.security.ssl.util.SSLConfigConstants;
174177
import org.opensearch.security.support.ConfigConstants;
175178
import org.opensearch.security.support.GuardedSearchOperationWrapper;
@@ -197,6 +200,7 @@
197200
import org.opensearch.transport.TransportRequestOptions;
198201
import org.opensearch.transport.TransportResponseHandler;
199202
import org.opensearch.transport.TransportService;
203+
import org.opensearch.transport.netty4.ssl.SecureNetty4Transport;
200204
import org.opensearch.watcher.ResourceWatcherService;
201205

202206
import static org.opensearch.security.dlic.rest.api.RestApiAdminPrivilegesEvaluator.ENDPOINTS_WITH_PERMISSIONS;
@@ -855,44 +859,44 @@ public <T extends TransportResponse> void sendRequest(
855859
}
856860

857861
@Override
858-
public Map<String, Supplier<Transport>> getTransports(
862+
public Map<String, Supplier<Transport>> getSecureTransports(
859863
Settings settings,
860864
ThreadPool threadPool,
861865
PageCacheRecycler pageCacheRecycler,
862866
CircuitBreakerService circuitBreakerService,
863867
NamedWriteableRegistry namedWriteableRegistry,
864868
NetworkService networkService,
869+
SecureTransportSettingsProvider secureTransportSettingsProvider,
865870
Tracer tracer
866871
) {
867872
Map<String, Supplier<Transport>> transports = new HashMap<String, Supplier<Transport>>();
868873

869874
if (SSLConfig.isSslOnlyMode()) {
870-
return super.getTransports(
875+
return super.getSecureTransports(
871876
settings,
872877
threadPool,
873878
pageCacheRecycler,
874879
circuitBreakerService,
875880
namedWriteableRegistry,
876881
networkService,
882+
secureTransportSettingsProvider,
877883
tracer
878884
);
879885
}
880886

881887
if (transportSSLEnabled) {
882888
transports.put(
883889
"org.opensearch.security.ssl.http.netty.SecuritySSLNettyTransport",
884-
() -> new SecuritySSLNettyTransport(
885-
settings,
890+
() -> new SecureNetty4Transport(
891+
migrateSettings(settings),
886892
Version.CURRENT,
887893
threadPool,
888894
networkService,
889895
pageCacheRecycler,
890896
namedWriteableRegistry,
891897
circuitBreakerService,
892-
sks,
893-
evaluateSslExceptionHandler(),
894898
sharedGroupFactory,
895-
SSLConfig,
899+
secureTransportSettingsProvider,
896900
tracer
897901
)
898902
);
@@ -901,7 +905,7 @@ public Map<String, Supplier<Transport>> getTransports(
901905
}
902906

903907
@Override
904-
public Map<String, Supplier<HttpServerTransport>> getHttpTransports(
908+
public Map<String, Supplier<HttpServerTransport>> getSecureHttpTransports(
905909
Settings settings,
906910
ThreadPool threadPool,
907911
BigArrays bigArrays,
@@ -911,11 +915,12 @@ public Map<String, Supplier<HttpServerTransport>> getHttpTransports(
911915
NetworkService networkService,
912916
Dispatcher dispatcher,
913917
ClusterSettings clusterSettings,
918+
SecureTransportSettingsProvider secureTransportSettingsProvider,
914919
Tracer tracer
915920
) {
916921

917922
if (SSLConfig.isSslOnlyMode()) {
918-
return super.getHttpTransports(
923+
return super.getSecureHttpTransports(
919924
settings,
920925
threadPool,
921926
bigArrays,
@@ -925,6 +930,7 @@ public Map<String, Supplier<HttpServerTransport>> getHttpTransports(
925930
networkService,
926931
dispatcher,
927932
clusterSettings,
933+
secureTransportSettingsProvider,
928934
tracer
929935
);
930936
}
@@ -940,17 +946,16 @@ public Map<String, Supplier<HttpServerTransport>> getHttpTransports(
940946
evaluateSslExceptionHandler()
941947
);
942948
// TODO close odshst
943-
final SecurityHttpServerTransport odshst = new SecurityHttpServerTransport(
944-
settings,
949+
final SecureHttpServerTransport odshst = new SecureHttpServerTransport(
950+
migrateSettings(settings),
945951
networkService,
946952
bigArrays,
947953
threadPool,
948-
sks,
949-
evaluateSslExceptionHandler(),
950954
xContentRegistry,
951955
validatingDispatcher,
952956
clusterSettings,
953957
sharedGroupFactory,
958+
secureTransportSettingsProvider,
954959
tracer,
955960
securityRestHandler
956961
);
@@ -959,15 +964,16 @@ public Map<String, Supplier<HttpServerTransport>> getHttpTransports(
959964
} else if (!client) {
960965
return Collections.singletonMap(
961966
"org.opensearch.security.http.SecurityHttpServerTransport",
962-
() -> new SecurityNonSslHttpServerTransport(
963-
settings,
967+
() -> new NonSslHttpServerTransport(
968+
migrateSettings(settings),
964969
networkService,
965970
bigArrays,
966971
threadPool,
967972
xContentRegistry,
968973
dispatcher,
969974
clusterSettings,
970975
sharedGroupFactory,
976+
secureTransportSettingsProvider,
971977
tracer,
972978
securityRestHandler
973979
)
@@ -2003,6 +2009,11 @@ public SecurityTokenManager getTokenManager() {
20032009
return tokenManager;
20042010
}
20052011

2012+
@Override
2013+
public Optional<SecureSettingsFactory> getSecureSettingFactory(Settings settings) {
2014+
return Optional.of(new OpenSearchSecureSettingsFactory(settings, sks, sslExceptionHandler));
2015+
}
2016+
20062017
public static class GuiceHolder implements LifecycleComponent {
20072018

20082019
private static RepositoriesService repositoriesService;

src/main/java/org/opensearch/security/filter/NettyAttribute.java

+11
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
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+
112
package org.opensearch.security.filter;
213

314
import java.util.Optional;

src/main/java/org/opensearch/security/filter/SecurityRestFilter.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,10 @@
6969

7070
import static org.opensearch.security.OpenSearchSecurityPlugin.LEGACY_OPENDISTRO_PREFIX;
7171
import static org.opensearch.security.OpenSearchSecurityPlugin.PLUGINS_PREFIX;
72-
import static org.opensearch.security.http.SecurityHttpServerTransport.CONTEXT_TO_RESTORE;
73-
import static org.opensearch.security.http.SecurityHttpServerTransport.EARLY_RESPONSE;
74-
import static org.opensearch.security.http.SecurityHttpServerTransport.IS_AUTHENTICATED;
75-
import static org.opensearch.security.http.SecurityHttpServerTransport.UNCONSUMED_PARAMS;
72+
import static org.opensearch.security.http.SecureHttpServerTransport.CONTEXT_TO_RESTORE;
73+
import static org.opensearch.security.http.SecureHttpServerTransport.EARLY_RESPONSE;
74+
import static org.opensearch.security.http.SecureHttpServerTransport.IS_AUTHENTICATED;
75+
import static org.opensearch.security.http.SecureHttpServerTransport.UNCONSUMED_PARAMS;
7676

7777
public class SecurityRestFilter {
7878

src/main/java/org/opensearch/security/http/SecurityNonSslHttpServerTransport.java src/main/java/org/opensearch/security/http/NonSslHttpServerTransport.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import org.opensearch.core.xcontent.NamedXContentRegistry;
3434
import org.opensearch.http.HttpHandlingSettings;
3535
import org.opensearch.http.netty4.Netty4HttpServerTransport;
36+
import org.opensearch.http.netty4.ssl.SecureNetty4HttpServerTransport;
37+
import org.opensearch.plugins.SecureTransportSettingsProvider;
3638
import org.opensearch.security.filter.SecurityRestFilter;
3739
import org.opensearch.security.ssl.http.netty.Netty4ConditionalDecompressor;
3840
import org.opensearch.security.ssl.http.netty.Netty4HttpRequestHeaderVerifier;
@@ -44,11 +46,11 @@
4446
import io.netty.channel.ChannelHandler;
4547
import io.netty.channel.ChannelInboundHandlerAdapter;
4648

47-
public class SecurityNonSslHttpServerTransport extends Netty4HttpServerTransport {
49+
public class NonSslHttpServerTransport extends SecureNetty4HttpServerTransport {
4850

4951
private final ChannelInboundHandlerAdapter headerVerifier;
5052

51-
public SecurityNonSslHttpServerTransport(
53+
public NonSslHttpServerTransport(
5254
final Settings settings,
5355
final NetworkService networkService,
5456
final BigArrays bigArrays,
@@ -57,6 +59,7 @@ public SecurityNonSslHttpServerTransport(
5759
final Dispatcher dispatcher,
5860
final ClusterSettings clusterSettings,
5961
final SharedGroupFactory sharedGroupFactory,
62+
final SecureTransportSettingsProvider secureTransportSettingsProvider,
6063
final Tracer tracer,
6164
final SecurityRestFilter restFilter
6265
) {
@@ -69,6 +72,7 @@ public SecurityNonSslHttpServerTransport(
6972
dispatcher,
7073
clusterSettings,
7174
sharedGroupFactory,
75+
secureTransportSettingsProvider,
7276
tracer
7377
);
7478
headerVerifier = new Netty4HttpRequestHeaderVerifier(restFilter, threadPool, settings);

src/main/java/org/opensearch/security/http/SecurityHttpServerTransport.java src/main/java/org/opensearch/security/http/SecureHttpServerTransport.java

+24-11
Original file line numberDiff line numberDiff line change
@@ -34,19 +34,21 @@
3434
import org.opensearch.common.util.BigArrays;
3535
import org.opensearch.common.util.concurrent.ThreadContext;
3636
import org.opensearch.core.xcontent.NamedXContentRegistry;
37+
import org.opensearch.http.netty4.ssl.SecureNetty4HttpServerTransport;
38+
import org.opensearch.plugins.SecureTransportSettingsProvider;
3739
import org.opensearch.security.filter.SecurityResponse;
3840
import org.opensearch.security.filter.SecurityRestFilter;
39-
import org.opensearch.security.ssl.SecurityKeyStore;
40-
import org.opensearch.security.ssl.SslExceptionHandler;
41-
import org.opensearch.security.ssl.http.netty.SecuritySSLNettyHttpServerTransport;
41+
import org.opensearch.security.ssl.http.netty.Netty4ConditionalDecompressor;
42+
import org.opensearch.security.ssl.http.netty.Netty4HttpRequestHeaderVerifier;
4243
import org.opensearch.security.ssl.http.netty.ValidatingDispatcher;
4344
import org.opensearch.telemetry.tracing.Tracer;
4445
import org.opensearch.threadpool.ThreadPool;
4546
import org.opensearch.transport.SharedGroupFactory;
4647

48+
import io.netty.channel.ChannelInboundHandlerAdapter;
4749
import io.netty.util.AttributeKey;
4850

49-
public class SecurityHttpServerTransport extends SecuritySSLNettyHttpServerTransport {
51+
public class SecureHttpServerTransport extends SecureNetty4HttpServerTransport {
5052

5153
public static final AttributeKey<SecurityResponse> EARLY_RESPONSE = AttributeKey.newInstance("opensearch-http-early-response");
5254
public static final AttributeKey<Set<String>> UNCONSUMED_PARAMS = AttributeKey.newInstance("opensearch-http-request-consumed-params");
@@ -56,17 +58,18 @@ public class SecurityHttpServerTransport extends SecuritySSLNettyHttpServerTrans
5658
public static final AttributeKey<Boolean> SHOULD_DECOMPRESS = AttributeKey.newInstance("opensearch-http-should-decompress");
5759
public static final AttributeKey<Boolean> IS_AUTHENTICATED = AttributeKey.newInstance("opensearch-http-is-authenticated");
5860

59-
public SecurityHttpServerTransport(
61+
private final ChannelInboundHandlerAdapter headerVerifier;
62+
63+
public SecureHttpServerTransport(
6064
final Settings settings,
6165
final NetworkService networkService,
6266
final BigArrays bigArrays,
6367
final ThreadPool threadPool,
64-
final SecurityKeyStore odsks,
65-
final SslExceptionHandler sslExceptionHandler,
6668
final NamedXContentRegistry namedXContentRegistry,
6769
final ValidatingDispatcher dispatcher,
6870
final ClusterSettings clusterSettings,
6971
SharedGroupFactory sharedGroupFactory,
72+
final SecureTransportSettingsProvider secureTransportSettingsProvider,
7073
Tracer tracer,
7174
SecurityRestFilter restFilter
7275
) {
@@ -75,14 +78,24 @@ public SecurityHttpServerTransport(
7578
networkService,
7679
bigArrays,
7780
threadPool,
78-
odsks,
7981
namedXContentRegistry,
8082
dispatcher,
81-
sslExceptionHandler,
8283
clusterSettings,
8384
sharedGroupFactory,
84-
tracer,
85-
restFilter
85+
secureTransportSettingsProvider,
86+
tracer
8687
);
88+
89+
headerVerifier = new Netty4HttpRequestHeaderVerifier(restFilter, threadPool, settings);
90+
}
91+
92+
@Override
93+
protected ChannelInboundHandlerAdapter createHeaderVerifier() {
94+
return headerVerifier;
95+
}
96+
97+
@Override
98+
protected ChannelInboundHandlerAdapter createDecompressor() {
99+
return new Netty4ConditionalDecompressor();
87100
}
88101
}

0 commit comments

Comments
 (0)