0028-如何在CDH未啟用認證的情況下安裝及使用Sentry
溫馨提示:要看高清無碼套圖,請使用手機開啟並單擊圖片放大檢視。
1.文件編寫目的
CDH平臺中的安全,認證(Kerberos/LDAP)是第一步,授權(Sentry)是第二步。如果要啟用授權,必須先啟用認證。但在CDH平臺中給出了一種測試模式,即不啟用認證而只啟用Sentry授權。但強烈不建議在生產系統中這樣使用,因為如果沒有使用者認證,授權沒有任何意義形同虛設,使用者可以隨意使用任何超級使用者登入HiveServer2或者Impala,並不會做密碼校驗。注:本文件僅適用於測試環境。
本文件主要描述如何在CDH未啟用認證的情況下安裝,配置及使用Sentry。
- 內容概述
1.如何安裝Sentry服務
2.Hive/Impala/Hue/HDFS服務如何與Sentry整合
3.Sentry測試
- 測試環境
1.作業系統為CentOS6.5
2.CM和CDH版本為5.11.1
3.採用root使用者操作
- 前置條件
1.CDH叢集執行正常
2.叢集未啟用認證服務(如Kerberos或LDAP)
2.Sentry安裝
1.在MySQL中建立sentry資料庫
建表語句:
create database sentry default character set utf8;
CREATE USER 'sentry'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON sentry. * TO 'sentry'@'%';
FLUSH PRIVILEGES;
命令列操作:
[[email protected] 527-hive-HIVEMETASTORE]# mysql -uroot -p Enter password: ... mysql> create database sentry default character set utf8; Query OK, 1 row affected (0.00 sec) mysql> CREATE USER 'sentry'@'%' IDENTIFIED BY 'password'; Query OK, 0 rows affected (0.00 sec) mysql> GRANT ALL PRIVILEGES ON sentry.* TO 'sentry'@'%'; Query OK, 0 rows affected (0.00 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) mysql>
2.進入Cloudera Manager控制檯點選“新增服務”
3.進入服務新增介面
4.選擇Sentry服務,點選“繼續”
5.選擇Sentry Server及Gateway的安裝節點,點選“繼續“,注意需提前在MySQL中建立好相關使用者和資料庫
6.輸入Sentry服務的資料庫資訊,點選測試,測試通過,點選“繼續”
7.等待服務安裝成功,點選“繼續”
8.點選“完成”,Sentry服務到此安裝完成。
3.Sentry配置
3.1Hive配置
1.配置Hive使用Sentry服務
2.關閉Hive的使用者模擬功能
3.叢集未啟用安全認證環境下,需要配置以下引數
<property>
<name>sentry.hive.testing.mode</name>
<value>true</value>
</property>
3.2Impala配置
配置Impala與Sentry整合
3.3Hue配置
配置Hue與Sentry整合
3.4HDFS配置
配置HDFS開啟ACLs與Sentry許可權同步
完成以上配置後,回到Cloudera Manager主頁,部署客戶端配置並重啟相關服務。
4.Sentry測試
4.1建立hive超級使用者
1.使用beeline連線HiveServer2,並登入hive使用者
[[email protected] ~]# beeline
Beeline version 1.1.0-cdh5.12.0 by Apache Hive
beeline> !connect jdbc:hive2://localhost:10000
Enter username for jdbc:hive2://localhost:10000: hive
Enter password for jdbc:hive2://localhost:10000:
Connected to: Apache Hive (version 1.1.0-cdh5.12.0)
Driver: Hive JDBC (version 1.1.0-cdh5.12.0)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://localhost:10000>
注意:標紅部分為輸入的hive使用者,輸入的hive使用者並未真正的校驗
2.建立一個admin角色
0: jdbc:hive2://localhost:10000> create role admin;
...
INFO : OK
No rows affected (2.52 seconds)
0: jdbc:hive2://localhost:10000>
3.為admin角色賦予超級許可權
0: jdbc:hive2://localhost:10000> grant all on server server1 to role admin;
...
INFO : OK
No rows affected (0.221 seconds)
0: jdbc:hive2://localhost:10000>
4.將admin角色授權給hive使用者組
0: jdbc:hive2://localhost:10000> grant role admin to group hive;
...
INFO : OK
No rows affected (0.162 seconds)
0: jdbc:hive2://localhost:10000>
4.2建立test表
使用beeline登入hive使用者,建立一個test表,並插入測試資料
0: jdbc:hive2://localhost:10000> create table test (s1 string, s2 string) row format delimitedfields terminated by ',';
...
INFO : OK
No rows affected (0.592 seconds)
0: jdbc:hive2://localhost:10000> insert into test values('a','b'),('1','2');
...
INFO : OK
No rows affected (20.123 seconds)
0: jdbc:hive2://localhost:10000>
4.3建立測試角色並授權給使用者組
建立兩個角色:
read:只能讀default庫test表,並授權給fayson使用者組
write:只能寫default庫test表,並授權給user_w使用者組
注意:叢集所有節點必須存在fayson和user_w使用者,使用者預設使用者組與使用者名稱一致,賦權是針對使用者組而不是針對使用者。
[[email protected] cdh-shell-master]# id fayson
uid=501(fayson) gid=501(fayson) groups=501(fayson)
[[email protected] cdh-shell-master]# useradd user_w
[[email protected] cdh-shell-master]# id user_w
uid=502(user_w) gid=502(user_w) groups=502(user_w)
[[email protected] cdh-shell-master]#
1.使用hive使用者建立建立read和write角色,並授權read角色對test表select許可權,write角色對test表insert許可權
0: jdbc:hive2://localhost:10000> create role read;
...
INFO : OK
No rows affected (0.094 seconds)
0: jdbc:hive2://localhost:10000> grant select on table test to role read;
...
INFO : OK
No rows affected (0.1 seconds)
0: jdbc:hive2://localhost:10000> create role write;
...
INFO : OK
No rows affected (0.105 seconds)
0: jdbc:hive2://localhost:10000> grant insert on table test to role write;
...
INFO : OK
No rows affected (0.112 seconds)
0: jdbc:hive2://localhost:10000>
2.為fayson使用者組授權read角色,為user_w使用者組授權write角色
0: jdbc:hive2://localhost:10000> grant role read to group fayson;
...
INFO : OK
No rows affected (0.187 seconds)
0: jdbc:hive2://localhost:10000> grant role write to group user_w;
...
INFO : OK
No rows affected (0.101 seconds)
0: jdbc:hive2://localhost:10000>
4.4beeline驗證
1.使用fayson使用者登入beeline進行驗證
[[email protected] ~]# beeline
Beeline version 1.1.0-cdh5.12.0 by Apache Hive
beeline> !connect jdbc:hive2://localhost:10000
scan complete in 2ms
Connecting to jdbc:hive2://localhost:10000
Enter username for jdbc:hive2://localhost:10000: fayson
Enter password for jdbc:hive2://localhost:10000:
Connected to: Apache Hive (version 1.1.0-cdh5.12.0)
Driver: Hive JDBC (version 1.1.0-cdh5.12.0)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://localhost:10000> show tables;
...
INFO : OK
+-----------+--+
| tab_name |
+-----------+--+
| test |
+-----------+--+
1 row selected (0.351 seconds)
0: jdbc:hive2://localhost:10000> select * from test;
...
INFO : OK
+----------+----------+--+
| test.s1 | test.s2 |
+----------+----------+--+
| a | b |
| 1 | 2 |
+----------+----------+--+
2 rows selected (0.24 seconds)
0: jdbc:hive2://localhost:10000>
0: jdbc:hive2://localhost:10000> insert into test values("2", "222");
Error: Error while compiling statement: FAILED: SemanticException No valid privileges
User fayson does not have privileges for QUERY
The required privileges: Server=server1->Db=default->Table=test->action=insert; (state=42000,code=40000)
0: jdbc:hive2://localhost:10000>
2.使用user_w使用者登入beeline驗證
[[email protected] ~]# beeline
Beeline version 1.1.0-cdh5.12.0 by Apache Hive
beeline> !connect jdbc:hive2://localhost:10000
scan complete in 2ms
Connecting to jdbc:hive2://localhost:10000
Enter username for jdbc:hive2://localhost:10000: user_w
Enter password for jdbc:hive2://localhost:10000:
Connected to: Apache Hive (version 1.1.0-cdh5.12.0)
Driver: Hive JDBC (version 1.1.0-cdh5.12.0)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://localhost:10000> show tables;
INFO : OK
+-----------+--+
| tab_name |
+-----------+--+
| test |
+-----------+--+
1 row selected (0.365 seconds)
0: jdbc:hive2://localhost:10000> select * from test;
Error: Error while compiling statement: FAILED: SemanticException No valid privileges
User user_w does not have privileges for QUERY
The required privileges: Server=server1->Db=default->Table=test->Column=s1->action=select; (state=42000,code=40000)
0: jdbc:hive2://localhost:10000> insert into test values("2", "333");
...
INFO : Completed executing command(queryId=hive_20170902183535_56bcd189-544a-453f-9752-e40a9fed60c5); Time taken: 17.762 seconds
INFO : OK
No rows affected (18.035 seconds)
0: jdbc:hive2://localhost:10000>
驗證總結:
fayson使用者所屬組為fayson擁有test表讀許可權,所以只能對test表進行selecth和count操作不能進行insert操作;
user_w使用者所屬組為user_w擁有test表寫許可權,所以只能對test表進行insert操作不能進行select和count操作;
4.5HDFS驗證
1.切換至fayson使用者下,瀏覽和檢視/user/hive/warehouse/test資料目錄及檔案
[[email protected] ~]# su fayson
[[email protected] root]$ cd /home/fayson/
[[email protected] ~]$ ll
total 4
-rw-rw-r-- 1 fayson fayson 19 Sep 5 12:55 test.txt
[[email protected] ~]$ hadoop fs -ls /user/hive/warehouse
ls: Permission denied: user=fayson, access=READ_EXECUTE, inode="/user/hive/warehouse":hive:hive:drwxrwx--x
[[email protected] ~]$ hadoop fs -ls /user/hive/warehouse/test
Found 1 items
-rwxrwx--x+ 3 hive hive 8 2017-09-05 12:52 /user/hive/warehouse/test/000000_0
[[email protected] ~]$ hadoop fs -cat /user/hive/warehouse/test/000000_0
a,b
1,2
[[email protected] ~]$ hadoop fs -put test.txt /user/hive/warehouse/test
put: Permission denied: user=fayson, access=WRITE, inode="/user/hive/warehouse/test":hive:hive:drwxrwx--x
[[email protected] ~]$
2.切換user_w使用者下,瀏覽和檢視/user/hive/warehouse/test資料目錄及檔案
[[email protected] ~]# su user_w
[[email protected] root]$ cd /home/user_w/
[[email protected] ~]$ cat test.txt
333,5555
eeee,dddd
[[email protected] ~]$ hadoop fs -ls /user/hive/warehouse
ls: Permission denied: user=user_w, access=READ_EXECUTE, inode="/user/hive/warehouse":hive:hive:drwxrwx--x
[[email protected] ~]$ hadoop fs -ls /user/hive/warehouse/test
ls: Permission denied: user=user_w, access=READ_EXECUTE, inode="/user/hive/warehouse/test":hive:hive:drwxrwx--x
[[email protected] ~]$ hadoop fs -put test.txt /user/hive/warehouse/test
[[email protected] ~]$
測試總結:
fayson使用者所屬使用者組為fayson,該組只擁有對test表的讀許可權,因此fayson使用者不能對/user/hive/warehouse目錄下除test以外的其它目錄進行檢視(包含父目錄),並且不能向test目錄put檔案,只能瀏覽和檢視test目錄下的檔案。
user_w使用者所屬使用者組為user_w,該組只擁有對test表的寫許可權,因此user_w使用者不能對/user/hive/warehouse目錄下的任何目錄進行檢視(包含父目錄),並且只擁有向test目錄put檔案的許可權。說明Sentry實現了HDFS的ACL同步。
4.6Hue驗證
1.使用admin使用者登入Hue,分別建立fayson和user_w使用者
2.使用fayson使用者登入Hue
可以檢視test表
可以對test表進行count操作
只有SELECT許可權不能向test表插入資料
FileBrower驗證
不可以瀏覽/user/hive/warehouse目錄
可以瀏覽有SELECT許可權的/user/hive/warehouse/test資料目錄
可以檢視/user/hive/warehouse/test目錄下的所有資料檔案,但不能修改
3.使用user_w使用者登入Hue
因為無SELECT許可權,所以不能查詢表資訊
不能對test表進行count操作
可以向test表中插入資料
FileBrowser
不可以瀏覽test表資料目錄的父目錄/user/hive/warehouse
無SELECT許可權也不能瀏test表的資料目錄/user/hive/warehouse/test
測試總結:
fayson和user_w使用者均能通過hue介面看到test表,擁有read角色的fayson使用者組能對test表進行select和count操作,並且能通過File Browser瀏覽和檢視test表的資料目錄/user/hive/warehouse/test。擁有write角色的user_w使用者組只能對test表進行insert操作,但不能通過File Browser瀏覽和檢視test表的資料目錄/user/hive/warehouse/test。說明Sentry在命令列的操作和授權在Hue中依舊有效。
4.7Impala驗證
1.使用fayson使用者測試
登入叢集任意節點命令列下切換到fayson使用者下
[[email protected] ~]# su fayson
[[email protected] root]$
在命令列執行impala-shell命令
[Not connected] > connect ip-172-31-10-118.fayson.com:21000;
...
[ip-172-31-10-118.fayson.com:21000] > show tables;
Query: show tables
+------+
| name |
+------+
| test |
+------+
Fetched 1 row(s) in 0.05s
[ip-172-31-10-118.fayson.com:21000] > select * from test;
...
+----+----------+
| s1 | s2 |
+----+----------+
| 1 | tttttttt |
+----+----------+
Fetched 1 row(s) in 5.32s
[ip-172-31-10-118.fayson.com:21000] > select count(*) from test;
...
+----------+
| count(*) |
+----------+
| 1 |
+----------+
Fetched 1 row(s) in 0.14s
[ip-172-31-10-118.fayson.com:21000] > insert into test values('2', 'test2');
Query: insert into test values('2', 'test2')
Query submitted at: 2017-09-11 01:37:56 (Coordinator: http://ip-172-31-10-118.fayson.com:25000)
ERROR: AuthorizationException: User 'fayson' does not have privileges to execute 'INSERT' on: default.test
[ip-172-31-10-118.fayson.com:21000] >
2.使用user_w使用者測試
登入叢集任意節點命令列下切換到user_w使用者下
[[email protected] ~]# su user_w
[[email protected] root]$ impala-shell
在命令列執行命令impala-shell,進行如下操作
[[email protected] root]$ impala-shell
...
[Not connected] > connect ip-172-31-10-118.fayson.com:21000;
...
Query: show tables
+------+
| name |
+------+
| test |
+------+
Fetched 1 row(s) in 0.06s
[ip-172-31-10-118.fayson.com:21000] > select * from test;
Query: select * from test
Query submitted at: 2017-09-11 01:41:17 (Coordinator: http://ip-172-31-10-118.fayson.com:25000)
ERROR: AuthorizationException: User 'user_w' does not have privileges to execute 'SELECT' on: default.test
[ip-172-31-10-118.fayson.com:21000] > select count(*) from test;
Query: select count(*) from test
Query submitted at: 2017-09-11 01:41:23 (Coordinator: http://ip-172-31-10-118.fayson.com:25000)
ERROR: AuthorizationException: User 'user_w' does not have privileges to execute 'SELECT' on: default.test
[ip-172-31-10-118.fayson.com:21000] > insert into test values('2', 'impala insert');
Query: insert into test values('2', 'impala insert')
Query submitted at: 2017-09-11 01:41:48 (Coordinator: http://ip-172-31-10-118.fayson.com:25000)
Query progress can be monitored at: http://ip-172-31-10-118.fayson.com:25000/query_plan?query_id=bd4a433465037682:77a7c3c400000000
Modified 1 row(s) in 0.71s
[ip-172-31-10-118.fayson.com:21000] >
驗證總結:
Impala與Sentry整合後可以使用Sentry來進行許可權管理,擁有read角色的fayson使用者組只能對test表進行select和count操作不能插入資料,擁有write角色的user_w
使用者組只能對test表插入資料不能進行select和count操作。說明Sentry實現了Hive許可權與Impala的同步。
5.Sentry列許可權管理驗證
1.在叢集所有節點新增fayson_r使用者
[[email protected] cdh-shell-bak]# useradd fayson_r
[[email protected] cdh-shell-bak]# id fayson_r
uid=504(fayson_r) gid=504(fayson_r) groups=504(fayson_r)
[[email protected] cdh-shell-bak]#
2.使用beeline登入hive使用者
使用hive使用者建立columnread角色,併為角色授權test表s1列的讀許可權,將columnread角色授權給fayson_r使用者組。
[[email protected] cdh-shell-bak]# beeline
Beeline version 1.1.0-cdh5.12.1 by Apache Hive
beeline> !connect jdbc:hive2://localhost:10000
Enter username for jdbc:hive2://localhost:10000: hive
Enter password for jdbc:hive2://localhost:10000:
Connected to: Apache Hive (version 1.1.0-cdh5.12.1)
Driver: Hive JDBC (version 1.1.0-cdh5.12.1)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://localhost:10000> create role columnread;
...
INFO : OK
No rows affected (0.225 seconds)
0: jdbc:hive2://localhost:10000> grant select(s1) on table test to role columnread;
...
INFO : OK
No rows affected (0.095 seconds)
0: jdbc:hive2://localhost:10000> grant role columnread to group fayson_r;
...
INFO : OK
No rows affected (0.091 seconds)
0: jdbc:hive2://localhost:10000>
3.使用beeline登入fayson_r使用者測試
[[email protected] cdh-shell-bak]# beeline
Beeline version 1.1.0-cdh5.12.1 by Apache Hive
beeline> !connect jdbc:hive2://localhost:10000
scan complete in 2ms
Connecting to jdbc:hive2://localhost:10000
Enter username for jdbc:hive2://localhost:10000: fayson_r
Enter password for jdbc:hive2://localhost:10000:
Connected to: Apache Hive (version 1.1.0-cdh5.12.1)
Driver: Hive JDBC (version 1.1.0-cdh5.12.1)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://localhost:10000> show tables;
...
INFO : OK
+-----------+--+
| tab_name |
+-----------+--+
| test |
+-----------+--+
1 row selected (0.304 seconds)
0: jdbc:hive2://localhost:10000> select * from test;
Error: Error while compiling statement: FAILED: SemanticException No valid privileges
User fayson_r does not have privileges for QUERY
The required privileges: Server=server1->Db=default->Table=test->Column=s2->action=select; (state=42000,code=40000)
0: jdbc:hive2://localhost:10000> select s1 from test;
...
INFO : OK
+-------+--+
| s1 |
+-------+--+
| a |
| 1 |
| 111 |
| 333 |
| eeee |
+-------+--+
5 rows selected (0.197 seconds)
0: jdbc:hive2://localhost:10000> select s2 from test;
Error: Error while compiling statement: FAILED: SemanticException No valid privileges
User fayson_r does not have privileges for QUERY
The required privileges: Server=server1->Db=default->Table=test->Column=s2->action=select; (state=42000,code=40000)
0: jdbc:hive2://localhost:10000> select count(*) from test;
Error: Error while compiling statement: FAILED: SemanticException No valid privileges
User fayson_r does not have privileges for QUERY
The required privileges: Server=server1->Db=default->Table=test->action=select; (state=42000,code=40000)
0: jdbc:hive2://localhost:10000> select count(s1) from test;
...
INFO : OK
+------+--+
| _c0 |
+------+--+
| 5 |
+------+--+
1 row selected (23.855 seconds)
0: jdbc:hive2://localhost:10000>
4.瀏覽HDFS目錄
[[email protected] ~]$ hadoop fs -ls /user/hive/warehouse
ls: Permission denied: user=fayson_r, access=READ_EXECUTE, inode="/user/hive/warehouse":hive:hive:drwxrwx--x
[[email protected] ~]$ hadoop fs -ls /user/hive/warehouse/test
ls: Permission denied: user=fayson_r, access=READ_EXECUTE, inode="/user/hive/warehouse/test":hive:hive:drwxrwx--x
[[email protected] ~]$
5.使用admin使用者登入Hue,建立fayson_r使用者,然後使用fayson_r使用者登入
測試總結:
fayson_r使用者所屬使用者組為fayson_r,該組只擁有對test表s1列的讀許可權,因此在select和count的時候只能對s1列進行select和count,fayson_r使用者無許可權瀏覽/user/hive/warehouse下的所有目錄;使用hue只能對test表s1列進行select和count操作,無許可權瀏覽/user/hive/warehouse目錄及目錄下所有子目錄。
注意:Sentry只支援SELECT的列授權,不能用於INSERT和ALL的列授權。
6.備註
在使用beeline進行授權驗證時,只是輸入了username未做使用者資訊校驗。在未啟用認證服務的叢集下,該文件的Sentry配置方式只適用於測試環境,不能用於生產環境。
在叢集啟用Sentry服務後,由於Sentry不支援Hive CLI許可權管理,所以建議禁用Hive CLI。但在非安全環境下,不能通過hadoop.proxyuser.hive.groups來限制訪問使用者組。
7.Hive授權參考
- 角色建立和刪除
create role test;
drop role test;
- 角色授權和取消授權
表授權給角色
grant select on table test_table to role role_name;
revoke select on table test_table to role role_name;
列授權給角色
grant select(column1,column2) on table test_table to role role_name;
revoke select(column1,column2) on table test_table to role role_name;
- 組授權和取消授權
grant role role_name to group user_group;
revoke role role_name to group user_group;
注意:Sentry適用於使用者組授權,不適用與使用者授權;
8.常見問題
- 不能建立角色,異常如下
0: jdbc:hive2://localhost:10000> create role admin;
Error: Error whilecompiling statement: FAILED:InvalidConfigurationException hive.server2.authentication can't be none innon-testing mode (state=42000,code=40000)
0: jdbc:hive2://localhost:10000>
原因:由於叢集未啟用Kerberos,需要配置sentry.hive.testing.mode為true
解決方法:參考3.1的第3步配置。
醉酒鞭名馬,少年多浮誇! 嶺南浣溪沙,嘔吐酒肆下!摯友不肯放,資料玩的花!
溫馨提示:要看高清無碼套圖,請使用手機開啟並單擊圖片放大檢視。
推薦關注Hadoop實操,第一時間,分享更多Hadoop乾貨,歡迎轉發和分享。
原創文章,歡迎轉載,轉載請註明:轉載自微信公眾號Hadoop實操