1.安全之Kerberos安全認證
1 Kerberos概述
1.1 什么是Kerberos
Kerberos是一種計算機網絡授權協議,用來在非安全網絡中,對個人通信以安全的手段進行身份認證。這個詞又指麻省理工學院為這個協議開發的一套計算機軟件。軟件設計上采用客戶端/服務器結構,並且能夠進行相互認證,即客戶端和服務器端均可對對方進行身份認證。可以用於防止竊聽、防止重放攻擊、保護數據完整性等場合,是一種應用對稱密鑰體制進行密鑰管理的系統。
Kerberos不是k8s,Kubernetes簡稱k8s,是一個開源的,用於管理雲平台中多個主機上的容器化的應用,跟我們今天學的Kerberos是兩回事,大家切記一定不要搞混。
1.2 Kerberos概念
Kerberos中有以下一些概念需要了解:
1)KDC:密鑰分發中心,負責管理發放票據,記錄授權。
2)Realm:Kerberos管理領域的標識。
3)principal:當每添加一個用戶或服務的時候都需要向kdc添加一條principal,principl的形式為:主名稱/實例名@領域名。
4)主名稱:主名稱可以是用戶名或服務名,表示是用於提供各種網絡服務(如hdfs,yarn,hive)的主體。
5)實例名:實例名簡單理解為主機名。
關於 Kerberos 更多的原理講解可參考以下鏈接:
https://cloud.tencent.com/developer/article/1496451
1.3 Kerberos認證原理
2 Kerberos安裝
2.1 server節點安裝kerberos相關軟件
[root@node02 ~]#
yum install -y krb5-server krb5-workstation krb5-libs
#查看結果
[root@node02 ~]#
rpm -qa | grep krb5
krb5-workstation-1.10.3-65.el6.x86_64
krb5-libs-1.10.3-65.el6.x86_64
krb5-server-1.10.3-65.el6.x86_64
2.2 client節點安裝
[root@node01 ~]#
yum install -y krb5-workstation krb5-libs
[root@node03 ~]#
yum install -y krb5-workstation krb5-libs
#查看結果
[root@node01 ~]#
rpm -qa | grep krb5
krb5-workstation-1.10.3-65.el6.x86_64
krb5-libs-1.10.3-65.el6.x86_64
2.3 配置kerberos
需要配置的文件有兩個為kdc.conf和krb5.conf , kdc配置只是需要Server服務節點配置,即node02.
1) kdc配置
[root@node02 ~]#
vim /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
kdc_ports = 88 kdc_tcp_ports = 88 [realms] HADOOP.COM = { #master_key_type = aes256-cts acl_file = /var/kerberos/krb5kdc/kadm5.acl dict_file = /usr/share/dict/words admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab max_life = 1d max_renewable_life = 7d supported_enctypes = aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal }
說明:
HADOOP.COM:realm名稱,Kerberos支持多個realm,一般全用大寫。
acl_file:admin的用戶權。
admin_keytab:KDC進行校驗的keytab。
supported_enctypes:支持的校驗方式,注意把aes256-cts去掉,JAVA使用aes256-cts驗證方式需要安裝額外的jar包,所有這里不用。
2) krb5文件配置
[root@node02 ~]#
vim /etc/krb5.conf
includedir /etc/krb5.conf.d/
[logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] dns_lookup_realm = false ticket_lifetime = 24h renew_lifetime = 7d forwardable = true rdns = false pkinit_anchors = /etc/pki/tls/certs/ca-bundle.crt default_realm = HADOOP.COM #default_ccache_name = KEYRING:persistent:%{uid} udp_preference_limit = 1 [realms] HADOOP.COM = { kdc = node02 admin_server = node02 } [domain_realm] # .example.com = EXAMPLE.COM # example.com = EXAMPLE.COM
說明:
default_realm:默認的realm,設置 Kerberos 應用程序的默認領域,必須跟要配置的realm的名稱一致。
ticket_lifetime:表明憑證生效的時限,一般為24小時。
renew_lifetime : 表明憑證最長可以被延期的時限,一般為一個禮拜。當憑證過期之后,對安全認證的服務的后續訪問則會失敗。
udp_preference_limit= 1:禁止使用 udp,可以防止一個 Hadoop 中的錯誤。
realms:配置使用的 realm,如果有多個領域,只需向 [realms] 節添加其他的語句。
domain_realm:集群域名與Kerberos realm的映射關系,單個realm的情況下,可忽略。
3)同步krb5到Client節點
[root@node02 ~]#
xsync /etc/krb5.conf
2.4 生成Kerberos數據庫
在server節點執行
[root@node02 ~]# kdb5_util create -s Loading random data Initializing database '/var/kerberos/krb5kdc/principal' for realm 'HADOOP.COM', master key name 'K/M@HADOOP.COM' You will be prompted for the database Master Password. It is important that you NOT FORGET this password. Enter KDC database master key: (輸入密碼) Re-enter KDC database master key to verify:(確認密碼)
創建完成后/var/kerberos/krb5kdc目錄下會生成對應的文件
[root@node02 ~]# ls /var/kerberos/krb5kdc/ kadm5.acl kdc.conf principal principal.kadm5 principal.kadm5.lock principal.ok
2.5 賦予Kerberos管理員所有權限
[root@node02 ~]#
vim /var/kerberos/krb5kdc/kadm5.acl
#修改為以下內容: */admin@HADOOP.COM *
說明:
*/admin:admin實例的全部主體
@HADOOP.COM:realm
*:全部權限
這個授權的意思:就是授予admin實例的全部主體對應HADOOP.COM領域的全部權限。也就是創建Kerberos主體的時候如果實例為admin,就具有HADOOP.COM領域的全部權限,比如創建如下的主體user1/admin就擁有全部的HADOOP.COM領域的權限。
2.6 啟動Kerberos服務
啟動krb5kdc
[root@node02 ~]# systemctl start krb5kdc 正在啟動 Kerberos 5 KDC: [確定] #啟動kadmin [root@node02 ~]# systemctl start kadmin 正在啟動 Kerberos 5 Admin Server: [確定] #設置開機自啟 [root@node02 ~]# systemctl enable krb5kdc #查看是否設置為開機自啟 [root@node02 ~]# systemctl is-enabled krb5kdc [root@node02 ~]# systemctl enable kadmin #查看是否設置為開機自啟 [root@node02 ~]# systemctl is-enabled kadmin
注意:啟動失敗時可以通過/var/log/krb5kdc.log和/var/log/kadmind.log來查看。
2.7 創建管理員主體/實例
root@node02 ~]# kadmin.local -q "addprinc admin/admin" Authenticating as principal root/admin@HADOOP.COM with password. WARNING: no policy specified for admin/admin@HADOOP.COM; defaulting to no policy Enter password for principal "admin/admin@HADOOP.COM": (輸入密碼) Re-enter password for principal "admin/admin@HADOOP.COM": (確認密碼) Principal "admin/admin@HADOOP.COM" created.
2.8 kinit管理員驗證
[root@node02 ~]# kinit admin/admin Password for admin/admin@HADOOP.COM: (輸入密碼) [root@node02 ~]# klist Ticket cache: FILE:/tmp/krb5cc_0 Default principal: admin/admin@HADOOP.COM Valid starting Expires Service principal 08/27/19 14:41:39 08/28/19 14:41:39 krbtgt/HADOOP.COM@HADOOP.COM renew until 08/27/19 14:41:39
出現以上紅色admin/admin@HADOOP.COM說明沒問題
在其他機器嘗試:
[root@node02 ~]# kinit admin/admin Password for admin/admin@HADOOP.COM: (輸入密碼)
[root@node02 ~]# klist Ticket cache: FILE:/tmp/krb5cc_0 Default principal: admin/admin@HADOOP.COM Valid starting Expires Service principal 08/27/19 14:41:39 08/28/19 14:41:39 krbtgt/HADOOP.COM@HADOOP.COM renew until 08/27/19 14:41:39
如果出現:kadmin: GSS-API (or Kerberos) error while initializing kadmin interface,則重啟ntp服務:
[root@node02 ~]# service ntpd restart 關閉 ntpd: [確定] 正在啟動 ntpd:
3 Kerberos數據庫操作
3.1 登錄Kerberos數據庫
1)本地登錄(無需認證)
[root@node02 ~]# kadmin.local
Authenticating as principal root/admin@HADOOP.COM with password. kadmin.local:
2)遠程登錄(需進行主體認證,先認證剛剛創建的管理員主體)
[root@hadoop103 ~]# kadmin
Authenticating as principal admin/admin@HADOOP.COM with password. Password for admin/admin@HADOOP.COM: kadmin:
退出輸入:exit
3.2 創建Kerberos主體
[root@node02 ~]# kadmin.local -q "addprinc aaa/aaa"
Authenticating as principal root/admin@HADOOP.COM with password.
WARNING: no policy specified for aaa/aaa@HADOOP.COM; defaulting to no policy Enter password for principal "aaa/aaa@HADOOP.COM": (輸入密碼) Re-enter password for principal "aaa/aaa@HADOOP.COM": (輸入密碼) Principal "admin/admin@HADOOP.COM" created.
3.3 修改主體密碼
[root@node02 ~]# kadmin.local -q "cpw aaa/aaa" Authenticating as principal root/admin@HADOOP.COM with password. Enter password for principal "aaa/aaa@HADOOP.COM": (輸入密碼) Re-enter password for principal "aaa/aaa@HADOOP.COM": (輸入密碼) Password for "aaa/aaa@HADOOP.COM" changed.
3.4 查看所有主體
[root@node02 ~]# kadmin.local -q "list_principals"
Authenticating as principal root/admin@HADOOP.COM with password. K/M@HADOOP.COM [admin/admin@HADOOP.COM](mailto:admin/admin@HADOOP.COM) aaa/aaa@HADOOP.COM kadmin/admin@HADOOP.COM kadmin/changepw@HADOOP.COM kadmin/hadoop105@HADOOP.COM kiprop/hadoop105@HADOOP.COM krbtgt/HADOOP.COM@HADOOP.COM
4 Kerberos主體認證
Kerberos提供了兩種認證方式,一種是通過輸入密碼認證,另一種是通過keytab密鑰文件認證,但兩種方式不可同時使用。
4.1 密碼認證
1)使用kinit進行主體認證
[root@node02 ~]#
kinit aaa/aaa
Password for admin/admin@HADOOP.COM:
2)查看認證憑證
[root@node02 ~]# klist
Ticket cache: FILE:/tmp/krb5cc_0 Default principal: aaa/aaa@HADOOP.COM Valid starting Expires Service principal 10/27/2019 18:23:57 10/28/2019 18:23:57 krbtgt/HADOOP.COM@HADOOP.COM renew until 11/03/2019 18:23:57
4.2 keytab密鑰文件認證
1)生成主體admin/admin的keytab文件到指定目錄/root/admin.keytab
[root@node02 ~]# kadmin.local -q "xst -k /root/aaa.keytab aaa/aaa@HADOOP.COM"
2)使用keytab進行認證
[root@node02 ~]# kinit -kt /root/aaa.keytab aaa/aaa
3)查看認證憑證
[root@node02 ~]# klist
Ticket cache: FILE:/tmp/krb5cc_0 Default principal: aaa/aaa@HADOOP.COM Valid starting Expires Service principal 08/27/19 15:41:28 08/28/19 15:41:28 krbtgt/HADOOP.COM@HADOOP.COM renew until 08/27/19 15:41:28
4.3 銷毀憑證
[root@node02 ~]# kdestroy
[root@node02 ~]# klist klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_0)
5 CDH啟用Kerberos安全認證
5.1 為CM創建管理員主體/實例
[root@node02 ~]# kadmin.local -q "addprinc cloudera-scm/admin"
Authenticating as principal root/admin@HADOOP.COM with password.
WARNING: no policy specified for cloudera-scm/admin @HADOOP.COM; defaulting to no policy Enter password for principal " cloudera-scm/admin @HADOOP.COM": (輸入密碼) Re-enter password for principal " cloudera-scm/admin @HADOOP.COM": (確認密碼) Principal " cloudera-scm/admin @HADOOP.COM" created.
5.2 啟用Kerberos
5.3 環境確認(勾選全部)
5.4 填寫配置
Kerberos 加密類型:aes128-cts、des3-hmac-sha1、arcfour-hmac
5.5 繼續
5.6 填寫主體名和密碼
5.7 等待導入KDC
5.8 准備重啟集群
5.9 等待完成
5.10 查看主體
[root@node02 ~]# kadmin.local -q "list_principals" Authenticating as principal cloudera-scm/admin@HADOOP.COM with password. HTTP/node02@HADOOP.COM HTTP/hadoop103@HADOOP.COM HTTP/hadoop104@HADOOP.COM K/M@HADOOP.COM admin/admin@HADOOP.COM aaa@HADOOP.COM cloudera-scm/admin@HADOOP.COM hdfs/node02@HADOOP.COM hdfs/hadoop103@HADOOP.COM hdfs/hadoop104@HADOOP.COM hive/node02@HADOOP.COM hue/node02@HADOOP.COM kadmin/admin@HADOOP.COM kadmin/changepw@HADOOP.COM kadmin/node02@HADOOP.COM krbtgt/HADOOP.COM@HADOOP.COM mapred/node02@HADOOP.COM oozie/node02@HADOOP.COM sentry/node02@HADOOP.COM yarn/node02@HADOOP.COM yarn/hadoop103@HADOOP.COM yarn/hadoop104@HADOOP.COM zookeeper/node02@HADOOP.COM zookeeper/hadoop103@HADOOP.COM zookeeper/hadoop104@HADOOP.COM
6 Kerberos安全環境實操
在啟用Kerberos之后,系統與系統(flume-kafka)之間的通訊,以及用戶與系統(user-hdfs)之間的通訊都需要先進行安全認證,認證通過之后方可進行通訊。
故在啟用Kerberos后,數倉中使用的腳本等,均需要加入一步安全認證的操作,才能正常工作。
6.1 用戶訪問服務認證
開啟Kerberos安全認證之后,日常的訪問服務(例如訪問HDFS,消費Kafka topic等)都需要先進行安全認證
1)在Kerberos數據庫中創建用戶主體/實例
[root@node02 ~]# kadmin.local -q "addprinc hive/hive@HADOOP.COM"
2)進行用戶認證
[root@node02 ~]# kinit hive/hive@HADOOP.COM
3)訪問HDFS
[root@node02 ~]# hadoop fs -ls /
Found 4 items drwxr-xr-x - hive hive 0 2019-10-02 01:29 /origin_data drwxrwxrwt - hdfs supergroup 0 2019-10-03 00:20 /tmp drwxr-xr-x - hdfs supergroup 0 2019-10-02 01:35 /user drwxr-xr-x - hive hive 0 2019-10-02 01:38 /warehouse
4)hive查詢
[root@node02 ~]# hive
WARNING: Use "yarn jar" to launch YARN applications. Logging initialized using configuration in jar:file:/opt/cloudera/parcels/CDH-6.2.1-1.cdh6.2.1.p0.1425774/jars/hive-common-2.1.1-cdh6.2.1.jar!/hive-log4j2.properties Async: false WARNING: Hive CLI is deprecated and migration to Beeline is recommended. hive>
5)HDFS WebUI瀏覽器認證
我們設置CDH支持kerberos后會出現下圖所示的情況:
可以登錄9870,但是不能查看目錄及文件,這是由於我們本地環境沒有通過認證。
接下來我們設置本地驗證。
注意:由於瀏覽器限制問題,我們這里使用火狐瀏覽器,其他如:谷歌,ie等均會出現問題。
(1) 下載火狐
(2)設置瀏覽器
1 打開火狐瀏覽器,在地址欄輸入:about:config,進入設置頁面。
2 搜索“network.negotiate-auth.trusted-uris”,修改值為自己的服務器主機名。
3搜索“network.auth.use-sspi”,雙擊將值變為false。
(3)安裝kfw
1安裝提供的kfw-4.1-amd64.msi。
2將集群的/etc/krb5.conf文件的內容復制到C:\ProgramData\MIT\Kerberos5\krb.ini中,刪除和路徑相關的配置。
[logging] [libdefaults] default_realm = HADOOP.COM dns_lookup_realm = false dns_lookup_kdc = false ticket_lifetime = 24h renew_lifetime = 7d forwardable = true udp_preference_limit = 1 [realms] HADOOP.COM = { kdc = node02 admin_server = node02 } [domain_realm]
3打開MIT,輸入主體名和密碼:
4)測試
6.2 數倉腳本更改
(1)生成hive用戶的keytab文件
用戶認證的方式有“輸入密碼”和“使用keytab密鑰文件”兩種方式,此處需使用keytab密鑰文件進行認證。
[root@node02 hive]# kadmin.local -q “xst -k /var/lib/hive/hive.keytab hive/hive@HADOOP.COM”
(2)增加讀權限
chmod +r /var/lib/hive/hive.keytab
(3)分發keytab文件
xsync /var/lib/hive/hive.keytab
(4)sqoop_import.sh
#!/bin/bash kinit -kt /var/lib/hive/hive.keytab hive/hive # 如果是輸入的日期按照取輸入日期;如果沒輸入日期取當前時間的前一天 if [ -n "$2" ] ;then do_date=$2 else do_date=`date -d "-1 day" +%F` fi echo "===日志日期為 $do_date===" import_ec_data_daily() { sqoop import \ --connect jdbc:mysql://10.73.129.169:3306/ecdata \ --username admin_user \ --password Tcladmin#20170104 \ --hive-drop-import-delims \ --target-dir /origin_data/db_mall/$1/$do_date \ --delete-target-dir \ --null-string '\\N' \ --null-non-string '\\N' \ --compress \ --compression-codec lzop \ --num-mappers 1 \ --fields-terminated-by "\001" \ --query "$2" } import_base_bottom_shop(){ import_ec_data_daily "ods_sale_base_bottom_shop_daily" "select * from base_bottom_shop where 1=1 and \$CONDITIONS" } case $1 in "import_base_bottom_shop") import_base_bottom_shop ;; "all") import_base_bottom_shop ;; esac
(5)load_ods.sh
#!/bin/bash # 定義變量方便修改 APP=db_mall table11=ods_sale_base_bottom_shop_daily # 如果是輸入的日期按照取輸入日期;如果沒輸入日期取當前時間的前一天 if [ -n "$1" ] ;then do_date=$1 else do_date=`date -d "-1 day" +%F` fi echo ================== 日志日期為 $do_date ================== sql=" load data inpath '/origin_data/$APP/$table11/$do_date' OVERWRITE into table "$APP".$table11 partition(dt='$do_date'); " beeline -u " jdbc:hive2://node02:10000/;principal=hive/node02@HADOOP.COM" -n hive -e "$sql"
6.3問題總結
1.kinit認證時密碼輸入正確卻提示密碼錯誤
[root@node02 ~]# kinit aaa
Password for aaa@HADOOP.COM: kinit: Password incorrect while getting initial credentials
這是因為aaa已經生成了keytab,所以此時通過這種方式不能認證,需要通過keytab文件來認證,或者修改密碼后再認證(修改密碼后之前的keytab文件會失效)。
[root@node02 ~]# kinit -kt /root/aaa.keytab aaa [root@node02 ~]# klist
Ticket cache: FILE:/tmp/krb5cc_0 Default principal: aaa@HADOOP.COM Password for aaa@HADOOP.COM: kinit: Password incorrect while getting initial credentials
2.Kerberos啟動后台日志提示異常:No such file or directory - while initializing database for realm HADOOP.COM
在/var/log/krb5kdc.log中發現No such file or directory - while initializing database for realm HADOOP.COM。
解決方法:
1)檢查kdc.conf和krb5.conf文件是否配置正確,修改配置,注意:配置文件的[kdcdefaults],[logging]、[libdefaults]等的里面不能有空格
2)停止服務
service krb5kdc stop
service kadmin stop
3)刪除Kerberos數據庫重新創建數據庫
rm -rf /var/kerberos/krb5kdc/principal
kdb5_util create -s -r HADOOP.COM
4)創建管理員
kadmin.local -q “addprinc admin/admin”
5)啟動服務
service krb5kdc start
service kadmin start
3 kinit通過keytab認證出現異常
通過Linux的aaa主體執行kinit -kt /root/aaa.keytab aaa出現下面情況:
kinit: ???? while getting initial credentials 或者 kinit: Permission denied while getting initial credentials
解決方式:
1)使用root用戶修改aaa.keytab的所屬用戶:
chown aaa /root/aaa.keytab
- 修改aaa.keytab的權限為660
chmod 660 /root/aaa.keytab
2. 安全之Sentry權限管理
1 Sentry概述
cdh版本的hadoop在對數據安全上的處理通常采用Kerberos+Sentry的結構。
kerberos主要負責平台用戶的用戶認證,sentry則負責數據的權限管理。
1.1 Sentry是什么
Apache Sentry是Cloudera公司發布的一個Hadoop開源組件,它提供了細粒度級、基於角色的授權以及多租戶的管理模式。
Sentry提供了對Hadoop集群上經過身份驗證的用戶和應用程序的數據控制和強制執行精確級別權限的功能。Sentry目前可以與Apache Hive,Hive Metastore / HCatalog,Apache Solr,Impala和HDFS(僅限於Hive表數據)一起使用。
Sentry旨在成為Hadoop組件的可插拔授權引擎。它允許自定義授權規則以驗證用戶或應用程序對Hadoop資源的訪問請求。Sentry是高度模塊化的,可以支持Hadoop中各種數據模型的授權。
1.2 Sentry中的角色
2.Sentry安裝部署
2.1 添加Sentry服務
2.2 自定義Sentry角色分配
2.3 配置數據庫連接
2.4 成功完成Sentry的服務添加
3 Sentry與Hive/Impala集成
3.1 修改配置參數
(1)取消HiveServer2用戶模擬
在hive配置項中搜索“HiveServer2 啟用模擬”,取消勾選
(2)確保hive用戶能夠提交MR任務
在yarn配置項中搜索“允許的系統用戶”,確保包含“hive”。
3.2 配置Hive使用Sentry
(1)在Hive配置項中搜索“啟用數據庫中的存儲通知”,勾選。
(2)在Hive配置項中搜索“Sentry”,勾選Sentry
3.3 配置Impala使用Sentry
在Impala配置項中搜索“Sentry”,勾選。
3.4 配置HDFS權限與Sentry同步
1)在HDFS配置項中搜索“啟用訪問控制列表”,勾選。
(2)在HDFS配置項中搜索“啟用 Sentry 同步”,做出下圖修改。
4 Sentry授權實戰
使用Sentry進行授權管理,需要使用Sentry的管理員用戶對其他用戶進行授權,授權的方式有兩種,一是通過HUE進行可視化操作,一是使用HIVE中的授權語句進行操作。
4.1 Sentry實戰之HUE
1)配置HUE支持Sentry
在HUE配置項中搜索“Sentry”,勾選Sentry。
2)查看Sentry權限管理中的管理員組。
在Sentry的配置項中搜索“管理員組”,其中包括hive、impala,只有當某用戶所屬組位於其中時,才可為其他用戶授予權限。
3)在Hive集群所有節點創建兩個用戶reader,writer,為權限測試做准備。必須集群每個節點都創建該用戶
[root@hadoop102 ~]# useradd reader [root@hadoop102 ~]# passwd reader [root@hadoop102 ~]# useradd writer [root@hadoop102 ~]# passwd writer [root@hadoop101 ~]# useradd reader [root@hadoop101 ~]# passwd reader [root@hadoop101~]# useradd writer [root@hadoop101~]# passwd writer
4)使用hive用戶登錄HUE,創建兩個用戶組reader、writer,並在兩個用戶組下創建兩個用戶reader、writer,為權限測試做准備。
5)Sentry工作界面(需要授予HUE用戶訪問Sentry的權限)
6)點擊Roles按鈕,並點擊添加按鈕
7)編輯Role
admin_role(首先為hive用戶添加所有權限)
reader_role
writer_role
7)權限測試
(1)分別使用reader和writer用戶登錄HUE
(2)查詢gmall數據庫中的任意一張表,發現只有reader用戶可查出,而writer則不能。說明權限控制生效。
reader用戶
writer用戶
4.2 Sentry實戰之命令行
1)在Hive集群所有節點創建兩個用戶reader_cmd,writer_cmd
[root@hadoop102 ~]# useradd reader_cmd [root@hadoop102 ~]# passwd reader_cmd [root@hadoop102 ~]# useradd writer_cmd [root@hadoop102 ~]# passwd writer_cmd [root@hadoop101 ~]# useradd reader_cmd [root@hadoop101 ~]# passwd reader_cmd [root@hadoop101 ~]# useradd writer_cmd [root@hadoop101 ~]# passwd writer_cmd
2)使用Sentry管理員用戶hive通過beeline客戶端連接HiveServer2
[root@hadoop102 ~]# kinit -kt /var/lib/hive/hive.keytab hive/hive@HADOOP.COM
[root@hadoop102 ~]# beeline -u "jdbc:hive2://node01:10000/;principal=hive/node01@HADOOP.COM"
1)創建Role(reader_role_cmd,writer_role_cmd)
create role reader_role_cmd; create role writer_role_cmd;
2)為role賦予privilege
GRANT select ON DATABASE db_mall TO ROLE reader_role_cmd; GRANT insert ON DATABASE db_mall TO ROLE writer_role_cmd;
3)將role授予用戶組
GRANT ROLE reader_role_cmd TO GROUP reader_cmd; GRANT ROLE writer_role_cmd TO GROUP writer_cmd;
4)查看權限授予情況
(1)查看所有role(管理員)
SHOW ROLES;
(2)查看指定用戶組的role(管理員)
SHOW ROLE GRANT GROUP reader_cmd;
(3)查看當前認證用戶的role
SHOW CURRENT ROLES;
(4)查看指定ROLE的具體權限(管理員)
SHOW GRANT ROLE reader_role_cmd;
5)權限測試
(1)為reader_cmd、writer_cmd創建Kerberos主體
[root@hadoop102 ~]# kadmin.local -q "addprinc reader_cmd/reader_cmd@HADOOP.COM"
[root@hadoop102 ~]#
kadmin.local -q "addprinc writer_cmd/writer_cmd@HADOOP.COM"
(2)使用reader_cmd登錄HiveServer2,查詢gmall庫下的任意一張表
[root@hadoop102 ~]# kinit reader_cmd/reader_cmd@HADOOP.COM
[root@hadoop102 ~]# beeline -u "jdbc:hive2://node01:10000/;principal=hive/ node01@HADOOP.COM"
(3)使用writer_cmd登錄HiveServer2,查詢gmall庫下的任意一張表
[root@hadoop102 ~]# kinit writer_cmd/writer_cmd@HADOOP.COM
[root@hadoop102 ~]# beeline -u "jdbc:hive2://node01:10000/;principal=hive/ node01@HADOOP.COM"
(4)查詢結果
reader_cmd有對於gmall表的查詢權限,而writer_cmd沒有。說明授權生效。
5.Sentry與Kafka的集成
(1)修改Kafka配置
1在Kafka的配置項搜索“security.inter.broker.protocol”,設置為SALS_PLAINTEXT。
2在Kafka的配置項搜索“ssl.client.auth”,設置為none。
3在Kafka的配置項搜索“Kerberos”
4 啟用Kafka的Sentry,通過Cloudera Manager修改Kafka服務的配置
(2)創建jaas.conf文件
[root@hadoop102 hive]#
vim /var/lib/hive/jaas.conf
文件內容如下
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true; };
(3)創建consumer.properties文件
[root@hadoop102 conf]# vim /etc/kafka/conf/client.properties
文件內容如下
security.protocol=SASL_PLAINTEXT
sasl.kerberos.service.name=kafka
(4)創建kafka管理員用戶
為了后面操作方便,我們這里還創建一個kafka的principle,當然你也可以到/var/run/cloudera-scm-agent/process目錄下去拿kafka用戶的principle。
[root@cdh01 shell]# kadmin.local
Authenticating as principal root/admin@FAYSON.COM with password.
kadmin.local: addprinc kafka/admin
WARNING: no policy specified for kafka/admin@FAYSON.COM; defaulting to no policy Enter password for principal "kafka/admin@FAYSON.COM": Re-enter password for principal "kafka/admin@FAYSON.COM": Principal "kafka/admin@FAYSON.COM" created. kadmin.local:
(5)聲明jass.conf文件路徑(臨時用,后續可以加入到配置文件中)
[root@hadoop102 conf]# export KAFKA_OPTS="-Djava.security.auth.login.config=/var/lib/hive/jaas.conf"
或者
vim /etc/profile
source /etc/profile
6.Kafka的賦權測試
1.消費者命令
kafka-console-producer --broker-list node02:9092 --topic first --producer.config /etc/kafka/conf/consumer.properties
2.生產者命令
kafka-console-consumer --bootstrap-server node02:9092 --topic first --from-beginning --consumer.config /etc/kafka/conf/consumer.properties
3.創建管理員用戶
我們給hive用戶組賦權可以寫入數據到first,注意需要使用管理員kafka用戶登錄Kerberos才能進行操作
[root@cdh01 kafka]# kinit kafka/admin
Password for kafka/admin@FAYSON.COM: [root@cdh01 kafka]# klist Ticket cache: FILE:/tmp/krb5cc_0 Default principal: kafka/admin@FAYSON.COM Valid starting Expires Service principal 06/13/2018 00:41:45 06/14/2018 00:41:45 krbtgt/FAYSON.COM@FAYSON.COM renew until 06/20/2018 00:41:45
4.創建角色kafka_role
[root@cdh01 kafka]# kafka-sentry -cr -r kafka_role
5.列出Sentry中的角色
[root@cdh01 kafka]# kafka-sentry -lr
6.使用hive用戶啟動produce程序
1.給kafka_role角色賦權可以給first寫入權限
[root@cdh01 kafka]# kafka-sentry -gpr -r kafka_role -p "Topic=first->action=write"
2.給kafka_role角色賦權可以給testTopic的describe權限
在給Topic賦權read或者write權限時,務必同時帶上describe權限,否則權限不生效。當然你也可以將權限設置為ALL
[root@cdh01 kafka]# kafka-sentry -gpr -r kafka_role -p "Topic=testTopic->action=describe"
3.把kafka_role加入到用戶組kafka中
[root@cdh01 kafka]# kafka-sentry -arg -r kafka_role -g kafka
4.再次使用hive用戶登錄Kerberos,啟用producer程序
執行成功,說明賦權寫入權限成功。
7.使用fayson用戶啟動consumer程序
1.給kafka_role角色賦權consumer相關的權限
kafka-sentry -gpr -r kafka_role -p "CONSUMERGROUP=testgroup->action=read" kafka-sentry -gpr -r kafka_role -p "CONSUMERGROUP=testgroup->action=describe" kafka-sentry -gpr -r kafka_role -p "Topic=testTopic->action=read"
2.再次使用fayson用戶登錄Kerberos后啟動producer和consumer
kafka-console-producer --broker-list cdh02.fayson.com:9092,cdh03.fayson.com:9092,cdh04.fayson.com:9092 --topic testTopic --producer.config client.properties
消費成功,表明賦權消費者相關權限以后,消費成功。
7.總結
1.通過Sentry可以對Kafka的topic進行權限管理,主要是往topic寫入數據以及讀取topic的數據。
2.在給Topic賦權read或者write權限時,務必同時帶上describe權限,否則權限不生效。當然你也可以將權限設置為ALL。
3.一旦對Kafka啟用Sentry授權以后,kafka用戶就是管理員,一切管理員操作都需要使用kafka用戶來操作,這個與我們在Hive/Impala中使用Sentry時,hive用戶是管理員原理是一樣的,Fayson之前介紹Solr的Sentry賦權時,solr用戶就是默認管理員,也是一樣。
4.目前Kafka的授權,對於create和delete topic還不完善,需要等待后續版本。
5.Hue使用Sentry進行權限管理之后, 要求登錄Hue的用戶及其組需要在Sentry Server節點(以正式環境為例, 即gs01節點)Linux系統中存在對應的用戶和組, 否則無法進行權限控制.