Spring Docker Kerberos WebHDFS身份验证异常:未经授权

Spring Docker Kerberos WebHDFS身份验证异常:未经授权,spring,docker,hdfs,kerberos,webhdfs,Spring,Docker,Hdfs,Kerberos,Webhdfs,我有一个Spring应用程序,它使用WebHDFS从HDFS读取文件。当我在IDEA中测试它时,它是有效的。但在我构建项目并将Docker映像部署到本地虚拟机或连接到HDFS的服务器上后,我得到: AuthenticationException: Unauthorized 在我的本地机器上,我必须定期使用 kinit 为了诱惑。如果我没有,我会得到同样的错误。我在没有Docker的情况下在服务器上测试了这个应用程序,它也可以工作。我认为Docker图像没有看到令牌。但我不知道该怎么办 Ker

我有一个Spring应用程序,它使用WebHDFS从HDFS读取文件。当我在IDEA中测试它时,它是有效的。但在我构建项目并将Docker映像部署到本地虚拟机或连接到HDFS的服务器上后,我得到:

AuthenticationException: Unauthorized
在我的本地机器上,我必须定期使用

kinit
为了诱惑。如果我没有,我会得到同样的错误。我在没有Docker的情况下在服务器上测试了这个应用程序,它也可以工作。我认为Docker图像没有看到令牌。但我不知道该怎么办

Kerberos用于安全性


有什么建议吗?

好的。我做到了。有一些问题,但这就是最终的变体的外观

我的码头工人。krb5.conf和keytab与我的docker文件位于同一文件夹中。当我构建项目时,它们被添加到容器和我使用的入口点中

-Djava.security.krb5.conf
提供krb5位置。还有一些选项可用于调试+I connect mongo

FROM java:8
ADD report.jar report.jar
ADD krb5.conf /etc/krb5.conf
ADD evkuzmin.keytab /etc/evkuzmin.keytab
RUN sh -c 'touch report.jar'
ENTRYPOINT ["java","-Dspring.data.mongodb.uri=mongodb://audpro_mongo/report","-Djavax.net.debug=all","-Dsun.security.spnego.debug=true","-Dsun.security.krb5.debug=true","-Djava.security.krb5.conf=/etc/krb5.conf","-jar","/report.jar"]
然后我使用
kerberosrestemplate
连接到webhdfs

public String getReportJSON() throws URISyntaxException {
    KerberosRestTemplate restTemplate = new 
         KerberosRestTemplate("/etc/evkuzmin.keytab", "EvKuzmin@DOMAIN");
    URI uri = new URI("http" + "://" + host + ":" + port + "/webhdfs/v1" + path + "?op=OPEN");
    String json = restTemplate.getForObject(uri, String.class);
    return json;
  }

如果您想在没有docker的情况下运行应用程序,只需构建它并将keytab添加到与jar相同的方向。然后更改
/etc/evkuzmin.keytab
,使其指向新位置。

应避免在图像构建中添加本应保密的密钥。运行时平台(如Kubernetes)应以安全的方式(即卷)注入它们。