大数据安全浅析

2018 年 2 月 9 日 计算机与网络安全 cs312779641

信息安全公益宣传,信息安全知识启蒙。

加微信群回复公众号:微信群QQ群16004488

加微信群或QQ群可免费索取:学习教程

教程列表见微信公众号底部菜单



adoop安全目录:

kerberos(已发布)

elasticsearch

knox

oozie

ranger

apache sentry


一、大数据基本组件


二、Hadoop安全背景


  • 共享集群

  • 按照业务或应用的规则划分资源队列,并分配给特定用户

  • HDFS上存放各种数据,包括公共的、机密的

  • 安全认证:确保某个用户是自己声称的那个用户

  • 安全授权:确保某个用户只能做他允许的那些操作


三、设备说明


服务

IP

主机名

系统

Ambari

Kerberos

192.168.2.140

hdp140

CentOS 7.3

namenode

192.168.2.141

hdp141

CentOS 7.3

datanode

192.168.2.142

hdp142

CentOS 7.3

datanode

192.168.2.143

hdp143

CentOS 7.3


四、kerberos基本概念:


  • Principal(安全个体):被认证的个体,有一个名字和口令

  • KDC(key distribution center ) : 是一个网络服务,提供ticket 和临时会话密钥

  • Ticket:一个票据,客户用它来向服务器证明自己的身份,包括客户标识、会话密钥、时间戳。

  • AS (Authentication Server): 认证服务器

  • TGS(Ticket Granting Server): 许可证服务器

  • TGT:Ticket-granting Ticket

五、kerberos认证过程:



六、集群启用Kerberos认证


安装KDC Server

1、安装一个新的KDC Server(任意一个集群主机,这里hdp141为例)


1

# yum install krb5-server krb5-libs krb5-workstation


2、打开KDC Server的配置文件

# vi /etc/krb5.conf

修改文件中的[realms]部分,将为属性kdc和admin_server设置的默认值“kerberos.example.com”替换成实际KDC server的主机名。在下面的例子中,“kerberos.example.com”被替换成了 “my.kdc.server”。

1
2
3
4
5
[realms]
EXAMPLE.COM = {
kdc = my.kdc.server
admin_server = my.kdc.server
}

3、(可选)自定义realms配置(EXAMPLE.COM修改为CESHI.COM,下面例子都为CESHI.COM)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# vi /etc/krb5.conf
[logging]
  default = FILE: /var/log/krb5libs .log
  kdc = FILE: /var/log/krb5kdc .log
  admin_server = FILE: /var/log/kadmind .log
  
[libdefaults]
  default_realm = CESHI.COM
  dns_lookup_realm =  false
  dns_lookup_kdc =  false
  ticket_lifetime = 24h
  renew_lifetime = 7d
  forwardable =  true
  
[realms]
  CESHI.COM = {
   kdc = hdp141
   admin_server = hdp141
  }
  
[domain_realm]
  .vrv.com = CESHI.COM
  vrv.com = CESHI.COM
# vi /var/kerberos/krb5kdc/kdc.conf
[kdcdefaults]
  kdc_ports = 88
  kdc_tcp_ports = 88
  
[realms]
CESHI.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
   supported_enctypes = aes256-cts:normal 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
  }

4、创建Kerberos数据库

创建过程中需要输入master key。

1
2
3
4
5
6
7
8
# kdb5_util create -s
Loading random data
Initializing database  '/var/kerberos/krb5kdc/principal'  for  realm  'CESHI.COM' ,
master key name  'K/M@CESHI.COM'
You will be prompted  for  the database Master Password.
It  is  important that you NOT FORGET this password.
Enter KDC database master key: ceshi123456.
Re - enter KDC database master key to verify: ceshi123456.

5、启动KDC

1
2
3
4
# service krb5kdc start
# chkconfig krb5kdc on
# service kadmin start
# chkconfig kadmin on

6、创建kerberos Admin

 通过创建一个admin principal创建KDC admin,需要输入principal的密码。

1
2
3
4
5
6
7
# kadmin.local -q "addprinc admin/admin"
Authenticating as principal root /admin @CESHI.COM.COM with password.
WARNING: no policy specified  for  admin /admin @CESHI.COM.COM; defaulting to no policy
Enter password  for  principal  "admin/admin@CESHI.COM.COM" : ceshi123456.
Re-enter password  for  principal  "admin/admin@CESHI.COM.COM" : ceshi123456.
Principal  "admin/admin@CESHI.COM"  created.
"admin/admin@CESHI.COM" :ceshi123456.

