diff --git a/src/main/java/org/opensearch/security/privileges/ProtectedIndexAccessEvaluator.java b/src/main/java/org/opensearch/security/privileges/ProtectedIndexAccessEvaluator.java index 877e6fd787..3f098854b2 100644 --- a/src/main/java/org/opensearch/security/privileges/ProtectedIndexAccessEvaluator.java +++ b/src/main/java/org/opensearch/security/privileges/ProtectedIndexAccessEvaluator.java @@ -24,6 +24,7 @@ import org.opensearch.common.settings.Settings; import org.opensearch.security.auditlog.AuditLog; import org.opensearch.security.resolver.IndexResolverReplacer; +import org.opensearch.security.support.ActionPatternConstants; import org.opensearch.security.support.ConfigConstants; import org.opensearch.security.support.WildcardMatcher; import org.opensearch.tasks.Task; @@ -55,15 +56,19 @@ public ProtectedIndexAccessEvaluator(final Settings settings, AuditLog auditLog) this.auditLog = auditLog; final List<String> indexDeniedActionPatterns = new ArrayList<String>(); - indexDeniedActionPatterns.add("indices:data/write*"); - indexDeniedActionPatterns.add("indices:admin/delete*"); - indexDeniedActionPatterns.add("indices:admin/mapping/delete*"); - indexDeniedActionPatterns.add("indices:admin/mapping/put*"); - indexDeniedActionPatterns.add("indices:admin/freeze*"); - indexDeniedActionPatterns.add("indices:admin/settings/update*"); - indexDeniedActionPatterns.add("indices:admin/aliases"); - indexDeniedActionPatterns.add("indices:admin/close*"); - indexDeniedActionPatterns.add("cluster:admin/snapshot/restore*"); + indexDeniedActionPatterns.add(ActionPatternConstants.IndicesData.WRITE_ALL); + indexDeniedActionPatterns.add(ActionPatternConstants.IndicesAdmin.DELETE_INDEX); + // action does not exist in OpenSearch- + // https://github.com/opensearch-project/OpenSearch/tree/main/server/src/main/java/org/opensearch/action/admin/indices/mapping + //indexDeniedActionPatterns.add("indices:admin/mapping/delete*"); + indexDeniedActionPatterns.add(ActionPatternConstants.IndicesAdmin.PUT_MAPPING); + // action does not exist in OpenSearch- + // https://github.com/opensearch-project/OpenSearch/tree/main/server/src/main/java/org/opensearch/action/admin/indices + //indexDeniedActionPatterns.add("indices:admin/freeze*"); + indexDeniedActionPatterns.add(ActionPatternConstants.IndicesAdmin.UPDATE_SETTINGS); + indexDeniedActionPatterns.add(ActionPatternConstants.IndicesAdmin.ALIASES); + indexDeniedActionPatterns.add(ActionPatternConstants.IndicesAdmin.CLOSE); + indexDeniedActionPatterns.add(ActionPatternConstants.ClusterOperations.SNAPSHOT_RESTORE); this.deniedActionMatcher = WildcardMatcher.from(indexDeniedActionPatterns); } diff --git a/src/main/java/org/opensearch/security/privileges/SystemIndexAccessEvaluator.java b/src/main/java/org/opensearch/security/privileges/SystemIndexAccessEvaluator.java index 99828f7b17..a56497b08f 100644 --- a/src/main/java/org/opensearch/security/privileges/SystemIndexAccessEvaluator.java +++ b/src/main/java/org/opensearch/security/privileges/SystemIndexAccessEvaluator.java @@ -38,12 +38,19 @@ import org.opensearch.action.ActionRequest; import org.opensearch.action.RealtimeRequest; +import org.opensearch.action.admin.cluster.snapshots.restore.RestoreSnapshotAction; +import org.opensearch.action.admin.indices.alias.IndicesAliasesAction; +import org.opensearch.action.admin.indices.close.CloseIndexAction; +import org.opensearch.action.admin.indices.delete.DeleteIndexAction; +import org.opensearch.action.admin.indices.mapping.put.PutMappingAction; +import org.opensearch.action.admin.indices.settings.put.UpdateSettingsAction; import org.opensearch.action.search.SearchRequest; import org.opensearch.common.settings.Settings; import org.opensearch.indices.SystemIndexRegistry; import org.opensearch.security.auditlog.AuditLog; import org.opensearch.security.resolver.IndexResolverReplacer; import org.opensearch.security.resolver.IndexResolverReplacer.Resolved; +import org.opensearch.security.support.ActionPatternConstants; import org.opensearch.security.support.ConfigConstants; import org.opensearch.security.support.WildcardMatcher; import org.opensearch.security.user.User; @@ -71,6 +78,9 @@ public class SystemIndexAccessEvaluator { private final boolean isSystemIndexEnabled; private final boolean isSystemIndexPermissionEnabled; private final static ImmutableSet<String> SYSTEM_INDEX_PERMISSION_SET = ImmutableSet.of(ConfigConstants.SYSTEM_INDEX_PERMISSION); + // Pattern for all actions like indices:data/write/index, indices:data/write/bulk, indices:data/write/delete, + // indices:data/write/reindex, etc + public static final String INDICES_DATA_WRITE_ALL_ACTIONS_PATTERN = "indices:data/write/*"; public SystemIndexAccessEvaluator(final Settings settings, AuditLog auditLog, IndexResolverReplacer irr) { this.securityIndex = settings.get( @@ -97,8 +107,8 @@ public SystemIndexAccessEvaluator(final Settings settings, AuditLog auditLog, In final List<String> deniedActionPatternsList = deniedActionPatterns(); final List<String> deniedActionPatternsListNoSnapshot = new ArrayList<>(deniedActionPatternsList); - deniedActionPatternsListNoSnapshot.add("indices:admin/close*"); - deniedActionPatternsListNoSnapshot.add("cluster:admin/snapshot/restore*"); + deniedActionPatternsListNoSnapshot.add(CloseIndexAction.NAME + "*"); // "indices:admin/close*" + deniedActionPatternsListNoSnapshot.add(RestoreSnapshotAction.NAME + "*"); // "cluster:admin/snapshot/restore*" deniedActionsMatcher = WildcardMatcher.from( restoreSecurityIndexEnabled ? deniedActionPatternsList : deniedActionPatternsListNoSnapshot @@ -111,13 +121,17 @@ public SystemIndexAccessEvaluator(final Settings settings, AuditLog auditLog, In private static List<String> deniedActionPatterns() { final List<String> securityIndexDeniedActionPatternsList = new ArrayList<>(); - securityIndexDeniedActionPatternsList.add("indices:data/write*"); - securityIndexDeniedActionPatternsList.add("indices:admin/delete*"); - securityIndexDeniedActionPatternsList.add("indices:admin/mapping/delete*"); - securityIndexDeniedActionPatternsList.add("indices:admin/mapping/put*"); - securityIndexDeniedActionPatternsList.add("indices:admin/freeze*"); - securityIndexDeniedActionPatternsList.add("indices:admin/settings/update*"); - securityIndexDeniedActionPatternsList.add("indices:admin/aliases"); + securityIndexDeniedActionPatternsList.add(ActionPatternConstants.IndicesData.WRITE_ALL); // "indices:data/write*" + securityIndexDeniedActionPatternsList.add(ActionPatternConstants.IndicesAdmin.DELETE_INDEX); // "indices:admin/delete*" + // action does not exist in OpenSearch- + // https://github.com/opensearch-project/OpenSearch/tree/main/server/src/main/java/org/opensearch/action/admin/indices/mapping + // securityIndexDeniedActionPatternsList.add("indices:admin/mapping/delete*"); + securityIndexDeniedActionPatternsList.add(ActionPatternConstants.IndicesAdmin.PUT_MAPPING); // indices:admin/mapping/put* + // action does not exist in OpenSearch- + // https://github.com/opensearch-project/OpenSearch/tree/main/server/src/main/java/org/opensearch/action/admin/indices + // securityIndexDeniedActionPatternsList.add("indices:admin/freeze*"); + securityIndexDeniedActionPatternsList.add(ActionPatternConstants.IndicesAdmin.UPDATE_SETTINGS); // "indices:admin/settings/update*" + securityIndexDeniedActionPatternsList.add(ActionPatternConstants.IndicesAdmin.ALIASES); // "indices:admin/aliases" return securityIndexDeniedActionPatternsList; } diff --git a/src/main/java/org/opensearch/security/support/ActionPatternConstants.java b/src/main/java/org/opensearch/security/support/ActionPatternConstants.java new file mode 100644 index 0000000000..3d201e930a --- /dev/null +++ b/src/main/java/org/opensearch/security/support/ActionPatternConstants.java @@ -0,0 +1,130 @@ +package org.opensearch.security.support; + +import org.opensearch.action.admin.cluster.shards.ClusterSearchShardsAction; +import org.opensearch.action.admin.cluster.snapshots.restore.RestoreSnapshotAction; +import org.opensearch.action.admin.indices.alias.IndicesAliasesAction; +import org.opensearch.action.admin.indices.alias.get.GetAliasesAction; +import org.opensearch.action.admin.indices.close.CloseIndexAction; +import org.opensearch.action.admin.indices.create.AutoCreateAction; +import org.opensearch.action.admin.indices.delete.DeleteIndexAction; +import org.opensearch.action.admin.indices.mapping.get.GetFieldMappingsAction; +import org.opensearch.action.admin.indices.mapping.put.PutMappingAction; +import org.opensearch.action.admin.indices.resolve.ResolveIndexAction; +import org.opensearch.action.admin.indices.settings.get.GetSettingsAction; +import org.opensearch.action.admin.indices.settings.put.UpdateSettingsAction; +import org.opensearch.action.admin.indices.stats.IndicesStatsAction; +import org.opensearch.action.admin.indices.upgrade.post.UpgradeAction; +import org.opensearch.action.search.SearchAction; +import org.opensearch.action.index.IndexAction; +import org.opensearch.action.delete.DeleteAction; +import org.opensearch.action.search.SearchScrollAction; +import org.opensearch.action.bulk.BulkAction; +import org.opensearch.action.get.MultiGetAction; +import org.opensearch.action.search.MultiSearchAction; +import org.opensearch.action.termvectors.MultiTermVectorsAction; +import org.opensearch.action.update.UpdateAction; +import org.opensearch.action.admin.indices.create.CreateIndexAction; +import org.opensearch.action.admin.indices.mapping.put.AutoPutMappingAction; +import org.opensearch.index.reindex.ReindexAction; +import org.opensearch.script.mustache.RenderSearchTemplateAction; + +/** + * Constants defining patterns for various OpenSearch actions. + * These patterns are used for permission checking and action filtering. + */ +public final class ActionPatternConstants { + + private ActionPatternConstants() { + // Prevent instantiation + } + /** + * Constants for index data operations (read/write) + */ + public static final class IndicesData { + /** Pattern matching all write operations on indices */ + public static final String WRITE_ALL = "indices:data/write/*"; + /** Pattern matching all read operations on indices */ + public static final String READ_ALL = "indices:data/read/*"; + + private IndicesData() {} + } + + /** + * Constants for index administration operations + */ + public static final class IndicesAdmin { + public static final String DELETE_INDEX = DeleteIndexAction.NAME + "*"; + public static final String PUT_MAPPING = PutMappingAction.NAME + "*"; + public static final String UPDATE_SETTINGS = UpdateSettingsAction.NAME + "*"; + public static final String ALIASES = IndicesAliasesAction.NAME; + public static final String CLOSE = CloseIndexAction.NAME + "*"; + public static final String GET_FIELD_MAPPINGS = GetFieldMappingsAction.NAME + "*"; + public static final String GET_ALIASES = GetAliasesAction.NAME + "*"; + public static final String RESOLVE_INDEX = ResolveIndexAction.NAME + "*"; + public static final String UPGRADE = UpgradeAction.NAME + "*"; + public static final String AUTO_CREATE = AutoCreateAction.NAME; + public static final String AUTO_PUT_MAPPING = AutoPutMappingAction.NAME; + public static final String CREATE_INDEX = CreateIndexAction.NAME; + + private IndicesAdmin() {} + } + + /** + * Constants for cluster-level operations + */ + public static final class ClusterOperations { + public static final String SNAPSHOT_RESTORE = RestoreSnapshotAction.NAME + "*"; + public static final String BASE_PATTERN = "cluster:"; + + private ClusterOperations() {} + } + + /** + * Constants for monitoring operations + */ + public static final class MonitorOperations { + public static final String GET_SETTINGS = GetSettingsAction.NAME + "*"; + public static final String STATS = IndicesStatsAction.NAME + "*"; + + private MonitorOperations() {} + } + + /** + * Constants for search-related operations + */ + public static final class SearchOperations { + public static final String SEARCH = SearchAction.NAME; + public static final String SCROLL = SearchScrollAction.NAME; + public static final String MULTI_SEARCH = MultiSearchAction.NAME; + public static final String RENDER_TEMPLATE = RenderSearchTemplateAction.NAME; + + public static final String SEARCH_SHARDS = ClusterSearchShardsAction.NAME + "*"; + + private SearchOperations() {} + } + + /** + * Constants for document-level operations + */ + public static final class DocumentOperations { + public static final String INDEX = IndexAction.NAME; + public static final String DELETE = DeleteAction.NAME; + public static final String BULK = BulkAction.NAME; + public static final String MULTI_GET = MultiGetAction.NAME; + public static final String MULTI_TERM_VECTORS = MultiTermVectorsAction.NAME; + public static final String REINDEX = ReindexAction.NAME; + public static final String UPDATE = UpdateAction.NAME; + + private DocumentOperations() {} + } + + /** + * Constants for template-related operations + */ + public static final class TemplateOperations { + public static final String ADMIN_TEMPLATE = "indices:admin/template/"; + public static final String ADMIN_INDEX_TEMPLATE = "indices:admin/index_template/"; + + private TemplateOperations() {} + } +}