个人 Java 程序需要 Kerberos 认证, 但是是在集群的环境中用 Map-Reduce 跑, 没有权限修改默认的 /etc/krb5.conf
文件.
刚开始我参考的这个: Kerberos Environment variables, 设置 KRB5_CONFIG
export KRB5_CONFIG=/path/to/krb5.conf
程序运行中, 报各种错, 如:
javax.security.auth.login.LoginException: Unable to obtain password from user
以及
javax.security.auth.login.LoginException: java.lang.IllegalArgumentException: Illegal principal name ..
...
org.apache.hadoop.security.authentication.util.KerberosName$NoMatchingRule: No rules applied to
各种 check 和测试都未能解决.
偶然发现修改系统的 /etc/krb5.conf
后, 程序能正常运行, 由此确定 Java 环境并没有使用 KRB5_CONFIG
环境变量.
在 Java Kerberos Requirements 找到生效的配置方式, 将 krb5.conf
放在 $JAVA_HOME/jre/lib/security/
下即可.
当然, 也可以通过 java 命令行参数设置:
-Djava.security.krb5.conf=./conf/krb5.conf
安全相关的设置实在是比较繁琐, 而 Kerberos 认证很多时候很难从报错找到实际的对应原因. 从目前来看, 安全很多地方在运维和开发中维护都不容易. 可见任重而道远.