Skip to content

Commit 14017a2

Browse files
WIP bypass local permissions check for esql in CPS
# Conflicts: # x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/Security.java # x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authz/AuthorizationService.java # x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/authz/AuthorizationServiceTests.java
1 parent 414972d commit 14017a2

File tree

6 files changed

+70
-10
lines changed

6 files changed

+70
-10
lines changed

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,7 @@
323323
import org.elasticsearch.xpack.security.authc.support.mapper.ProjectStateRoleMapper;
324324
import org.elasticsearch.xpack.security.authz.AuthorizationDenialMessages;
325325
import org.elasticsearch.xpack.security.authz.AuthorizationService;
326+
import org.elasticsearch.xpack.security.authz.CustomActionAuthorizationStep;
326327
import org.elasticsearch.xpack.security.authz.DlsFlsRequestCacheDifferentiator;
327328
import org.elasticsearch.xpack.security.authz.FileRoleValidator;
328329
import org.elasticsearch.xpack.security.authz.ReservedRoleNameChecker;
@@ -644,6 +645,7 @@ public class Security extends Plugin
644645
private final SetOnce<RemoteClusterSecurityExtension.Provider> remoteClusterSecurityExtensionProvider = new SetOnce<>();
645646
private final SetOnce<RemoteClusterSecurityExtension> remoteClusterSecurityExtension = new SetOnce<>();
646647
private final SetOnce<RemoteClusterAuthenticationService> remoteClusterAuthenticationService = new SetOnce<>();
648+
private final SetOnce<CustomActionAuthorizationStep.Factory> esqlAuthorizationStep = new SetOnce<>();
647649

