hadoop安全目录:

  1. kerberos(已发布)

    SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
  2. elasticsearch(已发布)http://blog.51cto.com/chenhao6/2113873

  3. knox

  4. oozie

  5. ranger

  6. apache sentry

 

简介:

       从运维青铜到运维白银再到运维黄金,这里就要牵扯到方向问题也就是装备,根据自己的爱好,每个人都应该选择一个适合自己和喜欢自己的一个职业技术方向,如:大数据安全,开发运维,云计算运维等等。而掌握的越多前言技术也就是更多的装备,才能更好的在it行业混下去,毕竟it技术更新太快,初级篇和中级篇前面已介绍。

如果你想了解大数据的学习路线,想学习大数据知识以及需要免费的学习资料可以加群:784789432.欢迎你的加入。

 

初级篇:详解Linux运维工程师入门必备技能(青铜)

 

中级篇:详解Linux运维工程师打怪升级篇(白银)

 

现在给大家介绍大数据安全的正式面目:

1.大数据基本组件

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第1张

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第2张

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第3张

2. Hadoop安全背景

 共享集群

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

特定用户

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

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

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

如果你想了解大数据的学习路线,想学习大数据知识以及需要免费的学习资料可以加群:784789432.欢迎你的加入。

3. 设备说明

 

服务

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

4. kerberos基本概念:

 

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

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

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

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

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

 TGT:Ticket-granting Ticket

5. kerberos认证过程:

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第4张

 

6. 集群启用Kerberos认证

装KDC Server

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

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

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第5张

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

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第6张

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

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第7张

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

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

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第8张

 

 

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

自定义Hadoop使用的Kerberos identities

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第9张

 6.确认你的配置。你可以通过页面下载自动创建的包含principals和Keytabs的CSV文件。

 7.停止服务详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第10张

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第11张

 8.启用kerberos

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

 9.启动和测试服务详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第12张

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

 

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第13张

 10.查看已启用的Kerberos配置

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第14张

到这里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.

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第15张

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第16张

退出登陆状态

1 注销:kdestroy

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

未使用kerberos用户认证前执行

1 # hadoop dfs -ls /

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第17张

使用kerberos用户认证

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

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第18张

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

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第19张

 

换到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 查看目录属性:

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第20张

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

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第21张

使用test用户登录

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第22张

修改密码和重新生成

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

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第23张

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

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第24张

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第25张

使用生成的Keytab文件登录

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

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第26张

 

修改租期

 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

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第27张

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

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第28张

退出后,重新启动

1 2 # service krb5kdc restart # service  kadmin restart

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

1.指定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

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第29张

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第30张

详解Linux运维工程师高级篇(大数据安全方向). Hadoop 第31张

 

疑难问题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

 

 

实战到此结束。后续再更新elasticsearcn安全实战。

 

总结:

1. Hadoop集群节点数多,配置和维护一个使用kerberos系统高性能,稳定的hadoop集群难度非常高。

2. Hadoop中的hdfs是一个文件系统,用户的认证和授权比较复杂,难度不低于linux系统的用户和组管理。

加上kerberos后,用户和用户组的管理更加复杂,通常一个合适的用户不能访问hdfs上的文件。 

3. Hadoop加上kerberos后,通常原来的用户和文件,可能都失效导致数据流失。

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