Skip to content

Commit 6c63cad

Browse files
committed
reverse resolve the namenode hostname for kerberos spn
1 parent f19ae57 commit 6c63cad

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed

internal/rpc/kerberos.go

Lines changed: 45 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,54 @@ func (c *NamenodeConnection) readSaslResponse(expectedState hadoop.RpcSaslProto_
170171
return resp, nil
171172
}
172173

174+
func isValidHostname(host string, addr string) bool {
175+
addrs, err := net.LookupHost(host)
176+
if err != nil {
177+
return false
178+
}
179+
if len(addrs) == 0 {
180+
return false
181+
}
182+
for _, a := range addrs {
183+
if a != addr {
184+
return false
185+
}
186+
}
187+
return true
188+
189+
}
190+
191+
func reverseLookup(host string, restrict bool) string {
192+
addrs, err := net.LookupHost(host)
193+
if err != nil {
194+
return ""
195+
}
196+
for _, addr := range addrs {
197+
names, err := net.LookupAddr(addr)
198+
if err != nil {
199+
continue
200+
}
201+
for _, name := range names {
202+
if restrict {
203+
if !isValidHostname(name, addr) {
204+
continue
205+
}
206+
}
207+
return strings.TrimSuffix(name, ".")
208+
}
209+
}
210+
return ""
211+
}
212+
173213
// getKerberosTicket returns an initial kerberos negotiation token and the
174214
// paired session key, along with an error if any occured.
175215
func (c *NamenodeConnection) getKerberosTicket() (spnego.NegTokenInit, krbtypes.EncryptionKey, error) {
176216
host, _, _ := net.SplitHostPort(c.host.address)
217+
// Hadoop uses the reverse-resolved hostname for the SPN, so we do the same.
218+
// https://github.com/apache/hadoop/blob/7a7db7f0dc4107f44b281eb834fdffc9fd9b08b3/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/DFSUtil.java#L445
219+
if revHost := reverseLookup(host, true); revHost != "" {
220+
host = revHost
221+
}
177222
spn := replaceSPNHostWildcard(c.kerberosServicePrincipleName, host)
178223

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

0 commit comments

Comments
 (0)