作者介绍
陈浩,北信源研发工程师,五年linux运维工作经验,热衷运维技术研究、实践和团队分享。
从运维青铜到运维白银再到运维黄金,这里面牵扯到的方向问题也就是装备,根据自己的爱好,每个人都应该选择一个适合自己和喜欢自己的一个职业技术方向,如:大数据安全、开发运维、云计算运维等。掌握越多前沿技术也就是掌握了更多的装备,才能更好地在it行业混下去,毕竟it技术更新太快。
初级和中级篇详见《从苦逼到牛逼,详解linux运维工程师的打怪升级之路》,今天给大家介绍大数据安全的正式面目。
hadoop安全目录:
kerberos(已发布)
elasticsearch
knox
oozie
ranger
apache sentry
温馨提醒:本文代码部分较长,可向右滑动或pc端阅览。点击文末【阅读原文】还可进入作者专栏查看更多学习资料。
一、大数据基本组件
二、hadoop安全背景
共享集群
按照业务或应用的规则划分资源队列,并分配给特定用户
hdfs上存放各种数据,包括公共的、机密的
安全认证:确保某个用户是自己声称的那个用户
安全授权:确保某个用户只能做他允许的那些操作
三、设备说明
四、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为例)
# yum install krb5-server krb5-libs krb5-workstation
2、打开kdc server的配置文件
# vi /etc/krb5.conf
修改文件中的[realms]部分,将为属性kdc和admin_server设置的默认值“kerberos.example”替换成实际kdc server的主机名。在下面的例子中,“kerberos.example”被替换成了 “my.kdc.server”。
[realms]
example.com = {
kdc = my.kdc.server
admin_server = my.kdc.server
}
3、(可选)自定义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 = ceshi.com
vrv = 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/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
# 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/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中拥有权限,若没有对应的域则需要添加。
# vi /var/kerberos/krb5kdc/kadm5.acl
*/admin@vrv.com *
如果修改了文件kadm5.acl,那么你就必须重启kadmin进程
# service kadmin restart
7、启用kerberos保护
安装jce:必须用官网下载的jce覆盖本地已有的jce,否则将缺少供kerberos使用的加密方式。
在ambari server所在的主机和集群中的所有主机上,根据使用的jdk版本选择合适的jce策略文件。
oracle jdk 1.7:
oracle jdk 1.8:
在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
(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为自定义名)
# kadmin.local -q addprinc -randkey ambari-server@ceshi.com
2. 为此principal生成一个keytab
# kadmin.local -q xst -k ambari.server.keytab ambari-server@ceshi.com
3. 将单前目录生成的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
5. 运行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 ): 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(后面介绍)管理权限。
列出所有用户
# kadmin.local #在kdc服务器上执行
kadmin.local: listprincs #//列出所有用户
ambari-server@ceshi.com
.................
nn/hdp140@ceshi.com
zookeeper/hdp142@ceshi.com
zookeeper/hdp143@ceshi.com
创建测试用户
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.
退出登陆状态
注销:kdestroy
集群登录与授权(hdfs用户)
未使用kerberos用户认证前执行
# hadoop dfs -ls /
使用kerberos用户认证
# kinit test #登陆
password for test@ceshi #ceshi123456.
# hadoop dfs -ls /
此时test用户默认有查看权限,无目录授权
换到hdfs用户下,初始化hdfs
查看hdfs的kerberos用户名
# 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用户登录
修改密码和重新生成
#修改密码命令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
# kadmin.local
kadmin.local: listprincs
hbase/hdp143@ceshi.com
hdfs-vrvtest@ceshi.com
hive/hdp140@ceshi.com
2. 添加hdfs的princs的keytab到hdfs-hive.keytab
# kadmin.local
kadmin.local: xst -norandkey -k hdfs-hive.keytab hdfs-vrvtest@ceshi.com
3. 添加hive的princs的keytab到hdfs-hive.keytab
# kadmin.local
kadmin.local: xst -norandkey -k hdfs-hive.keytab hive/hdp140@ceshi.com
查看生成的hdfs-hive.keytab
使用生成的keytab文件登录
# kinit -k -t hdfs-hive.keytab hive/hdp140@ceshi.com
修改租期
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/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 用户
#应用例子
modprinc -maxrenewlife 300days hive/hdp141@ceshi
modprinc -maxlife 300days hive/hdp141@ceshi.com
退出后,重新启动
# 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
...