DNSSEC voor miek.nl
Aangezien gister avond (22 augustus) om 5 voor half 1 's nachts de eerste gesignde versie van .NL is gepubliceerd is het natuurlijk de hoogste tijd om je eigen zone te signen. Je kunt vooralsnog geen secure delegatie aanvragen, maar dat proces zit in de pijplijn bij SIDN.
Ik ga er van uit dat je redelijk bekent bent met DNS. Deze howto neemt een recent BIND9 als uitgangspunt, maar met NSD kom je ook een heel eind.
Er zijn een aantal stappen die je moet zetten voordat je DNSSEC aan hebt staan:
- Maak een sleutel paar, liefst een KSK (Key signing key) en een ZSK (zone signing key). Dus in totaal twee sleutel paren;
- Sign je zone met die sleutels;
- Configureer je nameserver zodat de gesignde zone wordt geserveerd;
- Configureer CRON zodat elke dag je zone wordt ge-resigned;
- Test het.
Deze sleutels zijn statisch. We gaan dus geen key rollovers implementeren.
Maak de sleutels:
Sleutels maken gaat met dnssec-keygen, dit programma heeft nogal wat
opties. De belangrijkste zijn: -a ALG om het algoritme van je sleutel
te specificeren, -b BITS: hoe lang moet je sleutel zijn, -f KSK
specificeert een KSK en -n ZONE zegt dat er een DNS sleutel moet
worden gemaakt. Voor miek.nl, komen we tot:
dnssec-keygen -a RSASHA256 -b 2048 -f KSK -n ZONE miek.nl
dnssec-keygen -a RSASHA256 -b 1024 -n ZONE miek.nl
(Je kunt dit versnellen door -r /dev/urandom als optie mee te geven,
maar dan krijg je kwalitatief slechtere sleutels). Dit levert vier
files op, in mijn geval:
Kmiek.nl.+008+12051.{key,private} en Kmiek.nl.+008+33694.{key,private}
Het public deel van mijn KSK ziet er zo uit:
; This is a key-signing key, keyid 33694, for miek.nl.
; Created: Wed Aug 18 14:46:09 2010
; Publish: Wed Aug 18 14:46:09 2010
; Activate: Wed Aug 18 14:46:09 2010
miek.nl. IN DNSKEY 257 3 8 AwEAAcWdjBl4W4wh/hPmNC.<ingekort>...V BdTRBtgHi0s=
Signeer je zone
Dit is de stap die je van PLAIN DNS naar DNSSEC tilt. Signeren gaat
met dnssec-signzone. In dit geval gebruik ik ook de -S optie, de
zogenaamd smart signing, hierbij kijkt dnssec-signzone naar de
commentaar regels (de regels die met ; beginnen in de key), om te
zien welke sleutels gebruikt moeten worden. Verder hebben we de sleutels
in een aparte directory staan (-K keys) en moeten de gegenereerde DS
records ook apart komen (-d ds) (zie "DS records"), -o miek.nl wordt
gebruik om aan te geven dat het hier om miek.nl gaat.
Het signeren van miek.nl gaat uiteindelijk met:
dnssec-signzone -K keys -d ds -o miek.nl -S miek.nl
Om dit te automatiseren gebruik ik een kleine Makefile:
.PHONY: miek.nl.signed
KEYDIR=/etc/bind/external/keys
DSDIR=/etc/bind/external/ds
miek.nl.signed: miek.nl
@dnssec-signzone -N unixtime -K $(KEYDIR) -d $(DSDIR) -o $< -S $<
NB: deze Makefile zorgt ervoor dat er altijd wordt ge-resigned.
Nameserver configuratie
Verander in mijn geval:
zone "miek.nl" {
type master;
file "/etc/bind/external/miek.nl";
};
naar
zone "miek.nl" {
type master;
file "/etc/bind/external/miek.nl.signed";
};
De bedoeling is duidelijk: serveer de gesignde variant van je zone.
CRON
Plaats een script /etc/cron.daily, die zorgt voor een dagelijkse
resign:
% cat /etc/cron.daily/dnssec
#!/bin/bash
# Resign unconditionally
( cd /etc/bind/external ; /usr/bin/make ) && /usr/sbin/rndc reload
Test
Run het script even met de hand: /etc/cron.daily/dnssec:
Fetching KSK 33694/RSASHA256 from key repository.
Fetching ZSK 12051/RSASHA256 from key repository.
Verifying the zone using the following algorithms: RSASHA256.
Zone signing complete:
Algorithm: RSASHA256: KSKs: 1 active, 0 stand-by, 0 revoked
ZSKs: 1 active, 0 stand-by, 0 revoked
miek.nl.signed
server reload successful
Ziet er goed uit, nu een tweede controle:
dig @a.miek.nl +dnssec +multiline DNSKEY miek.nl
;; ANSWER SECTION:
miek.nl. 14400 IN DNSKEY 257 3 8 (
AwEAAcWdjBl4W4wh/hPxMDcBytmNCvEngIgB9Ut3C2+Q
...
4N0t9ac/T0a0Sxba/BUX2UVPWaIVBdTRBtgHi0s=
) ; key id = 33694
miek.nl. 14400 IN DNSKEY 256 3 8 (
AwEAAcNEU67LJI5GEgF9QLNqLO1SMq1EdoQ6E9f85ha0
...
M335Ft9xjtXHPy7ztCbV9qZ4TVDTW/Iyg0PiwgoXVesz
) ; key id = 12051
Succes!
DS records
In de ds directory staat na het signen een dsset bestand:
% cat dsset-miek.nl.
miek.nl. IN DS 33694 8 1 8BA582C292324D256599CE72EEE6DF2A9F317AFD
miek.nl. IN DS 33694 8 2 2C235500B09FA87BBC0981674FC31AF87D2FA4DCFE666A64BA2646F2 9651DB83
Deze records zijn de hash waardes van mijn KSK. Er staan twee DSen in deze file, omdat er twee verschillende hashes SHA-1 (de 1 in "33694 8 1") en SHA-256 (de 2 in "33694 8 2").
Deze DS records, of misschien maar eentje moeten bij .nl terecht komen, zodat
zij een secure delegatie voor miek.nl kunnen maken.
It is there
Congrats to SIDN
% dig +dnssec +multiline DNSKEY nl
;; ANSWER SECTION:
nl. 6547 IN DNSKEY 256 3 8 (
AwEAAbXfJH0LevocrgMOI62Y0+oD02AxPrsXja59z11c
cqgW527Ghac2f1aj32a4c1Wc+H6UhTy+daf6LkVytw0l
lMmzDDVn/YHcfh7B+9DdbVjdBHvY6q+YTnZbsU3wGwod
PMneYJZl8d47eFYmraKKl/endifNukan0z4GkaKYHuI1
) ; key id = 37408
nl. 6547 IN DNSKEY 257 3 8 (
AwEAAekt0eDh+EmOVQMh1av++d5F6eS3B85YkFW9OBQN
8X9EA1rG8vl9TRHFBUfpu/vIaUJeuXV9tm/PO+qhNyIL
WxI26W1t1/EKr1WhbaNsLXPMhjtuelPqpxuQL/onXvhB
83uPcF88pjnKmu73pcdhInLfYkf4JfARztj4e+xaddoL
5eJ0Fj3KMVd303NAsH0tmRPBi3EGMAOtM4Ic84Rn8ZkH
bwmVUQ3n4qRYaLpgvmpX82RUpEkgPxhrrJGENp1QYGPv
0oWPWkcJcSUGsEBgjLSal5IzTJmOEFm7nzbvyrfq/KJX
PZZRfJgPpFPwqNfY+GlTfb39kDEcB34z2LCNM2U=
) ; key id = 38420
nl. 6547 IN RRSIG DNSKEY 8 1 7200 20100902004149 (
20100819064254 38420 nl.
0/C52WJ2OjQZOrP8y7relQWGVS5gmJLnwnrbic7dGNeJ
PVjI7W2gXgt8vVTg36bQ6gVpX7GG2zwvNA/cYTGYnfvF
n+0HpA8oZLqeVh1rbQR3oU+iym5F4vX1pka7pbJk358x
O9B9KsMFXH9exCoHHXzu/SU3D/TPZ60imrNgvJp6iOci
kPeomSQhwKmyyKBUheaOocdV/XIMtzFwOnKYV6bu9wCq
PXtOj4Qhp8Ty7mGMnOSpgAzwWcksvqmSZeNpC/tLT/57
TxefWNNGlbdY7+fxvA0T+AQVn0xctsS1y194SAv92kZW
azVQ9+ZYxQLVZqwSl1/ZBo8spxT1aiwMnw== )
Go number cruncher
Write a number cruncher that works as follows:
Pick six (6) random numbers from this list:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 25, 50, 75, 100
Numbers may be picked multiple times.
Pick one (1) random number (i) in the range:
1 . . . 1000
Tell how, by combining the first 6 numbers or or subset with the operators +,-,* and /, you can make i;
An example. We have picked the numbers: 1, 6, 7, 8, 8 and 75. And i is 977. This can be done in many different ways, two ways are:
((((1 * 6) * 8) + 75) * 8) - 7 = 977
(8*(75+(8*6)))-(7/1) = 977
Another:
(((6*8)+75)*8)-7 = 977
When using only a subset. This one is without the number 1.
Credit for this particular exercise goes to JC van Winkel.
Learning Go - version 0.1
I've tagged an 0.1 version of the book I'm writing: "Learning Go". It currently has 7 chapters. The first five are finished. Chapter 6 and 7 still need work. The exercises can also use some (more) love. The current chapter list of "Learning Go" is:
- Introduction
- Basics
- Functions
- Packages
- Beyond the basics
- Concurrency
- Communication
To get it:
- PDF download
- Gitweb repository
If you have comments, text or exercises feel free to drop an email.
Programmeer opdrachtje: oplossing(en)
Emil was gisteren wel heel snel. met een mooie (korte) oplossing. Zie hier voor een lokale kopie.
Regel nummers kun je weghalen met: sed -r 's/^ +[0-9]+//'
Mijn eigen oplossing is
iets langer, maar ik kende exec.Run dan ook nog niet. Hij is wel iets
korter geworden dan verwacht, maar daarvoor heb ik een klein beetje
gesjoemeld, want ik print nu:
PID 0 has 2 childeren: [453 612]
Dus met blokhaken. Dit doet %v in de fmt.Printf voor mij.
Programmeer opdracht(je) in Go
Een leuke opdracht om je handen vuil te maken met programmeren in Go. De opdracht:
Schrijf een programma dat van alle processen op het systeem uitschrijft hoeveel kinderen elke ouder (parent) heeft. Gebruik het
pscommando als volgt:ps -e -opid,ppid. De uitvoer van diepsziet er als volgt uit (maar dan langer):
PID PPID COMMAND
24497 24496 zsh
25337 24497 psDe uitvoer van jou programma moet iets worden als:
Pid 0 has 2 children: 1 2
Pid 20555 has 1 child: 20571Merk op: 1 kind, print dan
child, meerdere kinderen print danchildren. De uitvoer van de parent PID (PPIDs) moet gesorteerd zijn, dus beginnend bij 0 en dan oplopend.
Om je op weg te helpen, hier een versie in de programmeertaal Perl (Als je Perl niet snapt, heb je nu een probleem):
#!/usr/bin/perl -l
use strict;
use warnings;
my (%child, $pid, $parent);
my @ps=`ps -e -opid,ppid,comm`; # Capture the ouput from `ps`
foreach (@ps[1..$#ps]) { # Discard the header line
($pid, $parent, undef) = split; # Split the line, discard 'comm'
push @{$child{$parent}}, $pid; # Save the child PIDs on a list
}
# Walk through the sorted PPIDs
foreach (sort { $a <=> $b } keys %child) {
print "Pid ", $_, " has ", @{$child{$_}}+0, " child", # Print them
@{$child{$_}} == 1 ? ": " : "ren: ", "@{$child{$_}}";
}
De versie in Go is iets langer (zo'n 80 regels). Ik zal deze morgen middag posten. In de tussen tijd mag je hier je tanden op stuk bijten.
Formatting Go code with Vim
There are no formatting rules when writing Go code, but there is an official
style. If you pipe your code through gofmt, its output is the
official style. So while writing you need to occasionally execute:
%!~/bin/gofmt (which I've wrapped in a command, so I only need
to type :Fmt).
But the trouble is that executing this code resets the cursor to the first line and you then have to jump back to whatever line number you were on.
Surely vim should do better... and it does. The scripting in vim is
wonderful, this small function is all you need:
function Goformat()
let regel=line(".")
%!~/bin/gofmt
call cursor(regel, 1)
endfunction
And then together with this:
autocmd Filetype go command! Fmt call Goformat()
Put both in your .vimrc and you are set. Nice formatting with
:Fmt and you'll stay on the current line. The actual line
may be slightly different due to the reformatting, but this is
a far cry from being put on the first one.

