[
https://issues.apache.org/jira/browse/RANGER-4326?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17746747#comment-17746747
]
kirby zhou commented on RANGER-4326:
------------------------------------
// A more simpler example to reproduce 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");
final String dtCombineService = "kms://http@kms01;kms02:9292/kms";
final String kmsURI1 = "kms://http@kms01/kms";
final String kmsURI2 = "kms://http@kms02/kms";
// Logon UserGroupInformation.setConfiguration(conf);
UserGroupInformation.loginUserFromKeytab("myuser", "my.keytab");
UserGroupInformation ugi = UserGroupInformation.getCurrentUser();
String username = ugi.getShortUserName();
System.out.println(username);
// new keyproider KMSClientProvider kms1 = new
KMSClientProvider(new URI(kmsURI1), conf);
KMSClientProvider kms2 = new KMSClientProvider(new URI(kmsURI2), conf);
// do renew Token<?> token1 = kms1.getDelegationToken(username);
token1.setService(new Text(dtCombineService));
System.out.println("renew token1 through kms2 begin");
kms2.renewDelegationToken(token1);
System.out.println("renew token1 through kms2 done");
}
> 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.3.0, 2.4.0
> Reporter: kirby zhou
> Priority: Major
>
> 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)