Written by — Maximilian Thoma 2007/12/11 18:21
SKS (engl. Synchronizing Key Server) ist ein „neuer“ OpenPGP Keyserver, entwickelt und gewartet von Yaron Minsky. → http://www.nongnu.org/sks/
Im Gegensatz zum traditionellen PKS-System, bei dem die Synchronisation zwischen den Keyservern im Netzwerk durch E-Mails erfolgt, verwendet SKS einen ausgeklügelten Abgleichalgorithmus, um Unterschiede zwischen den Keyserver-Datenbanken zu finden und auszugleichen.
Das Howto ist für Debian Etch geschrieben sollte aber auf andere Distris portierbar sein.
Anforderungen
- Debian Etch
- Postfix mit Procmail
- Pakete: make, ocaml, ocaml-core, libdb4.2-dev, bzip2 (und Abhängigkeiten)
- PGP Keydump der PGP-Schlüssel → ftp://ftp.pramberger.at/services/keyserver/keydump/
- 4 – 5 GB Platz
Installation
Beginnen wir mit der Installation.
Debianpakete installieren
Folgende Pakete werden benötigt:
make, ocaml, ocaml-core, libdb4.2-dev, bzip2
Diese einfach mit
apt-get install make ocaml ocaml-core libdb4.2-dev bzip2
installieren.
SKS Paket herunterladen und entpacken
Als erstes laden wir das SKS Paket runter und enpacken es in /usr/src.
cd /usr/src wget http://download.savannah.gnu.org/releases/sks/sks-1.0.10.tgz tar xvfz sks-1.0.10.tgz rm sks-1.0.10.tgz
Ein ls auf /usr/src/sks-1.0.10 sollte ungefähr folgendes ergeben:
ls -la /usr/src/sks-1.0.10 insgesamt 1604 drwxr-xr-x 3 root root 4096 2007-12-11 18:18 . drwxr-xr-x 3 root root 4096 2007-12-11 18:18 .. -rw-r--r-- 1 500 500 2248 2004-04-25 03:06 add_mail.ml -rw-r--r-- 1 500 500 3775 2004-10-02 13:27 armor.ml drwxr-xr-x 2 root root 4096 2007-12-11 18:18 bdb -rw-r--r-- 1 500 500 4370 2004-10-04 04:00 bdbwrap.ml -rw-r--r-- 1 500 500 8546 2004-10-12 03:41 bitstring.ml -rw-r--r-- 1 500 500 673 2004-04-25 03:06 BUGS -rw-r--r-- 1 500 500 7429 2004-10-04 04:51 bugscript.ml -rw-r--r-- 1 500 500 3488 2005-01-19 16:02 build.ml -rw-r--r-- 1 500 500 3728 2004-10-04 04:51 catchup.ml -rw-r--r-- 1 500 500 1210 2004-04-25 03:06 CHANGELOG -rw-r--r-- 1 500 500 12070 2004-04-25 03:06 channel.ml -rw-r--r-- 1 500 500 4647 2004-04-25 03:06 channel.mli -rw-r--r-- 1 500 500 10947 2005-01-19 16:02 clean_keydb.ml -rw-r--r-- 1 500 500 6320 2004-10-04 03:58 client.ml -rw-r--r-- 1 500 500 3749 2004-04-25 03:06 cMarshal.ml -rw-r--r-- 1 500 500 6700 2004-11-26 21:08 common.ml -rw-r--r-- 1 500 500 15228 2004-04-25 03:06 COPYING -rw-r--r-- 1 500 500 1747 2004-04-25 03:06 crc.c -rw-r--r-- 1 500 500 99359 2004-04-25 03:06 cryptokit-1.0.tar.gz -rw-r--r-- 1 500 500 7719 2004-10-04 04:52 dbMessages.ml -rw-r--r-- 1 500 500 1614 2004-04-25 03:06 dbscript.ml -rw-r--r-- 1 500 500 21794 2005-08-20 18:36 dbserver.ml -rw-r--r-- 1 500 500 2068 2004-04-25 03:06 dbtest.ml -rw-r--r-- 1 500 500 6484 2004-06-05 05:10 decode.ml -rw-r--r-- 1 500 500 13096 2005-01-18 00:46 .depend -rw-r--r-- 1 500 500 3528 2004-04-25 03:06 ehandlers.ml -rw-r--r-- 1 500 500 7418 2004-10-04 04:48 eventloop.ml -rw-r--r-- 1 500 500 5585 2005-01-19 16:02 fastbuild.ml -rw-r--r-- 1 500 500 206 2005-08-21 23:33 FILES -rw-r--r-- 1 500 500 5554 2004-04-25 03:06 fingerprint.ml -rw-r--r-- 1 500 500 4746 2004-09-30 04:17 fixkey.ml -rw-r--r-- 1 500 500 108 2004-04-25 03:06 foo.ml -rw-r--r-- 1 500 500 3226 2004-04-25 03:06 fqueue.ml -rw-r--r-- 1 500 500 3986 2005-01-19 16:02 getfileopts.ml -rw-r--r-- 1 500 500 4032 2004-04-25 03:06 heap.ml -rw-r--r-- 1 500 500 1156 2004-04-25 03:06 heap.mli -rw-r--r-- 1 500 500 2758 2004-10-03 14:51 htmlTemplates.ml -rw-r--r-- 1 500 500 2759 2005-01-19 16:02 incdump.ml -rw-r--r-- 1 500 500 19343 2004-10-04 04:48 index.ml -rw-r--r-- 1 500 500 40979 2005-01-18 14:25 keydb.ml -rw-r--r-- 1 500 500 2516 2004-12-13 17:56 keyHash.ml -rw-r--r-- 1 500 500 8137 2004-04-25 03:06 keyMerge.ml -rw-r--r-- 1 500 500 4176 2004-04-25 03:06 key.ml -rw-r--r-- 1 500 500 9324 2004-04-25 03:06 linearAlg.ml -rw-r--r-- 1 500 500 1985 2004-04-25 03:06 logdump.ml -rw-r--r-- 1 500 500 3543 2005-01-19 16:02 mailsync.ml -rw-r--r-- 1 500 500 11590 2005-08-14 03:33 Makefile -rw-r--r-- 1 500 500 172 2004-04-29 03:49 Makefile.local.unused -rw-r--r-- 1 500 500 3426 2004-04-25 03:06 mArray.ml -rw-r--r-- 1 500 500 1477 2004-04-25 03:06 mArray.mli -rw-r--r-- 1 500 500 6290 2005-01-19 16:02 membership.ml -rw-r--r-- 1 500 500 3978 2005-01-19 16:02 merge_keyfiles.ml -rw-r--r-- 1 500 500 2217 2004-04-25 03:06 meteredChannel.ml -rw-r--r-- 1 500 500 8794 2004-04-25 03:06 mList.ml -rw-r--r-- 1 500 500 2547 2004-04-25 03:06 mList.mli -rw-r--r-- 1 500 500 4367 2004-10-19 04:44 mRindex.ml -rw-r--r-- 1 500 500 1653 2004-04-25 03:06 msgContainer.ml -rw-r--r-- 1 500 500 1712 2004-04-25 03:06 mTimer.ml -rw-r--r-- 1 500 500 1048 2004-04-25 03:06 mTimer.mli -rw-r--r-- 1 500 500 3252 2004-04-25 03:06 nbMsgContainer.ml -rw-r--r-- 1 500 500 4383 2004-04-25 03:06 number2.ml -rw-r--r-- 1 500 500 4150 2004-04-25 03:06 number.ml -rw-rw-r-- 1 500 500 667602 2005-01-18 00:42 numerix-0.19c.tar.gz -rw-r--r-- 1 500 500 10414 2004-04-25 03:06 packet.ml -rw-r--r-- 1 500 500 9108 2005-08-13 22:31 parsePGP.ml -rw-r--r-- 1 500 500 3122 2005-04-26 05:32 pbuild.ml -rw-r--r-- 1 500 500 4027 2004-04-25 03:06 pdiskTest.ml -rw-r--r-- 1 500 500 5435 2004-04-25 03:06 pMap.ml -rw-r--r-- 1 500 500 4657 2004-04-25 03:06 pMap.mli -rw-r--r-- 1 500 500 9047 2004-04-25 03:06 poly.ml -rw-r--r-- 1 500 500 5766 2004-04-25 03:06 prefix_test.ml -rw-r--r-- 1 500 500 30889 2004-10-04 04:46 prefixTree.ml -rw-r--r-- 1 500 500 3311 2004-04-25 03:06 prime.ml -rw-r--r-- 1 500 500 10274 2004-04-25 03:06 pSet.ml -rw-r--r-- 1 500 500 5701 2004-04-25 03:06 pSet.mli -rw-r--r-- 1 500 500 2017 2005-08-20 18:42 pstyle.ml -rw-r--r-- 1 500 500 4377 2004-10-04 04:45 ptest.ml -rw-r--r-- 1 500 500 2842 2004-10-04 04:28 ptree_consistency_test.ml -rw-r--r-- 1 500 500 5231 2005-01-18 00:42 pTreeDB.ml -rw-r--r-- 1 500 500 1668 2004-04-25 03:06 ptree_db_test.ml -rw-r--r-- 1 500 500 2575 2004-04-25 03:06 ptree_replay.ml -rw-r--r-- 1 500 500 967 2004-04-25 03:06 ptscript.ml -rw-r--r-- 1 500 500 2177 2004-04-25 03:06 query.ml -rw-r--r-- 1 500 500 7115 2004-04-25 03:06 README -rw-r--r-- 1 500 500 1272 2004-04-25 03:06 recode.ml -rw-r--r-- 1 500 500 3323 2005-08-10 03:51 reconComm.ml -rw-r--r-- 1 500 500 6012 2004-10-04 04:00 reconCS.ml -rw-r--r-- 1 500 500 7412 2004-10-04 04:28 reconMessages.ml -rw-r--r-- 1 500 500 951 2004-04-25 03:06 reconPTreeDb.ml -rw-r--r-- 1 500 500 11211 2005-01-19 16:02 reconserver.ml -rw-r--r-- 1 500 500 3423 2004-10-04 04:29 recoverList.ml -rw-r--r-- 1 500 500 3081 2004-04-25 03:06 recvmail.ml -rw-r--r-- 1 500 500 2983 2005-08-14 00:37 request.ml -rw-r--r-- 1 500 500 5382 2005-01-18 00:42 rMisc.ml -rw-r--r-- 1 500 500 14548 2004-04-25 03:06 script.ml -rw-r--r-- 1 500 500 3331 2004-04-25 03:06 sendmail.ml -rw-r--r-- 1 500 500 5298 2004-10-04 03:58 server.ml -rw-r--r-- 1 500 500 12607 2005-01-19 16:02 settings.ml -rwxr-xr-x 1 500 500 524 2004-04-25 03:06 sks_build.sh -rw-r--r-- 1 500 500 1941 2004-04-25 03:06 sks_do.ml -rw-r--r-- 1 500 500 3267 2005-01-19 16:02 sksdump.ml -rw-r--r-- 1 500 500 5054 2004-12-13 18:03 sks.ml -rw-r--r-- 1 500 500 2982 2005-08-15 02:36 spider.ml -rw-r--r-- 1 500 500 1334 2004-04-25 03:06 sStream.ml -rw-r--r-- 1 500 500 6534 2004-04-29 04:11 stats.ml -rw-r--r-- 1 500 500 2986 2005-01-19 16:02 tester.ml -rw-r--r-- 1 500 500 5190 2004-04-25 03:06 TODO -rw-r--r-- 1 500 500 988 2004-04-25 03:06 tz.c -rw-r--r-- 1 500 500 3894 2005-01-19 16:02 update_subkeys.ml -rw-r--r-- 1 500 500 9453 2005-08-14 00:32 utils.ml -rw-r--r-- 1 500 500 7 2005-08-14 01:38 VERSION -rw-r--r-- 1 500 500 9849 2004-10-19 04:47 wserver.ml -rw-r--r-- 1 500 500 4896 2004-04-25 03:06 zZp2.ml -rw-r--r-- 1 500 500 5291 2005-01-18 00:42 zZp.ml
Konfigurationsdateien anpassen
1. Makefile.local.unused nach Makefile.local kopieren und anpassen
cd /usr/src/sks-1.0.10 cp Makefile.local.unused Makefile.local vi Makefile.local
Geändert werden muss die ldb Version von 4.1 auf 4.2 und BDBLIB von /usr/lib auf /usr.
Datei sieht dann wie folgt aus:
BDBLIB=-L/usr BDBINCLUDE=-I/usr/include PREFIX=/usr/local LIBDB=-ldb-4.2 MANDIR=/usr/share/man export BDBLIB export BDBINCLUDE export PREFIX export LIBDB export MANDIR
2. Makefile anpassen
Nach folgender Zeile suchen:
COMMONCAMLFLAGS=$(CAMLINCLUDE) $(OCAMLLIB) -ccopt -Lbdb -dtypes
und ersetzen durch
COMMONCAMLFLAGS=$(CAMLINCLUDE) $(OCAMLLIB) -ccopt -Lbdb -dtypes -pthread
Kompilieren / Installieren
1. Depts bauen
Dauert nur wenige Sekunden.
make dep
2. Alles kompilieren
make all
3. Installieren
Leider fehlen bei SKS die Manuals. Bei der Installationsroutine will er diese aber kopieren nach /usr/share/man/man8 um diesen Fehler zu umgehen einfach:
touch sks.8.gz
in /usr/src/sks-1.0.10 ausführen. Dann klappt`s.
Wenn alles ohne Fehler durchgelaufen ist dann mit:
make install
installieren.
Verzeichnisse/Dateien anlegen / Konfigurationsdateien anlegen
1. Verzeichnisse/Dateien
mkdir /var/sks mkdir /var/sks/web mkdir /var/sks/dump touch /var/sks/sksconf touch /var/sks/membership touch /var/sks/mailsync
2. Konfigurationsdateien anpassen
vi /var/sks/sksconf
Hostname anpassen z.B. keys.example.org
Inhalt der Datei sksconf:
# sksconf sample for keyserver.foo.bar # ------------------------------------ # Set the logfile to $basedir/log[.db|.recon] logfile: log # debuglevel 4 is default (max. debuglevel is 10) debuglevel: 4 # set from adress for mailsync from_addr: pgp-public-keys@keys.example.org # set the hostname of your server hostname: keys.example.org # EOF
Die membership Datei enthält die Server mit den man eine Peerbeziehung (gossip peer) unterhält. Wer mit keys.thoma.cc eine Peerbeziehung eingehen will soll mir bitte eine Mail schicken an info@thoma.cc.
Beispiel:
# Format # server port keys.thoma.cc 11370
SKS Server aufsetzen
SKS ist jetzt soweit installiert, jetzt können wir beginnen die Datenbank anzulegen und den Server betriebsfertig zu machen.
Datenbank aufbauen
Als erstes holen wir uns den Keydump von einem Server. Hier z.B. der Keydump von ftp.pramberger.at.
cd /var/sks/dump wget -r -l 1 ftp://ftp.pramberger.at/services/keyserver/keydump/ mv ftp.pramberger.at/services/keyserver/keydump/* . rm -rf ftp.pramberger.at/ bzip2 *.bz2
Es ist wichtig das die Dateien im Dumpverzeichnis nach dem entpacken die Endung .pgp haben damit sie in die Datenbank importiert werden.
cd /var/sks sks_build.sh
Die Datenbank wird jetzt generiert. Das kann mehrere Stunden dauern ! Benötigt ca. 190 MB RAM!!!
Hinweis
Wenn das Script fertig ist sind folgende neue Verzeichnisse angelegt worden PTree und KDB. In diesen Verzeichnissen befindet sich jetzt die Datenbank für SKS.
Peers hinzufügen
Die Peers befinden sich (wie oben schon erwähnt) in der Datei membership.
Wenn mit jemanden eine Partnerschaft vereinbart ist dann diesen wie folgt hinzufügen.
Beispiel:
keys.thoma.cc 11370
Mailsync einrichten
In dieser Datei werden die „Outgoing“ PKS Peers angegeben. PKS syncronisiert sich über E-Mails.
Beispiel:
mail@example.org abc@example.com
Für keys.thoma.cc ist pgp-public-keys@keys.thoma.cc die PKS Peer Adresse.
PKS verlangt eine Mailsyncadresse. Mailsync wird dazu verwendet andere PKS Server die kein gossip unterstützen aktuell zu halten. Diese Server werden quasi durch E-Mails syncronisiert. Da ich momentan keine Aktualisierungen an andere PKS Server sende aber SKS eine verlangt, habe ich eine „Blackhole“ Adresse angegeben. Diese Mails verschwinden im Nirvana. (devnull@thoma.cc) Wie Sie das auch Einrichten können finden Sie in den Postfix Howtos unter Spamtrap/Blackhole Adresse einrichten.
Webseite einrichten
Um später Keys per Webinterface suchen und hochzuladen muss man im Verzeichnis web eine index.html anlegen. → http://keys.thoma.cc:11371
Eine Beispieldatei können Sie hier herunterladen.
Direktdownload
Installation
cd /var/sks/web wget http://www.thoma.cc/_media/howtos/security/sks_keyserver/sks_index.tgz?id=howtos%3Asecurity%3Asks_keyserver&cache=cache tar xvfz sks_index.tgz
User / Gruppe anlegen für SKS
Da SKS später nicht unter root-Rechten laufen soll legen wir einen User und eine Gruppe an.
groupadd sks useradd -d /var/sks -g sks -s /bin/false sks
Postfix einrichten für SKS
Falls mailsync verwendet wird und Incoming PKS verwenden will muss man mit Procmail das ganze an sks_add_mail übergeben.
Falls Procmail noch nicht installiert sein sollte man dies nachholen mit:
apt-get install procmail
Für die Incoming PKS requests verwende ich als Beispiel die Adresse pgp-public-keys@keys.example.org.
Änderungen an /etc/aliases
Um die Mails mit Procmail bearbeiten zu können müssen wir diese erstmal zum User sks „weiterleiten“.
Fügen Sie in die aliases folgendes hinzu
pgp-public-keys: sks
und machen Sie anschließend ein
postalias /etc/aliases
um die postalias Datenbank zu aktualisieren.
main.cf
Öffnen Sie die Datei /etc/postfix/main.cf und fügen Sie unsere Beispieldomain keys.example.org zu mydestination hinzu.
mydestination = localhost.example.org, localhost, server.example.org, keys.example.org
Fügen Sie folgenden Parameter in einer neuen Zeile hinzu: (falls dieser noch nicht existiert)
mailbox_command = procmail -a "$EXTENSION"
Speichern Sie die Datei und führen Sie einen
postfix reload
aus.
.procmailrc
Damit Procmail weiss was er mit einer Mail machen soll wenn eine kommt muss man im Homeverzeichnis des Users eine .procmailrc anlegen.
Die Datei hat folgenden Inhalt
PATH=/usr/local/bin :0 * ^Subject: incremental | sks_add_mail /var/sks
und übergibt die Mail an sks_add_mail.
/etc/init.d/sks anlegen und zu den defaults hinzufügen
SKS liefert leider kein init.d-script mit, deshalb habe ich selber eines geschrieben.
Falls Username, Gruppe, Installationspfad oder Arbeitsverzeichnis abgeändert wurde muss dies in der sks init Datei angepasst werden.
Speichern Sie die Datei unter /etc/init.d/sks
Inhalt
#! /bin/sh # # init.d script for sks # written by Maximilian Thoma (c) 2007 - http://www.thoma.cc # PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin DAEMON=/usr/local/bin/sks NAME=sksdb NAME2=sksrecon DESC=sksdb DESC2=sksrecon PIDDIR="/var/sks" INSTDIR="/var/sks" RUNUSER=sks RUNGROUP=sks test -f ${DAEMON} || exit 0 set -e START="--start --quiet --background --make-pidfile --chuid ${RUNUSER}:${RUNGROUP} \ --pidfile ${PIDDIR}/${NAME}.pid --startas ${DAEMON}" STOP="--stop --quiet --pidfile ${PIDDIR}/${NAME}.pid" START2="--start --quiet --background --make-pidfile --chuid ${RUNUSER}:${RUNGROUP} \ --pidfile ${PIDDIR}/${NAME2}.pid --startas ${DAEMON}" STOP2="--stop --quiet --pidfile ${PIDDIR}/${NAME2}.pid" PARAMS="db -basedir ${INSTDIR}" PARAMS2="recon -basedir ${INSTDIR}" cleanup() { [ -d /var/sks ] && find /var/sks -maxdepth 1 -name 'db_com_sock' -type f \ -exec rm -rf "{}" \; >/dev/null 2>&1 || true [ -d /var/sks ] && find /var/sks -maxdepth 1 -name 'recon_com_sock' -type f \ -exec rm -rf "{}" \; >/dev/null 2>&1 || true : } case "$1" in start) echo -n "Starting $DESC: " if start-stop-daemon ${START} -- ${PARAMS} >/dev/null ; then echo "sks db." else if start-stop-daemon --test ${START} >/dev/null 2>&1; then echo "(failed)." exit 1 else echo "(already running)." exit 0 fi fi echo -n "Starting $DESC2: " if start-stop-daemon ${START2} -- ${PARAMS2} & >/dev/null ; then echo "sks recon." else if start-stop-daemon --test ${START2} & >/dev/null 2>&1; then echo "(failed)." exit 1 else echo "(already running)." exit 0 fi fi ;; stop) echo -n "Stopping $DESC: " if start-stop-daemon ${STOP} --retry 10 >/dev/null ; then cleanup echo "sks db." else if start-stop-daemon --test ${START} >/dev/null 2>&1; then echo "(not running)." exit 0 else echo "(failed)." exit 1 fi fi echo -n "Stopping $DESC2: " if start-stop-daemon ${STOP2} --retry 10 >/dev/null ; then cleanup echo "sks recon." else if start-stop-daemon --test ${START2} >/dev/null 2>&1; then echo "(not running)." exit 0 else echo "(failed)." exit 1 fi fi ;; restart|force-reload) $0 stop exec $0 start ;; *) N=/etc/init.d/sks echo "Usage: $N {start|stop|restart}" >&2 exit 1 ;; esac exit 0
Setzen Sie folgende Dateiberechtigungen
chmod 755 /etc/init.d/sks
und jetzt noch zu den defaults hinzufügen
update-rc.d sks defaults
damit SKS bei Systemstart startet.
SKS starten
Führen Sie
/etc/init.d/sks start
aus um SKS zu starten.
Zur Kontrolle führen wir
ps aux | grep sks
aus.
Wenn alles geklappt hat sollte es ungefähr so aussehen:
relaym:/etc/init.d# ps aux | grep sks sks 18803 0.0 1.3 31692 3352 ? Ss 16:40 0:00 /usr/local/bin/sks db -basedir /var/sks sks 18805 0.0 1.8 14208 4652 ? Ss 16:40 0:00 /usr/local/bin/sks recon -basedir /var/sks root 18813 0.0 0.2 2872 748 pts/1 R+ 17:05 0:00 grep sks relaym:/etc/init.d#
Ports checken:
Führen Sie ein
netstat -tulpen | grep sks
aus.
Das Ergebnis sollte folgendermaßen aussehen:
relaym:/var/sks# netstat -tulpen | grep sks tcp 0 0 0.0.0.0:11370 0.0.0.0:* LISTEN 107 57645 18805/sks tcp 0 0 0.0.0.0:11371 0.0.0.0:* LISTEN 107 57632 18803/sks relaym:/var/sks#
Fertig!
Ihr Keyserver sollte jetzt unter dem Defaultport 11371 eine Webseite anzeigen. Rufen Sie hierzu http://keys.example.org:11371 im Browser auf. Sie können hier versuchen ob Sie einen PGP Schlüssel in Ihrer Datenbank finden können. z.B. 0xB4F04E79 oder pgpCA@ct.heise.de als Suchstring eingeben.
Viel Spaß mit SKS