1. Privilege

Index

Authorization modes

这是原始的 Hive 授权模式的设计文档。有关授权模式的概述,请参见Authorization,其中包括基于存储的授权基于 SQL 标准的授权

1.1 访问权限

Management 员特权,数据库特权,表级别特权,列级别特权

1 .1.1Management 员特权是全局特权,用于执行 Management。

1 .1.2 DB 特权是特定于数据库的,并且适用于该数据库内部的所有对象。

1 .1.3 表特权适用于给定数据库中的表/视图/索引

1 .1.4 列特权适用于列级别。

即使现在配置单元不支持列级覆盖,所有的 DB/Table/Column 特权也区分读写特权。而且没有分区级别特权。

2.配置单元操作

创建索引/删除索引

创建数据库/删除数据库

创建表/放置表

创建视图/放置视图

alter table

show databases

锁表/解锁表/显示锁

add partition

archive

Select

插入覆盖目录

插入覆盖表

其他包括“创建表为”,“创建表为”等

3. Metadata

将特权信息存储在新的元存储表“ user”,“ db”,“ tables_priv”,“ columns_priv”中。

用户表指示用户的全局特权,该特权适用于所有数据库。
db 表确定数据库级别的访问特权,该特权适用于该数据库内部的所有对象。

3.1 用户,组和角色

用户可以属于某些组。组信息由验证者提供。

每个用户或组可以具有一些特权和角色。一个角色可以是另一个角色的成员,但不能以循环的方式。

因此,配置单元元数据需要存储:

1)角色->特权,角色 Map

2)Hive 用户/组->特权,角色 Map

3.1.1 角色 Management

create role

drop role

向用户授予角色

撤消用户的角色

3.1.2 角色元数据

role_name-字符串

create_time-整数

3.1.3 配置单元角色用户成员资格表

role_name-字符串

user_name-字符串

is_group –用户名是组名吗

is_role –用户名是角色名吗

3.2 Hive 支持的特权

3.2.1 metadata

下面显示了我们如何将授权信息存储在 metastore 中。拒绝信息存储在同一事件中(仅存储在不同的表中)。

因此,对于每个授权表,还将有一个拒绝表。 Metastore 表是

用户,deny_user,数据库,deny_db,tables_priv,deny_tables_priv,columns_priv,deny_columns_priv

另一种方法是在授予表中添加一列以记录此行是授予还是拒绝。

我们将特权存储在一列中,并使用逗号分隔不同的特权。

Hive> desc 用户;

Field

  • - - -

User

isRole

isGroup

isSuper

db_priv –设置(Select_priv,Insert_priv,Create_priv,Drop_priv,Reload_priv,

Grant_priv,Index_priv,Alter_priv,Show_db_priv,

Lock_tables_priv,Create_view_priv,Show_view_priv)

Hive> desc db;

Field

  • - - -

Db

User

isRole

isGroup

Table_priv –设置(Select_priv,Insert_priv,Create_priv,Drop_priv,Grant_priv,

Index_priv,Reload_priv,Alter_priv,Create_tmp_table_priv,

Lock_tables_priv,Create_view_priv,Show_view_priv)

Hive> desc table_priv;

Field

  • - - -

Db

User

isRole

isGroup

Table_name

Grantor

Timestamp

Table_priv – set('Select','Insert','Create','Drop','Grant','Index','Alter','Create View','Show view')

Column_priv –设置(“选择”,“插入”,)

mysql> desc columns_priv;

Field

  • - - -

Db

User

isRole

isGroup

Table_name

Column_name

Timestamp

Column_priv –设置(“选择”,“插入”,“更新”)

4.授予/撤消访问权限

4.1 特权名称/类型:

ALL Privileges

ALTER

Create

Create view

Delete

Drop

Index

Insert

Lock Tables

Select

Show databases

Super

4.2 表演资助

4.3 授权/撤销声明

GRANT
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    TO user [, user] ...
WITH ADMIN OPTION

object_type:
    TABLE

priv_level:
    *
  | *.*
  | db_name.*
  | db_name.tbl_name
  | tbl_name

REVOKE
    priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    FROM user [, user] ...

