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

阿里云幸运券

hadoop安全目录:

kerberos(已发布)

elasticsearch(已发布)https://blog.51cto.com/chenhao6/2113873

knox

oozie

ranger

apache sentry

简介:

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

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

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

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

1.大数据基本组件

v2-c07c85dfa597fe9b6a1c63b24948323d_hd.jpg

ef4868e403fa42868e75ef5978153b39_hd.jpg

21.jpg

  1. Hadoop安全背景

 共享集群

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

特定用户

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

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

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

  1. 设备说明

服务

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

  1. kerberos基本概念:

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

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

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

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

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

 TGT:Ticket-granting Ticket

  1. kerberos认证过程:

image.png

  1. 集群启用Kerberos认证

装KDC Server

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

yum install krb5-server krb5-libs krb5-workstation

image.png

  1. 打开KDC Server的配置文件

vi /etc/krb5.conf

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

[realms]
EXAMPLE.COM = {
kdc = my.kdc.server
admin_server = my.kdc.server
}

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

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。

kdb5_util create -s

Loading random data
Initializing database ‘/var/kerberos/krb5kdc/principal’ for realm ‘CESHI.COM’,
master key name ‘K/[email protected]
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

service krb5kdc start

chkconfig krb5kdc on

service kadmin start

chkconfig kadmin on

6.创建kerberos Admin

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

kadmin.local -q “addprinc admin/admin”

Authenticating as principal root/[email protected] with password.
WARNING: no policy specified for admin/[email protected]; defaulting to no policy
Enter password for principal “admin/[email protected]”: ceshi123456.
Re-enter password for principal “admin/[email protected]”: ceshi123456.
Principal “admin/[email protected]” created.
“admin/[email protected]”:ceshi123456.
打开KDC ACL文件,确认admin principal在KDC ACL中拥有权限,若没有对应的域则需要添加。

vi /var/kerberos/krb5kdc/kadm5.acl

*/[email protected] *
如果修改了文件kadm5.acl,那么你就必须重启kadmin进程

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目录下

JAVA_HOME=/usr/java/default

unzip -o -j -q UnlimitedJCEPolicyJDK8.zip -d $JAVA_HOME/jre/lib/security/

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

service ambari-server restart

8.运行Kerberos保护向导

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

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

image.png

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

image.png

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

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

image.png

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

自定义Hadoop使用的Kerberos identities

image.png

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

7.停止服务image.png

image.png

8.启用kerberos

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

9.启动和测试服务image.png

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

image.png

10.查看已启用的Kerberos配置

image.png

到这里kerberos安装完成。

高级选项:

为Ambari Server设置Kerberos(可选项)

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

kadmin.local -q "addprinc -randkey [email protected]

  1. 为此principal生成一个Keytab

kadmin.local -q “xst -k ambari.server.keytab [email protected]

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

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

ambari-server stop

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

A. 选择3,Setup Ambari kerberos JAAS configuration

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

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

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 ([email protected]): [email protected]
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(后面介绍)管理权限。

列出所有用户

kadmin.local #在kdc服务器上执行

kadmin.local: listprincs #//列出所有用户
[email protected]

nn/[email protected]
zookeeper/[email protected]
zookeeper/[email protected]
创建测试用户

kadmin.local: addprinc test
Enter password for principal "[email protected]": ceshi123456.
Re-enter password for principal "[email protected]": ceshi123456.
Principal "[email protected]" created.
登录验证

kinit test #登陆

ceshi123456.

image.png

image.png

退出登陆状态

注销:kdestroy
集群登录与授权(hdfs用户)

未使用kerberos用户认证前执行

hadoop dfs -ls /

image.png

使用kerberos用户认证

kinit test #登陆

Password for [email protected] #ceshi123456.

hadoop dfs -ls /

image.png

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

image.png

换到hdfs用户下,初始化hdfs

查看hdfs的Kerberos用户名

klist -k /etc/security/keytabs/hdfs.headless.keytab

Keytab name: FILE:hdfs.headless.keytab
KVNO Principal


1 [email protected]
1 [email protected]
1 [email protected]
1 [email protected]
1 [email protected]
初始化认证hdfs用户

kinit -k [email protected] -t /etc/security/keytabs/hdfs.headless.keytab

创建目录:hadoop fs -mkdir /test
查看目录属性:
image.png

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

image.png

使用test用户登录

image.png

修改密码和重新生成

#修改密码命令cpw test(KDC server上执行)

kadmin.local

Authenticating as principal test/[email protected] with password.
kadmin.local: cpw test
Enter password for principal "[email protected]": ceshi123
Re-enter password for principal "[email protected]": ceshi123
change_password: Principal does not exist while changing password for "[email protected]".
kadmin.local: exit
生成新的多用户使用keytab文件

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

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

  1. 查看所有princs

kadmin.local

Kadmin.local: listprincs
hbase/[email protected]"
[email protected]"
hive/[email protected]"
2. 添加hdfs的princs的keytab到hdfs-hive.keytab

kadmin.local

Kadmin.local: xst -norandkey -k hdfs-hive.keytab [email protected]
image.png

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

kadmin.local

Kadmin.local: xst -norandkey -k hdfs-hive.keytab hive/[email protected]
查看生成的hdfs-hive.keytab

image.png

image.png

使用生成的Keytab文件登录

kinit -k -t hdfs-hive.keytab hive/[email protected]

image.png

修改租期

1.修改全局租期

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
#重新启动

service krb5kdc restart

service kadmin restart

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

#查看租期时间
可在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/[email protected])
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 用户
#应用例子

modprinc -maxrenewlife 300days hive/[email protected]
image.png

modprinc -maxlife 300days hive/[email protected]
image.png

退出后,重新启动

service krb5kdc restart

service kadmin restart

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

1.指定spark用户和密码

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

klist -k spark.headless.keytab

Keytab name: FILE:spark.headless.keytab
KVNO Principal


1 [email protected]
1 [email protected]
1 [email protected]
1 [email protected]
1 [email protected]

kinit -k [email protected] -t spark.headless.keytab

#指定spark用户
[root@hdp140 keytabs]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: [email protected]

Valid starting Expires Service principal
10/31/2017 01:08:56 11/01/2017 01:08:56 krbtgt/[email protected]
上传spark文件到opt

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测试文件

sparkwordcountinput.txt spark_word_count.jar
spark命令提交任务

spark-submit \

–class com.vrv.bigdata.ml.DataExtract2
–master yarn
–deploy-mode cluster
–principal [email protected]
–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
image.png

image.png

image.png

疑难问题1:

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.(EncryptionKey.java:286)
at javax.security.auth.kerberos.KeyImpl.(KeyImpl.java
解决:

  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:

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

kinit guest

Password for [email protected]: ceshi123456.

klist

Ticket cache: FILE:/tmp/krb5cc_0
Default principal: [email protected]

Valid starting Expires Service principal
11/28/2017 18:30:48 11/29/2017 18:30:48 krbtgt/[email protected]
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/[email protected]
参考:

http://blog.csdn.net/wulantian/article/details/42418231

http://book.51cto.com/art/200907/140533.htm

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

总结:

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

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

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

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

腾讯云代金券

原文链接

https://blog.51cto.com/chenhao6/2069961

服务推荐

猜你喜欢

转载自blog.csdn.net/ff00yo/article/details/89044647
今日推荐