java 安全Hadoop

SPNEGO

2018-10-14  本文已影响357人  spraysss

GSSAPI

GSSAPI为 Generic Security Services Application Program Interface 的缩写,即:通用安全服务应用程序接口,GSSAPI是一个IETF标准,它解决了当今使用的许多类似但不兼容的安全服务的问题。
GSSAPI只是一个标准的安全接口,相应的实现由相关的软件供应商完成,开发者面向接口编程就完事了。
GSSAPI应用程序用于交换令牌(token),对高层应用隐藏其实现细节。。GSSAPI实现在不安全的网络环境中实现安全的token传递。在交换了一些令牌之后,两端的GSSAPI实现会通知本地应用程序已经建立了安全上下文。
一旦建立了安全上下文,敏感的应用程序消息就可以由GSSAPI包装(加密),以便在客户机和服务器之间进行安全通信。

SPNEGO

Simple and Protected GSSAPI Negotiation Mechanism (SPNEGO) 即
简单且受保护的GSSAPI协商机制,是客户端-服务器软件用于协商安全技术选择的GSSAPI过程。当客户端想要向服务器认证身份,但是客户端和服务器都不知道对方支持什么认证协议。这时需要使用SPNEGO来选择双方都支持的GSSAPI ,以便接下来的认证过程以及后续安全信息传输的正常进行

Hadoop Auth, Java HTTP SPNEGO

Hadoop Auth是一个Java库,它由一个客户机和一个服务器组件组成,用于为HTTP启用Kerberos SPNEGO身份验证。

工作原理
Hadoop Auth对受保护的资源执行身份验证, 认证过程成功完成后会设置一个有认证token(令牌)的签名HTTP Cookie。
token由用户名 (user name),主体( user principal),认证类型( authentication type和过期时间 (expiration time)构成。
之后的客户端就可以使用携带这个有token的cookie访问受保护资源,直到token过期
用于签名HTTP Cookie的有多个实现,它们提供不同的行为:如下图

签名类

java 客户端

客户端使用AuthenticatedURL java类来访问由AuthenticationFilter保护的http资源。


image.png

java client demo:
通过AuthenticatedURL的openConnection返回一个授HttpURLConnection

 AuthenticatedURL.Token token = new AuthenticatedURL.Token();
      URL url = new URL(args[0]);
      HttpURLConnection conn = new AuthenticatedURL().openConnection(url, token);
      System.out.println();
      System.out.println("Token value: " + token);
      System.out.println("Status code: " + conn.getResponseCode() + " " + conn.getResponseMessage());

openConnection方法如下:

  public HttpURLConnection openConnection(URL url, Token token) throws IOException, AuthenticationException {
        if (url == null) {
            throw new IllegalArgumentException("url cannot be NULL");
        }
        if (!url.getProtocol().equalsIgnoreCase("http") && !url.getProtocol().equalsIgnoreCase("https")) {
            throw new IllegalArgumentException("url must be for a HTTP or HTTPS resource");
        }
        if (token == null) {
            throw new IllegalArgumentException("token cannot be NULL");
        }
        authenticator.authenticate(url, token);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        if (connConfigurator != null) {
            conn = connConfigurator.configure(conn);
        }
        injectToken(conn, token);
        return conn;
    }

openConnection中调用 authenticator.authenticate(url, token);来生成token。

Spnego如下:

  1. 客户端发送OPTIONS请求
  2. 服务器回复401(Unauthorized),并且响应头WWW-AuthenticateNegotiate开头,那么开始Spnego流程。

Hadoop默认支持的身份验证机制包括简单身份验证(也称为伪身份验证)和Kerberos SPNEGO身份验证。
也可以通过Authenticator实现支持其他身份验证机制。
默认的Authenticator是KerberosAuthenticator类

客户端身份验证机制的接口Authenticator

Authenticator类图

KerberosAuthenticator实现Kerberos SPNEGO身份验证流程。它使用Kerberos缓存的默认主体(通常通过kinit设置),如果HTTP端点没有触发SPNEGO身份验证,则回退使用PseudoAuthenticator

参考文献

https://en.wikipedia.org/wiki/SPNEGO
http://hadoop.apache.org/docs/stable/hadoop-auth/index.html

上一篇 下一篇

猜你喜欢

热点阅读