Skip to content

Commit 3464adb

Browse files
authored
Adjust Bootstrap and JVM options to ensure the SM is never used when entitlements are enabled (#119689)
1 parent 66f7c7b commit 3464adb

File tree

4 files changed

+20
-9
lines changed

4 files changed

+20
-9
lines changed

distribution/tools/server-cli/src/main/java/org/elasticsearch/server/cli/SystemJvmOptions.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ static List<String> systemJvmOptions(Settings nodeSettings, final Map<String, St
7171
maybeSetActiveProcessorCount(nodeSettings),
7272
maybeSetReplayFile(distroType, isHotspot),
7373
maybeWorkaroundG1Bug(),
74-
maybeAllowSecurityManager(),
74+
maybeAllowSecurityManager(useEntitlements),
7575
maybeAttachEntitlementAgent(useEntitlements)
7676
).flatMap(s -> s).toList();
7777
}
@@ -140,8 +140,8 @@ private static Stream<String> maybeWorkaroundG1Bug() {
140140
}
141141

142142
@UpdateForV9(owner = UpdateForV9.Owner.CORE_INFRA)
143-
private static Stream<String> maybeAllowSecurityManager() {
144-
if (RuntimeVersionFeature.isSecurityManagerAvailable()) {
143+
private static Stream<String> maybeAllowSecurityManager(boolean useEntitlements) {
144+
if (useEntitlements == false && RuntimeVersionFeature.isSecurityManagerAvailable()) {
145145
// Will become conditional on useEntitlements once entitlements can run without SM
146146
return Stream.of("-Djava.security.manager=allow");
147147
}

server/src/main/java/org/elasticsearch/bootstrap/Bootstrap.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class Bootstrap {
3333

3434
// arguments from the CLI process
3535
private final ServerArgs args;
36+
private final boolean useEntitlements;
3637

3738
// controller for spawning component subprocesses
3839
private final Spawner spawner = new Spawner();
@@ -46,10 +47,11 @@ class Bootstrap {
4647
// loads information about plugins required for entitlements in phase 2, used by plugins service in phase 3
4748
private final SetOnce<PluginsLoader> pluginsLoader = new SetOnce<>();
4849

49-
Bootstrap(PrintStream out, PrintStream err, ServerArgs args) {
50+
Bootstrap(PrintStream out, PrintStream err, ServerArgs args, boolean useEntitlements) {
5051
this.out = out;
5152
this.err = err;
5253
this.args = args;
54+
this.useEntitlements = useEntitlements;
5355
}
5456

5557
ServerArgs args() {
@@ -60,6 +62,10 @@ Spawner spawner() {
6062
return spawner;
6163
}
6264

65+
public boolean useEntitlements() {
66+
return useEntitlements;
67+
}
68+
6369
void setSecureSettings(SecureSettings secureSettings) {
6470
this.secureSettings.set(secureSettings);
6571
}

server/src/main/java/org/elasticsearch/bootstrap/BootstrapChecks.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,6 @@ static List<BootstrapCheck> checks() {
212212
checks.add(new OnErrorCheck());
213213
checks.add(new OnOutOfMemoryErrorCheck());
214214
checks.add(new EarlyAccessCheck());
215-
checks.add(new AllPermissionCheck());
216215
checks.add(new DiscoveryConfiguredCheck());
217216
checks.add(new ByteOrderCheck());
218217
return Collections.unmodifiableList(checks);

server/src/main/java/org/elasticsearch/bootstrap/Elasticsearch.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import java.nio.file.Path;
5555
import java.security.Permission;
5656
import java.security.Security;
57+
import java.util.ArrayList;
5758
import java.util.List;
5859
import java.util.Objects;
5960
import java.util.concurrent.CountDownLatch;
@@ -108,6 +109,7 @@ private static Bootstrap initPhase1() {
108109
final PrintStream out = getStdout();
109110
final PrintStream err = getStderr();
110111
final ServerArgs args;
112+
final boolean useEntitlements = Boolean.parseBoolean(System.getProperty("es.entitlements.enabled"));
111113
try {
112114
initSecurityProperties();
113115

@@ -116,7 +118,7 @@ private static Bootstrap initPhase1() {
116118
* the presence of a security manager or lack thereof act as if there is a security manager present (e.g., DNS cache policy).
117119
* This forces such policies to take effect immediately.
118120
*/
119-
if (RuntimeVersionFeature.isSecurityManagerAvailable()) {
121+
if (useEntitlements == false && RuntimeVersionFeature.isSecurityManagerAvailable()) {
120122
org.elasticsearch.bootstrap.Security.setSecurityManager(new SecurityManager() {
121123
@Override
122124
public void checkPermission(Permission perm) {
@@ -149,7 +151,7 @@ public void checkPermission(Permission perm) {
149151
return null; // unreachable, to satisfy compiler
150152
}
151153

152-
return new Bootstrap(out, err, args);
154+
return new Bootstrap(out, err, args, useEntitlements);
153155
}
154156

155157
/**
@@ -214,7 +216,7 @@ private static void initPhase2(Bootstrap bootstrap) throws IOException {
214216
var pluginsLoader = PluginsLoader.createPluginsLoader(nodeEnv.modulesFile(), nodeEnv.pluginsFile());
215217
bootstrap.setPluginsLoader(pluginsLoader);
216218

217-
if (Boolean.parseBoolean(System.getProperty("es.entitlements.enabled"))) {
219+
if (bootstrap.useEntitlements()) {
218220
LogManager.getLogger(Elasticsearch.class).info("Bootstrapping Entitlements");
219221

220222
List<EntitlementBootstrap.PluginData> pluginData = Stream.concat(
@@ -280,7 +282,11 @@ protected void validateNodeBeforeAcceptingRequests(
280282
final BoundTransportAddress boundTransportAddress,
281283
List<BootstrapCheck> checks
282284
) throws NodeValidationException {
283-
BootstrapChecks.check(context, boundTransportAddress, checks);
285+
var additionalChecks = new ArrayList<>(checks);
286+
if (bootstrap.useEntitlements() == false) {
287+
additionalChecks.add(new BootstrapChecks.AllPermissionCheck());
288+
}
289+
BootstrapChecks.check(context, boundTransportAddress, additionalChecks);
284290
}
285291
};
286292
INSTANCE = new Elasticsearch(bootstrap.spawner(), node);

0 commit comments

Comments
 (0)