很久没写过部署文档了,不过 Apache Ranger KMS 的手动部署较为繁琐,网上的相关资料基本都是散装的,因此写了一篇进行总结。

文章目录

  • 背景
  • 安装部署
    • 安装 ranger-admin
    • 安装 ranger-kms
      • HDFS 配置
      • Kerberos 配置
      • HA 配置
      • KMS LUNA HSM
    • FAQ
  • 后记
  • 参考

背景

需要一个高可用的 KMS 服务用于数据静态加密(HDFS 透明加密 / ORC格式列加密),hadoop 原生基于 java keystore 的 KMS 方案在生产环境并不可靠,列了几种可能的方案:

  1. 使用内部自建的 KMS ,实现 hadoop provider
  2. 使用 CDH 收费的 Navigator Key Trustee Server
  3. 使用 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 配置

  1. 可以启动多个 ranger kms 实例,当hadoop.security.key.provider.path中指定了多个URL时,将隐式使用LoadBalancingKMSClientProvider,对多个 kms 实例以轮询的方式发送请求。
  2. 对于 Kerberos SPNEGO 身份验证,URL的主机名用于构造服务器的 Kerberos 服务名HTTP /#HOSTNAME# ,这意味着所有KMS实例必须具有带有负载均衡器的Kerberos服务名称。为了能够直接访问特定的KMS实例,KMS实例还必须具有其自己的主机名的 Keberos 服务名,所以需要将 hadoop.kms.authentication.kerberos.principal 中的 Kerberos 服务名改为 *
  3. 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

  1. 提示没有 policies 下载权限

    在 ranger admin 中配置 kms server 时在 Add New Configurations 中添加参数。

    policy.download.auth.users = username

  2. 启动 kms 时提示 java.lang.Exception: Serivce:kmsdev not found

    需要在 ranger admin 中用 keyadmin 用户预先建一个 ranger kms 配置中 REPOSITORY_NAME 对应的 kms 服务。

  3. “User:keyadmin not allowed to do ‘GET_KEYS’”
    修改 kms 服务 Policies ,对提示用户添加相应的权限。

  4. 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 中的相关配置。

  5. 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>
    
  6. 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;

  7. ranger kms 日志提示 Illegal key size
    说明 aes 支持的位数不够,有两个解决办法:

    1. 升级 jdk ,例如 jdk8_162
    2. 替换 jce police,可参考 https://blog.csdn.net/hfhwfw/article/details/68557238
  8. 运行一段时间后,NameNode 连接 kms 提示 401
    DelegationToken 过期导致,可以在 crontab 中定期让 NN 访问 KMS

  9. KMS 多实例运行一段时间后,提示 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。

  10. 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 部署文档相关推荐

  1. loganalyzer部署文档-(第一部分)

    loganalyzer部署文档 环境准备: 简介 LogAnalyzer 是一款syslog日志和其他网络事件数据的Web前端.它提供了对日志的简单浏览.搜索.基本分析和一些图表报告的功能.数据可以从 ...

  2. Pentaho部署文档校验过程中遇到的一些问题和解决对策

    为什么80%的码农都做不了架构师?>>>    Pentaho部署文档校验过程中遇到的一些问题和解决对策 1.quartz.EmbeddedQuartzSystemListener发 ...

  3. Docker部署文档

    Docker部署文档 目录 Docker部署文档 1 一.什么是Docker 3 1.1Docker简介 3 1.2对比传统虚拟机总结 4 1.3Docker通常用于如下场景: 5 1.4基本概念 5 ...

  4. linux 文档属于apache,Apache 安装和使用文档

    Apache 安装和使用文档 更新时间:2009年11月26日 00:34:37   作者: Apache安装和使用文档 一.准备工作: 1台PC机,安装linux操作系统 参考文档linux安装.d ...

  5. django+nginx+uwsgi项目部署文档整理

    django+nginx+uwsgi项目部署文档整理 参考文章:https://blog.csdn.net/qq_42314550/article/details/81805328 一.python安 ...

  6. java web部署文档_javaweb项目实施部署文档

    javaweb项目实施部署文档 一 .安装配置jdk Jdk的下载地址: http://www.oracle.com/technetwork/java/javase/downloads/index.h ...

  7. Openmeetings—视频会议部署文档

    Openmeetings-视频会议部署文档 Linux丶晨星关注 0.3182019.11.15 19:48:49字数 1,714阅读 4,463 一.openmeeting简介 OpenMeetin ...

  8. Openmeeting—视频会议部署文档

    Openmeetings-开源视频会议测试环境部署 文章目录 Openmeetings-开源视频会议测试环境部署 一.openmeeting简介 二.部署流程 1. 安装 Java环境 MySQL I ...

  9. Ambari 部署文档

    Ambari 部署文档 说明: 一.把所需要的文件放到指定的目录下 二.集群主机配置(所有节点都要执行的) 2.1.安装前主机需要的软件 2.2.配置 NTP 服务(由邓哥配置完成) 2.3.配置主机 ...

  10. diagnose部署文档

    部署文档路径: https://192.168.57.73/PPD/tenant/trunk/Documents/D4.Manuals/部署文档/账户分析部署文档 写作注意事项: 1.src/main ...

最新文章

  1. SpringMVC + Hibernate-Validator 参数校验
  2. php 下划线转大写开头,使用PHP把下划线分隔命名的字符串 转换成驼峰式命名方式 , 把下划线后面的第一个字母变成大写...
  3. c语言实现椭圆曲线算法,椭圆曲线加密算法的C语言设计和实现
  4. Redis重新连接弹性
  5. Kettle使用_17 计算器生成时间维度数据
  6. C语言计算一个数的平方根立方根,怎样快速计算出一个数的平方根立方根?
  7. translclude
  8. Aurora AD308e 一体机驱动
  9. C语言,从入门到放弃
  10. COSClient上传图片失败
  11. NBUT1480:懒惰的风纪委Elaine(多重背包)
  12. 数字化转型进行时 | 区块链赋能政务数字化研讨会在零数科技举办
  13. [USACO18JAN] Lifeguards S
  14. GD32F303固件库开发(7)----printf打印配置
  15. 4.17每日一题之杂物(洛谷c++)
  16. 结合Bootstrap实现头像上传前预览
  17. (JavaSE 学习记录) 自定义类加载器
  18. 如何采用离线的 Google Map API 加载离线谷歌地图的方法
  19. 十五、修改VGG16网络来适应自己的需求
  20. 将腾讯视频Qlv格式转为MP4格式(亲测可用)

热门文章

  1. multisim 10.0安装、破解、汉化
  2. Linux中文显示乱码问题解决方法(编码查看及转换)
  3. matlab 取符号函数,Matlab 符号表达式和符号函数的操作
  4. python删除txt文本文件第一行数据
  5. 3dB等波纹低通滤波器设计(HFSS)
  6. 51单片机程序设计——电子音乐盒
  7. WCF学习记录【一】
  8. 记录从网页下载ppt的过程。
  9. 寻求 华中科大《机械控制工程基础》第五版习题参考答案
  10. 快速傅里叶变换(蝶形算法)