welcome: please sign in
location: Security / Isakmpd

Isakmpd

Einleitung

Der Isakmpd Daemon realisiert den Aufbau von Sicherheitsverbaenden (sorry aber eine doofere Uebersetzung fuer security associations ist mir nicht in den Sinn gekommen) fuer verschluesselte und/oder authentifizierte Netzwerkverbindungen. Wir verstehen unter verschluesselter und/oder authentifizierter Netzwerkverbindung eine Security/IPsec Verbindung. Isakmpd verwaltet in diesem Kontext sowohl eine interne Konfiguration, wie auch eine Verfahrensweise, die beschreibt was fuer verschiedene SAs (Security Associations) augehandelt werden koennen, und was fuer Ereignis auf diese SAs getriggert werden sollen. Meistens verwendet man Isakmpd um ein VPN (virtuelles privates Netzwerk) aufzubauen. Das genaue Verfahren von ISAKMP ist in 2407, 2408 beschrieben, IKE (Internet Key Exchange) ist in 2409 beschrieben. Ein alternativer ISAKMP Daemon ist Security/RaCoon entwickelt von dem Kame Project. Isakmpd ist entwickelt von OpenBSD.

Konfiguration

Nachfolgend moechte ich ein wenig auf die verwendete Verzeichnisstruktur und eingesetzten Konfigurationsdateien eingehen. Ein klassisches Isakmpd Verzeichnis baut sich auf wie folgt.

Verzeichnisstruktur

pinky:/etc/isakmpd# ls -l
total 20
drwxr-xr-x  2 root  wheel   512 Feb  4 20:22 ca/
drwxr-xr-x  2 root  wheel   512 Feb  4 21:14 certs/
drwxr-xr-x  2 root  wheel   512 Feb  3 01:55 crls/
drwxr-xr-x  2 root  wheel   512 Feb  4 20:57 export/
drwxr-xr-x  2 root  wheel   512 Feb  4 11:56 import/
-rw-------  1 root  wheel  1981 Feb  8 20:49 isakmpd.conf
-rw-------  1 root  wheel    65 Feb  4 21:41 isakmpd.policy
drwxr-xr-x  2 root  wheel   512 Feb  4 20:54 private/
drwxr-xr-x  3 root  wheel   512 Feb  4 02:24 pubkeys/
drwxr-xr-x  2 root  wheel   512 Feb  4 00:36 scripts/

Die Verzeichnisse export/, import/ und scripts/ wurden von mir noch zusaetzlich angelegt und sind eigentlich nicht notwenig. Alle anderen Verzeichnisse koennen, bei entsprechender Konfiguration, verwendet werden.

Ein Wort zu der isakmpd.conf: Isakmpd ist sehr pinkelig, was Leerzeichen, Tabs o.ae. am Ende einer Zeile angeht (hint: set list in Vi). Wenn Ihr euch die nachfolgenden Konfigurationen anseht, werdet Ihr feststellen, dass Verknuepfungen und Definitionen von darauf folgenden Kontaineren, immer durch einen Konfigurationswert bestimmt werden. Isakmpd wird sich in der Regel nicht ueber eine verpfuschte Konfiguration beschweren, sondern einfach anlaufen, das Resultat ist jedoch, dass Ih eueren Tunnel nicht zum laufen bekommen werdet. Daher die Konfiguration immer doppelt ueberpruefen!

Firewall

Falls eine Firewall auf den entsprechenden System existiert ist folgendes zu beachten. Isakmp wird ueber Port 500 UDP ausgehandelt, eine spaetere IPsec Verbindung, abhaengig von dem gewaehlten IPsec Protokoll, benoetigt zusaetzlich noch AH und/oder ESP. Es ist daher ratsam, vorerst einmal beide Protokolle AH/ESP in der Firewall zu erlauben, sowie Port 500 UDP zu oeffnen. Ein paar Worte noch zu handelsueblichen guenstigen DSL Routern/Firewall/Switch Kombos: Besorgt euch einen vernuenftigen Router! AH ist abgesehen davon ueber NAT, soweit meine Kenntnis (hier wird der Header manipuliert), nicht moeglich, sprich ist es nicht moeglich eine AH IPsec Verbindung von einem geNATeten Host aus durchzufuehren.

