Skip to content

Commit a6b1454

Browse files
authored
Merge pull request #256 from palashhedau/opendistro-0.10
Allow SuperAdmin to update/delete/add read only config such as action…
2 parents 98119df + 5dd7d19 commit a6b1454

34 files changed

+416
-226
lines changed

src/main/java/com/amazon/opendistroforelasticsearch/security/configuration/AdminDNs.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public AdminDNs(final Settings settings) {
8383
}
8484

8585
log.debug("Loaded {} admin DN's {}",adminDn.size(), adminDn);
86-
86+
8787
final Settings impersonationDns = settings.getByPrefix(ConfigConstants.OPENDISTRO_SECURITY_AUTHCZ_IMPERSONATION_DN+".");
8888

8989
for (String dnString:impersonationDns.keySet()) {

src/main/java/com/amazon/opendistroforelasticsearch/security/dlic/rest/api/AbstractApiAction.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ public abstract class AbstractApiAction extends BaseRestHandler {
7777
private final RestApiPrivilegesEvaluator restApiPrivilegesEvaluator;
7878
protected final AuditLog auditLog;
7979
protected final Settings settings;
80+
private AdminDNs adminDNs;
8081

8182
protected AbstractApiAction(final Settings settings, final Path configPath, final RestController controller,
8283
final Client client, final AdminDNs adminDNs, final IndexBaseConfigurationRepository cl,
@@ -86,6 +87,7 @@ protected AbstractApiAction(final Settings settings, final Path configPath, fina
8687
this.settings = settings;
8788
this.opendistrosecurityIndex = settings.get(ConfigConstants.OPENDISTRO_SECURITY_CONFIG_INDEX_NAME,
8889
ConfigConstants.OPENDISTRO_SECURITY_DEFAULT_CONFIG_INDEX);
90+
this.adminDNs = adminDNs;
8991
this.cl = cl;
9092
this.cs = cs;
9193
this.threadPool = threadPool;
@@ -147,7 +149,7 @@ protected void handleDelete(final RestChannel channel, final RestRequest request
147149
return;
148150
}
149151

150-
if (isReadOnly(existingAsSettings.v2(), name)) {
152+
if (!isReadOnlyAndAccessible(existingAsSettings.v2(), name)) {
151153
forbidden(channel, "Resource '"+ name +"' is read-only.");
152154
return;
153155
}
@@ -187,7 +189,7 @@ protected void handlePut(final RestChannel channel, final RestRequest request, f
187189
return;
188190
}
189191

190-
if (isReadOnly(existingAsSettings.v2(), name)) {
192+
if (!isReadOnlyAndAccessible(existingAsSettings.v2(), name)) {
191193
forbidden(channel, "Resource '"+ name +"' is read-only.");
192194
return;
193195
}
@@ -544,4 +546,16 @@ public String getName() {
544546

545547
protected abstract Endpoint getEndpoint();
546548

547-
}
549+
protected boolean isSuperAdmin() {
550+
User user = threadPool.getThreadContext().getTransient(ConfigConstants.OPENDISTRO_SECURITY_USER);
551+
return adminDNs.isAdmin(user);
552+
}
553+
554+
protected boolean isReadOnlyAndAccessible(Settings settings, String name) {
555+
if( isReadOnly(settings, name) && !isSuperAdmin()) {
556+
return false;
557+
}
558+
return true;
559+
}
560+
561+
}

src/main/java/com/amazon/opendistroforelasticsearch/security/dlic/rest/api/AccountApiAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ protected void handlePut(RestChannel channel, final RestRequest request, final C
195195
return;
196196
}
197197

198-
if (isReadOnly(existingAsSettings.v2(), username)) {
198+
if (!isReadOnlyAndAccessible(existingAsSettings.v2(), username)) {
199199
forbidden(channel, "Resource '"+ username +"' is read-only.");
200200
return;
201201
}

src/main/java/com/amazon/opendistroforelasticsearch/security/dlic/rest/api/ActionGroupsApiAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ protected void registerHandlers(RestController controller, Settings settings) {
7171

7272
@Override
7373
protected AbstractConfigurationValidator getValidator(final RestRequest request, BytesReference ref, Object... param) {
74-
return new ActionGroupValidator(request, ref, this.settings, param);
74+
return new ActionGroupValidator(request, isSuperAdmin(), ref, this.settings, param);
7575
}
7676

7777
@Override

src/main/java/com/amazon/opendistroforelasticsearch/security/dlic/rest/api/InternalUsersApiAction.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,7 @@ protected void handlePut(RestChannel channel, final RestRequest request, final C
115115
}
116116

117117
// check if resource is writeable
118-
Boolean readOnly = configurationSettings.v2().getAsBoolean(username + "." + ConfigConstants.CONFIGKEY_READONLY,
119-
Boolean.FALSE);
120-
if (readOnly) {
118+
if (!isReadOnlyAndAccessible(configurationSettings.v2(), username)) {
121119
forbidden(channel, "Resource '" + username + "' is read-only.");
122120
return;
123121
}
@@ -228,6 +226,6 @@ protected String getConfigName() {
228226

229227
@Override
230228
protected AbstractConfigurationValidator getValidator(RestRequest request, BytesReference ref, Object... params) {
231-
return new InternalUsersValidator(request, ref, this.settings, params);
229+
return new InternalUsersValidator(request, isSuperAdmin(), ref, this.settings, params);
232230
}
233231
}

src/main/java/com/amazon/opendistroforelasticsearch/security/dlic/rest/api/PatchableResourceApiAction.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,8 @@ private void handleSinglePatch(RestChannel channel, RestRequest request, Client
107107
return;
108108
}
109109

110-
if (isReadOnly(existingAsSettings.v2(), name)) {
110+
111+
if (!isReadOnlyAndAccessible(existingAsSettings.v2(), name)) {
111112
forbidden(channel, "Resource '" + name + "' is read-only.");
112113
return;
113114
}
@@ -186,7 +187,7 @@ private void handleBulkPatch(RestChannel channel, RestRequest request, Client cl
186187

187188
if (oldResource != null && !oldResource.equals(patchedResource)) {
188189

189-
if (isReadOnly(existingAsSettings.v2(), resourceName)) {
190+
if (!isReadOnlyAndAccessible(existingAsSettings.v2(), resourceName)) {
190191
forbidden(channel, "Resource '" + resourceName + "' is read-only.");
191192
return;
192193
}

src/main/java/com/amazon/opendistroforelasticsearch/security/dlic/rest/api/RolesApiAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ protected Endpoint getEndpoint() {
6161

6262
@Override
6363
protected AbstractConfigurationValidator getValidator(RestRequest request, BytesReference ref, Object... param) {
64-
return new RolesValidator(request, ref, this.settings, param);
64+
return new RolesValidator(request, isSuperAdmin(), ref, this.settings, param);
6565
}
6666

6767
@Override

src/main/java/com/amazon/opendistroforelasticsearch/security/dlic/rest/api/RolesMappingApiAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ protected Endpoint getEndpoint() {
6262

6363
@Override
6464
protected AbstractConfigurationValidator getValidator(RestRequest request, BytesReference ref, Object... param) {
65-
return new RolesMappingValidator(request, ref, this.settings, param);
65+
return new RolesMappingValidator(request, isSuperAdmin(), ref, this.settings, param);
6666
}
6767

6868
@Override

src/main/java/com/amazon/opendistroforelasticsearch/security/dlic/rest/validation/AbstractConfigurationValidator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ public boolean validateSettings() {
146146
Set<String> allowed = new HashSet<>(allowedKeys.keySet());
147147
requested.removeAll(allowed);
148148
this.invalidKeys.addAll(requested);
149+
149150
boolean valid = missingMandatoryKeys.isEmpty() && invalidKeys.isEmpty() && missingMandatoryOrKeys.isEmpty();
150151
if (!valid) {
151152
this.errorType = ErrorType.INVALID_CONFIGURATION;
@@ -264,7 +265,7 @@ private Settings.Builder toSettingsBuilder(final BytesReference ref) {
264265
}
265266

266267
public static enum DataType {
267-
STRING, ARRAY, OBJECT;
268+
STRING, ARRAY, OBJECT, BOOLEAN;
268269
}
269270

270271
public static enum ErrorType {

src/main/java/com/amazon/opendistroforelasticsearch/security/dlic/rest/validation/ActionGroupValidator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,11 @@
2222

2323
public class ActionGroupValidator extends AbstractConfigurationValidator {
2424

25-
public ActionGroupValidator(final RestRequest request, BytesReference ref, final Settings esSettings, Object... param) {
25+
public ActionGroupValidator(final RestRequest request, boolean isSuperAdmin, BytesReference ref, final Settings esSettings, Object... param) {
2626
super(request, ref, esSettings, param);
2727
this.payloadMandatory = true;
2828
allowedKeys.put("permissions", DataType.ARRAY);
29+
if (isSuperAdmin) allowedKeys.put("readonly" , DataType.BOOLEAN);
2930
mandatoryKeys.add("permissions");
3031
}
3132

0 commit comments

Comments
 (0)