SPNEGO
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如下:
- 客户端发送
OPTIONS
请求 - 服务器回复401(Unauthorized),并且响应头
WWW-Authenticate
以Negotiate
开头,那么开始Spnego流程。
Hadoop默认支持的身份验证机制包括简单身份验证(也称为伪身份验证)和Kerberos SPNEGO身份验证。
也可以通过Authenticator实现支持其他身份验证机制。
默认的Authenticator是KerberosAuthenticator类
客户端身份验证机制的接口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