java - 通过 Java API 从远程主机访问 HDFS,用户身份验证

标签 java security authentication hadoop hdfs

我需要通过 Java API 从远程桌面使用 HDFS 集群。在写访问之前一切正常。如果我尝试创建任何文件,我都会收到访问权限异常。路径看起来不错,但异常指示我的远程桌面用户名,这当然不是我访问所需 HDFS 目录所需要的。

问题是: - 有什么方法可以在 Java API 中使用“简单”身份验证来表示不同的用户名? - 您能否用 Java API 示例对 hadoop/HDFS 中的身份验证/授权方案进行一些很好的解释?

是的,我已经知道在这种情况下使用 shell 别名可能会使 'whoami' 过载,但我更愿意避免这样的解决方案。这里还有一些细节是我不喜欢使用一些技巧,比如通过 SSH 和脚本的管道。我想只使用 Java API 执行所有操作。 提前谢谢你。

最佳答案

经过一番研究,我得出以下解决方案:

  • 我实际上不需要完整的 Kerberos 解决方案,目前客户端可以运行来自任何用户的 HDFS 请求就足够了。环境本身被认为是安全的。
  • 这为我提供了基于 hadoop UserGroupInformation 类的解决方案。将来我可以扩展它以支持 Kerberos。

示例代码可能对“假身份验证”和远程 HDFS 访问都有用:

package org.myorg;

import java.security.PrivilegedExceptionAction;

import org.apache.hadoop.conf.*;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileStatus;

public class HdfsTest {

    public static void main(String args[]) {

        try {
            UserGroupInformation ugi
                = UserGroupInformation.createRemoteUser("hbase");

            ugi.doAs(new PrivilegedExceptionAction<Void>() {

                public Void run() throws Exception {

                    Configuration conf = new Configuration();
                    conf.set("fs.defaultFS", "hdfs://1.2.3.4:8020/user/hbase");
                    conf.set("hadoop.job.ugi", "hbase");

                    FileSystem fs = FileSystem.get(conf);

                    fs.createNewFile(new Path("/user/hbase/test"));

                    FileStatus[] status = fs.listStatus(new Path("/user/hbase"));
                    for(int i=0;i<status.length;i++){
                        System.out.println(status[i].getPath());
                    }
                    return null;
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

对有类似问题的人有用的引用:

  • Cloudera 博客文章“Authorization and Authentication In Hadoop”。简短,侧重于对 hadoop 安全方法的简单解释。没有特定于 Java API 解决方案的信息,但有助于基本了解问题。

更新:
对于那些使用命令行 hdfshadoop 实用程序而不需要本地用户的人的替代方案:

 HADOOP_USER_NAME=hdfs hdfs fs -put /root/MyHadoop/file1.txt /

您实际做的是根据您的本地权限读取本地文件,但是当将文件放在 HDFS 上时,您会像用户 hdfs 一样进行身份验证。

这与说明的 API 代码具有非常相似的属性:

  1. 您不需要 sudo
  2. 您不需要真正合适的本地用户“hdfs”。
  3. 您不需要因为之前的几点而复制任何内容或更改权限。

关于java - 通过 Java API 从远程主机访问 HDFS,用户身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15941108/

相关文章:

postgresql - AWS RDS Postgres/Iam 身份验证/和行级安全性 - 合而为一。这可能吗?

ios - 我可以将敏感信息放入 iOS 应用程序的源代码中吗?

java - 无法使用 Fresco 从 Google Cloud Storage 加载公共(public)图像

java - Scala 按分隔符拆分列表的惯用方法是什么?

java - Android 上的安全性

php - 我在 PHP 中使用 Django 用户身份验证。这种基于 cookie 的身份验证方案是否安全?

http - 主干 HTTP 基本 rest api 身份验证

azure - 使用用户分配的托管标识连接到 Azure Databricks

java - 为什么在 JDK 7 中,使用 try-with-resources 特性可以自动关闭文件?

java - 如何在 Arquillian 中测试 JPA