This is an automated email from the ASF dual-hosted git repository.
madhan pushed a commit to branch ranger-2.5
in repository https://gitbox.apache.org/repos/asf/ranger.git
The following commit(s) were added to refs/heads/ranger-2.5 by this push:
new 3436c2517 RANGER-4859: updated Trino service-def for authorization
interface changes in Trino 451 - removed Trino plugin implementation as it is
being moved into Trino repo
3436c2517 is described below
commit 3436c25174ccf4c508c80f270df5a3f11c5e0d90
Author: Pradeep AgrawaL <[email protected]>
AuthorDate: Tue Jul 16 11:52:32 2024 +0530
RANGER-4859: updated Trino service-def for authorization interface changes
in Trino 451
- removed Trino plugin implementation as it is being moved into Trino repo
Signed-off-by: Madhan Neethiraj <[email protected]>
(cherry picked from commit 085baf44248a3167f0d668b410626bc91fc1184c)
---
.../service-defs/ranger-servicedef-trino.json | 122 ++-
distro/pom.xml | 36 +-
.../trino/authorizer/RangerConfig.java | 81 --
.../authorizer/RangerSystemAccessControl.java | 1030 --------------------
.../RangerSystemAccessControlFactory.java | 63 --
.../trino/authorizer/TrinoRangerPlugin.java | 34 -
.../authorizer/RangerSystemAccessControlTest.java | 204 ----
pom.xml | 38 +-
.../optimized/current/ranger_core_db_mysql.sql | 2 +
.../optimized/current/ranger_core_db_oracle.sql | 2 +
.../optimized/current/ranger_core_db_postgres.sql | 2 +
.../current/ranger_core_db_sqlanywhere.sql | 4 +
.../optimized/current/ranger_core_db_sqlserver.sql | 2 +
.../patch/PatchForTrinoSvcDefUpdate_J10062.java | 315 ++++++
14 files changed, 451 insertions(+), 1484 deletions(-)
diff --git
a/agents-common/src/main/resources/service-defs/ranger-servicedef-trino.json
b/agents-common/src/main/resources/service-defs/ranger-servicedef-trino.json
index 802c72c7a..352b26f10 100644
--- a/agents-common/src/main/resources/service-defs/ranger-servicedef-trino.json
+++ b/agents-common/src/main/resources/service-defs/ranger-servicedef-trino.json
@@ -203,6 +203,70 @@
"label": "Schema Procedure",
"description": "Schema Procedure",
"accessTypeRestrictions": ["execute", "grant"]
+ },
+ {
+ "itemId": 10,
+ "name": "schemafunction",
+ "type": "string",
+ "level": 30,
+ "parent": "schema",
+ "mandatory": true,
+ "lookupSupported": false,
+ "recursiveSupported": false,
+ "excludesSupported": false,
+ "matcher":
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
+ "matcherOptions": { "wildCard": true, "ignoreCase": true },
+ "label": "Schema Function",
+ "description": "Schema Function",
+ "accessTypeRestrictions": [ "create", "drop", "show" ]
+ },
+ {
+ "itemId": 11,
+ "name": "queryid",
+ "type": "string",
+ "level": 10,
+ "parent": "",
+ "mandatory": true,
+ "lookupSupported": false,
+ "recursiveSupported": false,
+ "excludesSupported": false,
+ "matcher":
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
+ "matcherOptions": { "wildCard": true, "ignoreCase": true },
+ "label": "Query ID",
+ "description": "Query ID",
+ "accessTypeRestrictions": [ "execute" ]
+ },
+ {
+ "itemId": 12,
+ "name": "sysinfo",
+ "type": "string",
+ "level": 10,
+ "parent": "",
+ "mandatory": true,
+ "lookupSupported": false,
+ "recursiveSupported": false,
+ "excludesSupported": false,
+ "matcher":
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
+ "matcherOptions": { "wildCard": true, "ignoreCase": true },
+ "label": "System Information",
+ "description": "Trino System Information",
+ "accessTypeRestrictions": [ "read_sysinfo", "write_sysinfo" ]
+ },
+ {
+ "itemId": 13,
+ "name": "role",
+ "type": "string",
+ "level": 10,
+ "parent": "",
+ "mandatory": true,
+ "lookupSupported": false,
+ "recursiveSupported": false,
+ "excludesSupported": false,
+ "matcher":
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
+ "matcherOptions": { "wildCard": true, "ignoreCase": true },
+ "label": "Role",
+ "description": "Trino Role",
+ "accessTypeRestrictions": [ "create", "drop", "show", "grant", "revoke" ]
}
],
"accessTypes": [
@@ -288,14 +352,28 @@
"revoke",
"show",
"impersonate",
- "execute"
+ "execute",
+ "read_sysinfo",
+ "write_sysinfo"
]
},
{
"itemId": 13,
"name": "execute",
- "label": "execute",
+ "label": "Execute",
"category": "READ"
+ },
+ {
+ "itemId": 14,
+ "name": "read_sysinfo",
+ "label": "Read System Information",
+ "category": "MANAGE"
+ },
+ {
+ "itemId": 15,
+ "name": "write_sysinfo",
+ "label": "Write System Information",
+ "category": "MANAGE"
}
],
"configs": [
@@ -338,6 +416,44 @@
"validationRegEx": "",
"validationMessage": "",
"uiHint": ""
+ },
+ {
+ "itemId": 5,
+ "name": "ranger.plugin.audit.filters",
+ "type": "string",
+ "defaultValue":
"[{'accessResult':'DENIED','isAudited':true},{'isAudited':false,'resources':{'queryid':{'values':['*']}},'accessTypes':['execute']},{'isAudited':false,'resources':{'trinouser':{'values':['{USER}']}},'accessTypes':['impersonate']}]"
+ },
+ {
+ "itemId": 6,
+ "name": "ranger.plugin.super.users",
+ "label": "Superusers",
+ "description": "Superusers will have full access to all resources in
this Trino instance",
+ "type": "string",
+ "defaultValue": "trino"
+ },
+ {
+ "itemId": 7,
+ "name": "ranger.plugin.super.groups",
+ "label": "Superuser groups",
+ "description": "Users in superuser groups will have full access to all
resources in this Trino instance",
+ "type": "string",
+ "defaultValue": "trino"
+ },
+ {
+ "itemId": 8,
+ "name": "service.admin.users",
+ "label": "Service admin users",
+ "description": "Service admin users can create policies for any
resource in this Trino instance",
+ "type": "string",
+ "defaultValue": "trino"
+ },
+ {
+ "itemId": 9,
+ "name": "service.admin.groups",
+ "label": "Service admin usergroups",
+ "description": "Users in service admin usergroups can create policies
for any resource in this Trino instance",
+ "type": "string",
+ "defaultValue": "trino"
}
],
"enums": [
@@ -482,4 +598,4 @@
]
}
-}
\ No newline at end of file
+}
diff --git a/distro/pom.xml b/distro/pom.xml
index 6d606f043..fae6effe9 100644
--- a/distro/pom.xml
+++ b/distro/pom.xml
@@ -75,42 +75,8 @@
<descriptor>src/main/assembly/plugin-elasticsearch.xml</descriptor>
<descriptor>src/main/assembly/plugin-schema-registry.xml</descriptor>
<descriptor>src/main/assembly/plugin-presto.xml</descriptor>
-
<descriptor>src/main/assembly/sample-client.xml</descriptor>
- </descriptors>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- </profile>
-
- <profile>
- <id>ranger-jdk11</id>
- <activation>
- <jdk>11</jdk>
- </activation>
- <build>
- <plugins>
- <plugin>
- <artifactId>maven-assembly-plugin</artifactId>
- <version>${assembly.plugin.version}</version>
- <configuration>
- <finalName>ranger-${project.version}</finalName>
- <outputDirectory>../target</outputDirectory>
- </configuration>
- <executions>
- <execution>
- <goals>
- <goal>single</goal>
- </goals>
- <phase>package</phase>
- <configuration>
- <skipAssembly>false</skipAssembly>
- <descriptors>
-
<descriptor>src/main/assembly/admin-web.xml</descriptor>
-
<descriptor>src/main/assembly/solr_audit_conf.xml</descriptor>
<descriptor>src/main/assembly/plugin-trino.xml</descriptor>
+
<descriptor>src/main/assembly/sample-client.xml</descriptor>
</descriptors>
</configuration>
</execution>
diff --git
a/plugin-trino/src/main/java/org/apache/ranger/authorization/trino/authorizer/RangerConfig.java
b/plugin-trino/src/main/java/org/apache/ranger/authorization/trino/authorizer/RangerConfig.java
deleted file mode 100644
index 53e1eac9a..000000000
---
a/plugin-trino/src/main/java/org/apache/ranger/authorization/trino/authorizer/RangerConfig.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ranger.authorization.trino.authorizer;
-
-import io.airlift.configuration.Config;
-import io.airlift.configuration.ConfigDescription;
-
-public class RangerConfig
-{
- private String keytab;
- private String principal;
- private boolean useUgi;
- private String hadoopConfigPath;
-
- public String getKeytab()
- {
- return keytab;
- }
-
- @Config("ranger.keytab")
- @ConfigDescription("Keytab for authentication against Ranger")
- @SuppressWarnings("unused")
- public RangerConfig setKeytab(String keytab)
- {
- this.keytab = keytab;
- return this;
- }
-
- public String getPrincipal()
- {
- return principal;
- }
-
- @Config("ranger.principal")
- @ConfigDescription("Principal for authentication against Ranger with
keytab")
- @SuppressWarnings("unused")
- public RangerConfig setPrincipal(String principal)
- {
- this.principal = principal;
- return this;
- }
-
- public boolean isUseUgi()
- {
- return useUgi;
- }
-
- @Config("ranger.use_ugi")
- @ConfigDescription("Use Hadoop User Group Information instead of Trino
groups")
- @SuppressWarnings("unused")
- public RangerConfig setUseUgi(boolean useUgi)
- {
- this.useUgi = useUgi;
- return this;
- }
-
- @Config("ranger.hadoop_config")
- @ConfigDescription("Path to hadoop configuration. Defaults to
trino-ranger-site.xml in classpath")
- @SuppressWarnings("unused")
- public RangerConfig setHadoopConfigPath(String hadoopConfigPath)
- {
- this.hadoopConfigPath = hadoopConfigPath;
- return this;
- }
-
- public String getHadoopConfigPath()
- {
- return hadoopConfigPath;
- }
-}
diff --git
a/plugin-trino/src/main/java/org/apache/ranger/authorization/trino/authorizer/RangerSystemAccessControl.java
b/plugin-trino/src/main/java/org/apache/ranger/authorization/trino/authorizer/RangerSystemAccessControl.java
deleted file mode 100644
index 4fb5dfa9a..000000000
---
a/plugin-trino/src/main/java/org/apache/ranger/authorization/trino/authorizer/RangerSystemAccessControl.java
+++ /dev/null
@@ -1,1030 +0,0 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ranger.authorization.trino.authorizer;
-
-import com.google.common.collect.ImmutableList;
-import com.google.inject.Inject;
-import io.trino.spi.connector.CatalogSchemaName;
-import io.trino.spi.connector.CatalogSchemaRoutineName;
-import io.trino.spi.connector.CatalogSchemaTableName;
-import io.trino.spi.connector.SchemaTableName;
-import io.trino.spi.security.AccessDeniedException;
-import io.trino.spi.security.Privilege;
-import io.trino.spi.security.SystemAccessControl;
-import io.trino.spi.security.SystemSecurityContext;
-import io.trino.spi.security.TrinoPrincipal;
-import io.trino.spi.security.ViewExpression;
-import io.trino.spi.type.Type;
-import org.apache.commons.lang.StringUtils;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.security.UserGroupInformation;
-import org.apache.ranger.plugin.audit.RangerDefaultAuditHandler;
-import org.apache.ranger.plugin.model.RangerPolicy;
-import org.apache.ranger.plugin.model.RangerServiceDef;
-import org.apache.ranger.plugin.policyengine.RangerAccessRequestImpl;
-import org.apache.ranger.plugin.policyengine.RangerAccessResourceImpl;
-import org.apache.ranger.plugin.policyengine.RangerAccessResult;
-import org.apache.ranger.plugin.service.RangerBasePlugin;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.net.URL;
-import java.security.Principal;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-
-import static java.util.Locale.ENGLISH;
-
-public class RangerSystemAccessControl
- implements SystemAccessControl
-{
- private static final Logger LOG =
LoggerFactory.getLogger(RangerSystemAccessControl.class);
-
- public static final String RANGER_TRINO_DEFAULT_HADOOP_CONF =
"trino-ranger-site.xml";
- public static final String RANGER_TRINO_SERVICETYPE = "trino";
- public static final String RANGER_TRINO_APPID = "trino";
-
- private final RangerBasePlugin rangerPlugin;
- private final boolean useUgi;
-
- @Inject
- public RangerSystemAccessControl(RangerConfig config)
- {
- super();
-
- Configuration hadoopConf = new Configuration();
-
- if (config.getHadoopConfigPath() != null) {
- URL url = hadoopConf.getResource(config.getHadoopConfigPath());
-
- if (url == null) {
- LOG.warn("Hadoop config " + config.getHadoopConfigPath() + "
not found");
- }
- else {
- hadoopConf.addResource(url);
- }
- }
- else {
- URL url = hadoopConf.getResource(RANGER_TRINO_DEFAULT_HADOOP_CONF);
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("Trying to load Hadoop config from " + url + " (can
be null)");
- }
-
- if (url != null) {
- hadoopConf.addResource(url);
- }
- }
-
- UserGroupInformation.setConfiguration(hadoopConf);
-
- if (config.getKeytab() != null && config.getPrincipal() != null) {
- String keytab = config.getKeytab();
- String principal = config.getPrincipal();
-
- LOG.info("Performing kerberos login with principal " + principal +
" and keytab " + keytab);
-
- try {
- UserGroupInformation.loginUserFromKeytab(principal, keytab);
- }
- catch (IOException ioe) {
- LOG.error("Kerberos login failed", ioe);
-
- throw new RuntimeException(ioe);
- }
- }
-
- useUgi = config.isUseUgi();
- rangerPlugin = new RangerBasePlugin(RANGER_TRINO_SERVICETYPE,
RANGER_TRINO_APPID);
-
- rangerPlugin.init();
- rangerPlugin.setResultProcessor(new RangerDefaultAuditHandler());
- }
-
- /** FILTERING AND DATA MASKING **/
-
- private RangerAccessResult getDataMaskResult(RangerTrinoAccessRequest
request)
- {
- if (LOG.isDebugEnabled()) {
- LOG.debug("==> getDataMaskResult(request=" + request + ")");
- }
-
- RangerAccessResult ret = rangerPlugin.evalDataMaskPolicies(request,
null);
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("<== getDataMaskResult(request=" + request + "): ret=" +
ret);
- }
-
- return ret;
- }
-
- private RangerAccessResult getRowFilterResult(RangerTrinoAccessRequest
request)
- {
- if (LOG.isDebugEnabled()) {
- LOG.debug("==> getRowFilterResult(request=" + request + ")");
- }
-
- RangerAccessResult ret = rangerPlugin.evalRowFilterPolicies(request,
null);
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("<== getRowFilterResult(request=" + request + "): ret="
+ ret);
- }
-
- return ret;
- }
-
- private boolean isDataMaskEnabled(RangerAccessResult result)
- {
- return result != null && result.isMaskEnabled();
- }
-
- private boolean isRowFilterEnabled(RangerAccessResult result)
- {
- return result != null && result.isRowFilterEnabled();
- }
-
- @Override
- public Optional<ViewExpression> getRowFilter(SystemSecurityContext
context, CatalogSchemaTableName tableName)
- {
- RangerTrinoAccessRequest request =
createAccessRequest(createResource(tableName), context, TrinoAccessType.SELECT);
- RangerAccessResult result = getRowFilterResult(request);
- ViewExpression viewExpression = null;
-
- if (isRowFilterEnabled(result)) {
- String filter = result.getFilterExpr();
-
- viewExpression = new
ViewExpression(context.getIdentity().getUser(),
Optional.of(tableName.getCatalogName()),
Optional.of(tableName.getSchemaTableName().getSchemaName()), filter);
- }
-
- return Optional.ofNullable(viewExpression);
- }
-
- @Override
- public List<ViewExpression> getRowFilters(SystemSecurityContext context,
CatalogSchemaTableName tableName)
- {
- return getRowFilter(context,
tableName).map(ImmutableList::of).orElseGet(ImmutableList::of);
- }
-
- @Override
- public Optional<ViewExpression> getColumnMask(SystemSecurityContext
context, CatalogSchemaTableName tableName, String columnName, Type type)
- {
- RangerTrinoAccessRequest request =
createAccessRequest(createResource(tableName.getCatalogName(),
tableName.getSchemaTableName().getSchemaName(),
tableName.getSchemaTableName().getTableName(), Optional.of(columnName)),
context, TrinoAccessType.SELECT);
- RangerAccessResult result = getDataMaskResult(request);
- ViewExpression viewExpression = null;
-
- if (isDataMaskEnabled(result)) {
- String maskType = result.getMaskType();
- RangerServiceDef.RangerDataMaskTypeDef maskTypeDef =
result.getMaskTypeDef();
- String transformer = null;
-
- if (maskTypeDef != null) {
- transformer = maskTypeDef.getTransformer();
- }
-
- if (StringUtils.equalsIgnoreCase(maskType,
RangerPolicy.MASK_TYPE_NULL)) {
- transformer = "NULL";
- }
- else if (StringUtils.equalsIgnoreCase(maskType,
RangerPolicy.MASK_TYPE_CUSTOM)) {
- String maskedValue = result.getMaskedValue();
-
- if (maskedValue == null) {
- transformer = "NULL";
- }
- else {
- transformer = maskedValue;
- }
- }
-
- if (StringUtils.isNotEmpty(transformer)) {
- transformer = transformer.replace("{col}",
columnName).replace("{type}", type.getDisplayName());
- }
-
- viewExpression = new
ViewExpression(context.getIdentity().getUser(),
Optional.of(tableName.getCatalogName()),
Optional.of(tableName.getSchemaTableName().getSchemaName()), transformer);
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("getColumnMask: user: %s, catalog: %s, schema: %s,
transformer: %s");
- }
- }
-
- return Optional.ofNullable(viewExpression);
- }
-
- @Override
- public List<ViewExpression> getColumnMasks(SystemSecurityContext context,
CatalogSchemaTableName tableName, String columnName, Type type)
- {
- return getColumnMask(context, tableName, columnName,
type).map(ImmutableList::of).orElseGet(ImmutableList::of);
- }
-
- @Override
- public Set<String> filterCatalogs(SystemSecurityContext context,
Set<String> catalogs)
- {
- LOG.debug("==> RangerSystemAccessControl.filterCatalogs(" + catalogs +
")");
-
- Set<String> filteredCatalogs = new HashSet<>(catalogs.size());
-
- for (String catalog : catalogs) {
- if (hasPermission(createResource(catalog), context,
TrinoAccessType.SELECT)) {
- filteredCatalogs.add(catalog);
- }
- }
-
- return filteredCatalogs;
- }
-
- @Override
- public Set<String> filterSchemas(SystemSecurityContext context, String
catalogName, Set<String> schemaNames)
- {
- LOG.debug("==> RangerSystemAccessControl.filterSchemas(" + catalogName
+ ")");
-
- Set<String> filteredSchemaNames = new HashSet<>(schemaNames.size());
-
- for (String schemaName : schemaNames) {
- if (hasPermission(createResource(catalogName, schemaName),
context, TrinoAccessType.SELECT)) {
- filteredSchemaNames.add(schemaName);
- }
- }
-
- return filteredSchemaNames;
- }
-
- @Override
- public Set<SchemaTableName> filterTables(SystemSecurityContext context,
String catalogName, Set<SchemaTableName> tableNames)
- {
- LOG.debug("==> RangerSystemAccessControl.filterTables(" + catalogName
+ ")");
-
- Set<SchemaTableName> filteredTableNames = new
HashSet<>(tableNames.size());
-
- for (SchemaTableName tableName : tableNames) {
- RangerTrinoResource res = createResource(catalogName,
tableName.getSchemaName(), tableName.getTableName());
- if (hasPermission(res, context, TrinoAccessType.SELECT)) {
- filteredTableNames.add(tableName);
- }
- }
-
- return filteredTableNames;
- }
-
- /** PERMISSION CHECKS ORDERED BY SYSTEM, CATALOG, SCHEMA, TABLE, VIEW,
COLUMN, QUERY, FUNCTIONS, PROCEDURES **/
-
- /** SYSTEM **/
-
- @Override
- public void checkCanSetSystemSessionProperty(SystemSecurityContext
context, String propertyName)
- {
- if (!hasPermission(createSystemPropertyResource(propertyName),
context, TrinoAccessType.ALTER)) {
-
LOG.debug("RangerSystemAccessControl.checkCanSetSystemSessionProperty denied");
-
- AccessDeniedException.denySetSystemSessionProperty(propertyName);
- }
- }
-
- @Override
- public void checkCanImpersonateUser(SystemSecurityContext context, String
userName)
- {
- if (!hasPermission(createUserResource(userName), context,
TrinoAccessType.IMPERSONATE)) {
- LOG.debug("RangerSystemAccessControl.checkCanImpersonateUser(" +
userName + ") denied");
-
-
AccessDeniedException.denyImpersonateUser(context.getIdentity().getUser(),
userName);
- }
- }
-
- @Override
- public void checkCanSetUser(Optional<Principal> principal, String userName)
- {
- // pass as it is deprecated
- }
-
- /** CATALOG **/
- @Override
- public void checkCanSetCatalogSessionProperty(SystemSecurityContext
context, String catalogName, String propertyName)
- {
- if (!hasPermission(createCatalogSessionResource(catalogName,
propertyName), context, TrinoAccessType.ALTER)) {
-
LOG.debug("RangerSystemAccessControl.checkCanSetSystemSessionProperty(" +
catalogName + ") denied");
-
- AccessDeniedException.denySetCatalogSessionProperty(catalogName,
propertyName);
- }
- }
-
- @Override
- public void checkCanShowRoles(SystemSecurityContext context)
- {
- //allow
- }
-
- @Override
- public void checkCanShowCurrentRoles(SystemSecurityContext context)
- {
- //allow
- }
-
- @Override
- public void checkCanShowRoleGrants(SystemSecurityContext context)
- {
- //allow
- }
-
- @Override
- public void checkCanAccessCatalog(SystemSecurityContext context, String
catalogName)
- {
- if (!hasPermission(createResource(catalogName), context,
TrinoAccessType.USE)) {
- LOG.debug("RangerSystemAccessControl.checkCanAccessCatalog(" +
catalogName + ") denied");
-
- AccessDeniedException.denyCatalogAccess(catalogName);
- }
- }
-
- @Override
- public void checkCanShowSchemas(SystemSecurityContext context, String
catalogName)
- {
- if (!hasPermission(createResource(catalogName), context,
TrinoAccessType.SHOW)) {
- LOG.debug("RangerSystemAccessControl.checkCanShowSchemas(" +
catalogName + ") denied");
-
- AccessDeniedException.denyShowSchemas(catalogName);
- }
- }
-
- /** SCHEMA **/
-
- @Override
- public void checkCanSetSchemaAuthorization(SystemSecurityContext context,
CatalogSchemaName schema, TrinoPrincipal principal)
- {
- if (!hasPermission(createResource(schema.getCatalogName(),
schema.getSchemaName()), context, TrinoAccessType.GRANT)) {
-
LOG.debug("RangerSystemAccessControl.checkCanSetSchemaAuthorization(" +
schema.getSchemaName() + ") denied");
-
-
AccessDeniedException.denySetSchemaAuthorization(schema.getSchemaName(),
principal);
- }
- }
-
- @Override
- public void checkCanShowCreateSchema(SystemSecurityContext context,
CatalogSchemaName schema)
- {
- if (!hasPermission(createResource(schema.getCatalogName(),
schema.getSchemaName()), context, TrinoAccessType.SHOW)) {
- LOG.debug("RangerSystemAccessControl.checkCanShowCreateSchema(" +
schema.getSchemaName() + ") denied");
-
- AccessDeniedException.denyShowCreateSchema(schema.getSchemaName());
- }
- }
-
- /**
- * Create schema is evaluated on the level of the Catalog. This means that
it is assumed you have permission
- * to create a schema when you have create rights on the catalog level
- */
- @Override
- public void checkCanCreateSchema(SystemSecurityContext context,
CatalogSchemaName schema)
- {
- if (!hasPermission(createResource(schema.getCatalogName()), context,
TrinoAccessType.CREATE)) {
- LOG.debug("RangerSystemAccessControl.checkCanCreateSchema(" +
schema.getSchemaName() + ") denied");
-
- AccessDeniedException.denyCreateSchema(schema.getSchemaName());
- }
- }
-
- /**
- * This is evaluated against the schema name as ownership information is
not available
- */
- @Override
- public void checkCanDropSchema(SystemSecurityContext context,
CatalogSchemaName schema)
- {
- if (!hasPermission(createResource(schema.getCatalogName(),
schema.getSchemaName()), context, TrinoAccessType.DROP)) {
- LOG.debug("RangerSystemAccessControl.checkCanDropSchema(" +
schema.getSchemaName() + ") denied");
-
- AccessDeniedException.denyDropSchema(schema.getSchemaName());
- }
- }
-
- /**
- * This is evaluated against the schema name as ownership information is
not available
- */
- @Override
- public void checkCanRenameSchema(SystemSecurityContext context,
CatalogSchemaName schema, String newSchemaName)
- {
- RangerTrinoResource res = createResource(schema.getCatalogName(),
schema.getSchemaName());
- if (!hasPermission(res, context, TrinoAccessType.ALTER)) {
- LOG.debug("RangerSystemAccessControl.checkCanRenameSchema(" +
schema.getSchemaName() + ") denied");
-
- AccessDeniedException.denyRenameSchema(schema.getSchemaName(),
newSchemaName);
- }
- }
-
- /** TABLE **/
-
- @Override
- public void checkCanShowTables(SystemSecurityContext context,
CatalogSchemaName schema)
- {
- if (!hasPermission(createResource(schema), context,
TrinoAccessType.SHOW)) {
- LOG.debug("RangerSystemAccessControl.checkCanShowTables(" +
schema.toString() + ") denied");
-
- AccessDeniedException.denyShowTables(schema.toString());
- }
- }
-
- @Override
- public void checkCanShowCreateTable(SystemSecurityContext context,
CatalogSchemaTableName table)
- {
- if (!hasPermission(createResource(table), context,
TrinoAccessType.SHOW)) {
- LOG.debug("RangerSystemAccessControl.checkCanShowTables(" +
table.toString() + ") denied");
-
- AccessDeniedException.denyShowCreateTable(table.toString());
- }
- }
-
- /**
- * Create table is verified on schema level
- */
- @Override
- public void checkCanCreateTable(SystemSecurityContext context,
CatalogSchemaTableName table, Map<String, Object> properties)
- {
- if (!hasPermission(createResource(table.getCatalogName(),
table.getSchemaTableName().getSchemaName()), context, TrinoAccessType.CREATE)) {
- LOG.debug("RangerSystemAccessControl.checkCanCreateTable(" +
table.getSchemaTableName().getTableName() + ") denied");
-
-
AccessDeniedException.denyCreateTable(table.getSchemaTableName().getTableName());
- }
- }
-
- /**
- * This is evaluated against the table name as ownership information is
not available
- */
- @Override
- public void checkCanDropTable(SystemSecurityContext context,
CatalogSchemaTableName table)
- {
- if (!hasPermission(createResource(table), context,
TrinoAccessType.DROP)) {
- LOG.debug("RangerSystemAccessControl.checkCanDropTable(" +
table.getSchemaTableName().getTableName() + ") denied");
-
-
AccessDeniedException.denyDropTable(table.getSchemaTableName().getTableName());
- }
- }
-
- /**
- * This is evaluated against the table name as ownership information is
not available
- */
- @Override
- public void checkCanRenameTable(SystemSecurityContext context,
CatalogSchemaTableName table, CatalogSchemaTableName newTable)
- {
- RangerTrinoResource res = createResource(table);
-
- if (!hasPermission(res, context, TrinoAccessType.ALTER)) {
- LOG.debug("RangerSystemAccessControl.checkCanRenameTable(" +
table.getSchemaTableName().getTableName() + ") denied");
-
-
AccessDeniedException.denyRenameTable(table.getSchemaTableName().getTableName(),
newTable.getSchemaTableName().getTableName());
- }
- }
-
- @Override
- public void checkCanInsertIntoTable(SystemSecurityContext context,
CatalogSchemaTableName table)
- {
- RangerTrinoResource res = createResource(table);
-
- if (!hasPermission(res, context, TrinoAccessType.INSERT)) {
- LOG.debug("RangerSystemAccessControl.checkCanInsertIntoTable(" +
table.getSchemaTableName().getTableName() + ") denied");
-
-
AccessDeniedException.denyInsertTable(table.getSchemaTableName().getTableName());
- }
- }
-
- @Override
- public void checkCanDeleteFromTable(SystemSecurityContext context,
CatalogSchemaTableName table)
- {
- if (!hasPermission(createResource(table), context,
TrinoAccessType.DELETE)) {
- LOG.debug("RangerSystemAccessControl.checkCanDeleteFromTable(" +
table.getSchemaTableName().getTableName() + ") denied");
-
-
AccessDeniedException.denyDeleteTable(table.getSchemaTableName().getTableName());
- }
- }
-
- @Override
- public void checkCanTruncateTable(SystemSecurityContext context,
CatalogSchemaTableName table)
- {
- if (!hasPermission(createResource(table), context,
TrinoAccessType.DELETE)) {
- LOG.debug("RangerSystemAccessControl.checkCanTruncateTable(" +
table.getSchemaTableName().getTableName() + ") denied");
-
-
AccessDeniedException.denyTruncateTable(table.getSchemaTableName().getTableName());
- }
- }
-
- @Override
- public void checkCanGrantTablePrivilege(SystemSecurityContext context,
Privilege privilege, CatalogSchemaTableName table, TrinoPrincipal grantee,
boolean withGrantOption)
- {
- if (!hasPermission(createResource(table), context,
TrinoAccessType.GRANT)) {
- LOG.debug("RangerSystemAccessControl.checkCanGrantTablePrivilege("
+ table + ") denied");
-
-
AccessDeniedException.denyGrantTablePrivilege(privilege.toString(),
table.toString());
- }
- }
-
- @Override
- public void checkCanRevokeTablePrivilege(SystemSecurityContext context,
Privilege privilege, CatalogSchemaTableName table, TrinoPrincipal revokee,
boolean grantOptionFor)
- {
- if (!hasPermission(createResource(table), context,
TrinoAccessType.REVOKE)) {
-
LOG.debug("RangerSystemAccessControl.checkCanRevokeTablePrivilege(" + table +
") denied");
-
-
AccessDeniedException.denyRevokeTablePrivilege(privilege.toString(),
table.toString());
- }
- }
-
- @Override
- public void checkCanSetTableComment(SystemSecurityContext context,
CatalogSchemaTableName table)
- {
- if (!hasPermission(createResource(table), context,
TrinoAccessType.ALTER)) {
- LOG.debug("RangerSystemAccessControl.checkCanSetTableComment(" +
table.toString() + ") denied");
-
- AccessDeniedException.denyCommentTable(table.toString());
- }
- }
-
- @Override
- public void checkCanSetColumnComment(SystemSecurityContext context,
CatalogSchemaTableName table)
- {
- if (!hasPermission(createResource(table), context,
TrinoAccessType.ALTER)) {
- LOG.debug("RangerSystemAccessControl.checkCanSetColumnComment(" +
table.toString() + ") denied");
-
- AccessDeniedException.denyCommentColumn(table.toString());
- }
- }
-
- /**
- * Create view is verified on schema level
- */
- @Override
- public void checkCanCreateView(SystemSecurityContext context,
CatalogSchemaTableName view)
- {
- if (!hasPermission(createResource(view.getCatalogName(),
view.getSchemaTableName().getSchemaName()), context, TrinoAccessType.CREATE)) {
- LOG.debug("RangerSystemAccessControl.checkCanCreateView(" +
view.getSchemaTableName().getTableName() + ") denied");
-
-
AccessDeniedException.denyCreateView(view.getSchemaTableName().getTableName());
- }
- }
-
- /**
- * This is evaluated against the table name as ownership information is
not available
- */
- @Override
- public void checkCanDropView(SystemSecurityContext context,
CatalogSchemaTableName view)
- {
- if (!hasPermission(createResource(view), context,
TrinoAccessType.DROP)) {
- LOG.debug("RangerSystemAccessControl.checkCanDropView(" +
view.getSchemaTableName().getTableName() + ") denied");
-
-
AccessDeniedException.denyDropView(view.getSchemaTableName().getTableName());
- }
- }
-
- @Override
- public void checkCanSetViewAuthorization(SystemSecurityContext context,
CatalogSchemaTableName view, TrinoPrincipal principal)
- {
- if (!hasPermission(createResource(view), context,
TrinoAccessType.ALTER)) {
-
LOG.debug("RangerSystemAccessControl.checkCanSetViewAuthorization(" +
view.getSchemaTableName().getTableName() + ") denied");
-
- AccessDeniedException.denySetViewAuthorization(view.toString(),
principal);
- }
- }
-
- /**
- * This check equals the check for checkCanCreateView
- */
- @Override
- public void checkCanCreateViewWithSelectFromColumns(SystemSecurityContext
context, CatalogSchemaTableName table, Set<String> columns)
- {
- try {
- checkCanCreateView(context, table);
- }
- catch (AccessDeniedException ade) {
-
LOG.debug("RangerSystemAccessControl.checkCanCreateViewWithSelectFromColumns("
+ table.getSchemaTableName().getTableName() + ") denied");
-
-
AccessDeniedException.denyCreateViewWithSelect(table.getSchemaTableName().getTableName(),
context.getIdentity());
- }
- }
-
- /**
- *
- * check if materialized view can be created
- */
- @Override
- public void checkCanCreateMaterializedView(SystemSecurityContext context,
CatalogSchemaTableName materializedView, Map<String, Object> properties)
- {
- if (!hasPermission(createResource(materializedView), context,
TrinoAccessType.CREATE)) {
-
LOG.debug("RangerSystemAccessControl.checkCanCreateMaterializedView( " +
materializedView.getSchemaTableName().getTableName() + ") denied");
-
-
AccessDeniedException.denyCreateMaterializedView(materializedView.getSchemaTableName().getTableName());
- }
- }
-
- @Override
- public void checkCanDropMaterializedView(SystemSecurityContext context,
CatalogSchemaTableName materializedView)
- {
- if (!hasPermission(createResource(materializedView), context,
TrinoAccessType.DROP)) {
-
LOG.debug("RangerSystemAccessControl.checkCanDropMaterializedView(" +
materializedView.getSchemaTableName().getTableName() + ") denied");
-
-
AccessDeniedException.denyCreateView(materializedView.getSchemaTableName().getTableName());
- }
- }
-
- /**
- * This is evaluated against the table name as ownership information is
not available
- */
- @Override
- public void checkCanRenameView(SystemSecurityContext context,
CatalogSchemaTableName view, CatalogSchemaTableName newView)
- {
- if (!hasPermission(createResource(view), context,
TrinoAccessType.ALTER)) {
- LOG.debug("RangerSystemAccessControl.checkCanRenameView(" +
view.toString() + ") denied");
-
- AccessDeniedException.denyRenameView(view.toString(),
newView.toString());
- }
- }
-
- /** COLUMN **/
-
- /**
- * This is evaluated on table level
- */
- @Override
- public void checkCanAddColumn(SystemSecurityContext context,
CatalogSchemaTableName table)
- {
- RangerTrinoResource res = createResource(table);
-
- if (!hasPermission(res, context, TrinoAccessType.ALTER)) {
-
AccessDeniedException.denyAddColumn(table.getSchemaTableName().getTableName());
- }
- }
-
- /**
- * This is evaluated on table level
- */
- @Override
- public void checkCanDropColumn(SystemSecurityContext context,
CatalogSchemaTableName table)
- {
- RangerTrinoResource res = createResource(table);
-
- if (!hasPermission(res, context, TrinoAccessType.DROP)) {
- LOG.debug("RangerSystemAccessControl.checkCanDropColumn(" +
table.getSchemaTableName().getTableName() + ") denied");
-
-
AccessDeniedException.denyDropColumn(table.getSchemaTableName().getTableName());
- }
- }
-
- /**
- * This is evaluated on table level
- */
- @Override
- public void checkCanRenameColumn(SystemSecurityContext context,
CatalogSchemaTableName table)
- {
- RangerTrinoResource res = createResource(table);
-
- if (!hasPermission(res, context, TrinoAccessType.ALTER)) {
- LOG.debug("RangerSystemAccessControl.checkCanRenameColumn(" +
table.getSchemaTableName().getTableName() + ") denied");
-
-
AccessDeniedException.denyRenameColumn(table.getSchemaTableName().getTableName());
- }
- }
-
- /**
- * This is evaluated on table level
- */
- @Override
- public void checkCanShowColumns(SystemSecurityContext context,
CatalogSchemaTableName table)
- {
- if (!hasPermission(createResource(table), context,
TrinoAccessType.SHOW)) {
- LOG.debug("RangerSystemAccessControl.checkCanShowTables(" +
table.toString() + ") denied");
- AccessDeniedException.denyShowColumns(table.toString());
- }
- }
-
- @Override
- public void checkCanSelectFromColumns(SystemSecurityContext context,
CatalogSchemaTableName table, Set<String> columns)
- {
- for (RangerTrinoResource res : createResource(table, columns)) {
- if (!hasPermission(res, context, TrinoAccessType.SELECT)) {
-
LOG.debug("RangerSystemAccessControl.checkCanSelectFromColumns(" +
table.getSchemaTableName().getTableName() + ") denied");
-
-
AccessDeniedException.denySelectColumns(table.getSchemaTableName().getTableName(),
columns);
- }
- }
- }
-
- /**
- * This is a NOOP, no filtering is applied
- */
- @Override
- public Set<String> filterColumns(SystemSecurityContext context,
CatalogSchemaTableName table, Set<String> columns)
- {
- return columns;
- }
-
- /** QUERY **/
-
- /**
- * This is a NOOP. Everyone can execute a query
- */
- @Override
- public void checkCanExecuteQuery(SystemSecurityContext context)
- {
- }
-
- @Override
- public void checkCanViewQueryOwnedBy(SystemSecurityContext context, String
queryOwner)
- {
- if (!hasPermission(createUserResource(queryOwner), context,
TrinoAccessType.IMPERSONATE)) {
- LOG.debug("RangerSystemAccessControl.checkCanViewQueryOwnedBy(" +
queryOwner + ") denied");
-
-
AccessDeniedException.denyImpersonateUser(context.getIdentity().getUser(),
queryOwner);
- }
- }
-
- /**
- * This is a NOOP, no filtering is applied
- */
- @Override
- public Set<String> filterViewQueryOwnedBy(SystemSecurityContext context,
Set<String> queryOwners)
- {
- return queryOwners;
- }
-
- @Override
- public void checkCanKillQueryOwnedBy(SystemSecurityContext context, String
queryOwner)
- {
- if (!hasPermission(createUserResource(queryOwner), context,
TrinoAccessType.IMPERSONATE)) {
- LOG.debug("RangerSystemAccessControl.checkCanKillQueryOwnedBy(" +
queryOwner + ") denied");
-
-
AccessDeniedException.denyImpersonateUser(context.getIdentity().getUser(),
queryOwner);
- }
- }
-
- /** FUNCTIONS **/
- @Override
- public void checkCanGrantExecuteFunctionPrivilege(SystemSecurityContext
context, String function, TrinoPrincipal grantee, boolean grantOption)
- {
- if (!hasPermission(createFunctionResource(function), context,
TrinoAccessType.GRANT)) {
-
LOG.debug("RangerSystemAccessControl.checkCanGrantExecuteFunctionPrivilege(" +
function + ") denied");
-
- AccessDeniedException.denyGrantExecuteFunctionPrivilege(function,
context.getIdentity(), grantee.getName());
- }
- }
-
- @Override
- public void checkCanExecuteFunction(SystemSecurityContext context, String
function)
- {
- if (!hasPermission(createFunctionResource(function), context,
TrinoAccessType.EXECUTE)) {
- LOG.debug("RangerSystemAccessControl.checkCanExecuteFunction(" +
function + ") denied");
-
- AccessDeniedException.denyExecuteFunction(function);
- }
- }
-
- /** PROCEDURES **/
- @Override
- public void checkCanExecuteProcedure(SystemSecurityContext context,
CatalogSchemaRoutineName procedure)
- {
- if (!hasPermission(createProcedureResource(procedure), context,
TrinoAccessType.EXECUTE)) {
- LOG.debug("RangerSystemAccessControl.checkCanExecuteFunction(" +
procedure.getSchemaRoutineName().getRoutineName() + ") denied");
-
-
AccessDeniedException.denyExecuteProcedure(procedure.getSchemaRoutineName().getRoutineName());
- }
- }
-
- @Override
- public void checkCanExecuteTableProcedure(SystemSecurityContext context,
CatalogSchemaTableName catalogSchemaTableName, String procedure)
- {
- if (!hasPermission(createResource(catalogSchemaTableName), context,
TrinoAccessType.ALTER)) {
- LOG.debug("RangerSystemAccessControl.checkCanExecuteFunction(" +
procedure + ") denied");
-
-
AccessDeniedException.denyExecuteTableProcedure(catalogSchemaTableName.toString(),
procedure);
- }
- }
-
- /** HELPER FUNCTIONS **/
-
- private RangerTrinoAccessRequest createAccessRequest(RangerTrinoResource
resource, SystemSecurityContext context, TrinoAccessType accessType)
- {
- Set<String> userGroups = null;
-
- if (useUgi) {
- UserGroupInformation ugi =
UserGroupInformation.createRemoteUser(context.getIdentity().getUser());
- String[] groups = ugi != null ? ugi.getGroupNames() : null;
-
- if (groups != null && groups.length > 0) {
- userGroups = new HashSet<>(Arrays.asList(groups));
- }
- }
- else {
- userGroups = context.getIdentity().getGroups();
- }
-
- RangerTrinoAccessRequest request = new
RangerTrinoAccessRequest(resource, context.getIdentity().getUser(), userGroups,
accessType);
-
- return request;
- }
-
- private boolean hasPermission(RangerTrinoResource resource,
SystemSecurityContext context, TrinoAccessType accessType)
- {
- RangerTrinoAccessRequest request = createAccessRequest(resource,
context, accessType);
- RangerAccessResult result = rangerPlugin.isAccessAllowed(request);
-
- return result != null && result.getIsAllowed();
- }
-
- private static RangerTrinoResource createUserResource(String userName)
- {
- RangerTrinoResource res = new RangerTrinoResource();
-
- res.setValue(RangerTrinoResource.KEY_USER, userName);
-
- return res;
- }
-
- private static RangerTrinoResource createFunctionResource(String function)
- {
- RangerTrinoResource res = new RangerTrinoResource();
-
- res.setValue(RangerTrinoResource.KEY_FUNCTION, function);
-
- return res;
- }
-
- private static RangerTrinoResource
createProcedureResource(CatalogSchemaRoutineName procedure)
- {
- RangerTrinoResource res = new RangerTrinoResource();
-
- res.setValue(RangerTrinoResource.KEY_CATALOG,
procedure.getCatalogName());
- res.setValue(RangerTrinoResource.KEY_SCHEMA,
procedure.getSchemaRoutineName().getSchemaName());
- res.setValue(RangerTrinoResource.KEY_PROCEDURE,
procedure.getSchemaRoutineName().getRoutineName());
-
- return res;
- }
-
- private static RangerTrinoResource createCatalogSessionResource(String
catalogName, String propertyName)
- {
- RangerTrinoResource res = new RangerTrinoResource();
-
- res.setValue(RangerTrinoResource.KEY_CATALOG, catalogName);
- res.setValue(RangerTrinoResource.KEY_SESSION_PROPERTY, propertyName);
-
- return res;
- }
-
- private static RangerTrinoResource createSystemPropertyResource(String
property)
- {
- RangerTrinoResource res = new RangerTrinoResource();
-
- res.setValue(RangerTrinoResource.KEY_SYSTEM_PROPERTY, property);
-
- return res;
- }
-
- private static RangerTrinoResource createResource(CatalogSchemaName
catalogSchemaName)
- {
- return createResource(catalogSchemaName.getCatalogName(),
catalogSchemaName.getSchemaName());
- }
-
- private static RangerTrinoResource createResource(CatalogSchemaTableName
catalogSchemaTableName)
- {
- return createResource(catalogSchemaTableName.getCatalogName(),
catalogSchemaTableName.getSchemaTableName().getSchemaName(),
catalogSchemaTableName.getSchemaTableName().getTableName());
- }
-
- private static RangerTrinoResource createResource(String catalogName)
- {
- return new RangerTrinoResource(catalogName, Optional.empty(),
Optional.empty());
- }
-
- private static RangerTrinoResource createResource(String catalogName,
String schemaName)
- {
- return new RangerTrinoResource(catalogName, Optional.of(schemaName),
Optional.empty());
- }
-
- private static RangerTrinoResource createResource(String catalogName,
String schemaName, final String tableName)
- {
- return new RangerTrinoResource(catalogName, Optional.of(schemaName),
Optional.of(tableName));
- }
-
- private static RangerTrinoResource createResource(String catalogName,
String schemaName, final String tableName, final Optional<String> column)
- {
- return new RangerTrinoResource(catalogName, Optional.of(schemaName),
Optional.of(tableName), column);
- }
-
- private static List<RangerTrinoResource>
createResource(CatalogSchemaTableName table, Set<String> columns)
- {
- List<RangerTrinoResource> colRequests = new ArrayList<>();
-
- if (columns.size() > 0) {
- for (String column : columns) {
- RangerTrinoResource rangerTrinoResource =
createResource(table.getCatalogName(),
table.getSchemaTableName().getSchemaName(),
table.getSchemaTableName().getTableName(), Optional.of(column));
-
- colRequests.add(rangerTrinoResource);
- }
- }
- else {
- colRequests.add(createResource(table.getCatalogName(),
table.getSchemaTableName().getSchemaName(),
table.getSchemaTableName().getTableName(), Optional.empty()));
- }
-
- return colRequests;
- }
-
- private static class RangerTrinoResource
- extends RangerAccessResourceImpl
- {
- public static final String KEY_CATALOG = "catalog";
- public static final String KEY_SCHEMA = "schema";
- public static final String KEY_TABLE = "table";
- public static final String KEY_COLUMN = "column";
- public static final String KEY_USER = "trinouser";
- public static final String KEY_FUNCTION = "function";
- public static final String KEY_PROCEDURE = "procedure";
- public static final String KEY_SYSTEM_PROPERTY = "systemproperty";
- public static final String KEY_SESSION_PROPERTY = "sessionproperty";
-
- public RangerTrinoResource()
- {
- }
-
- public RangerTrinoResource(String catalogName, Optional<String>
schema, Optional<String> table)
- {
- setValue(KEY_CATALOG, catalogName);
-
- if (schema.isPresent()) {
- setValue(KEY_SCHEMA, schema.get());
- }
-
- if (table.isPresent()) {
- setValue(KEY_TABLE, table.get());
- }
- }
-
- public RangerTrinoResource(String catalogName, Optional<String>
schema, Optional<String> table, Optional<String> column)
- {
- setValue(KEY_CATALOG, catalogName);
-
- if (schema.isPresent()) {
- setValue(KEY_SCHEMA, schema.get());
- }
-
- if (table.isPresent()) {
- setValue(KEY_TABLE, table.get());
- }
-
- if (column.isPresent()) {
- setValue(KEY_COLUMN, column.get());
- }
- }
-
- public String getCatalogName()
- {
- return (String) getValue(KEY_CATALOG);
- }
-
- public String getTable()
- {
- return (String) getValue(KEY_TABLE);
- }
-
- public String getCatalog()
- {
- return (String) getValue(KEY_CATALOG);
- }
-
- public String getSchema()
- {
- return (String) getValue(KEY_SCHEMA);
- }
-
- public Optional<SchemaTableName> getSchemaTable()
- {
- final String schema = getSchema();
-
- if (StringUtils.isNotEmpty(schema)) {
- return Optional.of(new SchemaTableName(schema,
Optional.ofNullable(getTable()).orElse("*")));
- }
-
- return Optional.empty();
- }
- }
-
- private static class RangerTrinoAccessRequest
- extends RangerAccessRequestImpl
- {
- public RangerTrinoAccessRequest(RangerTrinoResource resource, String
user, Set<String> userGroups, TrinoAccessType trinoAccessType)
- {
- super(resource, trinoAccessType.name().toLowerCase(ENGLISH), user,
userGroups, null);
-
- setAccessTime(new Date());
- }
- }
-
- private static enum TrinoAccessType {
- CREATE, DROP, SELECT, INSERT, DELETE, USE, ALTER, ALL, GRANT, REVOKE,
SHOW, IMPERSONATE, EXECUTE;
- }
-}
diff --git
a/plugin-trino/src/main/java/org/apache/ranger/authorization/trino/authorizer/RangerSystemAccessControlFactory.java
b/plugin-trino/src/main/java/org/apache/ranger/authorization/trino/authorizer/RangerSystemAccessControlFactory.java
deleted file mode 100644
index 919646fbf..000000000
---
a/plugin-trino/src/main/java/org/apache/ranger/authorization/trino/authorizer/RangerSystemAccessControlFactory.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ranger.authorization.trino.authorizer;
-
-import com.google.inject.Injector;
-import com.google.inject.Scopes;
-import io.airlift.bootstrap.Bootstrap;
-import io.trino.spi.security.SystemAccessControl;
-import io.trino.spi.security.SystemAccessControlFactory;
-
-import java.util.Map;
-
-import static com.google.common.base.Throwables.throwIfUnchecked;
-import static io.airlift.configuration.ConfigBinder.configBinder;
-import static java.util.Objects.requireNonNull;
-
-public class RangerSystemAccessControlFactory
- implements SystemAccessControlFactory
-{
- private static final String NAME = "ranger";
-
- @Override
- public String getName()
- {
- return NAME;
- }
-
- @Override
- public SystemAccessControl create(Map<String, String> config)
- {
- requireNonNull(config, "config is null");
-
- try {
- Bootstrap app = new Bootstrap(binder ->
- {
- configBinder(binder).bindConfig(RangerConfig.class);
-
binder.bind(RangerSystemAccessControl.class).in(Scopes.SINGLETON);
- });
-
- Injector injector = app
- .doNotInitializeLogging()
- .setRequiredConfigurationProperties(config)
- .initialize();
-
- return injector.getInstance(RangerSystemAccessControl.class);
- }
- catch (Exception e) {
- throwIfUnchecked(e);
- throw new RuntimeException(e);
- }
- }
-}
diff --git
a/plugin-trino/src/main/java/org/apache/ranger/authorization/trino/authorizer/TrinoRangerPlugin.java
b/plugin-trino/src/main/java/org/apache/ranger/authorization/trino/authorizer/TrinoRangerPlugin.java
deleted file mode 100644
index 5a83b12d7..000000000
---
a/plugin-trino/src/main/java/org/apache/ranger/authorization/trino/authorizer/TrinoRangerPlugin.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ranger.authorization.trino.authorizer;
-
-import io.trino.spi.Plugin;
-import io.trino.spi.security.SystemAccessControlFactory;
-
-import java.util.ArrayList;
-
-public class TrinoRangerPlugin
- implements Plugin
-{
- @Override
- public Iterable<SystemAccessControlFactory>
getSystemAccessControlFactories()
- {
- ArrayList<SystemAccessControlFactory> list = new ArrayList<>();
- SystemAccessControlFactory factory = new
RangerSystemAccessControlFactory();
-
- list.add(factory);
-
- return list;
- }
-}
diff --git
a/plugin-trino/src/test/java/org/apache/ranger/authorization/trino/authorizer/RangerSystemAccessControlTest.java
b/plugin-trino/src/test/java/org/apache/ranger/authorization/trino/authorizer/RangerSystemAccessControlTest.java
deleted file mode 100644
index 220c8c252..000000000
---
a/plugin-trino/src/test/java/org/apache/ranger/authorization/trino/authorizer/RangerSystemAccessControlTest.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ranger.authorization.trino.authorizer;
-
-import com.google.common.collect.ImmutableSet;
-import io.trino.spi.connector.CatalogSchemaName;
-import io.trino.spi.connector.CatalogSchemaRoutineName;
-import io.trino.spi.connector.CatalogSchemaTableName;
-import io.trino.spi.connector.SchemaTableName;
-import io.trino.spi.security.AccessDeniedException;
-import io.trino.spi.security.Identity;
-import io.trino.spi.security.SystemSecurityContext;
-import io.trino.spi.security.TrinoPrincipal;
-import io.trino.spi.security.ViewExpression;
-import io.trino.spi.type.VarcharType;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import javax.security.auth.kerberos.KerberosPrincipal;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-
-import static io.trino.spi.security.PrincipalType.USER;
-import static io.trino.spi.security.Privilege.SELECT;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-public class RangerSystemAccessControlTest
-{
- static RangerSystemAccessControl accessControlManager;
-
- private static final Identity alice = Identity.ofUser("alice");
- private static final Identity admin = Identity.ofUser("admin");
- //private static final Identity aliceWithGroups =
Identity.from(alice).withGroups(new HashSet(Arrays.asList("users",
"friends"))).build();
- //private static final Identity kerberosValidAlice =
Identity.from(alice).withPrincipal(new
KerberosPrincipal("alice/[email protected]")).build();
- //private static final Identity kerberosValidNonAsciiUser =
Identity.forUser("\u0194\u0194\u0194").withPrincipal(new
KerberosPrincipal("\u0194\u0194\u0194/[email protected]")).build();
- private static final Identity kerberosInvalidAlice =
Identity.from(alice).withPrincipal(new
KerberosPrincipal("mallory/[email protected]")).build();
- private static final Identity bob = Identity.ofUser("bob");
- //private static final Identity nonAsciiUser =
Identity.ofUser("\u0194\u0194\u0194");
-
- private static final Set<String> allCatalogs =
ImmutableSet.of("open-to-all", "all-allowed", "alice-catalog");
- private static final Set<String> queryOwners = ImmutableSet.of("bob",
"alice", "frank");
- private static final String aliceCatalog = "alice-catalog";
- private static final CatalogSchemaName aliceSchema = new
CatalogSchemaName("alice-catalog", "schema");
- private static final CatalogSchemaTableName aliceTable = new
CatalogSchemaTableName("alice-catalog", "schema", "table");
- private static final CatalogSchemaTableName aliceView = new
CatalogSchemaTableName("alice-catalog", "schema", "view");
- private static final CatalogSchemaRoutineName aliceProcedure = new
CatalogSchemaRoutineName("alice-catalog", "schema", "procedure");
- private static final String functionName = new String("function");
-
- @BeforeClass
- public static void setUpBeforeClass()
- throws Exception
- {
- accessControlManager = new RangerSystemAccessControl(new
RangerConfig());
- }
-
- @Test
- @SuppressWarnings("PMD")
- public void testCanSetUserOperations()
- {
- try {
- accessControlManager.checkCanImpersonateUser(context(alice),
bob.getUser());
- throw new AssertionError("expected AccessDeniedExeption");
- }
- catch (AccessDeniedException expected) {
- }
-
- accessControlManager.checkCanImpersonateUser(context(admin),
bob.getUser());
-
- try {
-
accessControlManager.checkCanImpersonateUser(context(kerberosInvalidAlice),
bob.getUser());
- throw new AssertionError("expected AccessDeniedExeption");
- }
- catch (AccessDeniedException expected) {
- }
- }
-
- @Test
- public void testCatalogOperations()
- {
- assertEquals(accessControlManager.filterCatalogs(context(alice),
allCatalogs), allCatalogs);
- Set<String> bobCatalogs = ImmutableSet.of("open-to-all",
"all-allowed");
- assertEquals(accessControlManager.filterCatalogs(context(bob),
allCatalogs), bobCatalogs);
- //Set<String> nonAsciiUserCatalogs = ImmutableSet.of("open-to-all",
"all-allowed", "\u0200\u0200\u0200");
-
//assertEquals(accessControlManager.filterCatalogs(context(nonAsciiUser),
allCatalogs), nonAsciiUserCatalogs);
- }
-
- @Test
- @SuppressWarnings("PMD")
- public void testSchemaOperations()
- {
- Set<String> aliceSchemas = ImmutableSet.of("schema");
- assertEquals(accessControlManager.filterSchemas(context(alice),
aliceCatalog, aliceSchemas), aliceSchemas);
- assertEquals(accessControlManager.filterSchemas(context(bob),
"alice-catalog", aliceSchemas), ImmutableSet.of());
-
- accessControlManager.checkCanCreateSchema(context(alice), aliceSchema);
- accessControlManager.checkCanDropSchema(context(alice), aliceSchema);
- accessControlManager.checkCanRenameSchema(context(alice), aliceSchema,
"new-schema");
- accessControlManager.checkCanShowSchemas(context(alice), aliceCatalog);
-
- try {
- accessControlManager.checkCanCreateSchema(context(bob),
aliceSchema);
- }
- catch (AccessDeniedException expected) {
- }
-
- accessControlManager.checkCanSetSchemaAuthorization(context(alice),
aliceSchema, new TrinoPrincipal(USER, "principal"));
- accessControlManager.checkCanShowCreateSchema(context(alice),
aliceSchema);
- }
-
- @Test
- @SuppressWarnings("PMD")
- public void testTableOperations()
- {
- Set<SchemaTableName> aliceTables = ImmutableSet.of(new
SchemaTableName("schema", "table"));
- assertEquals(accessControlManager.filterTables(context(alice),
aliceCatalog, aliceTables), aliceTables);
- assertEquals(accessControlManager.filterTables(context(bob),
"alice-catalog", aliceTables), ImmutableSet.of());
-
- accessControlManager.checkCanCreateTable(context(alice), aliceTable,
Map.of());
- accessControlManager.checkCanDropTable(context(alice), aliceTable);
- accessControlManager.checkCanSelectFromColumns(context(alice),
aliceTable, ImmutableSet.of());
- accessControlManager.checkCanInsertIntoTable(context(alice),
aliceTable);
- accessControlManager.checkCanDeleteFromTable(context(alice),
aliceTable);
- accessControlManager.checkCanRenameColumn(context(alice), aliceTable);
-
- try {
- accessControlManager.checkCanCreateTable(context(bob), aliceTable,
Map.of());
- }
- catch (AccessDeniedException expected) {
- }
- }
-
- @Test
- @SuppressWarnings("PMD")
- public void testViewOperations()
- {
- accessControlManager.checkCanCreateView(context(alice), aliceView);
- accessControlManager.checkCanDropView(context(alice), aliceView);
- accessControlManager.checkCanSelectFromColumns(context(alice),
aliceView, ImmutableSet.of());
-
accessControlManager.checkCanCreateViewWithSelectFromColumns(context(alice),
aliceTable, ImmutableSet.of());
-
accessControlManager.checkCanCreateViewWithSelectFromColumns(context(alice),
aliceView, ImmutableSet.of());
- accessControlManager.checkCanSetCatalogSessionProperty(context(alice),
aliceCatalog, "property");
- accessControlManager.checkCanGrantTablePrivilege(context(alice),
SELECT, aliceTable, new TrinoPrincipal(USER, "grantee"), true);
- accessControlManager.checkCanRevokeTablePrivilege(context(alice),
SELECT, aliceTable, new TrinoPrincipal(USER, "revokee"), true);
-
- try {
- accessControlManager.checkCanCreateView(context(bob), aliceView);
- }
- catch (AccessDeniedException expected) {
- }
- }
-
- @Test
- @SuppressWarnings("PMD")
- public void testMisc()
- {
-
assertEquals(accessControlManager.filterViewQueryOwnedBy(context(alice),
queryOwners), queryOwners);
-
- // check {type} / {col} replacement
- final VarcharType varcharType = VarcharType.createVarcharType(20);
-
- Optional<ViewExpression> ret =
accessControlManager.getColumnMask(context(alice), aliceTable, "cast_me",
varcharType);
- List<ViewExpression> retArray =
accessControlManager.getColumnMasks(context(alice), aliceTable, "cast_me",
varcharType);
- assertNotNull(ret.get());
- assertEquals(ret.get().getExpression(), "cast cast_me as varchar(20)");
- assertEquals(1, retArray.size());
- assertEquals("cast cast_me as varchar(20)",
retArray.get(0).getExpression());
-
- ret = accessControlManager.getColumnMask(context(alice), aliceTable,
"do-not-cast-me", varcharType);
- retArray = accessControlManager.getColumnMasks(context(alice),
aliceTable, "do-not-cast-me", varcharType);
- assertFalse(ret.isPresent());
- assertTrue(retArray.isEmpty());
-
- ret = accessControlManager.getRowFilter(context(alice), aliceTable);
- retArray = accessControlManager.getRowFilters(context(alice),
aliceTable);
- assertFalse(ret.isPresent());
- assertTrue(retArray.isEmpty());
-
- accessControlManager.checkCanExecuteFunction(context(alice),
functionName);
-
accessControlManager.checkCanGrantExecuteFunctionPrivilege(context(alice),
functionName, new TrinoPrincipal(USER, "grantee"), true);
- accessControlManager.checkCanExecuteProcedure(context(alice),
aliceProcedure);
- }
-
- private SystemSecurityContext context(Identity id)
- {
- return new SystemSecurityContext(id, Optional.empty());
- }
-}
diff --git a/pom.xml b/pom.xml
index 29347f402..7b2bb3d97 100644
--- a/pom.xml
+++ b/pom.xml
@@ -185,7 +185,7 @@
<owasp-java-html-sanitizer.version>20211018.2</owasp-java-html-sanitizer.version>
<paranamer.version>2.3</paranamer.version>
<presto.version>333</presto.version>
- <trino.version>377</trino.version>
+ <trino.version>451</trino.version>
<poi.version>5.2.2</poi.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<protobuf-java.version>3.19.3</protobuf-java.version>
@@ -326,45 +326,14 @@
<module>ranger-elasticsearch-plugin-shim</module>
<module>ranger-authn</module>
<module>ranger-metrics</module>
- <!--
- 'distro' should be the last module. If a module gets
inserted after
- ranger-elasticsearch-plugin-shim, make sure to update
dependency in distro/pom.xml
- -->
- <module>distro</module>
- </modules>
- </profile>
-
- <profile>
- <id>ranger-jdk11</id>
- <activation>
- <jdk>11</jdk>
- </activation>
- <modules>
- <!-- ranger-admin requirements -->
- <module>security-admin</module>
- <module>agents-audit</module>
- <module>agents-common</module>
- <module>agents-cred</module>
- <module>jisql</module>
- <module>embeddedwebserver</module>
- <module>credentialbuilder</module>
- <module>ranger-util</module>
- <module>ugsync-util</module>
- <module>unixauthclient</module>
- <module>ranger-plugin-classloader</module>
- <module>ranger-authn</module>
- <module>ranger-metrics</module>
- <!-- trino-plugin requirements -->
- <module>agents-installer</module>
<module>plugin-trino</module>
<!--
'distro' should be the last module. If a module gets
inserted after
- plugin-nestedstructure, make sure to update dependency in
distro/pom.xml
+ ranger-elasticsearch-plugin-shim, make sure to update
dependency in distro/pom.xml
-->
<module>distro</module>
</modules>
</profile>
-
<profile>
<id>ranger-examples</id>
<modules>
@@ -604,7 +573,6 @@
<module>ranger-plugin-classloader</module>
<module>ranger-util</module>
<module>plugin-trino</module>
- <module>ranger-trino-plugin-shim</module>
</modules>
</profile>
<profile>
@@ -685,6 +653,7 @@
<module>ranger-elasticsearch-plugin-shim</module>
<module>ranger-authn</module>
<module>ranger-metrics</module>
+ <module>plugin-trino</module>
<!--
'distro' should be the last module. If a module gets
inserted after
ranger-elasticsearch-plugin-shim, make sure to update
dependency in distro/pom.xml
@@ -770,6 +739,7 @@
<module>ranger-elasticsearch-plugin-shim</module>
<module>ranger-authn</module>
<module>ranger-metrics</module>
+ <module>plugin-trino</module>
</modules>
<build>
<plugins>
diff --git a/security-admin/db/mysql/optimized/current/ranger_core_db_mysql.sql
b/security-admin/db/mysql/optimized/current/ranger_core_db_mysql.sql
index c3937a9a1..2d0d8ace9 100644
--- a/security-admin/db/mysql/optimized/current/ranger_core_db_mysql.sql
+++ b/security-admin/db/mysql/optimized/current/ranger_core_db_mysql.sql
@@ -1875,4 +1875,6 @@ INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10055',UTC_TIMESTAMP(),'Ranger 3.0.0',UTC_TIMESTAMP(),'localhost','Y');
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10056',UTC_TIMESTAMP(),'Ranger 3.0.0',UTC_TIMESTAMP(),'localhost','Y');
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10060',UTC_TIMESTAMP(),'Ranger 3.0.0',UTC_TIMESTAMP(),'localhost','Y');
+INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10061',UTC_TIMESTAMP(),'Ranger 3.0.0',UTC_TIMESTAMP(),'localhost','Y');
+INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10062',UTC_TIMESTAMP(),'Ranger 3.0.0',UTC_TIMESTAMP(),'localhost','Y');
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('JAVA_PATCHES',UTC_TIMESTAMP(),'Ranger 1.0.0',UTC_TIMESTAMP(),'localhost','Y');
diff --git
a/security-admin/db/oracle/optimized/current/ranger_core_db_oracle.sql
b/security-admin/db/oracle/optimized/current/ranger_core_db_oracle.sql
index 809534ece..9551aef28 100644
--- a/security-admin/db/oracle/optimized/current/ranger_core_db_oracle.sql
+++ b/security-admin/db/oracle/optimized/current/ranger_core_db_oracle.sql
@@ -2057,5 +2057,7 @@ INSERT INTO x_db_version_h
(id,version,inst_at,inst_by,updated_at,updated_by,act
INSERT INTO x_db_version_h
(id,version,inst_at,inst_by,updated_at,updated_by,active) VALUES
(X_DB_VERSION_H_SEQ.nextval,'J10055',sys_extract_utc(systimestamp),'Ranger
3.0.0',sys_extract_utc(systimestamp),'localhost','Y');
INSERT INTO x_db_version_h
(id,version,inst_at,inst_by,updated_at,updated_by,active) VALUES
(X_DB_VERSION_H_SEQ.nextval,'J10056',sys_extract_utc(systimestamp),'Ranger
3.0.0',sys_extract_utc(systimestamp),'localhost','Y');
INSERT INTO x_db_version_h
(id,version,inst_at,inst_by,updated_at,updated_by,active) VALUES
(X_DB_VERSION_H_SEQ.nextval,'J10060',sys_extract_utc(systimestamp),'Ranger
3.0.0',sys_extract_utc(systimestamp),'localhost','Y');
+INSERT INTO x_db_version_h
(id,version,inst_at,inst_by,updated_at,updated_by,active) VALUES
(X_DB_VERSION_H_SEQ.nextval,'J10061',sys_extract_utc(systimestamp),'Ranger
3.0.0',sys_extract_utc(systimestamp),'localhost','Y');
+INSERT INTO x_db_version_h
(id,version,inst_at,inst_by,updated_at,updated_by,active) VALUES
(X_DB_VERSION_H_SEQ.nextval,'J10062',sys_extract_utc(systimestamp),'Ranger
3.0.0',sys_extract_utc(systimestamp),'localhost','Y');
INSERT INTO x_db_version_h
(id,version,inst_at,inst_by,updated_at,updated_by,active) VALUES
(X_DB_VERSION_H_SEQ.nextval,'JAVA_PATCHES',sys_extract_utc(systimestamp),'Ranger
1.0.0',sys_extract_utc(systimestamp),'localhost','Y');
commit;
diff --git
a/security-admin/db/postgres/optimized/current/ranger_core_db_postgres.sql
b/security-admin/db/postgres/optimized/current/ranger_core_db_postgres.sql
index 7d7cc1c10..821438c3b 100644
--- a/security-admin/db/postgres/optimized/current/ranger_core_db_postgres.sql
+++ b/security-admin/db/postgres/optimized/current/ranger_core_db_postgres.sql
@@ -2010,6 +2010,8 @@ INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10055',current_timestamp,'Ranger 3.0.0',current_timestamp,'localhost','Y');
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10056',current_timestamp,'Ranger 3.0.0',current_timestamp,'localhost','Y');
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10060',current_timestamp,'Ranger 3.0.0',current_timestamp,'localhost','Y');
+INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10061',current_timestamp,'Ranger 3.0.0',current_timestamp,'localhost','Y');
+INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10062',current_timestamp,'Ranger 3.0.0',current_timestamp,'localhost','Y');
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('JAVA_PATCHES',current_timestamp,'Ranger
1.0.0',current_timestamp,'localhost','Y');
DROP VIEW IF EXISTS vx_principal;
diff --git
a/security-admin/db/sqlanywhere/optimized/current/ranger_core_db_sqlanywhere.sql
b/security-admin/db/sqlanywhere/optimized/current/ranger_core_db_sqlanywhere.sql
index 51679a8de..e7dfaeead 100644
---
a/security-admin/db/sqlanywhere/optimized/current/ranger_core_db_sqlanywhere.sql
+++
b/security-admin/db/sqlanywhere/optimized/current/ranger_core_db_sqlanywhere.sql
@@ -2426,6 +2426,10 @@ INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active
GO
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10060',CURRENT_TIMESTAMP,'Ranger 3.0.0',CURRENT_TIMESTAMP,'localhost','Y');
GO
+INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10061',CURRENT_TIMESTAMP,'Ranger 3.0.0',CURRENT_TIMESTAMP,'localhost','Y');
+GO
+INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10062',CURRENT_TIMESTAMP,'Ranger 3.0.0',CURRENT_TIMESTAMP,'localhost','Y');
+GO
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('JAVA_PATCHES',CURRENT_TIMESTAMP,'Ranger
1.0.0',CURRENT_TIMESTAMP,'localhost','Y');
GO
exit
diff --git
a/security-admin/db/sqlserver/optimized/current/ranger_core_db_sqlserver.sql
b/security-admin/db/sqlserver/optimized/current/ranger_core_db_sqlserver.sql
index 931ca5d2d..4e2c9a9aa 100644
--- a/security-admin/db/sqlserver/optimized/current/ranger_core_db_sqlserver.sql
+++ b/security-admin/db/sqlserver/optimized/current/ranger_core_db_sqlserver.sql
@@ -4213,5 +4213,7 @@ INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10055',CURRENT_TIMESTAMP,'Ranger 3.0.0',CURRENT_TIMESTAMP,'localhost','Y');
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10056',CURRENT_TIMESTAMP,'Ranger 3.0.0',CURRENT_TIMESTAMP,'localhost','Y');
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10060',CURRENT_TIMESTAMP,'Ranger 3.0.0',CURRENT_TIMESTAMP,'localhost','Y');
+INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10061',CURRENT_TIMESTAMP,'Ranger 3.0.0',CURRENT_TIMESTAMP,'localhost','Y');
+INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10062',CURRENT_TIMESTAMP,'Ranger 3.0.0',CURRENT_TIMESTAMP,'localhost','Y');
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('JAVA_PATCHES',CURRENT_TIMESTAMP,'Ranger
1.0.0',CURRENT_TIMESTAMP,'localhost','Y');
GO
diff --git
a/security-admin/src/main/java/org/apache/ranger/patch/PatchForTrinoSvcDefUpdate_J10062.java
b/security-admin/src/main/java/org/apache/ranger/patch/PatchForTrinoSvcDefUpdate_J10062.java
new file mode 100644
index 000000000..57d55f50c
--- /dev/null
+++
b/security-admin/src/main/java/org/apache/ranger/patch/PatchForTrinoSvcDefUpdate_J10062.java
@@ -0,0 +1,315 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.ranger.patch;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.log4j.Logger;
+import org.apache.ranger.biz.ServiceDBStore;
+import org.apache.ranger.common.GUIDUtil;
+import org.apache.ranger.common.RangerValidatorFactory;
+import org.apache.ranger.db.RangerDaoManager;
+import org.apache.ranger.entity.XXService;
+import org.apache.ranger.plugin.model.RangerPolicy;
+import org.apache.ranger.plugin.model.RangerPolicyResourceSignature;
+import org.apache.ranger.plugin.model.RangerServiceDef;
+import org.apache.ranger.plugin.model.validation.RangerServiceDefValidator;
+import org.apache.ranger.plugin.model.validation.RangerValidator.Action;
+import org.apache.ranger.plugin.store.EmbeddedServiceDefsUtil;
+import org.apache.ranger.util.CLIUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.TransactionDefinition;
+import org.springframework.transaction.TransactionStatus;
+import org.springframework.transaction.support.TransactionCallback;
+import org.springframework.transaction.support.TransactionTemplate;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Component
+public class PatchForTrinoSvcDefUpdate_J10062 extends BaseLoader {
+ public static final String LOGIN_ID_ADMIN = "admin";
+ public static final String WILDCARD_ASTERISK = "*";
+ public static final String POlICY_NAME_FOR_ALL_SYSINFO = "all - sysinfo";
+ public static final String POlICY_NAME_FOR_ALL_CATALOG_SCHEMA_FUNCTION =
"all - catalog, schema, schemafunction";
+ public static final String POlICY_NAME_FOR_ALL_QUERY = "all - queryid";
+ public static final String POlICY_NAME_FOR_ALL_ROLE = "all - role";
+ public static final String RESOURCE_SYSINFO = "sysinfo";
+ public static final String RESOURCE_CATALOG = "catalog";
+ public static final String RESOURCE_SCHEMA = "schema";
+ public static final String RESOURCE_QUERYID = "queryid";
+ public static final String RESOURCE_ROLE = "role";
+ public static final String RESOURCE_SCHEMAFUNCTION = "schemafunction";
+ public static final String ACCESS_TYPE_READ_SYSINFO = "read_sysinfo";
+ public static final String ACCESS_TYPE_WRITE_SYSINFO = "write_sysinfo";
+ public static final String ACCESS_TYPE_CREATE = "create";
+ public static final String ACCESS_TYPE_DROP = "drop";
+ public static final String ACCESS_TYPE_SHOW = "show";
+ public static final String ACCESS_TYPE_GRANT = "grant";
+ public static final String ACCESS_TYPE_REVOKE = "revoke";
+ public static final String ACCESS_TYPE_EXECUTE = "execute";
+ public static final String ACCESS_TYPE_SELECT = "select";
+ private static final Logger logger =
Logger.getLogger(PatchForTrinoSvcDefUpdate_J10062.class);
+ private static final String TRINO_SVC_DEF_NAME =
EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_TRINO_NAME;
+ @Autowired
+ GUIDUtil guidUtil;
+ @Autowired
+ ServiceDBStore svcDBStore;
+ @Autowired
+ @Qualifier(value = "transactionManager")
+ PlatformTransactionManager txManager;
+ @Autowired
+ private RangerDaoManager daoMgr;
+ @Autowired
+ private RangerValidatorFactory validatorFactory;
+
+ public static void main(String[] args) {
+ logger.info("main()");
+ try {
+ PatchForTrinoSvcDefUpdate_J10062 loader =
(PatchForTrinoSvcDefUpdate_J10062)
CLIUtil.getBean(PatchForTrinoSvcDefUpdate_J10062.class);
+ loader.init();
+ while (loader.isMoreToProcess()) {
+ loader.load();
+ }
+ logger.info("Load complete. Exiting!!!");
+ System.exit(0);
+ } catch (Exception e) {
+ logger.error("Error loading", e);
+ System.exit(1);
+ }
+ }
+
+ @Override
+ public void init() throws Exception {
+ // DO NOTHING
+ }
+
+ @Override
+ public void printStats() {
+ logger.info("PatchForTrinoSvcDefUpdate_J10062 logs ");
+ }
+
+ @Override
+ public void execLoad() {
+ logger.info("==> PatchForTrinoSvcDefUpdate_J10062.execLoad()");
+ try {
+ TransactionTemplate txTemplate = new
TransactionTemplate(txManager);
+
txTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
+ try {
+ txTemplate.execute(new TransactionCallback<Object>() {
+ @Override
+ public Object doInTransaction(TransactionStatus status) {
+ RangerServiceDef dbRangerServiceDef = null;
+ RangerServiceDef embeddedTrinoServiceDef = null;
+ try {
+ embeddedTrinoServiceDef =
EmbeddedServiceDefsUtil.instance().getEmbeddedServiceDef(TRINO_SVC_DEF_NAME);
+ } catch (Exception ex) {
+ logger.error("Error while loading service-def: " +
TRINO_SVC_DEF_NAME, ex);
+ }
+ if (embeddedTrinoServiceDef == null) {
+ logger.error("The embedded Trino
service-definition does not exist.");
+ throw new RuntimeException("Error while updating "
+ TRINO_SVC_DEF_NAME + " service-def");
+ }
+ if (embeddedTrinoServiceDef != null) {
+ try {
+ dbRangerServiceDef =
svcDBStore.getServiceDefByName(TRINO_SVC_DEF_NAME);
+ } catch (Exception e) {
+ logger.error("The Trino service-definition
does not exist in ranger db.");
+ } finally {
+ if (dbRangerServiceDef == null) {
+ logger.error("The Trino service-definition
does not exist.");
+ throw new RuntimeException("Error while
updating " + TRINO_SVC_DEF_NAME + " service-def");
+ }
+ }
+ }
+ dbRangerServiceDef =
updateTrinoSvcDef(embeddedTrinoServiceDef, dbRangerServiceDef);
+ if (dbRangerServiceDef != null) {
+ try {
+ createDefaultPolicies(dbRangerServiceDef);
+ } catch (Exception e) {
+ logger.error("Error while creating default
ranger policies for " + TRINO_SVC_DEF_NAME + " service-def");
+ throw new RuntimeException("Error while
creating default ranger policies for " + TRINO_SVC_DEF_NAME + " service-def");
+ }
+ } else {
+ logger.error("Error while updating " +
TRINO_SVC_DEF_NAME + " service-def");
+ throw new RuntimeException("Error while updating "
+ TRINO_SVC_DEF_NAME + " service-def");
+ }
+ return null;
+ }
+ });
+ } catch (Throwable ex) {
+ logger.error("Error while updating " + TRINO_SVC_DEF_NAME + "
service-def");
+ throw new RuntimeException(ex.getMessage());
+ }
+ } catch (Exception e) {
+ logger.error("Error while executing
PatchForTrinoSvcDefUpdate_J10062, Error - ", e);
+ throw new RuntimeException(e.getMessage());
+ }
+ logger.info("<== PatchForTrinoSvcDefUpdate_J10062.execLoad()");
+ }
+
+ private RangerServiceDef updateTrinoSvcDef(RangerServiceDef
embeddedTrinoServiceDef, RangerServiceDef dbRangerServiceDef) {
+ logger.info("==>
PatchForTrinoSvcDefUpdate_J10062.updateTrinoSvcDef()");
+ RangerServiceDef ret = null;
+ try {
+
dbRangerServiceDef.setResources(embeddedTrinoServiceDef.getResources());
+
dbRangerServiceDef.setAccessTypes(embeddedTrinoServiceDef.getAccessTypes());
+
dbRangerServiceDef.setConfigs(embeddedTrinoServiceDef.getConfigs());
+ RangerServiceDefValidator validator =
validatorFactory.getServiceDefValidator(this.svcDBStore);
+ validator.validate(dbRangerServiceDef, Action.UPDATE);
+ ret = this.svcDBStore.updateServiceDef(dbRangerServiceDef);
+ logger.info(TRINO_SVC_DEF_NAME + " service-def has been updated");
+ } catch (Exception e) {
+ logger.error("Error while updating" + TRINO_SVC_DEF_NAME + "
service-def", e);
+ throw new RuntimeException(e);
+ }
+ logger.info("<==
PatchForTrinoSvcDefUpdate_J10062.updateTrinoSvcDef()");
+ return ret;
+ }
+
+ private void createDefaultPolicies(RangerServiceDef dbRangerServiceDef)
throws Exception {
+ List<XXService> dbServices =
daoMgr.getXXService().findByServiceDefId(dbRangerServiceDef.getId());
+ if (CollectionUtils.isNotEmpty(dbServices)) {
+ for (XXService dbService : dbServices) {
+ addDefaultPolicies(dbService.getName(), null);
+ }
+ }
+ }
+
+ private void addDefaultPolicies(String serviceName, String zoneName)
throws Exception {
+ logger.info("===> addDefaultPolicies ServiceName : " + serviceName + "
ZoneName : " + zoneName);
+ List<String> resources = new ArrayList<>();
+ resources.add(RESOURCE_SYSINFO);
+ RangerPolicy allSysInfoPolicy = getPolicy(serviceName, zoneName,
POlICY_NAME_FOR_ALL_SYSINFO, resources);
+ List<RangerPolicy> policies =
svcDBStore.getPoliciesByResourceSignature(serviceName,
allSysInfoPolicy.getResourceSignature(), true);
+ if (CollectionUtils.isEmpty(policies)) {
+ logger.info("No policy found with resource sysinfo = * creating
new policy");
+ svcDBStore.createPolicy(allSysInfoPolicy);
+ }
+
+ resources.clear();
+ policies.clear();
+ resources.add(RESOURCE_CATALOG);
+ resources.add(RESOURCE_SCHEMA);
+ resources.add(RESOURCE_SCHEMAFUNCTION);
+ RangerPolicy allCatalogSchemaFunctionPolicy = getPolicy(serviceName,
zoneName, POlICY_NAME_FOR_ALL_CATALOG_SCHEMA_FUNCTION, resources);
+ policies = svcDBStore.getPoliciesByResourceSignature(serviceName,
allCatalogSchemaFunctionPolicy.getResourceSignature(), true);
+ if (CollectionUtils.isEmpty(policies)) {
+ logger.info("No policy found with resource catalog, schema,
schemafunction = *; creating new policy");
+ svcDBStore.createPolicy(allCatalogSchemaFunctionPolicy);
+ }
+
+ resources.clear();
+ policies.clear();
+ resources.add(RESOURCE_QUERYID);
+ RangerPolicy allQueryIdPolicy = getPolicy(serviceName, zoneName,
POlICY_NAME_FOR_ALL_QUERY, resources);
+ policies = svcDBStore.getPoliciesByResourceSignature(serviceName,
allQueryIdPolicy.getResourceSignature(), true);
+ if (CollectionUtils.isEmpty(policies)) {
+ logger.info("No policy found with resource queryId = *; creating
new policy");
+ svcDBStore.createPolicy(allQueryIdPolicy);
+ }
+
+ resources.clear();
+ policies.clear();
+ resources.add(RESOURCE_ROLE);
+ RangerPolicy allRolePolicy = getPolicy(serviceName, zoneName,
POlICY_NAME_FOR_ALL_ROLE, resources);
+ policies = svcDBStore.getPoliciesByResourceSignature(serviceName,
allRolePolicy.getResourceSignature(), true);
+ if (CollectionUtils.isEmpty(policies)) {
+ logger.info("No policy found with resource role = *; creating new
policy");
+ svcDBStore.createPolicy(allRolePolicy);
+ }
+ logger.info("<=== addDefaultPolicies");
+ }
+
+ private RangerPolicy getPolicy(String serviceName, String zoneName, String
policyName, List<String> resources) {
+ logger.info("===> getPolicy ");
+ RangerPolicy policy;
+ Map<String, RangerPolicy.RangerPolicyResource> policyResources = new
HashMap<>();
+ for (String resource : resources) {
+ policyResources.put(resource, new
RangerPolicy.RangerPolicyResource(WILDCARD_ASTERISK));
+ }
+ policy = new RangerPolicy();
+ policy.setService(serviceName);
+ policy.setName(policyName);
+ policy.setDescription("Policy for " + policyName);
+ policy.setIsAuditEnabled(true);
+ policy.setCreatedBy(LOGIN_ID_ADMIN);
+ policy.setResources(policyResources);
+ policy.setPolicyType(RangerPolicy.POLICY_TYPE_ACCESS);
+ policy.setGuid(guidUtil.genGUID());
+ policy.setZoneName(zoneName);
+ List<RangerPolicy.RangerPolicyItem> policyItems = new ArrayList<>();
+ policyItems.add(getPolicyItem(policyName, "trino", true));
+ policyItems.add(getPolicyItem("select", "rangerlookup", false));
+ policy.setPolicyItems(policyItems);
+ policy.setResourceSignature(new
RangerPolicyResourceSignature(policy).getSignature());
+ if (logger.isDebugEnabled()) {
+ logger.debug("===> getPolicy policy ResourceSignature " +
policy.getResourceSignature());
+ logger.debug("===> getPolicy policy : " + policy);
+ }
+ logger.info("<=== getPolicy ");
+ return policy;
+ }
+
+ private RangerPolicy.RangerPolicyItem getPolicyItem(String policyName,
String user, boolean delegateAdmin) {
+ RangerPolicy.RangerPolicyItem policyItem = new
RangerPolicy.RangerPolicyItem();
+ policyItem.setUsers(new ArrayList<String>() {{
+ add(user);
+ }});
+ policyItem.setAccesses(getAccessList(policyName));
+ policyItem.setDelegateAdmin(delegateAdmin);
+ return policyItem;
+ }
+
+ private List<RangerPolicy.RangerPolicyItemAccess> getAccessList(String
policyName) {
+ List<RangerPolicy.RangerPolicyItemAccess> accessList = new
ArrayList<RangerPolicy.RangerPolicyItemAccess>();
+ switch (policyName) {
+ case POlICY_NAME_FOR_ALL_SYSINFO:
+ accessList.add(new
RangerPolicy.RangerPolicyItemAccess(ACCESS_TYPE_READ_SYSINFO));
+ accessList.add(new
RangerPolicy.RangerPolicyItemAccess(ACCESS_TYPE_WRITE_SYSINFO));
+ break;
+ case POlICY_NAME_FOR_ALL_CATALOG_SCHEMA_FUNCTION:
+ accessList.add(new
RangerPolicy.RangerPolicyItemAccess(ACCESS_TYPE_CREATE));
+ accessList.add(new
RangerPolicy.RangerPolicyItemAccess(ACCESS_TYPE_DROP));
+ accessList.add(new
RangerPolicy.RangerPolicyItemAccess(ACCESS_TYPE_SHOW));
+ accessList.add(new
RangerPolicy.RangerPolicyItemAccess(ACCESS_TYPE_GRANT));
+ accessList.add(new
RangerPolicy.RangerPolicyItemAccess(ACCESS_TYPE_EXECUTE));
+ break;
+ case POlICY_NAME_FOR_ALL_ROLE:
+ accessList.add(new
RangerPolicy.RangerPolicyItemAccess(ACCESS_TYPE_CREATE));
+ accessList.add(new
RangerPolicy.RangerPolicyItemAccess(ACCESS_TYPE_DROP));
+ accessList.add(new
RangerPolicy.RangerPolicyItemAccess(ACCESS_TYPE_SHOW));
+ accessList.add(new
RangerPolicy.RangerPolicyItemAccess(ACCESS_TYPE_GRANT));
+ accessList.add(new
RangerPolicy.RangerPolicyItemAccess(ACCESS_TYPE_REVOKE));
+ break;
+ case POlICY_NAME_FOR_ALL_QUERY:
+ accessList.add(new
RangerPolicy.RangerPolicyItemAccess(ACCESS_TYPE_EXECUTE));
+ break;
+ default:
+ accessList.add(new
RangerPolicy.RangerPolicyItemAccess(ACCESS_TYPE_SELECT));
+ break;
+ }
+ return accessList;
+ }
+
+}
\ No newline at end of file