一篇文章搞懂 HDFS 的 Kerberos 认证

前言

本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系

正文

Kerberos 认证

Kerberos 是一种网络认证协议,它使用加密来提供高度安全的认证机制。

这种认证机制由于具备以下功能而大受欢迎。

  1. 相互认证:在进行会话之前,客户端和服务器可以进行相互认证。
  2. 单点登录:一旦登录,令牌(token)的有效时间就确定了。令牌有效性的持续时间决定了会话的最长时间。
  3. 协议消息加密:认证过程中的所有协议消息都会加密,所以它不可能被对手进行中间人式攻击(man-in-the-middle attack)或是重放攻击(replay attack)。

Kerberos 的架构和工作流

Kerberos 的核心是 Kerberos 密钥分发中心(Key Distribution Center, KDC)。

KDC 有以下两个重要的组件:

  1. 认证服务器(Authentication Server,AS)
  2. 票据授予服务器(Ticket Granting Server,TGS)

认证服务器负责验证客户端的有效性。

票据授予服务器则负责发放令牌或票据(有时间限制且加密的消息),受让人可以使用这些令牌或票据对其自身进行认证。

下图显示了当客户端使用 Kerberos 进行认证时的协议工作流。

Kerberos

  1. 首先,客户端向 Kerberos 中的 AS 请求一个票据授予票据(Ticket Granting Ticket, TGT)
  2. AS 在自己的数据库中检査客户端,然后送回两条消息。第一条消息是会话密钥,第二条则是 TGT。
    这两条消息都使用客户端的密码作为密钥进行了加密。只有当自己的密码和 AS 中保存的密码一致时,客户端才可以使用这个会话密钥和 TGT。
  3. 客户端想要访问服务,首先得提交自己的身份信息到 TGS。
    为了证明其真实性,客户端需要通过它从 AS 那取得的会话密钥向 TGS 发送加密过的认证信息。
  4. TGS 收到请求后,将它解密,然后检査客户端和请求的有效性。成功验证后,TGS 授予一张带有时效的票据,同时也会返回一个服务器会话密钥给客户端。
    这个服务器会话密钥会有两个副本一一一个用客户端的机密信息加密,另一个则用服务器机密信息加密。
  5. 现在,客户端手中握有票据、服务器会话密钥,以及它所需要访问的服务的认证信息。服务所在的服务器验证会话密钥,然后根据验证结果授予访问权限。
    如果需要相互认证,则服务器也会送回认证信息,这样客户端就可以对其有效性进行检查。这是可行的,因为会话密钥有两个副本,分别用服务器和客户端的机密信息进行了加密。

Kerberos 认证和 Hadoop

Hadoop 的认证客户端需要一个密码去进行 Kerberos 的认证工作流。

对于一个长时间运行的 MapReduce 作业来说,这可能不太现实,因为作业时间可能会超出票据的有效时间。

在 Hadoop 中,使用 kinit 命令来初始化客户端得到一个密码。

虽然票据的有效时间可能是几个小时,但对于某些长时间运行的作业,最好是将这个密码写入一个叫 keytab 的文件。

使用 ktutil 命令来创建 keytab 文件。然后使用 -t 参数在 kinit 命令中指定这个 keytab 文件。

klist 命令可以显示一个用户拥有的不同票据。 kdestroy 命令可以注销那些不再使用的票据。

HTTP接口的认证

默认情况下,Hadoop 集群所有的 HTTP 网络端口都没有启用认证。这意味着任何人只要知道网页地址就可以在集群中访问这些不同的服务。

不过可以通过配置 HTTP 网络接口,明确要求 Kerberos 认证使用 HTTPSPNEGO 协议。

这种协议可以很好地支持所有主流的浏览器。

也可以启用简单认证。

这需要在网页地址中追加用户名作为查询字符串的参数。参数的值是这个用户的身份名称。也可以使用自定义的认证方案。

Hadoop 的所有网络端口都支持这种扩展,前提是你正确地重写了 AuthenticatorHandler 类。

可以使用 core-site.xml 中的如下属性来配置 HTTP 认证。

  1. hadoop.htp.filter.initializers

这个属性的值需要配置为 org.apache.hadoop.security.AuthenticationFilterInitializer 类的类名。

  1. hadoop.http.authentication.type

这个属性决定了认证的类型。值可以是 simple 或 kerberos,或自定义 AuthenticatorHandler 派生类的类名。默认值为 simple

  1. hadoop.http.authentication.token.validity

这个属性的值是指认证令牌的有效时长。单位是秒,默认值为36000。超过这个时长就必须重新更新令牌。

  1. hadoop.http.authentication.signature.secret.file

冈络端口的机密信息保存在这个文件中。机密密钥被用于为认证令牌提供一个数字签名。

  1. hadoop.http, authentication.cookie.domain

这是域名白名单,其认证令牌可以通过 cookies 递送。此属性没有默认值。

  1. hadoop.http.authentication.simple.anonymous.allowed

当这个属性设为true时,允许匿名用户连接HTTP端口。默认值为true,并且只有当认证类型设为 simple时这个属性才有效。

7 hadoop.http.authentication.kerberos.principal

当认证类型设为kerberos时所使用的 Kerberos实体名称。

  1. hadoop.http.authentication.kerberos.keytab

这个属性的值是HTTP端口所使用的 Kerberos实体的 keytab文件的路径。

  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