打开KDC ACL文件,确认admin principal在KDC ACL中拥有权限,若没有对应的域则需要添加。

1
2
# vi /var/kerberos/krb5kdc/kadm5.acl
* /admin @VRV.COM *

如果修改了文件kadm5.acl,那么你就必须重启kadmin进程

1
# service kadmin restart

7、启用Kerberos保护

安装JCE

必须用官网下载的JCE覆盖本地已有的JCE,否则将缺少供Kerberos使用的加密方式

在Ambari server所在的主机和集群中的所有主机上,根据使用的JDK版本选择合适的JCE策略文件。

• Oracle JDK 1.7:

http://www.oracle.com/technetwork/java/javase/downloads/jce-7-

download-432124.html

• Oracle JDK 1.8:

http://www.oracle.com/technetwork/java/javase/downloads/jce8-

download-2133166.html

 在Ambari Server所在主机和集群中的所有主机上,添加unlimited security policy JCE jars

到目录$AMBARI_SERVER_JAVA_HOME/jre/lib/security/下。

注意:在所有的主机上,JCE相关的包都必须解压到配置文件/etc/ambari-server/conf/ambari.properties中属性java.home所指定的JDK目录下

1
2
# JAVA_HOME=/usr/java/default
# unzip -o -j -q UnlimitedJCEPolicyJDK8.zip -d $JAVA_HOME/jre/lib/security/

重启Ambari Server(ambari server服务器hdp140)

1

# service ambari-server restart


8、运行Kerberos保护向导

(1) 确认KDC已经安全和正确配置,并且已经在集群的所有主机上配置好JCE。

(2)登录Ambari Web,打开管理员 > Kerberos

(3)点击启用Kerberos,启用安装向导,选择条件检查

(4)提供关于KDC和管理员账号的信息

KDC相关信息请参考配置文件/etc/krb5.conf

(5)ambari会在集群的主机上安装Kerberos客户端,然后通过测试是否能创建principal,生成keytab和分配Keytab来测试是否能连接KDC

自定义Hadoop使用的Kerberos identities

(6)确认你的配置。你可以通过页面下载自动创建的包含principalsKeytabsCSV文件。

(7)停止服务

(8)启用kerberos

Keytabs保存在主机的/etc/security/keytabs目录下。

(9)启动和测试服务

启动和测试服务成功后点击完成以结束Kerberos的启用。

(10)查看已启用的Kerberos配置

到这里kerberos安装完成。


高级选项:

为Ambari Server设置Kerberos(可选项)

1. 使用kadmin在你的KDC所在的主机(hdp141)为Ambari Server创建一个principal。(ambari-server为自定义名)

1
# kadmin.local -q "addprinc -randkey ambari-server@CESHI.COM

2. 为此principal生成一个Keytab

1
# kadmin.local -q "xst -k ambari.server.keytab ambari-server@CESHI.COM"

3. 将单前目录生成的Keytab拷贝到Ambari Server所在的集群。确定该文件有合适的权限,能够被启动Ambari Server守护进程所访问。

1
2
3
# scp ambari.server.keytab hdp140:/etc/security/keytabs/
# ll /etc/security/keytabs/ambari.server.keytab
-r--r----- 1 root root 530 Dec 18 20:06  /etc/security/keytabs/ambari .server.keytab

4. 停止ambari server

1
# ambari-server stop

5. 运行setup-security命令,设置JAAS。标红部分为需要设置部分。

A. 选择3,Setup Ambari kerberos JAAS configuration

B. 输入第一步为Ambari Server设置的principal名

C. 输入Ambari principal的Keytab所在路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# ambari-server setup-security
Using python   /usr/bin/python2
Security setup options...
===========================================================================
Choose one of the following options:
   [1] Enable HTTPS  for  Ambari server.
   [2] Encrypt passwords stored  in  ambari.properties  file .
   [3] Setup Ambari kerberos JAAS configuration.
   [4] Setup truststore.
   [5] Import certificate to truststore.
===========================================================================
Enter choice, (1-5): 3
Setting up Ambari kerberos JAAS configuration to access secured Hadoop daemons...
Enter ambari server's kerberos principal name (ambari@VRV.COM): ambari-server@VRV.COM
Enter keytab path  for  ambari server's kerberos principal:  /etc/security/keytabs/ambari .server.keytab
Ambari Server  'setup-security'  completed successfully.
重启Ambari Server
# ambari-server restart

开始实测:


