协调节点Kerberos认证

可以配置openLooKeng协调节点,为客户端(例如openLooKeng命令行或JDBC和ODBC驱动程序)启用基于HTTPS的Kerberos身份验证。

为了启用Kerberos身份验证,需要修改在openLooKeng协调节点上的配置。不需要修改在工作节点上的配置。工作节点将继续通过未经身份验证的HTTP连接到协调节点。但是,如果需要确保openLooKeng节点之间使用SSL/TLS通信,则需要配置“内部通信安全”。

环境配置

Kerberos服务

openLooKeng协调节点通过网络访问的节点上需要运行Kerberos KDC(密钥分发中心)。KDC负责对主体进行身份验证,并为启用Kerberos的服务发布会话密钥。KDC通常在端口88上运行,该端口是IANA为Kerberos分配的端口。

MIT Kerberos配置介绍

Kerberos需要在openLooKeng协调节点上配置。至少需要在/etc/krb5.conf文件中的[realms]小节中有一个kdc条目。还可以增加一个admin_server条目,确保openLooKeng协调节点能够访问端口749上的Kerberos管理服务器。

  1. [realms]
  2. OPENLOOKENG.EXAMPLE.COM = {
  3. kdc = kdc.example.com
  4. admin_server = kdc.example.com
  5. }
  6. [domain_realm]
  7. .openlookeng.example.com = OPENLOOKENG.EXAMPLE.COM
  8. openlookeng.example.com = OPENLOOKENG.EXAMPLE.COM

Krb5.conf的完整文档由麻省理工学院Kerberos项目托管。如果您使用Kerberos协议的不同实现方式,则需要根据您的环境修改配置。

Kerberos主体和Keytab文件

openLooKeng协调节点需要一个Kerberos主体,需要连接到openLooKeng协调节点的用户也需要一个Kerberos主体。可以使用kadmin在Kerberos中创建这些用户。

另外,openLooKeng协调节点需要一个 keytab文件。创建主体后,可以使用kadmin创建keytab文件。

  1. kadmin
  2. > addprinc -randkey openlookeng@EXAMPLE.COM
  3. > addprinc -randkey openlookeng/openlookeng-coordinator.example.com@EXAMPLE.COM
  4. > ktadd -k /etc/openlookeng/openlookeng.keytab openlookeng@EXAMPLE.COM
  5. > ktadd -k /etc/openlookeng/openlookeng.keytab openlookeng/openlookeng-coordinator.example.com@EXAMPLE.COM

注意

运行ktadd会使主体的密钥随机化。如果您刚刚创建了主体,这无关紧要。如果主体已经存在,并且现有用户或服务依赖于能够使用密码或keytab进行验证,则运行ktadd时增加-norandkey选项。

Java加密扩展策略文件

JRE自带策略文件以限制可使用的加密密钥的强度。但默认情况下,Kerberos使用的密钥比策略文件支持的密钥要大。有两种可能的解决方案:

  • 更新JCE策略文件。
  • 配置Kerberos,使用强度降低的密钥。

推荐采用更新JCE策略文件的方案。JCE策略文件可以从Oracle下载。请注意,JCE策略文件因Java主版本而异。例如,Java6的策略文件不能在Java 8中使用。

Java 8策略文件可以从这里获取。ZIP归档文件的README文件中有安装策略文件的说明。如果要在系统JRE中安装策略文件,则需要管理级别的访问权限。

TLS使用的Java 密钥库文件

使用Kerberos身份验证时,应该通过HTTPS访问openLooKeng协调节点。您可以通过在协调节点上创建用于TLS连接的Java密钥库文件来实现。

系统访问控制插件

启用Kerberos的openLooKeng协调节点可能需要一个系统访问控制插件来达到所需的安全级别。

openLooKeng协调节点配置

在配置openLooKeng协调节点使用Kerberos身份验证和HTTPS之前,必须对环境进行上述修改。在完成以下环境修改后,您可以修改openLooKeng配置文件。

  • Kerberos服务
  • MIT Kerberos配置
  • Kerberos主体和Keytab文件
  • 用于TLS的Java密钥库文件
  • 系统访问控制插件

config.properties

