Skip to content

Commit bd84c31

Browse files
committed
[Failure Store] Authorization denial messages
1 parent 8ced682 commit bd84c31

File tree

2 files changed

+52
-11
lines changed

2 files changed

+52
-11
lines changed

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/security/authz/privilege/IndexPrivilege.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -482,10 +482,13 @@ public static Set<String> names() {
482482
* @see Privilege#sortByAccessLevel
483483
*/
484484
public static Collection<String> findPrivilegesThatGrant(String action) {
485+
return findPrivilegesThatGrant(action, IndexComponentSelector.DATA);
486+
}
487+
488+
public static Collection<String> findPrivilegesThatGrant(String action, IndexComponentSelector selector) {
485489
return VALUES.entrySet()
486490
.stream()
487-
// Only include privileges that grant data access; failures access is handled separately in authorization failure messages
488-
.filter(e -> e.getValue().selectorPredicate.test(IndexComponentSelector.DATA))
491+
.filter(e -> e.getValue().selectorPredicate.test(selector))
489492
.filter(e -> e.getValue().predicate.test(action))
490493
.map(Map.Entry::getKey)
491494
.toList();

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

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
package org.elasticsearch.xpack.security.authz;
99

10+
import org.elasticsearch.action.support.IndexComponentSelector;
11+
import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver;
1012
import org.elasticsearch.common.Strings;
1113
import org.elasticsearch.common.util.set.Sets;
1214
import org.elasticsearch.core.Nullable;
@@ -90,20 +92,56 @@ public String actionDenied(
9092

9193
if (ClusterPrivilegeResolver.isClusterAction(action)) {
9294
final Collection<String> privileges = findClusterPrivilegesThatGrant(authentication, action, request);
93-
if (privileges != null && privileges.size() > 0) {
95+
if (privileges != null && false == privileges.isEmpty()) {
9496
message = message
9597
+ ", this action is granted by the cluster privileges ["
9698
+ collectionToCommaDelimitedString(privileges)
9799
+ "]";
98100
}
99101
} else if (isIndexAction(action)) {
100-
final Collection<String> privileges = findIndexPrivilegesThatGrant(action);
101-
if (privileges != null && privileges.size() > 0) {
102-
message = message
103-
+ ", this action is granted by the index privileges ["
104-
+ collectionToCommaDelimitedString(privileges)
105-
+ "]";
102+
String[] indices = AuthorizationEngine.RequestInfo.indices(request);
103+
boolean hasFailuresSelector = false;
104+
boolean hasNullOrDataSelector = false;
105+
if (indices != null) {
106+
for (String index : indices) {
107+
if (IndexNameExpressionResolver.hasSelector(index, IndexComponentSelector.FAILURES)) {
108+
hasFailuresSelector = true;
109+
} else {
110+
hasNullOrDataSelector = true;
111+
}
112+
// we found both selectors, we can stop
113+
if (hasNullOrDataSelector && hasFailuresSelector) {
114+
break;
115+
}
116+
}
106117
}
118+
119+
if (hasNullOrDataSelector) {
120+
final Collection<String> privileges = findIndexPrivilegesThatGrant(action, IndexComponentSelector.DATA);
121+
if (privileges != null && false == privileges.isEmpty()) {
122+
message = message
123+
+ ", this action is granted by the index privileges ["
124+
+ collectionToCommaDelimitedString(privileges)
125+
+ "]";
126+
}
127+
}
128+
if (hasFailuresSelector) {
129+
final Collection<String> privileges = findIndexPrivilegesThatGrant(action, IndexComponentSelector.FAILURES);
130+
if (privileges != null && false == privileges.isEmpty()) {
131+
if (hasNullOrDataSelector) {
132+
message = message
133+
+ " for data access, or ["
134+
+ collectionToCommaDelimitedString(privileges)
135+
+ "] for access with the failures selector";
136+
} else {
137+
message = message
138+
+ ", this action is granted by the index privileges ["
139+
+ collectionToCommaDelimitedString(privileges)
140+
+ "]";
141+
}
142+
}
143+
}
144+
107145
}
108146

109147
return message;
@@ -132,8 +170,8 @@ protected Collection<String> findClusterPrivilegesThatGrant(
132170
return ClusterPrivilegeResolver.findPrivilegesThatGrant(action, request, authentication);
133171
}
134172

135-
protected Collection<String> findIndexPrivilegesThatGrant(String action) {
136-
return IndexPrivilege.findPrivilegesThatGrant(action);
173+
protected Collection<String> findIndexPrivilegesThatGrant(String action, IndexComponentSelector selector) {
174+
return IndexPrivilege.findPrivilegesThatGrant(action, selector);
137175
}
138176

139177
private String remoteClusterText(@Nullable String clusterAlias) {

0 commit comments

Comments
 (0)