kirby zhou created RANGER-4326:
----------------------------------
Summary: Cannot renew token when multiple KMS are applied.
Key: RANGER-4326
URL: https://issues.apache.org/jira/browse/RANGER-4326
Project: Ranger
Issue Type: Bug
Components: kms
Affects Versions: 2.4.0, 2.3.0
Reporter: kirby zhou
When multiple KMS are applied with kerberos. Flink on yarn can not renew tokens.
Flink calls FileSystem.addDelegationTokens to get all tokens to renew.
FileSystem.addDelegationTokens calls collectDelegationTokens to collect all
tokens.
When it calls LoadBalancingKMSClientProvider.getDelegationToken.
LoadBalancingKMSClientProvider calls doOp to call one of N
KMSClientProvider.getDelegationToken().
When renew the token, LoadBalancingKMSClientProvider may call another
KMSClientProvider to do op. It usually fails.
FYI: have already set hadoop.kms.authentication.signer.secret.provider=file,
and hadoop.kms.authentication.signature.secret.file="same content file".
Some Sample code:
{code:java}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
conf.set("hadoop.security.authorization", "true");
conf.set("hadoop.security.authentication", "kerberos");
conf.set("dfs.data.transfer.protection", "authentication");
conf.set("hadoop.security.key.provider.path",
"kms://http@kms01;kms02:9292/kms");
conf.set("dfs.client.ignore.namenode.default.kms.uri", "true");
conf.set("fs.defaultFS", "hdfs://namenode");
// Login with keytab
UserGroupInformation.setConfiguration(conf);
UserGroupInformation.loginUserFromKeytab("testuser@TESTREALM",
"/Users/kirbyzhou/Develop/testuser.keytab");
UserGroupInformation ugi = UserGroupInformation.getCurrentUser();
System.out.println(UserGroupInformation.getCurrentUser().getUserName());
// GetFS
FileSystem fs = FileSystem.get(conf);
System.out.println(((DistributedFileSystem)fs).getClient().getKeyProviderUri());
// Renew
for (int i = 0; i < 20; ++i) {
Thread.sleep(200);
System.out.printf("===========pass %02d===========\n", i);
{
System.out.println("==begin renew==");
Credentials credentials = ugi.getCredentials();
fs.addDelegationTokens("sa_cluster", credentials);
for (Token<?> token : credentials.getAllTokens()) {
System.out.println(token);
try {
token.renew(conf);
} catch (IOException e) {
System.err.println(e);
}
}
System.out.println("==end renew==");
}
}
}
{code}
A lot of exceptions happens
{code:java}
ava.io.IOException: HTTP status [403], message [Forbidden], URL
[http://kms01:9292/kms/v1/?op=RENEWDELEGATIONTOKEN&token=KgAKc2FfY2x1c3RlcgpzYV9jbHVzdGVyAIoBiYffA4WKAYmr64eFjgG_AhQ7Oo9G0Lc8IguxB0IgenAHsJ--DQZrbXMtZHRPa21zOi8vaHR0cEBrbXMwMS10aHJvbmUwMS5zZW5zb3JzZGF0YS5jbjtrbXMwMi10aHJvbmUwMS5zZW5zb3JzZGF0YS5jbjo5MjkyL2ttcw],
exception [com.fasterxml.jackson.core.JsonParseException: Unexpected character
('<' (code 60)): expected a valid value (JSON String, Number, Array, Object or
token 'null', 'true' or 'false') at [Source:
(sun.net.www.protocol.http.HttpURLConnection$HttpInputStream); line: 1, column:
2]] at
org.apache.hadoop.util.HttpExceptionUtils.validateResponse(HttpExceptionUtils.java:167)
~[classes/:?] at
org.apache.hadoop.security.token.delegation.web.DelegationTokenAuthenticator.doDelegationTokenOperation(DelegationTokenAuthenticator.java:318)
~[hadoop-common-3.3.4.jar:?] at
org.apache.hadoop.security.token.delegation.web.DelegationTokenAuthenticator.renewDelegationToken(DelegationTokenAuthenticator.java:235)
~[hadoop-common-3.3.4.jar:?] at
org.apache.hadoop.security.token.delegation.web.DelegationTokenAuthenticatedURL.renewDelegationToken(DelegationTokenAuthenticatedURL.java:435)
~[hadoop-common-3.3.4.jar:?] at
org.apache.hadoop.crypto.key.kms.KMSClientProvider$4.run(KMSClientProvider.java:1072)
~[hadoop-common-3.3.4.jar:?] at
org.apache.hadoop.crypto.key.kms.KMSClientProvider$4.run(KMSClientProvider.java:1069)
~[hadoop-common-3.3.4.jar:?] at
java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_332] at
javax.security.auth.Subject.doAs(Subject.java:422) ~[?:1.8.0_332] at
org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1878)
~[hadoop-common-3.3.4.jar:?] at
org.apache.hadoop.crypto.key.kms.KMSClientProvider.renewDelegationToken(KMSClientProvider.java:1068)
~[hadoop-common-3.3.4.jar:?] at
org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider$2.call(LoadBalancingKMSClientProvider.java:270)
~[hadoop-common-3.3.4.jar:?] at
org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider$2.call(LoadBalancingKMSClientProvider.java:267)
~[hadoop-common-3.3.4.jar:?] at
org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider.doOp(LoadBalancingKMSClientProvider.java:175)
[hadoop-common-3.3.4.jar:?] at
org.apache.hadoop.crypto.key.kms.LoadBalancingKMSClientProvider.renewDelegationToken(LoadBalancingKMSClientProvider.java:267)
[hadoop-common-3.3.4.jar:?] at
org.apache.hadoop.crypto.key.kms.KMSClientProvider$KMSTokenRenewer.renew(KMSClientProvider.java:201)
[hadoop-common-3.3.4.jar:?] at
org.apache.hadoop.security.token.Token.renew(Token.java:497)
[hadoop-common-3.3.4.jar:?] at CallHDFS2.main(CallHDFS2.java:42)
[classes/:?]Caused by: com.fasterxml.jackson.core.JsonParseException:
Unexpected character ('<' (code 60)): expected a valid value (JSON String,
Number, Array, Object or token 'null', 'true' or 'false') at [Source:
(sun.net.www.protocol.http.HttpURLConnection$HttpInputStream); line: 1, column:
2]
{code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)