Apache Ranger KMS 部署文档
很久没写过部署文档了,不过 Apache Ranger KMS 的手动部署较为繁琐,网上的相关资料基本都是散装的,因此写了一篇进行总结。
文章目录
- 背景
- 安装部署
- 安装 ranger-admin
- 安装 ranger-kms
- HDFS 配置
- Kerberos 配置
- HA 配置
- KMS LUNA HSM
- FAQ
- 后记
- 参考
背景
需要一个高可用的 KMS 服务用于数据静态加密(HDFS 透明加密 / ORC格式列加密),hadoop 原生基于 java keystore 的 KMS 方案在生产环境并不可靠,列了几种可能的方案:
- 使用内部自建的 KMS ,实现 hadoop provider
- 使用 CDH 收费的 Navigator Key Trustee Server
- 使用 Apache Ranger KMS
综合考虑最后选择了方案三,Hadoop KMS是Apache社区开发的,将密钥存入文件(Java keystore)中,而Ranger KMS则是把密钥存入后台数据库中,通过Ranger Admin webui/Api 可以集中化管理KMS服务(密钥管理,访问策略,审计日志)。
安装部署
- hadoop 版本: 2.6.0-cdh5.15.0
- ranger 版本: 1.2.0 (笔者在该版本遇到 sql 初始化的BUG,github 上最新 1.2.1-snapshot 版本已解决该问题)
下载 range-1.2.0 源码进行编译,初次编译耗时可能较长,可以放在后台执行,相应包会生成在 target 目录下。
wget http://mirrors.tuna.tsinghua.edu.cn/apache/ranger/1.2.0/apache-ranger-1.2.0.tar.gz
tar -vxf apache-ranger-1.2.0.tar.gz
cd apache-ranger-1.2.0
nohup mvn clean compile package assembly:assembly install -DskipTests=true -Drat.skip=true -Dmaven.test.skip=true > maven.log &
安装 ranger-admin
mysql 增加用户及数据库
create database ranger;
alter database ranger character set latin1;
create user 'rangeradmin'@'%' identified by '123456';
GRANT ALL PRIVILEGES ON ranger.* TO 'rangeradmin'@'%' IDENTIFIED BY '123456';
flush privileges;
解压,修改配置文件
tar -vxf ranger-1.2.0-admin.tar.gz
cd ranger-1.2.0-admin
vim install.properties
install.properties
SQL_CONNECTOR_JAR=/path/to/mysql-connector-java-5.1.34.jardb_root_user=...
db_root_password=...
db_host=...# DB UserId used for the Ranger schema
db_name=ranger
db_user=rangeradmin
db_password=123456# 禁用audit审计,如需开启,需安装solr
#audit_store=solr
#audit_solr_urls=
#audit_solr_user=
#audit_solr_password=
#audit_solr_zookeepers=# Custom log directory path
RANGER_KMS_LOG_DIR=/home/admin/output/ranger/admin/logs#PID file path
RANGER_KMS_PID_DIR_PATH=/home/admin/var/ranger/admin/run
保存后使用 root 进行 setup
./setup.sh
安装成功后会提示
Installation of Ranger PolicyManager Web Application is completed.
启动服务
./ews/ranger-admin-services.sh start
通过 netstat -lntp|grep 6080
查看进程是否正常启动,启动后访问 ip:6080
,通过 admin/admin 访问 webui 。
安装 ranger-kms
mysql 增加用户及数据库
create database rangerkms;
alter database rangerkms character set latin1;
create user 'rangerkms'@'%' identified by '123456';
GRANT ALL PRIVILEGES ON rangerkms.* TO 'rangerkms'@'%' IDENTIFIED BY '123456';
flush privileges;
解压,修改配置文件
tar -vxf ranger-1.2.0-kms.tar.gz
cd ranger-1.2.0-kms
vim install.properties
SQL_CONNECTOR_JAR=/path/to/mysql-connector-java-5.1.34.jardb_root_user=...
db_root_password=...
db_host=...# DB UserId used for the Ranger KMS schema
db_name=rangerkms
db_user=rangerkms
db_password=123456# Location of Policy Manager URL
POLICY_MGR_URL=http://$RANGER_ADMIN_HOST:6080# This is the repository name created within policy manager
REPOSITORY_NAME=kmsdev# Custom log directory path
RANGER_KMS_LOG_DIR=/home/admin/output/ranger/kms/logs#PID file path
RANGER_KMS_PID_DIR_PATH=/home/admin/var/ranger/kms/run
保存后进行安装
./setup.sh
./enable-kms-plugin.sh
一切顺利后会显示
Installation of Ranger KMS is completed
查看 rangerkms 数据库会发现两张表
ranger_keystore
ranger_masterkey
使用 keyadmin/keyadmin 登陆 webui,添加 kms 服务,服务名为 kms-site.xml 中REPOSITORY_NAME
设置的值,此处为 kmsdev
Service Name :kmsdev
KMS URL :kms://http@hostnip:9292/kms
Username :keyadmin
Password :keyadmin
启动 ranger-kms
./ranger-kms start
通过 netstat -lntp|grep 9292
查看进程是否正常启动
HDFS 配置
hdfs-site.xml
dfs.encryption.key.provider.uri kms://http@kms_host:9292/kms
core-site.xml
hadoop.security.key.provider.path kms://http@kms_host:9292/kms
Kerberos 配置
如果 range-admin 开启了 kerberos 认证,kms 也需要修改相关配置:
/home/admin/ranger-1.2.0-kms/ews/webapp/WEB-INF/classes/conf/kms-site.xml
<property><name>hadoop.kms.authentication.type</name><value>kerberos</value>
</property><property><name>hadoop.kms.authentication.kerberos.keytab</name><value>/etc/kerberos/dcadmin.keytab</value>
</property><property><name>hadoop.kms.authentication.kerberos.principal</name><value>HTTP/spark-d-011016.hz.td@HZNEW.TONGDUN.COM</value>
</property>
配置 kerberos SPNEGO 后可以通过 curl --negotiate -u: "..."
访问相应的 rest api ,会自动将本地的 tgt 票据加到 http 请求中
//list kms keys
curl --negotiate -u: "http://spark-d-011015.hz.td:9292/kms/v1/keys/names"
HA 配置
- 可以启动多个 ranger kms 实例,当
hadoop.security.key.provider.path中
指定了多个URL时,将隐式使用LoadBalancingKMSClientProvider,对多个 kms 实例以轮询的方式发送请求。 - 对于 Kerberos SPNEGO 身份验证,URL的主机名用于构造服务器的 Kerberos 服务名
HTTP /#HOSTNAME#
,这意味着所有KMS实例必须具有带有负载均衡器的Kerberos服务名称。为了能够直接访问特定的KMS实例,KMS实例还必须具有其自己的主机名的 Keberos 服务名,所以需要将hadoop.kms.authentication.kerberos.principal
中的 Kerberos 服务名改为*
- Ranger admin 不可用不会影响到 Ranger KMS 提供服务,Ranger KMS 默认每30秒会从Ranger Admin 中下载最新的策略(policies),当 Ranger Admin 不可用时,Ranger KMS 则会使用上一次从 ranger admin 中下载的策略。
修改相关配置,参数比较多,为了缩短篇幅,不再以 xml 格式表达:
/home/admin/ranger-1.2.0-kms/ews/webapp/WEB-INF/classes/conf/kms-site.xml
hadoop.kms.key.provider.uri = dbks://http@spark-d-011016.hz.td:9292/kms
hadoop.kms.cache.enable = false
hadoop.kms.cache.timeout.ms = 0
hadoop.kms.current.key.cache.timeout.ms = 0
hadoop.kms.authentication.kerberos.principal = *
hadoop.kms.authentication.signer.secret.provider = zookeeper
hadoop.kms.authentication.signer.secret.provider.zookeeper.connection.string = spark-d-011017.hz.td:2181,spark-d-011018.hz.td:2181,spark-d-011019.hz.td:2181
hadoop.kms.authentication.signer.secret.provider.zookeeper.auth.type = none
配置 provider url ,下述第一种写法必须保证所有的 kms 端口一致
之前的 KMS URL = kms://http@<internal host name>:9292/kms
新的 KMS URL
写法1 kms://http@<RangerKMS-node1>;<RangerKMS-node2>;...:9292/kms
写法2 kms://http@<RangerKMS-node1>:9292/kms,kms://http@<RangerKMS-node2>:9292/kms
可以直接使用 hadoop 命令行进行测试
hadoop key list -metadata -provider "kms://http@spark-d-011015.hz.td;spark-d-011016.hz.td:9292/kms"
Tip
github 上 clone 1.2.1-snapshot 版本,开启 HA 会提示下方错误,因为有个 RANGER-2140 中升级了 guava 版本,会导致方法冲突,可以在 pom.xml 中将 guava 版本降到 17.0。
2020-01-08 23:26:55,583 ERROR [/kms] - Exception starting filter authFilter
java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor()Lcom/google/common/util/concurrent/ListeningExecutorService;
KMS LUNA HSM
有一种比将密钥存在数据库中更加可靠的密钥保护方案,需要额外的硬件支持,HSM(硬件安全模块)是专为保护加密密钥生命周期而设计的专用加密处理器,在可靠且防篡改的设备中安全地管理、处理和保存加密密钥。有此需求的同学可以在 ranger wiki 中找到配置相应文档。
FAQ
提示没有 policies 下载权限
在 ranger admin 中配置 kms server 时在 Add New Configurations 中添加参数。
policy.download.auth.users = username
启动 kms 时提示 java.lang.Exception: Serivce:kmsdev not found
需要在 ranger admin 中用 keyadmin 用户预先建一个 ranger kms 配置中 REPOSITORY_NAME 对应的 kms 服务。
“User:keyadmin not allowed to do ‘GET_KEYS’”
修改 kms 服务 Policies ,对提示用户添加相应的权限。
WARN RangerAdminRESTClient - Error getting policies. secureMode=true, user=admin/dc@HZNEW.TONGDUN.COM (auth:KERBEROS), response={“httpStatusCode”:401,“statusCode”:0}, serviceName=kmsdev
401 的提示基本是 Kerberos SPNEGO 没有配置正确引起的,排查
/home/admin/ranger-1.2.0-kms/ews/webapp/WEB-INF/classes/conf/kms-site.xml
中的相关配置。User: admin is not allowed to impersonate xxx
用户没有代理权限,修改
/home/admin/ranger-1.2.0-kms/ews/webapp/WEB-INF/classes/conf/kms-site.xml
<property><name>hadoop.kms.proxyuser.admin.groups</name><value>*</value> </property><property><name>hadoop.kms.proxyuser.admin.hosts</name><value>*</value> </property><property><name>hadoop.kms.proxyuser.admin.users</name><value>*</value> </property>
setup.sh 脚本初始化时 sql 提示: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators variable)
set global log_bin_trust_function_creators = 1;ranger kms 日志提示 Illegal key size
说明 aes 支持的位数不够,有两个解决办法:- 升级 jdk ,例如 jdk8_162
- 替换 jce police,可参考 https://blog.csdn.net/hfhwfw/article/details/68557238
运行一段时间后,NameNode 连接 kms 提示 401
DelegationToken 过期导致,可以在 crontab 中定期让 NN 访问 KMSKMS 多实例运行一段时间后,提示 zk 超时,导致 kms 服务不可用
配置 zk-dt-secret-manager 保存 DelegationToken 时,在集群规模较大的情况下,zk /hadoop-kms-dt/ZKDTSMRoot/ZKDTSMTokensRoot 下的数据会迅速增长,在达到默认的 4M 后 zk 客户端会提示无法连接 zk ,错误提示如下:
解决办法:在 ranger-kms 脚本 JAVA_OPTS 中增加参数 -Djute.maxbuffer=50111000,如果请求量较大可以提高 ranger_kms_max_heap_size=4g ,默认为1g。
ranger 1.2 不支持 hadoop-2.8 及以上版本,默认依赖的 2.7.1 在zk代理令牌管理上有不少 BUG
比如 HADOOP-13487,重启 kms 不会删除zk中历史过期的令牌,导致 ZNODE 节点不断增加,在我们的集群中,正常存在的代理令牌数量保持在 120万左右,如果不删除过期令牌,很快就会遇到问题。
解决方式:
在 hadoop-2.7.7 版本上 cherry-pick 加入 HADOOP-12652/HADOOP-13422/HADOOP-13487 后,重新编译 hadoop-common/hadoop-hdfs 模块,将编译出的包
hadoop-annotations-2.7.7.jar / hadoop-auth-2.7.7.jar / hadoop-common-2.7.7.jar / hadoop-hdfs-2.7.7.jar
替换到 $RANGER_HOME/ews/webapp/lib 下。
后记
在没有硬件加密的情况下为了提高密钥的安全性,密钥需要不定期 rollover ,同时密钥数据库要做数据备份,密钥数据库密码管理需要在行政上做一定约束。
参考
Ranger集成KMS服务
Install Multiple Ranger KMS
kerberos_and_hadoop Error Messages to Fear
Apache Ranger 0.5.0 Installation
Hadoop Key Management Server (KMS) - Documentation Sets
Apache Ranger KMS 部署文档相关推荐
- loganalyzer部署文档-(第一部分)
loganalyzer部署文档 环境准备: 简介 LogAnalyzer 是一款syslog日志和其他网络事件数据的Web前端.它提供了对日志的简单浏览.搜索.基本分析和一些图表报告的功能.数据可以从 ...
- Pentaho部署文档校验过程中遇到的一些问题和解决对策
为什么80%的码农都做不了架构师?>>> Pentaho部署文档校验过程中遇到的一些问题和解决对策 1.quartz.EmbeddedQuartzSystemListener发 ...
- Docker部署文档
Docker部署文档 目录 Docker部署文档 1 一.什么是Docker 3 1.1Docker简介 3 1.2对比传统虚拟机总结 4 1.3Docker通常用于如下场景: 5 1.4基本概念 5 ...
- linux 文档属于apache,Apache 安装和使用文档
Apache 安装和使用文档 更新时间:2009年11月26日 00:34:37 作者: Apache安装和使用文档 一.准备工作: 1台PC机,安装linux操作系统 参考文档linux安装.d ...
- django+nginx+uwsgi项目部署文档整理
django+nginx+uwsgi项目部署文档整理 参考文章:https://blog.csdn.net/qq_42314550/article/details/81805328 一.python安 ...
- java web部署文档_javaweb项目实施部署文档
javaweb项目实施部署文档 一 .安装配置jdk Jdk的下载地址: http://www.oracle.com/technetwork/java/javase/downloads/index.h ...
- Openmeetings—视频会议部署文档
Openmeetings-视频会议部署文档 Linux丶晨星关注 0.3182019.11.15 19:48:49字数 1,714阅读 4,463 一.openmeeting简介 OpenMeetin ...
- Openmeeting—视频会议部署文档
Openmeetings-开源视频会议测试环境部署 文章目录 Openmeetings-开源视频会议测试环境部署 一.openmeeting简介 二.部署流程 1. 安装 Java环境 MySQL I ...
- Ambari 部署文档
Ambari 部署文档 说明: 一.把所需要的文件放到指定的目录下 二.集群主机配置(所有节点都要执行的) 2.1.安装前主机需要的软件 2.2.配置 NTP 服务(由邓哥配置完成) 2.3.配置主机 ...
- diagnose部署文档
部署文档路径: https://192.168.57.73/PPD/tenant/trunk/Documents/D4.Manuals/部署文档/账户分析部署文档 写作注意事项: 1.src/main ...
最新文章
- SpringMVC + Hibernate-Validator 参数校验
- php 下划线转大写开头,使用PHP把下划线分隔命名的字符串 转换成驼峰式命名方式 , 把下划线后面的第一个字母变成大写...
- c语言实现椭圆曲线算法,椭圆曲线加密算法的C语言设计和实现
- Redis重新连接弹性
- Kettle使用_17 计算器生成时间维度数据
- C语言计算一个数的平方根立方根,怎样快速计算出一个数的平方根立方根?
- translclude
- Aurora AD308e 一体机驱动
- C语言,从入门到放弃
- COSClient上传图片失败
- NBUT1480:懒惰的风纪委Elaine(多重背包)
- 数字化转型进行时 | 区块链赋能政务数字化研讨会在零数科技举办
- [USACO18JAN] Lifeguards S
- GD32F303固件库开发(7)----printf打印配置
- 4.17每日一题之杂物(洛谷c++)
- 结合Bootstrap实现头像上传前预览
- (JavaSE 学习记录) 自定义类加载器
- 如何采用离线的 Google Map API 加载离线谷歌地图的方法
- 十五、修改VGG16网络来适应自己的需求
- 将腾讯视频Qlv格式转为MP4格式(亲测可用)