DNSSEC with PowerShell und dnscmd (on Windows 2012)
Windows 2012 can DNSSEC sign zones using the GUI Management tools. That works fine for a handfull of zones. But how about automation, signing hundreds of zones? Windows 2012 could be used as a "hidden master" DNSSEC signing engine that provides DNSSEC signed zones to Unix based front-end servers, while automating the key rollovers and continuous re-singing of the zones to refresh the record signatures. In that scenario, automation can be important.
dnscmd
One automation option is the dnscmd
tool. However, dnscmd
is
deprecated and might be removed from future versions of Windows. The
more modern way is to use PowerShell (see below).
Usage: DnsCmd <ServerName> /ZoneAddSKD <ZoneName> /Alg <KeyAlg> [/Length <KeyLength>] [/KSP <KeyStorageProviderName>] [/Flags <KeyFlags>] [/StoreKeysInAD] [/DoNotStoreKeysInAD] [/InitialRolloverOffset <Seconds>] [/DNSKEYSignatureValidityPeriod <Seconds>] [/DSSignatureValidityPeriod <Seconds>] [/StandardSignatureValidityPeriod <Seconds>] [/RolloverPeriod <Seconds>] <KeyStorageProviderName> -- "Microsoft Software Key Storage Provider" or other KSP installed on this system <KeyAlg> -- the key algorithm mnemonic string. Currently only "RSASHA1", "NSEC3RSASHA1", "RSASHA256", "RSASHA512", "ECDSAP256SHA256" and "ECDSAP384SHA384" are supported. <KeyLength> -- length of the key in bits. For RSA algorithms the value can range from 1024 bits in 64 bit increments up to 4096 bits. Key size is ignored for other algorithms. <KeyFlags> -- bits to be set to 1 in DNSKEY flags field. If is "KSK", the Secure Entry Point bit will be set to 1 to indicate that this key is a Key Signing Key. If no /Flags is given, the key is considered to be a Zone Signing Key. /StoreKeysInAD -- if specified, keys will be stored on the zone object in Active Directory and will replicate to other DNS servers /DoNotStoreKeysInAD -- if specified, keys will be stored in a self-signed certificate in the local machine certificate store and will not replicate to other DNS servers In future versions of Windows, Microsoft might remove dnscmd.exe
The dnscmd
subcommand ZoneAddSKD
creates a new DNSSEC key and
assigns that key to a zone. Without a key assigned, dnscmd
will refuse
to sign the zone. Be careful not to assign more than the needed keys to
a zone. Every call to ZoneAddSKD
will add a new key to the zone.
Usually we want to have one Key Signing Key (KSK), and one Zone Signing
Key (ZSK):
creating the KSK
PS C:\Users\Administrator> dnscmd server1 /ZoneAddSkd dnscmd.example.com /Alg RSASHA256 /Length 2048 /Flags KSK Command returned the following Signing Key Descriptor: SKD GUID {EDADBF50-A733-4C67-A95E-8145C77BE0A1} key storage provider = Microsoft Software Key Storage Provider store keys in AD = 0 KSK flag = 1 signing algorithm = RSASHA256 key size = 2048 initial rollover offset = 0 DNSKEY signature validity period = 604800 DS signature validity period = 604800 standard signature validity period = 864000 rollover period = 65232000 next rollover action = Normal Command completed successfully
creating the ZSK
PS C:\Users\Administrator> dnscmd server1 /ZoneAddSkd dnscmd.example.com /Alg RSASHA256 /Length 1024 Command returned the following Signing Key Descriptor: SKD GUID {47D410EE-35A4-483C-9B3B-1FB763F5AAB5} key storage provider = Microsoft Software Key Storage Provider store keys in AD = 0 KSK flag = 0 signing algorithm = RSASHA256 key size = 1024 initial rollover offset = 0 DNSKEY signature validity period = 604800 DS signature validity period = 604800 standard signature validity period = 864000 rollover period = 7776000 next rollover action = Normal Command completed successfully.
To be precise, the commands above do not directly create the keys, instead they create a "Signing Key Descriptor (SKD)", which is a kind of policy that describes how DNSSEC keys are generated for this zone. The Windows 2012 DNS server then creates new keys based on the descriptors whenever needed (for example during a key rollover).
Now we can use dnscmd
subcommand "ZoneSign" to sign the zone. The
parameters for "ZoneSign" are:
Usage: DnsCmd /ZoneSign <ZoneName> Generates keys and adds DNSSEC records to the zone using the zone signing parameters and Signing Key Descriptors (SKDs) currently set on this zone. In future versions of Windows, Microsoft might remove dnscmd.exe.
The only required parameter is the name of the zone to sign. This zone must already have DNSSEC keys attached:
PS C:\Users\Administrator> dnscmd server1 /ZoneSign dnscmd.example.com Command completed successfully.
PowerShell
With PowerShell, we use the command Add-DnsServerSigningKey
to create
and add the DNSSEC Signing Key Descriptors to a DNS zone:
SYNTAX: Add-DnsServerSigningKey [-ZoneName] <string> [[-Type] <string> {KeySigningKey | ZoneSigningKey}] [[-CryptoAlgorithm] <string> {RsaSha1 | RsaSha256 | RsaSha512 | RsaSha1NSec3 | ECDsaP256Sha256 | ECDsaP384Sha384}] [[-KeyLength] <uint32>] [-ComputerName <string>] [-InitialRolloverOffset <timespan>] [-DnsKeySignatureValidityPeriod <timespan>] [-DSSignatureValidityPeriod <timespan>] [-ZoneSignatureValidityPeriod<timespan>] [-RolloverPeriod <timespan>] [-ActiveKey <string>] [-StandbyKey <string>] [-NextKey <string>] [-KeyStorageProvider <string>] [-StoreKeysInAD <bool>] [-PassThru] [-CimSession <CimSession[]>] [-ThrottleLimit <int>] [-AsJob] [-WhatIf] [-Confirm] [<CommonParameters>]
Again, we creating one for the KSK, and one for the ZSK:
creating the KSK
PS C:\Users\Administrator> Add-DnsServerSigningKey powershell.example.com -Type KeySigningKey -CryptoAlgorithm RsaSha256 -KeyLength 2048
creating the ZSK
PS C:\Users\Administrator> Add-DnsServerSigningKey powershell.example.com -Type ZoneSigningKey -CryptoAlgorithm RsaSha256 -KeyLength 1024
The last step is to sign the zone, where we use
Invoke-DnsServerZoneSign
.
SYNTAX: Invoke-DnsServerZoneSign [-ZoneName] <string> [-SignWithDefault] [-DoResign] [-ComputerName <string>] [-Force] [-PassThru] [-CimSession <CimSession[]>] [-ThrottleLimit <int>] [-AsJob] [-WhatIf] [-Confirm] [<CommonParameters>]
PS C:\Users\Administrator> Invoke-DnsServerZoneSign powershell.example.com Confirm This will initiate online signing of the zone powershell.example.com on server SERVER1. Do you want to continue? [Y] Yes [N] No [S] Suspend [?] Help (default is "Y"): y
Happy automated zone signing!