Zertifikate

Um spaeter eine zertifikatsbasierte Authentifizierung zu realisieren, benoetigen wir eine funktionsfaehige openssl Installation. Bei openssl handlet es sich um eine freie Implementation eines Kryptographie Toolkit, mit dem wir spaeter sowohl eine - falls noch nicht vorhanden - CA (Certificat Authority) und x509 Zertifikate erstellen koennen.

Beispiele

AH Beispiel

Anfangen moechte ich mit einem einfachen IPsec Tunnel zwischen 2 Hosts mit fixer IPAdresse. Als Protokoll werde ich vorerst ein einfaches AH (Authentication Header) verwenden. Hiermit gewaehrleisten wir die Integritaet und Authenzitaet der, von meinem IPsec Partner, empfangenen Pakete. In diesem Beispiel gibt es einen Host pinky mit der IPAdresse 1.2.3.4 und einen Host brain mit der IPAdresse 5.6.7.8. Fuer die Phase 1, also der eigentlichen ISAKMP Authentifizierung, verwenden wir pre shared Keys - handelsuebliche Passwoerter.

pinky

isakmpd.conf

# General Section for isakmpd
[General]
#Listen-on=              1.2.3.4
Retransmits=            3
Check-interval=         60
Policy-file=            /etc/isakmpd/isakmpd.policy

# Phases
[Phase 1]
5.6.7.8=                ISAKMP-peer-brain

[Phase 2]
Connections=            IPsec-brain

# ISAKMP Phase 1
# Peers
[ISAKMP-peer-brain]
Phase=                  1
Configuration=          Default-main-mode
Address=                5.6.7.8
Transport=              udp
Authentication=         unserpasswort

# IPsec Phase 2
[IPsec-brain]
Phase=                  2
ISAKMP-peer=            ISAKMP-peer-brain
Configuration=          Default-quick-mode
Local-ID=               Net-pinky
Remote-ID=              Net-brain

# Networks
[Net-pinky]
ID-type=                IPV4_ADDR_SUBNET
Network=                192.168.0.0
Netmask=                255.255.255.0

[Net-brain]
ID-type=                IPV4_ADDR
Address=                192.168.1.0
Netmask=                255.255.255.0


# Configurations
## Phase 1 ISAKMP 
[Default-main-mode]
DOI=                    IPSEC
# EXCHANGE_TYPE must be ID_PROT for main-mode AGGRESSIVE for agressive-mode
EXCHANGE_TYPE=          ID_PROT
Transforms=             3DES-SHA

[3DES-SHA]
ENCRYPTION_ALGORITHM=   3DES_CBC
HASH_ALGORITHM=         SHA
AUTHENTICATION_METHOD=  PRE_SHARED
GROUP_DESCRIPTION=      MODP_1024
Life=                   Default-phase-1-lifetime

## Phase 2 IPsec
[Default-quick-mode]
DOI=                    IPSEC
EXCHANGE_TYPE=          QUICK_MODE
Suites=                 QM-AH-SHA-SUITE

[QM-AH-SHA-SUITE]
Protocols=              QM-AH-SHA      

[QM-AH-SHA]
PROTOCOL_ID=            IPSEC_AH
Transforms=             QM-AH-SHA-XF

[QM-AH-SHA-XF]
TRANSFORM_ID=           SHA
ENCAPSULATION_MODE=     TUNNEL
AUTHENTICATION_ALGORITHM=   HMAC_SHA
GROUP_DESCRIPTION=      MODP_1024
Life=                   Default-phase-2-lifetime

## Lifetime descriptions
# 60 seconds
[Default-phase-1-lifetime]
LIFE_TYPE=              SECONDS
LIFE_DURATION=          60,45:72

[Default-phase-2-lifetime]
LIFE_TYPE=              SECONDS
LIFE_DURATION=          60,45:72