1.新建测试用户

普通用户需要安装ranger(后面介绍)管理权限。

列出所有用户

1
2
3
4
5
6
7
# kadmin.local #在kdc服务器上执行
kadmin. local :  listprincs   #//列出所有用户
ambari-server@CESHI.COM
.................
nn /hdp140 @CESHI.COM
zookeeper /hdp142 @CESHI.COM
zookeeper /hdp143 @CESHI.COM

创建测试用户

1
2
3
4
kadmin. local :  addprinc  test
Enter password  for  principal  "test@CESHI.COM" : ceshi123456.
Re-enter password  for  principal  "test@CESHI.COM" : ceshi123456.
Principal  "test@CESHI.COM"  created.

 登录验证

# kinit test  #登陆

ceshi123456.


退出登陆状态

1
注销:kdestroy

集群登录与授权(hdfs用户)

未使用kerberos用户认证前执行

1
# hadoop dfs -ls /

使用kerberos用户认证

1
2
3
# kinit test  #登陆
Password  for  test @CESHI.com  #ceshi123456.
# hadoop dfs -ls /

此时test用户默认有查看权限,无目录授权

换到hdfs用户下,初始化hdfs

查看hdfs的Kerberos用户名

1
2
3
4
5
6
7
8
9
10
11
12
13
# klist -k /etc/security/keytabs/hdfs.headless.keytab
Keytab name: FILE:hdfs.headless.keytab
KVNO Principal
---- --------------------------------------------------------------------------
    1 hdfs- test @CESHI.COM
    1 hdfs- test @CESHI.COM
    1 hdfs- test @CESHI.COM
    1 hdfs- test @CESHI.COM
    1 hdfs- test @CESHI.COM
初始化认证hdfs用户
# kinit -k hdfs-test@CESHI.COM -t /etc/security/keytabs/hdfs.headless.keytab 
创建目录:hadoop fs - mkdir   /test
查看目录属性:

改变目录属性:hadoop fs -chown test:hdfs  /test

使用test用户登录

修改密码和重新生成

1
2
3
4
5
6
7
8
#修改密码命令cpw test(KDC server上执行)
# kadmin.local
Authenticating as principal  test /admin @CESHI.COM with password.
kadmin. local :  cpw  test
Enter password  for  principal  "test1@CESHI.COM" : ceshi123
Re-enter password  for  principal  "test1@CESHI.COM" : ceshi123
change_password: Principal does not exist  while  changing password  for  "test@CESHI.COM" .
kadmin. local :   exit

生成新的多用户使用keytab文件

创建keytab文件(生成到当前文件夹下)

案例:将hive和hdfs的keytab集成到同一个keytab文件中

1. 查看所有princs

1
2
3
4
5
# kadmin.local
Kadmin. local : listprincs
hbase /hdp143 @CESHI.COM"
hdfs-vrvtest@CESHI.COM"
hive /hdp140 @CESHI.COM"

2. 添加hdfs的princs的keytab到hdfs-hive.keytab

1
2
# kadmin.local 
Kadmin. local : xst -norandkey -k hdfs-hive.keytab hdfs-vrvtest@CESHI.COM

3. 添加hive的princs的keytab到hdfs-hive.keytab

1
2
# kadmin.local 
Kadmin. local : xst -norandkey -k hdfs-hive.keytab hive /hdp140 @CESHI.COM

查看生成的hdfs-hive.keytab

使用生成的Keytab文件登录

1
# kinit -k -t hdfs-hive.keytab hive/hdp140@CESHI.COM

修改租期

 1.修改全局租期

1
2
3
4
5
6
7
8
9
10
# vi /etc/krb5.conf
[libdefaults]
  default_realm = CESHI.COM
dns_lookup_realm =  false  
dns_lookup_kdc =  false
ticket_lifetime = 24h  
#ticket 租期时间
renew_lifetime = 7d 
#重新申请时间
frwardable =  true

#重新启动

1
2
# service krb5kdc restart
# service  kadmin restart