在协调节点的config.properties文件中对Kerberos认证进行配置。需要添加的表项如下:

  1. http-server.authentication.type=KERBEROS
  2. http.server.authentication.krb5.service-name=openlookeng
  3. http.server.authentication.krb5.principal-hostname=openlookeng.example.com
  4. http.server.authentication.krb5.keytab=/etc/openlookeng/openlookeng.keytab
  5. http.authentication.krb5.config=/etc/krb5.conf
  6. http-server.https.enabled=true
  7. http-server.https.port=7778
  8. http-server.https.keystore.path=/etc/openlookeng_keystore.jks
  9. http-server.https.keystore.key=keystore_password
属性描述
http-server.authentication.typeopenLooKeng协调节点的认证类型。必须设置为KERBEROS
http.server.authentication.krb5.service-nameopenLooKeng协调节点的Kerberos服务名。服务名必须与Kerberos主体匹配。
http.server.authentication.krb5.principal-hostnameopenLooKeng协调节点的的Kerberos主机名。主机名必须与Kerberos主体匹配。该参数为可选参数。如果设置,openLooKeng将在Kerberos主体的主机部分使用这个值,而不是使用机器的主机名。
http.server.authentication.krb5.keytab用来对Kerberos主体进行身份验证的keytab文件的位置。
http.authentication.krb5.configkerberos配置文件所在的位置。
http-server.https.enabled为openLooKeng协调节点开启HTTPS访问功能。取值设置为true
http-server.https.portHTTPS服务器的端口号。
http-server.https.keystore.path用于TLS安全连接的Java密钥库文件的位置。
http-server.https.keystore.key密钥库的密码。必须与创建密钥库时设置的密码一致。
http-server.authentication.krb5.user-mapping.pattern用于认证用户匹配的正则表达式。如果匹配,认证用户映射到正则表达式中的第一个匹配组;如果不匹配,则拒绝认证。默认值是(.*)
http-server.authentication.krb5.user-mapping.file包含用户映射规则的JSON文件。详见 认证用户映射

注意

http-server.authentication.krb5.user-mapping.patternhttp-server.authentication.krb5.user-mapping.file属性不能同时设置。

开启HTTPS后,监控openLooKeng协调节点的CPU使用率。如果您允许Java从大的列表中选择,那么它更喜欢CPU密集型的加密套件。启用HTTPS后,如果CPU占用率过高,可以通过设置http-server.https.included-cipher属性只允许廉价的密码,使Java使用指定的加密套件。非前向保密密码默认关闭。因此,如果您想选择非前向保密密码,您需要将http-server.https.excluded-cipher属性设置为空列表,以覆盖默认的排除。

  1. http-server.https.included-cipher=TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256
  2. http-server.https.excluded-cipher=

Java资料中列出了支持的加密套件

access-controls.properties

access-control.properties文件必须至少包含access-control.name属性。 其他配置则因配置的实现而异。有关详细信息,请参阅系统访问控制。

异常处理

实现Kerberos身份验证具有挑战性的。您可以独立地验证openLooKeng之外的一些配置,以便在尝试解决问题时缩小您的关注范围。

Kerberos验证

请确保openLooKeng协调节点能够通过telnet连接到KDC。

  1. $ telnet kdc.example.com 88

验证使用keytab文件通过kinitklist成功获取票证功能。

  1. $ kinit -kt /etc/openlookeng/openlookeng.keytab openlookeng@EXAMPLE.COM
  2. $ klist

Java密钥库文件验证

使用Java密钥库文件验证中的方法验证密钥库文件的密码并查看其内容。

Kerberos附加调试信息

通过在openLooKeng jvm.config文件中添加以下行,可以为openLooKeng协调节点进程启用额外的Kerberos调试信息:

  1. -Dsun.security.krb5.debug=true
  2. -Dlog.enable-console=true

-Dsun.security.krb5.debug=true启用来自JRE Kerberos库的Kerberos调试输出。调试输出进入stdout,再被openLooKeng重定向到日志记录系统。-Dlog.enable-console=true使输出到stdout的输出呈现在日志中。

Kerberos调试输出发送到日志的信息量和有用性因身份验证失败的位置而异。异常消息和堆栈跟踪也可以提供有关问题本质的有用线索。

更多资源

常见的Kerberos错误信息(A-M)

常见的Kerberos错误信息(N-Z)

MIT Kerberos文档:故障处理