信息安全公益宣传,信息安全知识启蒙。
加微信群回复公众号:微信群;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
|
|
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
|
|
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)确认你的配置。你可以通过页面下载自动创建的包含principals和Keytabs的CSV文件。
(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
|