Hadoop安全模式+JAAS原理及实现

hadoop学习 专栏收录该内容
2 篇文章 0 订阅

1. Authentication

  • kerberos

2. Proxy user

这里写图片描述

3. Secure DataNode

  • Because the DataNode data transfer protocol does not use the Hadoop RPC framework, DataNodes must authenticate themselves using privileged ports which are specified by dfs.datanode.address and dfs.datanode.http.address.
  • (1) dfs.datanode.address 配置成privileged ports(端口号必须小于 1024),然后在hadoop-env.sh中设置环境变量 HADOOP_SECURE_DN_USER(hdfs) and JSVC_HOME 。
  • (2) As of version 2.6.0, SASL (Simple Authentication and Security Layer和SSL[Secure Sockets Layer 安全套接层])can be used to authenticate the data transfer protocol.
  • 在 hdfs-site.xml中设置dfs.data.transfer.protection为true,dfs.datanode.address设置为non-privileged,dfs.http.policy为HTTPS_ONLY。
  • 同时保证hadoop-env.sh中设置环境变量HADOOP_SECURE_DN_USER没被设置。

4. Data confidentiality(数据保密性)

  • Data Encryption on RPC
    The data transfered between hadoop services and clients can be encrypted on the wire. Setting hadoop.rpc.protection to privacy in core-site.xml activates data encryption.
  • Data Encryption on Block data transfer.
    set dfs.encrypt.data.transfer to true in the hdfs-site.xml in order to activate data encryption for data transfer protocol of DataNode.
    Optionally, you may set dfs.encrypt.data.transfer.algorithm to either 3des or rc4 to choose the specific encryption algorithm. If unspecified, then the configured JCE default on the system is used, which is usually 3DES.
  • Data Encryption on HTTP
    Data transfer between Web-console and clients are protected by using SSL(HTTPS). SSL configuration is recommended but not required to configure Hadoop security with Kerberos.

5. JAAS原理


  • JAAS的可扩展性来源于它能够进行动态配置,而配置信息通常是保存在文本。这些文本文件有很多个配置块构成,我们通常把这些配置块称作申请(Application)。每个申请对应了一个或多个特定的LoginModule对象。
  • 当你的代码构造一个LoginContext对象时,你需要把配置文件中申请的名称传递给它。LoginContext将会根据申请中的信息决定激活哪些LoginModule对象,按照什么顺序激活以及使用什么规则激活。
  • 下图为一个申请的示例
    这里写图片描述
  • 下图为JAAS的配置文件
    这里写图片描述
  • 下图为JAAS集成认证过程
    这里写图片描述
  • JAAS认证授权的基本流程
    这里写图片描述
  • 至此,可以总结出,实现一个LoginModule的大致步骤如下:
    1. 实现***LoginModul类,该类可以对输入的信息进行验证。(5个方法)【LoginContext在调用login()方法时会调用initialize()方法。***LoginModule的第一个任务就是在类中保存输入参数的引用。在验证成功后将向Subject对象中送入Principal对象和凭证。】
    2. 编辑一个配置文件,告诉LoginContext如何使用RdbmsLoginModule。
      3. 实现CallbackHandler类,通过该类可以获取用户的输入。
      4. 编写应用程序代码。

initialize()
//在LoginModule类的initialize()方法中保存了Application中每个参数的值。
public void initialize(Subject subject, CallbackHandler
callbackHandler,Map sharedState, Map options)
{
this.subject = subject;
this.callbackHandler = callbackHandler;//CallbackHandler对象将会在login()方法中被使用到。
this.sharedState = sharedState;//sharedState可以使数据在不同的LoginModule对象之间共享。
this.options = options;//options向LgoinModule对象传递在配置文件ModuleOption域中定义的参数的值。

url = (String)options.get("url");
driverClass = (String)options.get("driver");
debug = "true".equalsIgnoreCase((String)options.get("debug"));
}

login()

public boolean login() throws LoginException {
if (callbackHandler == null)
throw new LoginException("no handler");

NameCallback nameCb = new NameCallback("user: ");//创建两个Callback对象。这些对象从用户输入中获取用户名/密码。
PasswordCallback passCb = new PasswordCallback("password: ", true);//程序中使用了JAAS中的两个Callback类:NameCallback和PasswordCallback(这两个类包含在javax.security.auth.callback包中)。
callbacks = new Callback[] { nameCb, passCb };
callbackHandler.handle(callbacks);//通过将callbacks作为参数传递给CallbackHandler的handle()方法来激活Callback。

String username = nameCb.getName();//通过Callback对象获得用户名/密码。
String password = new String(passCb.getPassword());
...
authentication();
...
}

ConsoleCallbackHandler.handle()

//Callback对象同用户进行交互
public void handle(Callback[] callbacks)
throws java.io.IOException, UnsupportedCallbackException {

for (int i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof NameCallback) {
NameCallback nameCb = (NameCallback)callbacks[i];
System.out.print(nameCb.getPrompt());
String user=(new BufferedReader(new

InputStreamReader(System.in))).readLine();
nameCb.setName(user);
} else if (callbacks[i] instanceof PasswordCallback) {
PasswordCallback passCb = (PasswordCallback)callbacks[i];
System.out.print(passCb.getPrompt());
String pass=(new BufferedReader(new

InputStreamReader(System.in))).readLine();
passCb.setPassword(pass.toCharArray());
} else {
throw(new UnsupportedCallbackException(callbacks[i],
"Callback class not supported"));
...
}
展开阅读全文
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页

打赏

sfiayui123

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值