REVOKE ALL PRIVILEGES, GRANT OPTION
    FROM user [, user] ...

DENY  
	priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [object_type] priv_level
    FROM user [, user] ...

5.授权验证

5.1 USER/GROUP/ROLE

USER

GROUP

ROLE

GROUP 与角色非常相似。我们之所以支持 Group,是因为我们可能需要将组信息传递给 HDFS/Map-reduce。

角色还可以包含其他角色和特权-可以将它们授予用户和组。

角色可以嵌套但不能循环。

5.2 验证步骤

用户登录系统时,将拥有一个用户名,一个或几个所属的组。
就是这样

[

username, 

list of group names, 

list of privileges and roles that has been directly granted, 

list of privileges and roles that been directly granted to groups that users belongs to

].

  • 授权一种访问的步骤:*
First try user name:

 # If there is an entry in 'user' that accept this access, return ACCEPT

2. If there is an entry in 'db'  that accept this access, return ACCEPT

3. If there is an entry in 'table'  that accept this access, return ACCEPT

4. If there is an entry in 'column'  that accept this access, return ACCEPT

Second try the user's group/role names one by one until we get an ACCEPT. 

For each role/group, we do the same routine as we did for user name.

5.3 Examples

5 .3.1 我想授予所有人(新人可以随时加入)
db_name.*,然后稍后我想保护一个表 db_name.T 不受所有
用户,但少数

1)将所有用户添加到“用户”组中。 (假设:新用户将
自动加入此群组)。并授予“用户” db_name 的所有特权.*

2)将这几个用户添加到新的组“ users2”中。并从“用户”中删除它们

3)将“用户”拒绝给 db_name.T

4)将 db_name.T 上的 ALL 授予用户 2

5 .3.2 我想保护一个表 db_name.T 不受一个/几个用户的影响,但是所有
其他人可以访问它

1)将所有用户添加到“用户”组中。 (假设:新用户将自动
加入该组)。并授予“用户” db_name.*的所有特权。

2)将这几个用户添加到新的组“ users2”中。 (注意:这几个用户现在
属于两个组:用户和用户 2)

3)DENY'users2'到 db_name.T

6.在 Hive 中添加授权的位置

CliDriver 和 HiveServer。基本上,他们共享相同的代码。如果 HiveServer 调用 CliDriver,我们可以将其添加到 CliDriver 中。而且,我们还需要使 HiveServer 能够支持多个用户/连接。
如果有人直接访问 metastore(而不通过 Hive),这仍然不能解决问题。

7. Implementation

7.1 身份验证器界面

我们仅从身份验证器获得用户的用户名,组名。身份验证器实现需要提供这些信息。这是身份验证器和授权之间的唯一接口。

7.2 Authorization

授权决策 Management 器 Management 一组授权提供者,每个提供者可以决定接受还是拒绝。最终决策者是决策 Manager。可以基于投票,或者-1 表示拒绝,或者 1 表示接受。授权提供者根据他自己的信息决定接受还是拒绝访问。

8. MySQL 的 Metastore 升级脚本

--
-- Table structure for table {{ROLES}}
--

