`

我对cdh4安全机制的解读

 
阅读更多
     老大让我看cdh4的安全机制的实现,说实话,没有太多的思路。然后老大说,安全认证不通过肯定会抛异常,然后我就从异常入手了。


  目测 AccessControlException比较像,然后看到他有个子类:AuthorizationException。这个受众更小,更容易做为切入点,好,就这个了。

 public void authorize(UserGroupInformation user, 
                               Class<?> protocol,
                               Configuration conf,
                               InetAddress addr
                               ) throws AuthorizationException {
    AccessControlList acl = protocolToAcl.get(protocol);
    if (acl == null) {
      throw new AuthorizationException("Protocol " + protocol + 
                                       " is not known.");
    }
    
    // get client principal key to verify (if available)
    KerberosInfo krbInfo = SecurityUtil.getKerberosInfo(protocol, conf);
    String clientPrincipal = null; 
    if (krbInfo != null) {
      String clientKey = krbInfo.clientPrincipal();
      if (clientKey != null && !clientKey.equals("")) {
        try {
          clientPrincipal = SecurityUtil.getServerPrincipal(
              conf.get(clientKey), addr);
        } catch (IOException e) {
          throw (AuthorizationException) new AuthorizationException(
              "Can't figure out Kerberos principal name for connection from "
                  + addr + " for user=" + user + " protocol=" + protocol)
              .initCause(e);
        }
      }
    }
    if((clientPrincipal != null && !clientPrincipal.equals(user.getUserName())) || 
        !acl.isUserAllowed(user)) {
      AUDITLOG.warn(AUTHZ_FAILED_FOR + user + " for protocol=" + protocol
          + ", expected client Kerberos principal is " + clientPrincipal);
      throw new AuthorizationException("User " + user + 
          " is not authorized for protocol " + protocol + 
          ", expected client Kerberos principal is " + clientPrincipal);
    }
    AUDITLOG.info(AUTHZ_SUCCESSFUL_FOR + user + " for protocol="+protocol);
  }


这里是会抛出AuthorizationException异常的。
我比较关注kerberos的部分:clientPrincipal.equals(user.getUserName()

 clientPrincipal = SecurityUtil.getServerPrincipal(
              conf.get(clientKey), addr);


KerberosInfo krbInfo = SecurityUtil.getKerberosInfo(protocol, conf);


关键是clientKey,但是clientKey需要krbInfo。所以krbInfo就是最关键的地方了。

for(SecurityInfo provider: securityInfoProviders) {
KerberosInfo result = provider.getKerberosInfo(protocol, conf);


那这里是的securityInfoProviders是怎么来的呢:
  private static ServiceLoader<SecurityInfo> securityInfoProviders = 
    ServiceLoader.load(SecurityInfo.class);

这里使用了ServiceLoader,我们看到hadoop-commom的META-INF\services文件夹,有个叫org.apache.hadoop.security.SecurityInfo的文件名,内容是
org.apache.hadoop.security.AnnotatedSecurityInfo


public class AnnotatedSecurityInfo extends SecurityInfo {

  @Override
  public KerberosInfo getKerberosInfo(Class<?> protocol, Configuration conf) {
    return protocol.getAnnotation(KerberosInfo.class);
  }


意思就是返回protocol对应类的注解KerberosInfo 就可以了。

protocol = getProtocolClass(protocolName, getConf());


这个类似根据protocolName反射得到的。



可以看到protocolName是从数据流中读取的,
processOneRpc(data.array());

这里的data就是protocolName的源头了。

现在能拿到clientKey,再回过头来。  
clientPrincipal = SecurityUtil.getServerPrincipal(
              conf.get(clientKey), addr);


这里就与conf扯上关系了,conf的各个key和value都是系统初始化进去的。
clientPrincipal 只是conf对应的value替换掉主机名而已。看到替换规则,这些value应该是以[/@]来分隔的,但是我看了conf的初始化过程,没有找见有这样的value.
  • 大小: 63.1 KB
  • 大小: 82.6 KB
分享到:
评论

相关推荐

    CDH安全技术方案.docx

    CDH安全技术方案:关于 配置TLS证书、2 配置Kerberos、3 配置Sentry和4 集成Hive

    hadoop-cdh4-0.3.zip

    presto-hadoop-cdh4.zip,CDH4 Hadoop for Presto的阴影版本CDH4 Hadoop for Presto的阴影版本

    cloudera CDH4 installation guide 4.0(pdf)

    cloudera公司的CDH4版本hadoop安装说明

    CDH6.3.2安装包下载

    由于CSDN上传文件大小限制,大家可以下载《CDH6.3.2下载.txt》获取网盘地址进行下载,我打包了CDH6.3.2 搭建所需要的各种安装文件,包括: manifest.json cloudera-manager.repo RPM-GPG-KEY-cloudera cm6.3.1-...

    CDH5.12.0资源下载

    CDH5.12.0

    cdh6.3.2 集成 Phoenix

    cdh6.3.2 适配 Phoenix; cdh6.3.2 集成 Phoenix

    ubuntu-CDH6.3.2完整安装包网盘下载地址

    CDH6.3.2完整安装包网盘下载,包含 CDH-6.3.2-1.cdh6.3.2.p0.1605554-bionic.parcel、CDH-6.3.2-1.cdh6.3.2.p0.1605554-bionic.parcel.sha1、CDH-6.3.2-1.cdh6.3.2.p0.1605554-bionic.parcel.sha256、CDH-6.3.2-1....

    CDH7.1.5离线安装包下载

    CDH7及以上版本已经更名为CDP 本资源打包了CDH7.1.5 搭建所需要的各种安装文件,包括: cm7.2.4-redhat7.tar.gz manifest.json cloudera-manager.repo RPM-GPG-KEY-cloudera CDH-7.1.5-1.cdh7.1.5.p0.7431829-el7....

    CDH6.3.2安装包及下载地址

    也就是说CDH各版本都不能免费获取了。 整个过程不需要依赖外网,全部为离线安装。 包括: manifest.json CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel.sha CDH-6.3.2-1....

    CDH集群部署手册(For CDH5)

    详细描述CDH集群部署 1规划服务器 2 2安装和配置Mysql数据库 4 3离线安装Cloudera Manager5和CDH5 7 3.1创建本地yum软件源 7 3.2使用本地类库安装CM 10 3.3 设置cloudera manager使用的mysql数据库 10 3.4 使用本地...

    cdh7.1.7和cm7.4.4软件包下载及cdh7安装步骤

    cdh7.1.7包括: CDH-7.1.7-1.cdh7.1.7.p0.15945976-el7.parcel CDH-7.1.7-1.cdh7.1.7.p0.15945976-el7.parcel.sha1 CDH-7.1.7-1.cdh7.1.7.p0.15945976-el7.parcel.sha256 manifest.json cm7.4.7包括: cloudera-...

    CDH5.15.2资源下载

    CDH5.15.2资源下载

    CDH6.3.3安装bao下载

    CDH-6.3.3-1.cdh6.3.3.p0.1796617-el7.parcel CDH-6.3.3-1.cdh6.3.3.p0.1796617-el7.parcel.sha1 CDH-6.3.3-1.cdh6.3.3.p0.1796617-el7.parcel.sha256 如遇技术问题可添加微信咨询:15854186970

    Hadoop-2.0.0-cdh4.3.0安装手册(hbase-0.94.15-cdh4.6.0)

    ha 方式安装 cdh4,hbase,补充原文档的内容

    CDH6.3.2安装包及安装教程

    CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel.sha1 CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel.sha256 cloudera-manager-server-6.3.1-1466458.el7.x86_64.rpm ...

    cdh6.3.1离线完整版(百度网盘下载)

    CDH安装包

    cdh632安装包.txt

    cdh

    德力西CDH3隔离开关对折页.pdf.pdf

    德力西CDH3隔离开关对折页.pdfpdf,CDH3分断可视隔离开关 1、应用范围 CDH3隔离开关,适用于交流50HZ、400V,额定电流32A至125A的电阻电路中,主要供无负载情况下接通或断开电路,用作线路与电源接通之用,尤其适合...

    linux下部署CDH6.0.1详细步骤

    4.安装CDH集群; 请务必注意CDH6的安装前置条件包括如下: • 外部数据库支持: 1.MySQL 5.7或更高 2.MariaDB 5.5或更高 3.PostgreSQL 8.4或更高 4.Oracle 12c或更高 • JDK Oracle JDK1.8,将不再支持JDK1.7 • ...

Global site tag (gtag.js) - Google Analytics