[
https://issues.apache.org/jira/browse/HBASE-29143?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
ASF GitHub Bot updated HBASE-29143:
-----------------------------------
Labels: pull-request-available (was: )
> Decouple the znode acl update logic from AccessController to support custom
> implementations like RangerAuthorizationCoprocessor
> -------------------------------------------------------------------------------------------------------------------------------
>
> Key: HBASE-29143
> URL: https://issues.apache.org/jira/browse/HBASE-29143
> Project: HBase
> Issue Type: Improvement
> Components: acl, security
> Reporter: Nihal Jain
> Assignee: Anchal Kejriwal
> Priority: Major
> Labels: pull-request-available
>
> The HBase
> _[AccessController|https://github.com/apache/hbase/blob/master/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java]_
> has hooks to update Zookeeper (zk) with ACL permissions, which are used to
> perform validations across various parts of the code.
> For example, whenever a new record is added in ACL with a new permission, it
> is synchronized with the znode via the
> [{_}updateACL{_}()|https://github.com/apache/hbase/blob/a5666c085844307e694025ddc7ac710e017b3edf/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java#L263]
> call.
> The problem arises when a custom implementation of {_}AccessController{_},
> such as
> {_}[RangerAuthorizationCoprocessor|https://github.com/apache/ranger/blob/master/hbase-agent/src/main/java/org/apache/ranger/authorization/hbase/RangerAuthorizationCoprocessor.java]{_},
> is used. In this case, attempting to perform certain operations, like adding
> an rsgroup, fails (for any non super user) because
> _[MasterRpcServices#rpcPreCheck()|https://github.com/apache/hbase/blob/a5666c085844307e694025ddc7ac710e017b3edf/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java#L979]_
> requires global permissions, as enforced by
> _[AccessChecker#requireGlobalPermission()|https://github.com/apache/hbase/blob/a5666c085844307e694025ddc7ac710e017b3edf/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessChecker.java#L138]._
> Below is a sample stack trace for the 2.6 code path:
> {code:java}
> org.apache.hadoop.hbase.security.AccessDeniedException:
> org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient
> permissions for user 'nihaljain' (global, action=ADMIN)
> at
> org.apache.hadoop.hbase.security.access.AccessChecker.requireGlobalPermission(AccessChecker.java:152)
> at
> org.apache.hadoop.hbase.security.access.AccessChecker.requirePermission(AccessChecker.java:125)
> at
> org.apache.hadoop.hbase.regionserver.RSRpcServices.requirePermission(RSRpcServices.java:1342)
> at
> org.apache.hadoop.hbase.master.MasterRpcServices.rpcPreCheck(MasterRpcServices.java:474)
> at
> org.apache.hadoop.hbase.master.MasterRpcServices.execMasterService(MasterRpcServices.java:904)
> at
> org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos$MasterService$2.callBlockingMethod(MasterProtos.java)
> at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:443)
> at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:124)
> at org.apache.hadoop.hbase.ipc.RpcHandler.run(RpcHandler.java:105)
> at org.apache.hadoop.hbase.ipc.RpcHandler.run(RpcHandler.java:85) {code}
> This issue occurs because zk ACL data is only updated via
> {_}AccessController{_}, and hence global permission data is not available for
> Ranger. Consequently, there is no way to provide permissions to a user to
> work through this for _RangerAuthorizationCoprocessor_ unless we copy zk
> updation logic from _AccessController_ into Ranger, which is not ideal and
> not maintainable in long run.
>
> *Solution Proposal*
> We should extract all the zk update logic into a new separate class, say
> {_}ZKAclUpdaterCoprocessor{_}, from _AccessController_ and chain it in the
> coprocessor code path to preserve behavior. This can be achieved by setting
> this new coprocessor at the ACL table level.
> Systems dependent on custom coprocessors like
> _RangerAuthorizationCoprocessor_ can either:
> * Chain it in the coprocessor code path by setting this new coprocessor at
> the ACL table level.
> * Or, set the zk coprocessor as a preceding coprocessor to
> _RangerAuthorizationCoprocessor_ in configurations.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)