DROP TABLE IF EXISTS {{ROLES}};
CREATE TABLE {{ROLES}} (
  {{ROLE_ID}} bigint(20) NOT NULL,
  {{CREATE_TIME}} int(11) NOT NULL,
  {{OWNER_NAME}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{ROLE_NAME}} varchar(128) character set latin1 collate latin1_bin default NULL,
  PRIMARY KEY  ({{ROLE_ID}}),
  UNIQUE KEY {{ROLEENTITYINDEX}} ({{ROLE_NAME}})
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Table structure for table {{ROLE_MAP}}
--

DROP TABLE IF EXISTS {{ROLE_MAP}};
CREATE TABLE {{ROLE_MAP}} (
  {{ROLE_GRANT_ID}} bigint(20) NOT NULL,
  {{ADD_TIME}} int(11) NOT NULL,
  {{GRANT_OPTION}} smallint(6) NOT NULL,
  {{GRANTOR}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{GRANTOR_TYPE}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{PRINCIPAL_NAME}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{PRINCIPAL_TYPE}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{ROLE_ID}} bigint(20) default NULL,
  PRIMARY KEY  ({{ROLE_GRANT_ID}}),
  UNIQUE KEY {{USERROLEMAPINDEX}} ({{PRINCIPAL_NAME}},{{ROLE_ID}},{{GRANTOR}},{{GRANTOR_TYPE}}),
  KEY {{ROLE_MAP_N49}} ({{ROLE_ID}}),
  CONSTRAINT {{ROLE_MAP_FK1}} FOREIGN KEY ({{ROLE_ID}}) REFERENCES {{ROLES}} ({{ROLE_ID}})
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Table structure for table {{GLOBAL_PRIVS}}
--

DROP TABLE IF EXISTS {{GLOBAL_PRIVS}};
CREATE TABLE {{GLOBAL_PRIVS}} (
  {{USER_GRANT_ID}} bigint(20) NOT NULL,
  {{CREATE_TIME}} int(11) NOT NULL,
  {{GRANT_OPTION}} smallint(6) NOT NULL,
  {{GRANTOR}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{GRANTOR_TYPE}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{PRINCIPAL_NAME}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{PRINCIPAL_TYPE}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{USER_PRIV}} varchar(128) character set latin1 collate latin1_bin default NULL,
  PRIMARY KEY  ({{USER_GRANT_ID}}),
  UNIQUE KEY {{GLOBALPRIVILEGEINDEX}} ({{PRINCIPAL_NAME}},{{PRINCIPAL_TYPE}},{{USER_PRIV}},{{GRANTOR}},{{GRANTOR_TYPE}})
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Table structure for table {{DB_PRIVS}}
--

DROP TABLE IF EXISTS {{DB_PRIVS}};
CREATE TABLE {{DB_PRIVS}} (
  {{DB_GRANT_ID}} bigint(20) NOT NULL,
  {{CREATE_TIME}} int(11) NOT NULL,
  {{DB_ID}} bigint(20) default NULL,
  {{GRANT_OPTION}} smallint(6) NOT NULL,
  {{GRANTOR}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{GRANTOR_TYPE}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{PRINCIPAL_NAME}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{PRINCIPAL_TYPE}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{DB_PRIV}} varchar(128) character set latin1 collate latin1_bin default NULL,
  PRIMARY KEY  ({{DB_GRANT_ID}}),
  UNIQUE KEY {{DBPRIVILEGEINDEX}} ({{DB_ID}},{{PRINCIPAL_NAME}},{{PRINCIPAL_TYPE}},{{DB_PRIV}},{{GRANTOR}},{{GRANTOR_TYPE}}),
  KEY {{DB_PRIVS_N49}} ({{DB_ID}}),
  CONSTRAINT {{DB_PRIVS_FK1}} FOREIGN KEY ({{DB_ID}}) REFERENCES {{DBS}} ({{DB_ID}})
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Table structure for table {{TBL_PRIVS}}
--

DROP TABLE IF EXISTS {{TBL_PRIVS}};

CREATE TABLE {{TBL_PRIVS}} (
  {{TBL_GRANT_ID}} bigint(20) NOT NULL,
  {{CREATE_TIME}} int(11) NOT NULL,
  {{GRANT_OPTION}} smallint(6) NOT NULL,
  {{GRANTOR}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{GRANTOR_TYPE}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{PRINCIPAL_NAME}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{PRINCIPAL_TYPE}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{TBL_PRIV}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{TBL_ID}} bigint(20) default NULL,
  PRIMARY KEY  ({{TBL_GRANT_ID}}),
  KEY {{TBL_PRIVS_N49}} ({{TBL_ID}}),
  KEY {{TABLEPRIVILEGEINDEX}} ({{TBL_ID}},{{PRINCIPAL_NAME}},{{PRINCIPAL_TYPE}},{{TBL_PRIV}},{{GRANTOR}},{{GRANTOR_TYPE}}),
  CONSTRAINT {{TBL_PRIVS_FK1}} FOREIGN KEY ({{TBL_ID}}) REFERENCES {{TBLS}} ({{TBL_ID}})
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Table structure for table {{PART_PRIVS}}
--

DROP TABLE IF EXISTS {{PART_PRIVS}};

CREATE TABLE {{PART_PRIVS}} (
  {{PART_GRANT_ID}} bigint(20) NOT NULL,
  {{CREATE_TIME}} int(11) NOT NULL,
  {{GRANT_OPTION}} smallint(6) NOT NULL,
  {{GRANTOR}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{GRANTOR_TYPE}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{PART_ID}} bigint(20) default NULL,
  {{PRINCIPAL_NAME}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{PRINCIPAL_TYPE}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{PART_PRIV}} varchar(128) character set latin1 collate latin1_bin default NULL,
  PRIMARY KEY  ({{PART_GRANT_ID}}),
  KEY {{PARTPRIVILEGEINDEX}} ({{PART_ID}},{{PRINCIPAL_NAME}},{{PRINCIPAL_TYPE}},{{PART_PRIV}},{{GRANTOR}},{{GRANTOR_TYPE}}),
  KEY {{PART_PRIVS_N49}} ({{PART_ID}}),
  CONSTRAINT {{PART_PRIVS_FK1}} FOREIGN KEY ({{PART_ID}}) REFERENCES {{PARTITIONS}} ({{PART_ID}})
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Table structure for table {{TBL_COL_PRIVS}}
--

DROP TABLE IF EXISTS {{TBL_COL_PRIVS}};
CREATE TABLE {{TBL_COL_PRIVS}} (
  {{TBL_COLUMN_GRANT_ID}} bigint(20) NOT NULL,
  {{COLUMN_NAME}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{CREATE_TIME}} int(11) NOT NULL,
  {{GRANT_OPTION}} smallint(6) NOT NULL,
  {{GRANTOR}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{GRANTOR_TYPE}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{PRINCIPAL_NAME}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{PRINCIPAL_TYPE}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{TBL_COL_PRIV}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{TBL_ID}} bigint(20) default NULL,
  PRIMARY KEY  ({{TBL_COLUMN_GRANT_ID}}),
  KEY {{TABLECOLUMNPRIVILEGEINDEX}} ({{TBL_ID}},{{COLUMN_NAME}},{{PRINCIPAL_NAME}},{{PRINCIPAL_TYPE}},{{TBL_COL_PRIV}},{{GRANTOR}},{{GRANTOR_TYPE}}),
  KEY {{TBL_COL_PRIVS_N49}} ({{TBL_ID}}),
  CONSTRAINT {{TBL_COL_PRIVS_FK1}} FOREIGN KEY ({{TBL_ID}}) REFERENCES {{TBLS}} ({{TBL_ID}})
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS {{PART_COL_PRIVS}};
CREATE TABLE {{PART_COL_PRIVS}} (
  {{PART_COLUMN_GRANT_ID}} bigint(20) NOT NULL,
  {{COLUMN_NAME}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{CREATE_TIME}} int(11) NOT NULL,
  {{GRANT_OPTION}} smallint(6) NOT NULL,
  {{GRANTOR}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{GRANTOR_TYPE}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{PART_ID}} bigint(20) default NULL,
  {{PRINCIPAL_NAME}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{PRINCIPAL_TYPE}} varchar(128) character set latin1 collate latin1_bin default NULL,
  {{PART_COL_PRIV}} varchar(128) character set latin1 collate latin1_bin default NULL,
  PRIMARY KEY  ({{PART_COLUMN_GRANT_ID}}),
  KEY {{PART_COL_PRIVS_N49}} ({{PART_ID}}),
  KEY {{PARTITIONCOLUMNPRIVILEGEINDEX}} ({{PART_ID}},{{COLUMN_NAME}},{{PRINCIPAL_NAME}},{{PRINCIPAL_TYPE}},{{PART_COL_PRIV}},{{GRANTOR}},{{GRANTOR_TYPE}}),
  CONSTRAINT {{PART_COL_PRIVS_FK1}} FOREIGN KEY ({{PART_ID}}) REFERENCES {{PARTITIONS}} ({{PART_ID}})
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

HDFS Permission

上面对文件层安全性有严格的假设。如果对他开放了 hdfs 文件权限,则用户可以轻松绕过安全性。我们希望我们可以轻松地插入外部授权(例如 HDFS 权限/ Howl 权限)来更改授权结果甚至规则。