Skip to content

Commit 5c62d69

Browse files
committed
reverse resolve the namenode hostname for kerberos spn
1 parent f19ae57 commit 5c62d69

File tree

1 file changed

+23
-0
lines changed

1 file changed

+23
-0
lines changed

internal/rpc/kerberos.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"net"
77
"regexp"
88
"sort"
9+
"strings"
910

1011
hadoop "github.com/colinmarc/hdfs/v2/internal/protocol/hadoop_common"
1112
"github.com/colinmarc/hdfs/v2/internal/sasl"
@@ -170,10 +171,32 @@ func (c *NamenodeConnection) readSaslResponse(expectedState hadoop.RpcSaslProto_
170171
return resp, nil
171172
}
172173

174+
func reverseResolve(host string) string {
175+
addrs, err := net.LookupHost(host)
176+
if err != nil {
177+
return ""
178+
}
179+
for _, addr := range addrs {
180+
names, err := net.LookupAddr(addr)
181+
if err != nil {
182+
continue
183+
}
184+
for _, name := range names {
185+
return strings.TrimSuffix(name, ".")
186+
}
187+
}
188+
return ""
189+
}
190+
173191
// getKerberosTicket returns an initial kerberos negotiation token and the
174192
// paired session key, along with an error if any occured.
175193
func (c *NamenodeConnection) getKerberosTicket() (spnego.NegTokenInit, krbtypes.EncryptionKey, error) {
176194
host, _, _ := net.SplitHostPort(c.host.address)
195+
// Hadoop uses the reverse-resolved hostname for the SPN, so we do the same.
196+
// https://github.com/apache/hadoop/blob/7a7db7f0dc4107f44b281eb834fdffc9fd9b08b3/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSUtil.java#L445
197+
if revHost := reverseResolve(host); revHost != "" {
198+
host = revHost
199+
}
177200
spn := replaceSPNHostWildcard(c.kerberosServicePrincipleName, host)
178201

179202
ticket, key, err := c.kerberosClient.GetServiceTicket(spn)

0 commit comments

Comments
 (0)