2.手动修改用户租期时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#查看租期时间
可在kadmin命令行下用getprinc命令查看默认的最大时长,否则时长被限制在24小时,并且无法renew)
# kadmin.local
kadmin. local :getprinc hive /hdp141
Principal: hive /hdp141 @CESHI
Expiration  date : [never]
Last password change: Mon Dec 18 05:56:57 EST 2017
Password expiration  date : [none]
Maximum ticket life: 1 day 00:00:00  #租期时间
Maximum renewable life: 0 days 00:00:00  #重新续租时间
Last modified: Mon Dec 18 05:56:57 EST 2017 (admin /admin @VRV.COM)
Last successful authentication: [never]
Last failed authentication: [never]
Failed password attempts: 0
Number of keys: 8
Key: vno 1, aes256-cts-hmac-sha1-96
Key: vno 1, aes128-cts-hmac-sha1-96
Key: vno 1, des3-cbc-sha1
Key: vno 1, arcfour-hmac
Key: vno 1, camellia256-cts-cmac
Key: vno 1, camellia128-cts-cmac
Key: vno 1, des-hmac-sha1
Key: vno 1, des-cbc-md5
  
#更改租期时间命令(用户使用真实用户替换)
modprinc -maxrenewlife 300days 用户
modprinc -maxlife 300days 用户

#应用例子

1
modprinc -maxrenewlife 300days hive /hdp141 @CESHI.com

1
modprinc -maxlife 300days hive /hdp141 @CESHI.COM

退出后,重新启动

1
2
# service krb5kdc restart
# service  kadmin restart

3.使用spark任务测试kerberos下的作业提交

指定spark用户和密码

1
2
3
4
5
6
7
8
9
10
11
# cd /etc/security/keytabs
[root@hdp140 keytabs] # ll
-r--r----- 1 root      root   353 Oct 30 23:54 ambari.server.keytab
-r--r----- 1 hbase     hadoop 313 Oct 30 23:54 hbase.headless.keytab
-r-------- 1 hbase     hadoop 313 Oct 30 23:54 hbase.service.keytab
-r-------- 1 hdfs      hadoop 308 Oct 30 23:54 hdfs.headless.keytab
-r--r----- 1 hive      hadoop 308 Oct 30 23:54 hive.service.keytab
-r-------- 1 hdfs      hadoop 298 Oct 30 23:54 nn.service.keytab
-r--r----- 1 ambari-qa hadoop 333 Oct 30 23:54 smokeuser.headless.keytab
-r-------- 1 spark     hadoop 313 Oct 30 23:54 spark.headless.keytab
-r--r----- 1 root      hadoop 308 Oct 30 23:54 spnego.service.keytab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# klist -k spark.headless.keytab
Keytab name: FILE:spark.headless.keytab
KVNO Principal
---- --------------------------------------------------------------------------
    1 spark- test @CESHI.COM
    1 spark- test @CESHI.COM
    1 spark- test @CESHI.COM
    1 spark- test @CESHI.COM
    1 spark- test @CESHI.COM
  
# kinit -k spark-vrvtest@VRV.COM -t spark.headless.keytab
#指定spark用户
[root@hdp140 keytabs] # klist
Ticket cache: FILE: /tmp/krb5cc_0
Default principal: spark-vrvtest@VRV.COM
  
Valid starting       Expires              Service principal
10 /31/2017  01:08:56  11 /01/2017  01:08:56  krbtgt /VRV .COM@VRV.COM

上传spark文件到opt

1
2
3
4
# hdfs dfs -mkdir -p /tmp/sparkwordcount/
# hdfs dfs -mkdir -p /tmp/sparkwordcount/input
# hdfs dfs -put /opt/sparkwordcountinput.txt /tmp/sparkwordcount/input
# hdfs dfs -put /opt/spark_word_count.jar  /tmp/sparkwordcount/

#spark测试文件

1
sparkwordcountinput.txt  spark_word_count.jar

spark命令提交任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  # spark-submit \
   --class com.vrv.bigdata.ml.DataExtract2 \
   --master yarn \
   --deploy-mode cluster \
   --principal spark- test @CESHI.COM \
   --keytab  /etc/security/keytabs/spark .headless.keytab \
   hdfs: //hdp140 :8020 /tmp/sparkwordcount/spark_word_count .jar \
   hdfs: //hdp140 :8020 /tmp/sparkwordcount/input  \
   hdfs: //hdp140 :8020 /tmp/sparkwordcount/output/spark_work_count
17 /10/31  01:15:28 INFO Client:
  client token: Token { kind: YARN_CLIENT_TOKEN, service:  }
  diagnostics: N /A
  ApplicationMaster host: 192.168.2.143
  ApplicationMaster RPC port: 0
  queue: default
  start  time : 1509383715631
  final status: SUCCEEDED
  tracking URL: http: //hdp141 :8088 /proxy/application_1509379053332_0014/
  user: spark
