SKS – Synchronizing Key Server für OpenPGP

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

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

Das Verzeichnis dump und Inhalt nicht löschen falls Datenbank nochmal erzeugt werden muss!

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.

sks_init.tgz
sks_init.zip

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 ;-)

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.