HBASE-20276 restore original shell REPL functionality where commands can return results
[hbase.git] / src / main / asciidoc / _chapters / appendix_acl_matrix.adoc
blobd5ea0765ba840de963f4147c28eaca7f7f424d38
1 ////
2 /**
3  *
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  *     http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  */
20 ////
22 [appendix]
23 [[appendix_acl_matrix]]
24 == Access Control Matrix
25 :doctype: book
26 :numbered:
27 :toc: left
28 :icons: font
29 :experimental:
30 :toc: left
31 :source-language: java
33 The following matrix shows the permission set required to perform operations in HBase.
34 Before using the table, read through the information about how to interpret it.
36 .Interpreting the ACL Matrix Table
37 The following conventions are used in the ACL Matrix table:
39 === Scopes
40 Permissions are evaluated starting at the widest scope and working to the narrowest scope.
42 A scope corresponds to a level of the data model. From broadest to narrowest, the scopes are as follows:
44 .Scopes
45 * Global
46 * Namespace (NS)
47 * Table
48 * Column Family (CF)
49 * Column Qualifier (CQ)
50 * Cell
52 For instance, a permission granted at table level dominates any grants done at the Column Family, Column Qualifier, or cell level. The user can do what that grant implies at any location in the table. A permission granted at global scope dominates all: the user is always allowed to take that action everywhere.
54 === Permissions
55 Possible permissions include the following:
57 .Permissions
58 * Superuser - a special user that belongs to group "supergroup" and has unlimited access
59 * Admin (A)
60 * Create \(C)
61 * Write (W)
62 * Read \(R)
63 * Execute (X)
65 For the most part, permissions work in an expected way, with the following caveats:
67 Having Write permission does not imply Read permission.::
68   It is possible and sometimes desirable for a user to be able to write data that same user cannot read. One such example is a log-writing process.
69 The [systemitem]+hbase:meta+ table is readable by every user, regardless of the user's other grants or restrictions.::
70   This is a requirement for HBase to function correctly.
71 `CheckAndPut` and `CheckAndDelete` operations will fail if the user does not have both Write and Read permission.::
72 `Increment` and `Append` operations do not require Read access.::
73 The `superuser`, as the name suggests has permissions to perform all possible operations.::
74 And for the operations marked with *, the checks are done in post hook and only subset of results satisfying access checks are returned back to the user.::
76 The following table is sorted by the interface that provides each operation.
77 In case the table goes out of date, the unit tests which check for accuracy of permissions can be found in _hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java_, and the access controls themselves can be examined in _hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java_.
79 .ACL Matrix
80 [cols="1,1,1", frame="all", options="header"]
81 |===
82 | Interface | Operation | Permissions
83 | Master | createTable | superuser\|global\(C)\|NS\(C)
84 |        | modifyTable | superuser\|global(A)\|global\(C)\|NS(A)\|NS\(C)\|TableOwner\|table(A)\|table\(C)
85 |        | deleteTable | superuser\|global(A)\|global\(C)\|NS(A)\|NS\(C)\|TableOwner\|table(A)\|table\(C)
86 |        | truncateTable | superuser\|global(A)\|global\(C)\|NS(A)\|NS\(C)\|TableOwner\|table(A)\|table\(C)
87 |        | addColumn | superuser\|global(A)\|global\(C)\|NS(A)\|NS\(C)\|TableOwner\|table(A)\|table\(C)
88 |        | modifyColumn | superuser\|global(A)\|global\(C)\|NS(A)\|NS\(C)\|TableOwner\|table(A)\|table\(C)\|column(A)\|column\(C)
89 |        | deleteColumn | superuser\|global(A)\|global\(C)\|NS(A)\|NS\(C)\|TableOwner\|table(A)\|table\(C)\|column(A)\|column\(C)
90 |        | enableTable | superuser\|global(A)\|global\(C)\|NS(A)\|NS\(C)\|TableOwner\|table(A)\|table\(C)
91 |        | disableTable | superuser\|global(A)\|global\(C)\|NS(A)\|NS\(C)\|TableOwner\|table(A)\|table\(C)
92 |        | disableAclTable | Not allowed
93 |        | move | superuser\|global(A)\|NS(A)\|TableOwner\|table(A)
94 |        | assign | superuser\|global(A)\|NS(A)\|TableOwner\|table(A)
95 |        | unassign | superuser\|global(A)\|NS(A)\|TableOwner\|table(A)
96 |        | regionOffline | superuser\|global(A)\|NS(A)\|TableOwner\|table(A)
97 |        | balance | superuser\|global(A)
98 |        | balanceSwitch | superuser\|global(A)
99 |        | shutdown | superuser\|global(A)
100 |        | stopMaster | superuser\|global(A)
101 |        | snapshot | superuser\|global(A)\|NS(A)\|TableOwner\|table(A)
102 |        | listSnapshot | superuser\|global(A)\|SnapshotOwner
103 |        | cloneSnapshot | superuser\|global(A)\|(SnapshotOwner & TableName matches)
104 |        | restoreSnapshot | superuser\|global(A)\|SnapshotOwner & (NS(A)\|TableOwner\|table(A))
105 |        | deleteSnapshot | superuser\|global(A)\|SnapshotOwner
106 |        | createNamespace | superuser\|global(A)
107 |        | deleteNamespace | superuser\|global(A)
108 |        | modifyNamespace | superuser\|global(A)
109 |        | getNamespaceDescriptor | superuser\|global(A)\|NS(A)
110 |        | listNamespaceDescriptors* | superuser\|global(A)\|NS(A)
111 |        | flushTable | superuser\|global(A)\|global\(C)\|NS(A)\|NS\(C)\|TableOwner\|table(A)\|table\(C)
112 |        | getTableDescriptors* | superuser\|global(A)\|global\(C)\|NS(A)\|NS\(C)\|TableOwner\|table(A)\|table\(C)
113 |        | getTableNames* | superuser\|TableOwner\|Any global or table perm
114 |        | setUserQuota(global level) | superuser\|global(A)
115 |        | setUserQuota(namespace level) | superuser\|global(A)
116 |        | setUserQuota(Table level) | superuser\|global(A)\|NS(A)\|TableOwner\|table(A)
117 |        | setTableQuota | superuser\|global(A)\|NS(A)\|TableOwner\|table(A)
118 |        | setNamespaceQuota | superuser\|global(A)
119 |        | addReplicationPeer | superuser\|global(A)
120 |        | removeReplicationPeer | superuser\|global(A)
121 |        | enableReplicationPeer | superuser\|global(A)
122 |        | disableReplicationPeer | superuser\|global(A)
123 |        | getReplicationPeerConfig | superuser\|global(A)
124 |        | updateReplicationPeerConfig | superuser\|global(A)
125 |        | listReplicationPeers | superuser\|global(A)
126 |        | getClusterStatus | any user
127 | Region | openRegion | superuser\|global(A)
128 |        | closeRegion | superuser\|global(A)
129 |        | flush | superuser\|global(A)\|global\(C)\|TableOwner\|table(A)\|table\(C)
130 |        | split | superuser\|global(A)\|TableOwner\|TableOwner\|table(A)
131 |        | compact | superuser\|global(A)\|global\(C)\|TableOwner\|table(A)\|table\(C)
132 |        | getClosestRowBefore | superuser\|global\(R)\|NS\(R)\|TableOwner\|table\(R)\|CF\(R)\|CQ\(R)
133 |        | getOp | superuser\|global\(R)\|NS\(R)\|TableOwner\|table\(R)\|CF\(R)\|CQ\(R)
134 |        | exists | superuser\|global\(R)\|NS\(R)\|TableOwner\|table\(R)\|CF\(R)\|CQ\(R)
135 |        | put | superuser\|global(W)\|NS(W)\|table(W)\|TableOwner\|CF(W)\|CQ(W)
136 |        | delete | superuser\|global(W)\|NS(W)\|table(W)\|TableOwner\|CF(W)\|CQ(W)
137 |        | batchMutate | superuser\|global(W)\|NS(W)\|TableOwner\|table(W)\|CF(W)\|CQ(W)
138 |        | checkAndPut | superuser\|global(RW)\|NS(RW)\|TableOwner\|table(RW)\|CF(RW)\|CQ(RW)
139 |        | checkAndPutAfterRowLock | superuser\|global\(R)\|NS\(R)\|TableOwner\|Table\(R)\|CF\(R)\|CQ\(R)
140 |        | checkAndDelete   | superuser\|global(RW)\|NS(RW)\|TableOwner\|table(RW)\|CF(RW)\|CQ(RW)
141 |        | checkAndDeleteAfterRowLock | superuser\|global\(R)\|NS\(R)\|TableOwner\|table\(R)\|CF\(R)\|CQ\(R)
142 |        | incrementColumnValue | superuser\|global(W)\|NS(W)\|TableOwner\|table(W)\|CF(W)\|CQ(W)
143 |        | append | superuser\|global(W)\|NS(W)\|TableOwner\|table(W)\|CF(W)\|CQ(W)
144 |        | appendAfterRowLock | superuser\|global(W)\|NS(W)\|TableOwner\|table(W)\|CF(W)\|CQ(W)
145 |        | increment | superuser\|global(W)\|NS(W)\|TableOwner\|table(W)\|CF(W)\|CQ(W)
146 |        | incrementAfterRowLock | superuser\|global(W)\|NS(W)\|TableOwner\|table(W)\|CF(W)\|CQ(W)
147 |        | scannerOpen | superuser\|global\(R)\|NS\(R)\|TableOwner\|table\(R)\|CF\(R)\|CQ\(R)
148 |        | scannerNext | superuser\|global\(R)\|NS\(R)\|TableOwner\|table\(R)\|CF\(R)\|CQ\(R)
149 |        | scannerClose | superuser\|global\(R)\|NS\(R)\|TableOwner\|table\(R)\|CF\(R)\|CQ\(R)
150 |        | bulkLoadHFile | superuser\|global\(C)\|TableOwner\|table\(C)\|CF\(C)
151 |        | prepareBulkLoad | superuser\|global\(C)\|TableOwner\|table\(C)\|CF\(C)
152 |        | cleanupBulkLoad | superuser\|global\(C)\|TableOwner\|table\(C)\|CF\(C)
153 | Endpoint | invoke | superuser\|global(X)\|NS(X)\|TableOwner\|table(X)
154 | AccessController | grant(global level) | global(A)
155 |                  | grant(namespace level) | global(A)\|NS(A)
156 |                  | grant(table level) | global(A)\|NS(A)\|TableOwner\|table(A)\|CF(A)\|CQ(A)
157 |                  | revoke(global level) | global(A)
158 |                  | revoke(namespace level) | global(A)\|NS(A)
159 |                  | revoke(table level) | global(A)\|NS(A)\|TableOwner\|table(A)\|CF(A)\|CQ(A)
160 |                  | getUserPermissions(global level) | global(A)
161 |                  | getUserPermissions(namespace level) | global(A)\|NS(A)
162 |                  | getUserPermissions(table level) | global(A)\|NS(A)\|TableOwner\|table(A)\|CF(A)\|CQ(A)
163 | RegionServer | stopRegionServer | superuser\|global(A)
164 |              | mergeRegions | superuser\|global(A)
165 |              | rollWALWriterRequest | superuser\|global(A)
166 |              | replicateLogEntries | superuser\|global(W)
167 |RSGroup |addRSGroup           |superuser\|global(A)
168 |        |balanceRSGroup       |superuser\|global(A)
169 |        |getRSGroupInfo       |superuser\|global(A)
170 |        |getRSGroupInfoOfTable|superuser\|global(A)
171 |        |getRSGroupOfServer   |superuser\|global(A)
172 |        |listRSGroups         |superuser\|global(A)
173 |        |moveServers          |superuser\|global(A)
174 |        |moveServersAndTables |superuser\|global(A)
175 |        |moveTables           |superuser\|global(A)
176 |        |removeRSGroup        |superuser\|global(A)
177 |        |removeServers        |superuser\|global(A)
178 |===
180 :numbered: