mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2024-05-11 05:55:12 +00:00
Add missing MD5 support (#1866)
This commit is contained in:
committed by
GitHub
parent
96e4e88fc5
commit
4cf4d34ca6
@ -211,3 +211,7 @@ When AutoDNSSEC is enabled, the AXFR+DDNS provider will emit a warning when no R
|
|||||||
When AutoDNSSEC is disabled, the AXFR+DDNS provider will emit a warning when RRSIG, DNSKEY or NSEC records are found in the zone.
|
When AutoDNSSEC is disabled, the AXFR+DDNS provider will emit a warning when RRSIG, DNSKEY or NSEC records are found in the zone.
|
||||||
|
|
||||||
When AutoDNSSEC is not enabled or disabled, no checking is done.
|
When AutoDNSSEC is not enabled or disabled, no checking is done.
|
||||||
|
|
||||||
|
## FYI: MD5 Support
|
||||||
|
|
||||||
|
By default the used DNS Go package by miekg has deprecated supporting the (insecure) MD5 algorithm [https://github.com/miekg/dns/commit/93945c284489394b77653323d11d5de83a2a6fb5](Link). Some providers like the Leibniz Supercomputing Centre (LRZ) located in Munich still use this algorithm to authenticate internal dynamic DNS updates. To compensate the lack of MD5 a custom MD5 TSIG Provider was added into DNSControl.
|
@ -232,6 +232,9 @@ func (c *axfrddnsProvider) FetchZoneRecords(domain string) ([]dns.RR, error) {
|
|||||||
transfer.TsigSecret =
|
transfer.TsigSecret =
|
||||||
map[string]string{c.transferKey.id: c.transferKey.secret}
|
map[string]string{c.transferKey.id: c.transferKey.secret}
|
||||||
request.SetTsig(c.transferKey.id, c.transferKey.algo, 300, time.Now().Unix())
|
request.SetTsig(c.transferKey.id, c.transferKey.algo, 300, time.Now().Unix())
|
||||||
|
if c.transferKey.algo == dns.HmacMD5 {
|
||||||
|
transfer.TsigProvider = md5Provider(c.transferKey.secret)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
envelope, err := transfer.In(request, c.master)
|
envelope, err := transfer.In(request, c.master)
|
||||||
@ -428,6 +431,9 @@ func (c *axfrddnsProvider) GetDomainCorrections(dc *models.DomainConfig) ([]*mod
|
|||||||
client.TsigSecret =
|
client.TsigSecret =
|
||||||
map[string]string{c.updateKey.id: c.updateKey.secret}
|
map[string]string{c.updateKey.id: c.updateKey.secret}
|
||||||
update.SetTsig(c.updateKey.id, c.updateKey.algo, 300, time.Now().Unix())
|
update.SetTsig(c.updateKey.id, c.updateKey.algo, 300, time.Now().Unix())
|
||||||
|
if c.updateKey.algo == dns.HmacMD5 {
|
||||||
|
client.TsigProvider = md5Provider(c.updateKey.secret)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
msg, _, err := client.Exchange(update, c.master)
|
msg, _, err := client.Exchange(update, c.master)
|
||||||
|
46
providers/axfrddns/md5Provider.go
Normal file
46
providers/axfrddns/md5Provider.go
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
package axfrddns
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/hmac"
|
||||||
|
"crypto/md5" //#nosec
|
||||||
|
"encoding/base64"
|
||||||
|
"encoding/hex"
|
||||||
|
|
||||||
|
"github.com/miekg/dns"
|
||||||
|
)
|
||||||
|
|
||||||
|
type md5Provider string
|
||||||
|
|
||||||
|
func fromBase64(s []byte) (buf []byte, err error) {
|
||||||
|
buflen := base64.StdEncoding.DecodedLen(len(s))
|
||||||
|
buf = make([]byte, buflen)
|
||||||
|
n, err := base64.StdEncoding.Decode(buf, s)
|
||||||
|
buf = buf[:n]
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (key md5Provider) Generate(msg []byte, _ *dns.TSIG) ([]byte, error) {
|
||||||
|
rawsecret, err := fromBase64([]byte(key))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
h := hmac.New(md5.New, rawsecret)
|
||||||
|
|
||||||
|
h.Write(msg)
|
||||||
|
return h.Sum(nil), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (key md5Provider) Verify(msg []byte, t *dns.TSIG) error {
|
||||||
|
b, err := key.Generate(msg, t)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
mac, err := hex.DecodeString(t.MAC)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !hmac.Equal(b, mac) {
|
||||||
|
return dns.ErrSig
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
Reference in New Issue
Block a user