### 回答1: 您好, 如果您的服务器有kerberos安全认证,那么在使用spark-sql操作hdfs文件时,需要进行以下步骤: 1. 配置kerberos认证信息:在spark的配置文件中,需要配置kerberos认证信息,包括krb5.conf文件路径、keytab文件路径、principal等信息。 2. 启用kerberos认证:在spark-submit或spark-shell命令中,需要添加--principal和--keytab参数,指定使用哪个principal和keytab文件进行认证。 3. 配置hdfs认证信息:在hdfs-site.xml文件中,需要配置hadoop.security.authentication为kerberos,并配置hadoop.security.authorization为true。 4. 配置hdfs权限:在hdfs中,需要为spark用户授权,使其能够访问hdfs文件。 完成以上步骤后,您就可以使用spark-sql操作hdfs文件了。如果您还有其他问题,请随时联系我。 ### 回答2: Spark SQL是一种可以结合HDFS文件进行操作的处理引擎,它可以很好地支持Kerberos认证,在保证数据安全的同时,可以使用HDFS文件进行处理和分析。 首先,如果服务器上安装了Kerberos安全认证,那么我们需要先在Spark SQL中配置Kerberos认证,以保证Spark SQL能够正常访问HDFS文件。具体的配置步骤如下: 1. 在Spark的conf目录下找到spark-defaults.conf文件,添加以下配置: spark.hadoop.fs.defaultFS hdfs://namenode:8020 spark.hadoop.hadoop.security.authentication kerberos spark.hadoop.hadoop.security.authorization true spark.hadoop.hadoop.security.auth_to_local "DEFAULT" spark.hadoop.hadoop.security.auth_to_local.rules "RULE:[1:$1@$0](.*@MYREALM.COM)s/@.*//DEFAULT\nRULE:[2:$1@$0](.*@MYREALM.COM)s/@.*//DEFAULT" 2.将Kerberos配置文件krb5.conf放到Spark conf目录下,并且保持与Hadoop配置文件相同。 3.将spark-submit命令添加以下参数: --jars $KRB5_LIB_PATH/krb5-1.13.2.jar,$KRB5_LIB_PATH/javax.security.auth.jar \ --principal ${kinit-user}@${REALM} --keytab ${keytab-file}.keytab 其中,$KRB5_LIB_PATH是Kerberos安装路径,${kinit-user}是Kerberos用户,${REALM}是域名称,${keytab-file}是keytab文件名称。 以上配置完成后,就可以使用Spark SQL对HDFS文件进行处理和分析了。具体的操作步骤如下: 1.创建SparkSession连接: val spark = SparkSession .builder() .appName("Spark SQL Kerberos Demo") .config("spark.sql.warehouse.dir", "$HIVE_HOME/warehouse") .enableHiveSupport() .getOrCreate() 2.加载HDFS文件: val data = spark.read.format("csv") .option("header", "true") .option("inferSchema", "true") .load("hdfs://namenode:8020/user/data/file.csv") 其中,文件路径为HDFS的绝对路径。 3.对数据进行处理: data.createOrReplaceTempView("temp_table") val result = spark.sql("SELECT COUNT(*) FROM temp_table") 其中,将数据加载到临时表中,使用SQL语句对数据进行统计处理。 4.输出结果: result.show() 以上就是使用Spark SQL操作HDFS文件的步骤和方法,并且在Kerberos认证的环境下实现数据的安全处理。通过以上的配置和步骤,我们可以很好地利用Spark SQL来分析和处理大数据,提高数据分析的效率和精度。 ### 回答3: Apache Spark是一种大数据处理框架,它可以快速高效地处理数据,包括从hdfs文件中读取和写入数据。在使用Spark进行数据处理时,很可能需要在kerberos安全认证的服务器上访问hdfs文件,因此需要进行相应的操作。 首先,要在Spark中配置kerberos认证信息。这可以通过在spark-env.sh文件中设置相关的环境变量来实现。以下是一个示例: export HADOOP_CONF_DIR=/etc/hadoop/conf export KRB5_CONF=/etc/krb5.conf export SPARK_OPTS="--driver-java-options=-Djava.security.auth.login.config=/etc/hadoop/conf/kafka_client_jaas.conf" 这里,HADOOP_CONF_DIR指定了hadoop配置文件的路径,KRB5_CONF指定了krb5.conf的路径,SPARK_OPTS指定了Java选项的设置,通过这些设置,Spark将可以访问kerberos下的hdfs文件。 接下来,可以使用Spark SQL来读取和写入hdfs文件。在Spark中,可以使用SparkSession创建一个SQLContext对象,该对象允许使用Spark SQL来查询和处理数据。以下是一个简单的例子: from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("Read and Write from kerberos") \ .getOrCreate() # 读取hdfs文件 data = spark.read.parquet("hdfs://<namenode>/<file-path>") # 进行数据处理和转换 # 写入hdfs文件 data.write.parquet("hdfs://<namenode>/<file-path>") 这里,`SparkSession.builder`用于创建一个SparkSession对象,并指定应用程序名称。使用`spark.read`方法可以让SparkSQL从hdfs中读取数据,使用`data.write`方法可以将处理后的数据写回到hdfs中。 总的来说,通过Spark SQL,我们可以方便地操作hdfs文件,而通过设置kerberos认证信息,我们可以在安全的环境下进行数据处理和存储。这使得Spark在大数据处理方面具有非常广泛的应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值