brain

isakmpd.conf

# General Section for isakmpd
[General]
Retransmits=            3
Check-interval=         60
Policy-file=            /etc/isakmpd/isakmpd.policy

# Phases
[Phase 1]
1.2.3.4=                ISAKMP-peer-pinky

[Phase 2]
Passive-Connections=    IPsec-pinky

# ISAKMP Phase 1
# Peers
[ISAKMP-peer-pinky]
Phase=                  1
Configuration=          Default-main-mode
Address=                1.2.3.4
Transport=              udp
Authentication=         unserpasswort

# IPsec Phase 2
[IPsec-pinky]
Phase=                  2
ISAKMP-peer=            ISAKMP-peer-pinky
Configuration=          Default-quick-mode
Local-ID=               Net-brain
Remote-ID=              Net-pinky

# Networks
[Net-brain]
ID-type=                IPV4_ADDR
Address=                192.168.1.0
Netmask=                255.255.255.0

[Net-pinky]
ID-type=                IPV4_ADDR_SUBNET
Network=                192.168.0.0
Netmask=                255.255.255.0

# Configurations
## Phase 1 ISAKMP 
[Default-main-mode]
DOI=                    IPSEC
# EXCHANGE_TYPE must be ID_PROT for main-mode AGGRESSIVE for agressive-mode
EXCHANGE_TYPE=          ID_PROT
Transforms=             3DES-SHA

[3DES-SHA]
ENCRYPTION_ALGORITHM=   3DES_CBC
HASH_ALGORITHM=         SHA
AUTHENTICATION_METHOD=  PRE_SHARED
GROUP_DESCRIPTION=      MODP_1024
Life=                   Default-phase-1-lifetime

## Phase 2 IPsec
[Default-quick-mode]
DOI=                    IPSEC
EXCHANGE_TYPE=          QUICK_MODE
Suites=                 QM-AH-SHA-SUITE

[QM-AH-SHA-SUITE]
Protocols=              QM-AH-SHA      

[QM-AH-SHA]
PROTOCOL_ID=            IPSEC_AH
Transforms=             QM-AH-SHA-XF

[QM-AH-SHA-XF]
TRANSFORM_ID=           SHA
ENCAPSULATION_MODE=     TUNNEL
AUTHENTICATION_ALGORITHM=   HMAC_SHA
GROUP_DESCRIPTION=      MODP_1024
Life=                   Default-phase-2-lifetime

## Lifetime descriptions
# 60 seconds
[Default-phase-1-lifetime]
LIFE_TYPE=              SECONDS
LIFE_DURATION=          60,45:72

[Default-phase-2-lifetime]
LIFE_TYPE=              SECONDS
LIFE_DURATION=          60,45:72

Als Keynote Police verwenden wir vorerst auf beiden Seiten die einfachst moegliche.

isakmpd.policy

KeyNote-Version: 2
Authorizer: POLICY
Comment: Accept Everything

Jede Zeile dieser Konfiguartionen zu erklaeren, ist mir ehrlich gesagt zuviel. Nachzulesen sind die einzelnen Parameter in der Manpage zur isakmpd. Ein paar wichtige Parameter moechte ich jedoch, bezugnehmend auf die isakmpd.conf auf pinky, hervorheben. [Phase 1] definiert was fuer ISAKMP Partner wir erwarten, dies wird IP basierend definiert. Da wir in diesem Beispiel keine [Default] Phase 1 haben, akzeptiert pinky nur ISAKMP Verbindungen von 5.6.7.8, genauso wie brain nur die 1.2.3.4 zulaesst. In unserem ISAKMP Kontainer fuer Phase 1, setzen wir mit dem Parameter Authentication ein pre shared Passwort und definieren als den Default-main-mode Kontainer als Konfiguration hierfuer. [Phase 2] tritt erst in Kraft, wenn Phase 1 erfolgreich(!) abgeschlossen wurde. In [Phase 2] definieren wir wiederum den, in dieser Konfiguration, einzig gueltigen Kontainer IPsec-brain. In diesem schaffen wir die Verknuepfung zu inserem ISAKMP Kontainer ISAKMP-brain, legen die zu transportierenden Netze fest, und definieren erneut eine Konfiguration Default-quick-mode fuer das Ganze. Auf die Konfiguration der Phase 1 und 2 moechte ich auch noch kurz kommen. Wichtig fuer pre shared Keys ist der Eintrag AUTHENTICATION_METHOD=PRE_SHARED in dem Phase 1 Kontainer Defaul-main-mode. AH wird in der Phase 2 definiert (wo sonst) und kenntzeichnet sich durch den Eintrag PROTOCOL_ID=IPSEC_AH. Genauere Erklaerung wie bereits beschrieben in der Manpage oder eventuell im Query .

