Skip to content

Commit 6ff46da

Browse files
[Backport] Make reserved built-in roles queryable (elastic#118794)
* [Backport] Make reserved built-in roles queryable * fix compilation errors due to missing isMixedVersionCluster
1 parent 4bc6bb0 commit 6ff46da

File tree

23 files changed

+1597
-21
lines changed

23 files changed

+1597
-21
lines changed

docs/changelog/117581.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 117581
2+
summary: Make reserved built-in roles queryable
3+
area: Authorization
4+
type: enhancement
5+
issues: []

test/framework/src/main/java/org/elasticsearch/test/rest/ESRestTestCase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1197,7 +1197,7 @@ protected static void wipeAllIndices(boolean preserveSecurityIndices) throws IOE
11971197
}
11981198
}
11991199

1200-
private static boolean ignoreSystemIndexAccessWarnings(List<String> warnings) {
1200+
protected static boolean ignoreSystemIndexAccessWarnings(List<String> warnings) {
12011201
for (String warning : warnings) {
12021202
if (warning.startsWith("this request accesses system indices:")) {
12031203
SUITE_LOGGER.warn("Ignoring system index access warning during test cleanup: {}", warning);

x-pack/plugin/security/qa/security-basic/build.gradle

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,29 @@
11

2+
apply plugin: 'elasticsearch.base-internal-es-plugin'
23
apply plugin: 'elasticsearch.internal-java-rest-test'
34

45
import org.elasticsearch.gradle.internal.info.BuildParams
56

7+
esplugin {
8+
name 'queryable-reserved-roles-test'
9+
description 'A test plugin for testing that changes to reserved roles are made queryable'
10+
classname 'org.elasticsearch.xpack.security.role.QueryableBuiltInRolesTestPlugin'
11+
extendedPlugins = ['x-pack-core', 'x-pack-security']
12+
}
13+
614
dependencies {
715
javaRestTestImplementation(testArtifact(project(xpackModule('security'))))
816
javaRestTestImplementation(testArtifact(project(xpackModule('core'))))
17+
compileOnly project(':x-pack:plugin:core')
18+
compileOnly project(':x-pack:plugin:security')
19+
clusterPlugins project(':x-pack:plugin:security:qa:security-basic')
920
}
1021

1122
tasks.named('javaRestTest') {
1223
usesDefaultDistribution()
1324
}
1425

26+
tasks.named("javadoc").configure { enabled = false }
1527

1628
if (buildParams.inFipsJvm){
1729
// This test cluster is using a BASIC license and FIPS 140 mode is not supported in BASIC

x-pack/plugin/security/qa/security-basic/src/javaRestTest/java/org/elasticsearch/xpack/security/QueryRoleIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ private RoleDescriptor createRole(
496496
);
497497
}
498498

499-
private void assertQuery(String body, int total, Consumer<List<Map<String, Object>>> roleVerifier) throws IOException {
499+
static void assertQuery(String body, int total, Consumer<List<Map<String, Object>>> roleVerifier) throws IOException {
500500
assertQuery(client(), body, total, roleVerifier);
501501
}
502502

x-pack/plugin/security/qa/security-basic/src/javaRestTest/java/org/elasticsearch/xpack/security/QueryableReservedRolesIT.java

Lines changed: 354 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module org.elasticsearch.internal.security {
2+
requires org.elasticsearch.base;
3+
requires org.elasticsearch.server;
4+
requires org.elasticsearch.xcore;
5+
requires org.elasticsearch.security;
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0; you may not use this file except in compliance with the Elastic License
5+
* 2.0.
6+
*/
7+
8+
package org.elasticsearch.xpack.security.role;
9+
10+
import org.elasticsearch.common.settings.Setting;
11+
import org.elasticsearch.plugins.Plugin;
12+
import org.elasticsearch.xpack.core.security.authz.store.ReservedRolesStore;
13+
14+
import java.util.List;
15+
16+
public class QueryableBuiltInRolesTestPlugin extends Plugin {
17+
18+
@Override
19+
public List<Setting<?>> getSettings() {
20+
return List.of(ReservedRolesStore.INCLUDED_RESERVED_ROLES_SETTING);
21+
}
22+
}

x-pack/plugin/security/src/main/java/module-info.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@
7070
exports org.elasticsearch.xpack.security.slowlog to org.elasticsearch.server;
7171
exports org.elasticsearch.xpack.security.authc.support to org.elasticsearch.internal.security;
7272
exports org.elasticsearch.xpack.security.rest.action.apikey to org.elasticsearch.internal.security;
73+
exports org.elasticsearch.xpack.security.support to org.elasticsearch.internal.security;
74+
exports org.elasticsearch.xpack.security.authz.store to org.elasticsearch.internal.security;
7375

7476
provides org.elasticsearch.index.SlowLogFieldProvider with org.elasticsearch.xpack.security.slowlog.SecuritySlowLogFieldProvider;
7577

x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/Security.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,8 @@
411411
import org.elasticsearch.xpack.security.rest.action.user.RestSetEnabledAction;
412412
import org.elasticsearch.xpack.security.support.CacheInvalidatorRegistry;
413413
import org.elasticsearch.xpack.security.support.ExtensionComponents;
414+
import org.elasticsearch.xpack.security.support.QueryableBuiltInRolesProviderFactory;
415+
import org.elasticsearch.xpack.security.support.QueryableBuiltInRolesSynchronizer;
414416
import org.elasticsearch.xpack.security.support.ReloadableSecurityComponent;
415417
import org.elasticsearch.xpack.security.support.SecurityIndexManager;
416418
import org.elasticsearch.xpack.security.support.SecurityMigrationExecutor;
@@ -461,6 +463,7 @@
461463
import static org.elasticsearch.xpack.core.security.SecurityField.FIELD_LEVEL_SECURITY_FEATURE;
462464
import static org.elasticsearch.xpack.core.security.authz.store.ReservedRolesStore.INCLUDED_RESERVED_ROLES_SETTING;
463465
import static org.elasticsearch.xpack.security.operator.OperatorPrivileges.OPERATOR_PRIVILEGES_ENABLED;
466+
import static org.elasticsearch.xpack.security.support.QueryableBuiltInRolesSynchronizer.QUERYABLE_BUILT_IN_ROLES_ENABLED;
464467
import static org.elasticsearch.xpack.security.transport.SSLEngineUtils.extractClientCertificates;
465468

466469
public class Security extends Plugin
@@ -631,7 +634,7 @@ public class Security extends Plugin
631634
private final SetOnce<ReservedRoleNameChecker.Factory> reservedRoleNameCheckerFactory = new SetOnce<>();
632635
private final SetOnce<FileRoleValidator> fileRoleValidator = new SetOnce<>();
633636
private final SetOnce<SecondaryAuthActions> secondaryAuthActions = new SetOnce<>();
634-
637+
private final SetOnce<QueryableBuiltInRolesProviderFactory> queryableRolesProviderFactory = new SetOnce<>();
635638
private final SetOnce<SecurityMigrationExecutor> securityMigrationExecutor = new SetOnce<>();
636639

637640
// Node local retry count for migration jobs that's checked only on the master node to make sure
@@ -1206,6 +1209,23 @@ Collection<Object> createComponents(
12061209

12071210
reservedRoleMappingAction.set(new ReservedRoleMappingAction());
12081211

1212+
if (QUERYABLE_BUILT_IN_ROLES_ENABLED) {
1213+
if (queryableRolesProviderFactory.get() == null) {
1214+
queryableRolesProviderFactory.set(new QueryableBuiltInRolesProviderFactory.Default());
1215+
}
1216+
components.add(
1217+
new QueryableBuiltInRolesSynchronizer(
1218+
clusterService,
1219+
featureService,
1220+
queryableRolesProviderFactory.get(),
1221+
nativeRolesStore,
1222+
reservedRolesStore,
1223+
fileRolesStore.get(),
1224+
threadPool
1225+
)
1226+
);
1227+
}
1228+
12091229
cacheInvalidatorRegistry.validate();
12101230

12111231
final List<ReloadableSecurityComponent> reloadableComponents = new ArrayList<>();
@@ -2321,6 +2341,7 @@ public void loadExtensions(ExtensionLoader loader) {
23212341
loadSingletonExtensionAndSetOnce(loader, grantApiKeyRequestTranslator, RestGrantApiKeyAction.RequestTranslator.class);
23222342
loadSingletonExtensionAndSetOnce(loader, fileRoleValidator, FileRoleValidator.class);
23232343
loadSingletonExtensionAndSetOnce(loader, secondaryAuthActions, SecondaryAuthActions.class);
2344+
loadSingletonExtensionAndSetOnce(loader, queryableRolesProviderFactory, QueryableBuiltInRolesProviderFactory.class);
23242345
}
23252346

23262347
private <T> void loadSingletonExtensionAndSetOnce(ExtensionLoader loader, SetOnce<T> setOnce, Class<T> clazz) {

x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/SecurityFeatures.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.util.Map;
1515
import java.util.Set;
1616

17+
import static org.elasticsearch.xpack.security.support.QueryableBuiltInRolesSynchronizer.QUERYABLE_BUILT_IN_ROLES_FEATURE;
1718
import static org.elasticsearch.xpack.security.support.SecuritySystemIndices.SECURITY_MIGRATION_FRAMEWORK;
1819
import static org.elasticsearch.xpack.security.support.SecuritySystemIndices.SECURITY_PROFILE_ORIGIN_FEATURE;
1920
import static org.elasticsearch.xpack.security.support.SecuritySystemIndices.SECURITY_ROLES_METADATA_FLATTENED;
@@ -24,7 +25,12 @@ public class SecurityFeatures implements FeatureSpecification {
2425

2526
@Override
2627
public Set<NodeFeature> getFeatures() {
27-
return Set.of(SECURITY_ROLE_MAPPING_CLEANUP, SECURITY_ROLES_METADATA_FLATTENED, SECURITY_MIGRATION_FRAMEWORK);
28+
return Set.of(
29+
SECURITY_ROLE_MAPPING_CLEANUP,
30+
SECURITY_ROLES_METADATA_FLATTENED,
31+
SECURITY_MIGRATION_FRAMEWORK,
32+
QUERYABLE_BUILT_IN_ROLES_FEATURE
33+
);
2834
}
2935

3036
@Override

0 commit comments

Comments
 (0)