17 /10/31  01:15:28 INFO ShutdownHookManager: Shutdown hook called
17 /10/31  01:15:28 INFO ShutdownHookManager: Deleting directory  /tmp/spark-40e868df-ca58-4389-b20c-03d2717516cc

疑难问题1:

1
2
3
4
5
Received Exception  while  testing connectivity to the KDC: Algorithm AES256 not enabled
**** Host: hdp261:88 (TCP)
java.lang.IllegalArgumentException: Algorithm AES256 not enabled
at sun.security.krb5.EncryptionKey.<init>(EncryptionKey.java:286)
at javax.security.auth.kerberos.KeyImpl.<init>(KeyImpl.java

解决:

1
2
3
4
5
6
7
1. 在Ambari server所在的主机和集群中的所有主机上,根据使用的JDK版本选择合适的JCE策略文件。
• Oracle JDK 1.7:
http: //www .oracle.com /technetwork/java/javase/downloads/jce-7-
download-432124.html
• Oracle JDK 1.8:
http: //www .oracle.com /technetwork/java/javase/downloads/jce8-
download-2133166.html

疑难问题2:

1
org.apache.hadoop.security.authentication.client.AuthenticationException: GSSException: Defective token detected (Mechanism level: GSSHeader did not  find  the right tag)

解决:

1
2
3
4
5
6
7
8
9
10
11
# kinit guest
Password  for  guest@CESHI.COM: ceshi123456.
  
# klist
Ticket cache: FILE: /tmp/krb5cc_0
Default principal: guest@CESHI.COM
  
Valid starting       Expires              Service principal
11 /28/2017  18:30:48  11 /29/2017  18:30:48  krbtgt /CESHI .COM@CESHI.COM
11 /28/2017  18:31:09  11 /29/2017  18:30:48  HTTP /hdp140 @
11 /28/2017  18:31:09  11 /29/2017  18:30:48  HTTP /hdp140 @CESHI.COM

登录查看更多
0

相关内容

Hadoop分布式文件系统(HDFS),是Apache Hadoop Core项目的一部分
大数据安全技术研究进展
专知会员服务
90+阅读 · 2020年5月2日
【北京大学】面向5G的命名数据网络物联网研究综述
专知会员服务
35+阅读 · 2020年4月26日
德勤:2020技术趋势报告,120页pdf
专知会员服务
187+阅读 · 2020年3月31日
新时期我国信息技术产业的发展
专知会员服务
69+阅读 · 2020年1月18日
【大规模数据系统,552页ppt】Large-scale Data Systems
专知会员服务
58+阅读 · 2019年12月21日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
94+阅读 · 2019年12月4日
已删除
AI掘金志
7+阅读 · 2019年7月8日
大数据安全技术浅析
计算机与网络安全
14+阅读 · 2019年4月24日
去哪儿网开源DNS管理系统OpenDnsdb
运维帮
21+阅读 · 2019年1月22日
德国情报工作浅析
计算机与网络安全
27+阅读 · 2018年8月11日
英国情报工作浅析
计算机与网络安全
17+阅读 · 2018年7月27日
OCR技术浅析
机器学习研究会
40+阅读 · 2017年12月8日
威胁情报浅析
计算机与网络安全
7+阅读 · 2017年11月15日
图像算法在电商大促中的应用浅析
AI前线
4+阅读 · 2017年11月14日
网络安全态势感知浅析
计算机与网络安全
16+阅读 · 2017年10月13日
Arxiv
10+阅读 · 2020年4月5日
Arxiv
5+阅读 · 2019年4月25日
Arxiv
17+阅读 · 2019年4月5日
Arxiv
5+阅读 · 2018年1月30日
VIP会员
相关资讯
已删除
AI掘金志
7+阅读 · 2019年7月8日
大数据安全技术浅析
计算机与网络安全
14+阅读 · 2019年4月24日
去哪儿网开源DNS管理系统OpenDnsdb
运维帮
21+阅读 · 2019年1月22日
德国情报工作浅析
计算机与网络安全
27+阅读 · 2018年8月11日
英国情报工作浅析
计算机与网络安全
17+阅读 · 2018年7月27日
OCR技术浅析
机器学习研究会
40+阅读 · 2017年12月8日
威胁情报浅析
计算机与网络安全
7+阅读 · 2017年11月15日
图像算法在电商大促中的应用浅析
AI前线
4+阅读 · 2017年11月14日
网络安全态势感知浅析
计算机与网络安全
16+阅读 · 2017年10月13日
Top
微信扫码咨询专知VIP会员