648650
private final SetOnce<SecurityMigrations.Manager> migrationManager = new SetOnce<>();
649651
private final SetOnce<List<Closeable>> closableComponents = new SetOnce<>();
@@ -1144,6 +1146,9 @@ Collection<Object> createComponents(
11441146
if (authorizationDenialMessages.get() == null) {
11451147
authorizationDenialMessages.set(new AuthorizationDenialMessages.Default());
11461148
}
1149+
if (esqlAuthorizationStep.get() == null) {
1150+
esqlAuthorizationStep.set(new CustomActionAuthorizationStep.Factory.Default());
1151+
}
11471152
final AuthorizationService authzService = new AuthorizationService(
11481153
settings,
11491154
allRolesStore,
@@ -1162,7 +1167,8 @@ Collection<Object> createComponents(
11621167
authorizationDenialMessages.get(),
11631168
linkedProjectConfigService,
11641169
projectResolver,
1165-
getCustomAuthorizedProjectsResolverOrDefault(extensionComponents)
1170+
getCustomAuthorizedProjectsResolverOrDefault(extensionComponents),
1171+
esqlAuthorizationStep.get().create(settings, linkedProjectConfigService)
11661172
);
11671173

11681174
components.add(nativeRolesStore); // used by roles actions
@@ -2549,6 +2555,7 @@ public void loadExtensions(ExtensionLoader loader) {
25492555
RemoteClusterSecurityExtension.Provider.class,
25502556
CrossClusterAccessSecurityExtension.Provider::new
25512557
);
2558+
loadSingletonExtensionAndSetOnce(loader, esqlAuthorizationStep, CustomActionAuthorizationStep.Factory.class);
25522559
}
25532560

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

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,8 @@ public AuthorizationService(
172172
AuthorizationDenialMessages authorizationDenialMessages,
173173
LinkedProjectConfigService linkedProjectConfigService,
174174
ProjectResolver projectResolver,
175-
AuthorizedProjectsResolver authorizedProjectsResolver
175+
AuthorizedProjectsResolver authorizedProjectsResolver,
176+
CustomActionAuthorizationStep esqlAuthorizationStep
176177
) {
177178
this.clusterService = clusterService;
178179
this.auditTrailService = auditTrailService;
@@ -193,7 +194,8 @@ public AuthorizationService(
193194
settings,
194195
rolesStore,
195196
fieldPermissionsCache,
196-
new LoadAuthorizedIndicesTimeChecker.Factory(logger, settings, clusterService.getClusterSettings())
197+
new LoadAuthorizedIndicesTimeChecker.Factory(logger, settings, clusterService.getClusterSettings()),
198+
esqlAuthorizationStep
197199
);
198200
this.authorizationEngine = authorizationEngine == null ? this.rbacEngine : authorizationEngine;
199201
this.requestInterceptors = requestInterceptors;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
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.authz;
9+
10+
import org.elasticsearch.common.settings.Settings;
11+
import org.elasticsearch.transport.LinkedProjectConfigService;
12+
import org.elasticsearch.xpack.core.security.authz.AuthorizationEngine;
13+
14+
public interface CustomActionAuthorizationStep {
15+
boolean authorize(AuthorizationEngine.RequestInfo requestInfo);
16+
17+
class Default implements CustomActionAuthorizationStep {
18+
@Override
19+
public boolean authorize(AuthorizationEngine.RequestInfo requestInfo) {
20+
return false;
21+
}
22+
}
23+
24+
interface Factory {
25+
CustomActionAuthorizationStep create(Settings settings, LinkedProjectConfigService linkedProjectConfigService);
26+
27+
class Default implements Factory {
28+
@Override
29+
public CustomActionAuthorizationStep create(Settings settings, LinkedProjectConfigService linkedProjectConfigService) {
30+
return new CustomActionAuthorizationStep.Default();
31+
}
32+
}
33+
}
34+
}

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,17 +153,20 @@ public class RBACEngine implements AuthorizationEngine {
153153
private final CompositeRolesStore rolesStore;
154154
private final FieldPermissionsCache fieldPermissionsCache;
155155
private final LoadAuthorizedIndicesTimeChecker.Factory authzIndicesTimerFactory;
156+
private final CustomActionAuthorizationStep esqlStep;
156157

157158
public RBACEngine(
158159
Settings settings,
159160
CompositeRolesStore rolesStore,
160161
FieldPermissionsCache fieldPermissionsCache,
161-
LoadAuthorizedIndicesTimeChecker.Factory authzIndicesTimerFactory
162+
LoadAuthorizedIndicesTimeChecker.Factory authzIndicesTimerFactory,
163+
CustomActionAuthorizationStep esqlStep
162164
) {
163165
this.settings = settings;
164166
this.rolesStore = rolesStore;
165167
this.fieldPermissionsCache = fieldPermissionsCache;
166168
this.authzIndicesTimerFactory = authzIndicesTimerFactory;
169+
this.esqlStep = esqlStep;
167170
}
168171

169172
@Override
@@ -334,6 +337,9 @@ public SubscribableListener<IndexAuthorizationResult> authorizeIndexAction(
334337
} catch (Exception e) {
335338
return SubscribableListener.newFailed(e);
336339
}
340+
if (esqlStep.authorize(requestInfo)) {
341+
return SubscribableListener.newSucceeded(IndexAuthorizationResult.EMPTY);
342+
}
337343
if (TransportActionProxy.isProxyAction(action) || shouldAuthorizeIndexActionNameOnly(action, request)) {
338344
// we've already validated that the request is a proxy request so we can skip that but we still
339345
// need to validate that the action is allowed and then move on

x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/authz/AuthorizationServiceTests.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,8 @@ public void setup() {
343343
new AuthorizationDenialMessages.Default(),
344344
linkedProjectConfigService,
345345
projectResolver,
346-
new AuthorizedProjectsResolver.Default()
346+
new AuthorizedProjectsResolver.Default(),
347+
new CustomActionAuthorizationStep.Default()
347348
);
348349
}
349350

@@ -1778,7 +1779,8 @@ public void testDenialForAnonymousUser() {
17781779
new AuthorizationDenialMessages.Default(),
17791780
linkedProjectConfigService,
17801781
projectResolver,
1781-
new AuthorizedProjectsResolver.Default()
1782+
new AuthorizedProjectsResolver.Default(),
1783+
new CustomActionAuthorizationStep.Default()
17821784
);
17831785

17841786
RoleDescriptor role = new RoleDescriptor(
@@ -1830,7 +1832,8 @@ public void testDenialForAnonymousUserAuthorizationExceptionDisabled() {
18301832
new AuthorizationDenialMessages.Default(),
18311833
linkedProjectConfigService,
18321834
projectResolver,
1833-
new AuthorizedProjectsResolver.Default()
1835+
new AuthorizedProjectsResolver.Default(),
1836+
new CustomActionAuthorizationStep.Default()
18341837
);
18351838

18361839
RoleDescriptor role = new RoleDescriptor(
@@ -3370,7 +3373,8 @@ public void testAuthorizationEngineSelectionForCheckPrivileges() throws Exceptio
33703373
new AuthorizationDenialMessages.Default(),
33713374
linkedProjectConfigService,
33723375
projectResolver,
3373-
new AuthorizedProjectsResolver.Default()
3376+
new AuthorizedProjectsResolver.Default(),
3377+
new CustomActionAuthorizationStep.Default()
33743378
);
33753379

33763380
Subject subject = new Subject(new User("test", "a role"), mock(RealmRef.class));
@@ -3528,7 +3532,8 @@ public void getUserPrivileges(AuthorizationInfo authorizationInfo, ActionListene
35283532
new AuthorizationDenialMessages.Default(),
35293533
linkedProjectConfigService,
35303534
projectResolver,
3531-
new AuthorizedProjectsResolver.Default()
3535+
new AuthorizedProjectsResolver.Default(),
3536+
new CustomActionAuthorizationStep.Default()
35323537
);
35333538
Authentication authentication;
35343539
try (StoredContext ignore = threadContext.stashContext()) {

x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/authz/RBACEngineTests.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,13 @@ public void createEngine() {
172172
final LoadAuthorizedIndicesTimeChecker.Factory timerFactory = mock(LoadAuthorizedIndicesTimeChecker.Factory.class);
173173
when(timerFactory.newTimer(any())).thenReturn(LoadAuthorizedIndicesTimeChecker.NO_OP_CONSUMER);
174174
rolesStore = mock(CompositeRolesStore.class);
175-
engine = new RBACEngine(Settings.EMPTY, rolesStore, new FieldPermissionsCache(Settings.EMPTY), timerFactory);
175+
engine = new RBACEngine(
176+
Settings.EMPTY,
177+
rolesStore,
178+
new FieldPermissionsCache(Settings.EMPTY),
179+
timerFactory,
180+
new CustomActionAuthorizationStep.Default()
181+
);
176182
}
177183

178184
public void testResolveAuthorizationInfoForEmptyRolesWithAuthentication() {

0 commit comments

Comments
 (0)