AH Beispiel inkl. dynamischem ESP Client

Nun wollen wir unser Beispiel erweitern. Nehmen wir an, wir haben nun noch einen Host, der mit dynamischer IPAdresse eine IPsec Verbindung zu uns aufbauen moechte. Als IP Protokoll verwenden wir diesmal nicht AH sondern ESP (Encapsulated Security Payload). Unserer aktuelle Konfiguration laesst dies nicht zu. Hosts mit dynamischer IPAdresse und als Peer fuer ISAKMP nennen wir Roadwarrior. Nachfolgend nun ein diff(1) der isakmpd.conf auf pinky

pinky

diff -u isakmpd.conf.simple isakmpd.conf

--- isakmpd.conf.simple Fri Feb 25 20:28:13 2005
+++ isakmpd.conf        Fri Feb 25 20:35:59 2005
@@ -8,9 +8,13 @@
 # Phases
 [Phase 1]
 5.6.7.8=                ISAKMP-peer-brain
+Default=                ISAKMP-peer-roadwarrior
 
 [Phase 2]
 Connections=            IPsec-brain
+# When they are passive, ISAKMPD will not connect based on their IP.
+# This is perfect for clients with dynamic IP addresses.
+Passive-connections=    IPsec-roadwarrior
 
 # ISAKMP Phase 1
 # Peers
@@ -21,6 +25,12 @@
 Transport=              udp
 Authentication=         unserpasswort
 
+[ISAKMP-peer-roadwarrior]
+Phase=                  1
+Configuration=          Default-main-mode
+Transport=              udp
+Authentication=         roadiepasswort
+
 # IPsec Phase 2
 [IPsec-brain]
 Phase=                  2
@@ -29,6 +39,13 @@
 Local-ID=               Net-pinky
 Remote-ID=              Net-brain
 
+[IPsec-roadwarrior]
+Phase=                  2
+ISAKMP-peer=            ISAKMP-peer-roadwarrior
+Configuration=          Default-quick-mode-esp
+Local-ID=               Net-pinky
+Remote-ID=              Net-dynamic
+
 # Networks
 [Net-pinky]
 ID-type=                IPV4_ADDR_SUBNET
@@ -40,6 +57,9 @@
 Address=                192.168.1.0
 Netmask=                255.255.255.0
 
+[Net-dynamic]
+ID-type=                IPV4_ADDR
+Address=                0.0.0.0
 
 # Configurations
 ## Phase 1 ISAKMP 
@@ -62,6 +82,11 @@
 EXCHANGE_TYPE=          QUICK_MODE
 Suites=                 QM-AH-SHA-SUITE
 
+[Default-quick-mode-esp]
+DOI=                    IPSEC
+EXCHANGE_TYPE=          QUICK_MODE
+Suites=                 QM-ESP-3DES-SHA-SUITE
+
 [QM-AH-SHA-SUITE]
 Protocols=              QM-AH-SHA      
 
@@ -74,6 +99,19 @@
 ENCAPSULATION_MODE=     TUNNEL
 AUTHENTICATION_ALGORITHM=   HMAC_SHA
 GROUP_DESCRIPTION=      MODP_1024
