Contents
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.
ca/ - in diesem Verzeichnis wird das CA (Certificate Authority) Zertifikat aufgewahrt
certs/ - hier werden die zugelassenen Zertifikate abgelegt
crls/ - hier werden die wiederrufenen Zertifikate abgelegt
export/ - ein Verzeichnis um zu exportierende Zertifikate abzulegen
import/ - ein Verzeichnis um zu importierende Zertifikate abzulegen
isakmpd.conf - die Hauptkonfigurationsdatei
isakmpd.policy - die Keynote Police
private/ - in diesem Verzeichnis liegt unser private Schluessel
pubkeys/ - hier koennen oeffentliche Schluessel abgelegt werden
scripts/ - hier habe ich ein paar Scripte abgelegt um das Leben ein wenig zu vereinfachen
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