+Life=                   Default-phase-2-lifetime
+
+[QM-ESP-3DES-SHA-SUITE]
+Protocols=              QM-ESP-3DES-SHA
+
+[QM-ESP-3DES-SHA]
+PROTOCOL_ID=            IPSEC_ESP
+Transforms=             QM-ESP-3DES-SHA-XF
+
+[QM-ESP-3DES-SHA-XF]
+TRANSFORM_ID=           3DES
+ENCAPSULATION_MODE=     TUNNEL
+AUTHENTICATION_ALGORITHM=       HMAC_SHA
 Life=                   Default-phase-2-lifetime

Nun die isakmpd.conf auf unserem dynamischen Host.

dynamischer Client

# General Section for isakmpd
[General]
Retransmits=            3
Check-interval=         60
Policy-file=            /etc/isakmpd/isakmpd.policy

# Phases
[Phase 1]
1.2.3.4=                ISAKMP-peer-pinky

[Phase 2]
Connections=            IPsec-pinky

# ISAKMP Phase 1
# Peers
[ISAKMP-peer-pinky]
Phase=                  1
Configuration=          Default-main-mode
Address=                1.2.3.4
Transport=              udp
Authentication=         roadiepasswort

# IPsec Phase 2
[IPsec-pinky]
Phase=                  2
ISAKMP-peer=            ISAKMP-peer-pinky
Configuration=          Default-quick-mode-esp
Local-ID=               Net-mynet
Remote-ID=              Net-pinky
 
# Networks
[Net-mynet]
ID-type=                IPV4_ADDR
Address=                10.10.0.0
Netmask=                255.255.255.0
 
[Net-pinky]
ID-type=                IPV4_ADDR_SUBNET
Network=                192.168.0.0
Netmask=                255.255.255.0
 
# Configurations
## Phase 1 ISAKMP
[Default-main-mode]
DOI=                    IPSEC
EXCHANGE_TYPE=          ID_PROT
Transforms=             3DES-SHA
 
[3DES-SHA]
ENCRYPTION_ALGORITHM=   3DES_CBC
HASH_ALGORITHM=         SHA
AUTHENTICATION_METHOD=  PRE_SHARED
GROUP_DESCRIPTION=      MODP_1024
Life=                   Default-phase-1-lifetime
 
## Phase 2 IPsec
[Default-quick-mode-esp]
DOI=                    IPSEC
EXCHANGE_TYPE=          QUICK_MODE
Suites=                 QM-ESP-3DES-SHA-SUITE

[QM-ESP-3DES-SHA-SUITE]
Protocols=              QM-ESP-3DES-SHA

[QM-ESP-3DES-SHA]
PROTOCOL_ID=            IPSEC_ESP
Transforms=             QM-ESP-3DES-SHA-XF

[QM-ESP-3DES-SHA-XF]
TRANSFORM_ID=           3DES
ENCAPSULATION_MODE=     TUNNEL
AUTHENTICATION_ALGORITHM=       HMAC_SHA
Life=                   Default-phase-2-lifetime

## Lifetime descriptions
# 60 seconds
[Default-phase-1-lifetime]
LIFE_TYPE=              SECONDS
LIFE_DURATION=          60,45:72

[Default-phase-2-lifetime]
LIFE_TYPE=              SECONDS
LIFE_DURATION=          60,45:72

Wie man sieht, ziemlich straight forward zu der Konfiguration von brain. Einzig wirklicher Unterschied ist die Konfiguration fuer Phase 2, dem Default-quick-mode-esp. Die isakmpd.policy wollen wir nun noch etwas strikter gestalten.

isakmpd.policy

KeyNote-Version: 2
Authorizer: POLICY
Comment: Accept 2 passphrases and ESP or AH encrypted traffic
Licensees: passphrase:unserpasswort || passphrase:roadiepasswort
Conditions: app_domain == IPsec policy && (
            (esp_present == yes && esp_enc_alg != null) ||
            (ah_present == yes && ah_enc_alg != null)
            ) -> true

Security/Isakmpd (last edited 2008-07-14 09:55:40 by localhost)