Giblets IPsec messen wir gegen TLS 1.3, GOST und Go

Schöne GrĂŒĂŸe! Ich möchte Sie ĂŒber das GerĂ€t des modernen sagen , IPsec - Stack von der ESPv3 und IKEv2 - Protokolle . IPSec umgeht meines Erachtens zu Unrecht viele Seiten, und ich habe keine detaillierte Analyse seiner Arbeit, seiner Protokolle und FĂ€higkeiten auf Russisch gesehen. Außerdem mache ich etwas Seltsames - vergleiche IPsec ESPv3 und IKEv2 (beide 2005) mit dem modernen, trendigen und hochmodernen TLS 1.3 von 2018.





Warum bin ich so begeistert von IPsec - dem wohl komplexesten Protokollstapel zur Sicherung von Netzwerken? KomplexitĂ€t ist schließlich der Hauptfeind fĂŒr ZuverlĂ€ssigkeit und Sicherheit! Erstens, je mehr Sie ĂŒber seine Protokolle, insbesondere IKEv2, erfahren, desto besser verstehen Sie, wie viele Möglichkeiten darin enthalten waren, und Sie sind beeindruckt von seiner Nachdenklichkeit, im Gegensatz zu dem ĂŒblichen Ansatz der Entwickler, "eine KrĂŒcke treibt eine KrĂŒcke" und ernsthafte Probleme zu lösen ", bis der Donner ausbricht. Zweitens sind IPSec-Protokolle aus kryptografischer Sicht gut durchdacht, und selbst das alte ESP / IKEv1 ist in der Tat das einzige industrielle Massenprotokoll, bei dem keine schwerwiegenden Schwachstellen aufgetreten sind. Das gleiche SSL (1995) wurde erst ab Version 1.3 anstĂ€ndig durchdacht. Und viele Menschen mögen IPSec aufgrund der ungeheuren KomplexitĂ€t von IKEv1 nicht.das ist nicht mehr in v2.



Wenn die Entwickler von Betriebssystemen in ihrer Zeit mit der Implementierung und Implementierung von IPsec und IPv6 (fĂŒr die VerfĂŒgbarkeit von Computern, so dass kein NAT) nicht langsamer geworden sind, sollte im Idealfall kein SSL / TLS im Prinzip erscheinen. Die Welt erwies sich als nicht perfekt, aber jetzt ist IPsec out of the box (zumindest SA / SP + ESP Teil des Stacks) in einem zumindest weit verbreiteten Betriebssystem (ich persönlich kenne nur DragonFly BSD , das IPSec getrunken hat, weil es keine Entwickler gab, die es unterstĂŒtzen). und IPv6 in einigen IndustrielĂ€ndern steht der ĂŒberwiegenden Mehrheit der Menschen sofort zur VerfĂŒgung.



IPsec ist ein Stapel von Protokollen, API-Aufrufen und Frameworks, damit Anwendungen und / oder der Administrator erkennen können, welche Sicherheit sie wĂ€hrend der Kommunikation benötigen, und dies wird auf Netzwerkebene ( IP-Sek.) Transparent sichergestellturitĂ€t). Wir können ĂŒber beide IP-Pakete von nur einem Socket (z. B. TCP-Verbindungen) und ĂŒber den Verkehr zwischen ganzen Netzwerken sprechen.



Verkehrssicherheit bedeutet: GewĂ€hrleistung der Vertraulichkeit von Daten, ihrer AuthentizitĂ€t / IntegritĂ€t und Schutz vor Wiederholungsangriffen . Wie fast alle Protokolle verfĂŒgt IPsec ĂŒber einen Transportteil, der IP-Pakete sichert, und einen Handshake-Teil, der sich auf die SchlĂŒsselverhandlung, Parameter, Konfiguration und Authentifizierung der Parteien bezieht.



TLS 1.3 : Bietet nur Datenschutz pro Socket fĂŒr TCP-Verbindungen. DTLS kann Datagramme schĂŒtzen (DTLS 1.3 ist noch kein Standard), aber nicht jede Bibliothek unterstĂŒtzt dies.



Transportprotokolle



Der IPSec-Transport verwendet IP-Protokolle:



  • AH (Authentifizierungsheader). Ich werde nicht weiter auf AH eingehen, da es keine Vertraulichkeit der Daten bietet und, soweit ich gehört habe, nur dazu gedacht war, die Gesetze einiger LĂ€nder in den neunziger Jahren in Bezug auf BeschrĂ€nkungen der Verwendung von VerschlĂŒsselung irgendwie zu "ertragen". Die VerschlĂŒsselung ist im Vergleich zu allem anderen so leicht, dass es keinen Sinn macht, sie zu opfern. Aber fast ĂŒberall, wo ESP erwĂ€hnt wird, ist auch AH gemeint.
  • ESP (Kapselung von Sicherheitsnutzdaten). ESP hat sich im Laufe der Zeit leicht weiterentwickelt und verwendet jetzt seine ESPv3-Version, die hĂ€ufig abwĂ€rtskompatibel ist und sich nicht von der vorherigen Version unterscheidet.


IP-Verkehr wird nur durch die Transportschicht gesichert. Und da wir ĂŒber viele Millionen Pakete pro Sekunde sprechen können, wird de facto ESP zumindest auf Kernelebene des Betriebssystems in seinem Netzwerkstapel implementiert, um keine teure Kontextumschaltung zwischen Kernel und Benutzerbereich durchzufĂŒhren (wie dies normalerweise bei TLS der Fall ist) , SSH, OpenVPN und andere).



Ich betone, dass AH und ESP IP-Protokolle sind, Netzwerk, nicht Transport. Warum nicht UDP? Die PrĂŒfsumme ist redundant und brennt die CPU, und die Kryptografie stellt die IntegritĂ€t trotzdem sicher. Wenn Ihr NAT jedoch nichts ĂŒber ESP weiß (und er es nicht weiß), funktioniert dies alles nicht fĂŒr ihn. SpĂ€ter kamen sie auf NAT-T- KrĂŒcken (NAT-Traversal), wenn der IPSec-Verkehr in ein UDP-Paket an Port 4500 eingeschlossen ist und NAT passieren kann. Dies ist jedoch ein unnötiger Aufwand und die Notwendigkeit, den IPSec-Stapel im Kernel zu bearbeiten, da er diese speziellen UDP-Pakete bereits verstehen und ESP daraus extrahieren sollte regelmĂ€ĂŸige Verarbeitung.



SP, SA, SPI und unsere erste IPSec-VerschlĂŒsselung



Woher weiß der Kernel, was mit einem IP-Paket zu tun ist: ob es mit einem SchlĂŒssel verschlĂŒsselt, das eingehende ESP entschlĂŒsselt oder durchgelassen werden soll, ohne es zu berĂŒhren? Zu diesem Zweck verfĂŒgt der Kernel ĂŒber Sicherheitsrichtlinien ( SP ). Dies sind Regeln wie in einer Firewall. DarĂŒber hinaus gibt es im Kernel Sicherheitszuordnungen (Security Associations, SA ): Kontexte zum AusfĂŒhren kryptografischer Operationen (SchlĂŒssel, ZĂ€hler, Fensterwiedergabe usw.). Im Allgemeinen sind weder SPs IPSec-spezifisch noch SAs - sie können fĂŒr andere Aufgaben / Protokolle (z. B. OSPF) verwendet werden.



SP / SA kann entweder ĂŒber eine spezielle API ( PF_KEYv2 ) oder manuell ĂŒber ein Setkey- Dienstprogramm konfiguriert werden . Zum Beispiel, wenn wir dem Kernel mitteilen möchten, dass alle IP-Pakete von kommenfc :: 123- Adressen auf fc :: 321 mĂŒssen ĂŒber ESP gesichert werden. Dies kann einfach durch Aufrufen ĂŒber die Befehlszeile erfolgen:



$ echo "spdadd fc00::123 fc00::321 any -P out ipsec esp/transport//require;" | setkey -c


Vor diesem Befehl sahen wir Pings:



IP6 fc00::123 > fc00::321: ICMP6, echo request, seq 0, length 16
IP6 fc00::321 > fc00::123: ICMP6, echo reply, seq 0, length 16
IP6 fc00::123 > fc00::321: ICMP6, echo request, seq 1, length 16
IP6 fc00::321 > fc00::123: ICMP6, echo reply, seq 1, length 16


Wir werden es spĂ€ter nicht sehen, da der Kernel noch nicht weiß, "was" zu verschlĂŒsseln ist. Sie mĂŒssen eine SA hinzufĂŒgen. Dies kann auch manuell erfolgen, indem Sie die einfache AE-GCM-16-Algorithmus- AEAD- VerschlĂŒsselung und einen zufĂ€lligen 160-Bit-SchlĂŒssel festlegen :



echo "add fc00::123 fc00::321 esp 0xdeadbabe -E aes-gcm-16 0x0c09d1d90f804b0b4cef80e255e29c0894db1928 ;" | setkey -c


Wenn wir dieselben Befehle auf dem Remote-Host ausfĂŒhren (nur nicht vergessen, -P in anzugeben ), werden wir sehen:



IP6 fc00::123 > fc00::321: ESP(spi=0xdeadbabe,seq=0x1), length 52
IP6 fc00::321 > fc00::123: ICMP6, echo reply, seq 0, length 16
IP6 fc00::123 > fc00::321: ESP(spi=0xdeadbabe,seq=0x2), length 52
IP6 fc00::321 > fc00::123: ICMP6, echo reply, seq 1, length 16


Die Anfrage wird von ESP verschlĂŒsselt, die Antwort jedoch nicht. Da ESP standardmĂ€ĂŸig "in eine Richtung" und fĂŒr die bidirektionale Kommunikation funktioniert, muss ein weiterer SP / SA fĂŒr die entgegengesetzte Richtung hinzugefĂŒgt werden.



0xdeadbabe in diesem Beispiel ist der Security Parameters Index ( SPI ) - eine eindeutige Kennung fĂŒr den ESP- "Tunnel" zwischen zwei IP-Adressen, unter der der Kernel den entsprechenden SA-Kontext finden und den EntschlĂŒsselungsschlĂŒssel daraus entnehmen kann. Und esp / transport // require ist eine Voraussetzung fĂŒr die Verwendung von ESP im Transportmodus (mehr dazu weiter unten).



Giblets ESP



Das ESP-Paket ist schematisch wie folgt aufgebaut:



  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ---
|               Security Parameters Index (SPI)                 | ^
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | A
|                      Sequence Number                          | | u
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | t
~                       IV (variable)                           ~ | h
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | e -----
|                    Payload Data  (variable)                   | | n   ^ E
~                                                               ~ | t   | n
|                                                               | | i   | c
+               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | c   | r
|               |         TFC Padding * (optional, variable)    | | a   | y
+-+-+-+-+-+-+-+-+         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | t   | p
|                         |        Padding (0-255 bytes)        | | e   | t
+-+-+-+-+-+-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | d   | e
|                               |  Pad Length   | Next Header   | v     v d
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ---------
~         Integrity Check Value-ICV   (variable)                ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


  • SPI - 32-Bit-eindeutige Kennung fĂŒr die ESP-Sitzung / den Tunnel / die Verbindung zwischen IP-Adressen. Typischerweise ist {SrcIP, DstIP, SPI} die SA und der kryptografische Kontext.
  • SeqNum — 32- . . , replay attack.
  • payload — ESP, .
  • TFC padding — (Traffic Flow Confidentiality), , - , . TFC , , payload , . , payload IP , . TFC - , .
  • Padding — ESP payload 32- , . , ( CBC) . . .
  • Pad Length — 8- Padding .
  • Next Header — 8- IP payload. «no next header», ESP- — , . TFC — .
  • ICV — Integrity Check Value, (MAC).


Der gesamte Teil des Pakets von der Nutzlast bis zum nĂ€chsten Header wird verschlĂŒsselt. Alles außer dem MAC ist authentifiziert. Die LĂ€nge des ICV und das Vorhandensein einer IV (Initialisierungsvektor) hĂ€ngen von den verwendeten VerschlĂŒsselungs- und Authentifizierungsmodi / -algorithmen ab.



TLS 1.3 : Das optionale AuffĂŒllen von Daten auf eine bestimmte GrĂ¶ĂŸe wurde nur in Version 1.3 angezeigt. Ansonsten sind VerschlĂŒsselung und Authentifizierung völlig Ă€hnlich. TLS 1.3 verpflichtet sich, nur AEAD-Algorithmen zu verwenden, was korrekt und gut ist. ESP unterstĂŒtzt AEAD, es gibt jedoch eine Auswahl archaischerer Lösungen. Geben Sie die Felder SPI oder SeqNum einnein, da TCP Sequenz und Zustellung garantiert, wird in der Praxis außerdem kein Initialisierungsvektor explizit ĂŒbertragen - das TLS-Record-Layer-Paket ist daher etwas kĂŒrzer. DTLS enthĂ€lt bereits SeqNum sowie Nachrichtenfragmentierungsdaten.



Die 32-Bit-Paketnummer ist in der Praxis möglicherweise zu kurz. Dies sind nur mehr als 4 Milliarden IP-Pakete, die bei einer Geschwindigkeit von mehr als 10 Mpps in Minuten fliegen können. Was passiert, wenn der ZĂ€hler ĂŒberlĂ€uft? Es wird auf Null zurĂŒckgesetzt. Dies bedeutet jedoch, dass sich der Wert von SPI + SeqNum fĂŒr uns wiederholt und die zuvor abgefangenen ESP-Pakete zur Wiederholung des Angriffs verwendet werden können. Um dieses Problem zu lösen, wurde ESN erfunden(Erweiterte Sequenznummer). Dies ist ein 64-Bit-ZĂ€hler, von dem jedoch nur die "unteren" 32-Bit in das SeqNum- Feld ĂŒbertragen werden und die oberen 32-Bit im Speicher gespeichert werden. Der volle Wert des ESN wird authentifiziert - daher sind die Parteien verpflichtet, die Nutzung des ESN im Voraus zu vereinbaren.



ESP-VerschlĂŒsselung



Wie genau erfolgt die VerschlĂŒsselung / Authentifizierung eines ESP-Pakets beispielsweise bei Verwendung von AES-GCM-16? FĂŒr die Arbeit mit ESP wird ein 64-Bit-Initialisierungsvektor verwendet, der sich am Anfang der Nutzlast befindet . Es verwendet auch 32-Bit-Salz als Teil des SchlĂŒsselmaterials. Im Beispiel fĂŒr setkey habe ich keinen 128-Bit-SchlĂŒssel bereitgestellt, sondern einen 128 + 32-Bit-SchlĂŒssel. Es kann Situationen geben, in denen der SchlĂŒssel wiederverwendet wird und die IV mit einem schlechten Pseudozufallszahlengenerator (PRNG) gefĂŒllt ist, dessen Werte wiederholt werden können. Das Salz soll vor diesem gefĂ€hrlichsten Fall schĂŒtzen, der möglicherweise zur EntschlĂŒsselung abgefangener Pakete fĂŒhrt. Die VerschlĂŒsselung / Authentifizierung von ESP selbst im AES-128-GCM-16-ESP-Modus ist wie folgt:



AES-GCM(
    key             = 128-bit key,
    plaintext       = 64-bit IV || payload || TFC || pad || padLen || NH,
    nonce           = 32-bit salt || IV,
    associated-data = SPI || {ESN  SeqNum},
) -> encrypted-payload || 128-bit ICV

ESP = SPI || SeqNum || IV || encrypted-payload || ICV


FĂŒr russische GOST-Algorithmen (Magma- oder Grasshopper-Chiffren) sind die Eingabedaten Ă€hnlich. Beide Chiffren werden im MGM- Modus verwendet (ich wĂŒrde sagen eine verbesserte Version von GCM ), und die regelmĂ€ĂŸige Rotation des ESPTREE- SchlĂŒsselmaterials wird mit HMAC-Stribog-256 angewendet . Dies reduziert die Belastung des SchlĂŒssels. HauptsĂ€chlich im Zusammenhang mit IPSec bedeutet dies weniger eine VerlĂ€ngerung der Nutzungsdauer als vielmehr eine Reduzierung der AngriffsflĂ€che durch SeitenkanĂ€le. Beispielsweise erwies sich die GOST 28147-89-BlockverschlĂŒsselung mit 64-Bit-BlockgrĂ¶ĂŸe aufgrund von SchlĂŒsselnetzen (eine Ă€hnliche Technologie der konstanten SchlĂŒsselrotation) als unverwundbar fĂŒr SWEET32- Angriffe.



Aus SicherheitsgrĂŒnden gibt es keine Beschwerden ĂŒber ESP mit AEAD-Algorithmen. Bei AEAD-Algorithmen ist IV jedoch nur ein 64-Bit-ZĂ€hler, der explizit mit jedem Paket ĂŒbergeben wird, das Speicherplatz im Paket verschwendet. SeqNum ist zu kurz und ESN wird nicht vollstĂ€ndig ĂŒbertragen, obwohl es vollstĂ€ndig als IV passen wĂŒrde. FĂŒr Nicht-AEAD-Algorithmen ist IV möglicherweise bereits erforderlich und weist einen unvorhersehbaren Wert auf, jedoch keinesfalls einen ZĂ€hler. Dies ist ein VermĂ€chtnis, da wertvoller Platz in der Verpackung und das Gewicht die ZuverlĂ€ssigkeit hier nicht beeintrĂ€chtigen.







Wenn IV fĂŒr AEADs Werte von 128 Bit haben könnte, wĂ€re es möglich, Algorithmen wie XSalsa20 / XChaCha20 mit 192-Bit-Nonce zu verwenden, von denen 128 Bit beim Start pseudozufĂ€llig generiert werden, und die verbleibenden 64 Bit können fĂŒr den ZĂ€hler verwendet werden ... Dies könnte ein Lebensretter fĂŒr Systeme sein, die ihren ZĂ€hlerstatus verloren haben, aber weiterhin vorhandene SchlĂŒssel verwenden möchten.



TLS 1.3 : XOR wird als Nonce zwischen dem NachrichtenzĂ€hler und dem mit dem SchlĂŒssel generierten Initialisierungsvektor verwendet. Da weder das MessgerĂ€t noch die IV explizit ĂŒbertragen werden, ist TLS 1.3 etwas kompakter. Wenn ESP Nicht-AEAD-Algorithmen verwendet, muss möglicherweise eine unvorhersehbare IV generiert werden, die spĂŒrbar CPU-intensiv sein kann.



Tunnel- und VerkehrstrÀger



Was ist in der Nutzlast des Pakets enthalten? Dies hĂ€ngt davon ab, ob das ESP im Transportmodus oder im Tunnelmodus arbeitet . Der Transportmodus ersetzt die Nutzlast des ĂŒbertragenen IP-Pakets durch ESP durch diese Nutzlast. Das heißt, es war:



---------------------------------------
| orig IP hdr |[ext hdrs]| TCP | Data |
---------------------------------------


wurden:



---------------------------------------------------------
| orig |hop-by-hop,dest*,|   |dest|   |    | ESP   | ESP|
|IP hdr|routing,fragment.|ESP|opt*|TCP|Data|Trailer| ICV|
---------------------------------------------------------
                             |<--- encryption ---->|
                         |<---- authenticity ----->|


Im Tunnelmodus wird das gesamte IP-Paket vollstÀndig in ESP eingeschlossen und ein neues IP-Paket gebildet, normalerweise mit neuen Headern und SrcIP / DstIP-Adressen. Dieser Modus wird verwendet, um Pakete zwischen Netzwerken zu tunneln.



----------------------------------------------------------
| new* |new ext|   | orig*|orig ext|   |    | ESP   | ESP|
|IP hdr| hdrs* |ESP|IP hdr| hdrs * |TCP|Data|Trailer| ICV|
----------------------------------------------------------
                   |<--------- encryption --------->|
               |<---------- authenticity ---------->|


Zum Beispiel kann ich ĂŒber setkey festlegen, dass alle Pakete zwischen 2001: ac :: / 64 und 2001: dc :: / 64- Netzwerken verschlĂŒsselt durch zwei Endpunkte von Tunneln mit den Adressen 2001 :: 123 , 2001 :: 321 geleitet werden sollen ...



spdadd 2001:ac::/64 2001:dc::/64 any -P out ipsec esp/tunnel/2001::123-2001::321/require ;
spdadd 2001:dc::/64 2001:ac::/64 any -P in  ipsec esp/tunnel/2001::321-2001::123/require ;


Der Transportmodus wird hĂ€ufig als Host-zu-Host-Verbindung bezeichnet. Wenn fĂŒr das Tunneln ein GRE- oder IPv * -over-IPv * -Protokoll verwendet wird, das bereits zwischen zwei Endpunkten funktioniert, ist es in diesem Fall nicht sinnvoll, den Tunnelmodus auf IPSec-Ebene zu verwenden. Der Transportmodus authentifiziert den IP-Header jedoch nicht. Dies ist in der Regel nicht wichtig und nicht kritisch. Wenn Sie jedoch sicherstellen möchten, dass keine erweiterten IPv6-Header oder Flussbezeichnungen von Paketen geĂ€ndert wurden, sollten Sie den Tunnelmodus auf Kosten des Overheads verwenden, auch wenn er zwischen zwei Hosts liegt.



ISAKMP



Was passiert, wenn ich die Computer neu starte, SA mit allen ZĂ€hlerwerten aus ihrem Speicher verschwindet und ich die alten SP / SA-Befehle erneut mit meinen HĂ€nden lade? Erstens können Pakete, die mit der IV ĂŒbereinstimmen, entschlĂŒsselt werden, da dies einer zweimaligen Verwendung des Chiffrierpads gleichkommt. Zweitens werden alle zuvor abgefangenen Pakete gĂŒltig authentifiziert, da SPI / salt / ESN / SeqNum ĂŒbereinstimmen, und Sie können sie erneut abspielen. Die Wiederverwendung solcher Setkey- SAs ist aus SicherheitsgrĂŒnden katastrophal. Drittens, insbesondere wenn ESN nicht verwendet wird (z. B. in FreeBSD zum Zeitpunkt dieses Schreibens wird es noch nicht unterstĂŒtzt), stellen Sie bei einem langen SA-Betrieb möglicherweise nicht fest, dass der ZĂ€hler "verbraucht" ist.



All dies bedeutet, dass wir die ESP-SchlĂŒssel regelmĂ€ĂŸig Ă€ndern mĂŒssen. Und vereinbaren Sie auch den VerschlĂŒsselungsalgorithmus, das Vorhandensein von ESN-, TFC-, Transport- / Tunnelmodus- und SPI-Werten. De facto wird hierfĂŒr das ISAKMP- Protokoll (Internet Security Association und Key Management Protocol) verwendet . Sie können jedoch problemlos einige IM mit OTR / PGP / OMEMO-authentifizierter VerschlĂŒsselung verschrauben und einfach die Shell-Skript- Setkey- Befehle an den Server senden , auf dem die SchlĂŒssel durch Lesen von / dev / urandom generiert werden . FĂŒr den Kernel ist es egal, wie es vereinbart wurde. Wie in OpenVPN: X.509 erfolgt die Authentifizierung mit Zertifikaten und SchlĂŒsselaushandlung im Allgemeinen ĂŒber TLS, und das VPN-Transportprotokoll selbst ist bereits ein eigenes.



In seiner "reinen" Form wird ISAKMP nicht verwendet, da es keine Kryptographie enthĂ€lt. Um GesprĂ€chspartner zu authentifizieren und SchlĂŒsselmaterial zu generieren, wird ein Protokoll eines Drittanbieters verwendet, das ISAKMP in sich selbst kapselt. Ich weiß:



  • KINK - Kerberisierte Internetaushandlung von SchlĂŒsseln , bei der ein drittes vertrauenswĂŒrdiges Kerberos-KDC zur Authentifizierung und Aushandlung verwendet wird. Neben der Beschreibung aus Wikipedia weiß ich nichts mehr ĂŒber KINK und habe es nicht live gesehen.
  • IKE (v1) - Internet Key Exchange . Wahrscheinlich immer noch das beliebteste Protokoll, obwohl es 1998 erstellt wurde.
  • IKEv2 ist die zweite Version von IKE, 2005, ĂŒber die ich sprechen werde.


IKE-Protokolle sind aufgrund der großen Anzahl unterschiedlicher Nutzlasttypen sehr erweiterbar. IKEv1 bietet eine Vielzahl von Optionen, um nur einen Tunnel fĂŒr die Arbeit zu konfigurieren. Mehr als ein Dutzend RFCs beschreiben die gesamte Reihe von ISAKMP und IKEv1 mit gemeinsamen Nutzdaten. EinschĂŒchternde KomplexitĂ€t. Plus die FĂ€higkeit, nicht narrensichere Konfigurationen einfach zu vermasseln, und der bekannte, teilweise zu Recht zutreffende Mythos, dass IKEv1 garantiert nur funktioniert, wenn die Konfigurationsdatei fast vollstĂ€ndig kopiert wird.



GlĂŒcklicherweise ist IKEv2 erschienen: ein praktischer RFC (fĂŒr die meisten Funktionen), ein erheblich vereinfachtes Protokoll fĂŒr die Aushandlung von Parametern und entsprechend seine Konfiguration. In der Regel gibt es weniger Roundtrips fĂŒr den gesamten Handshake- und SchlĂŒsselvereinbarungsprozess als in IKEv1. Daher wird nur er berĂŒcksichtigt, da IKEv1 keinen Sinn mehr hat (aber es lohnt sich kaum, bereits laufende und funktionierende Instanzen zu ersetzen, da sie funktionieren). IKEv2 verwendet im Gegensatz zu IKEv1 absolut Ă€hnliche Algorithmen und AnsĂ€tze, um seine eigenen Nachrichten zu verschlĂŒsseln, wie dies bei ESP der Fall ist. Außerdem wurde die EAP-Authentifizierung eingefĂŒhrt und die Möglichkeit fĂŒr jede Partei, sich mit unterschiedlichen Methoden zu authentifizieren (z. B. verwendet der Client PSK und der X.509-Server Zertifikate).



IKE Daemon



      +-------------+
      |  |
      +-------------+
       |           |
       |           |
       |           |      /userspace
=====[PF_KEY]====[PF_INET]====================
       |           |                    
+-----------+   +-------------+
| |   |TCP/IP,      |
|  SA  SP  |---| IPsec|
+-----------+   +-------------+
                     |
                 +-----------+
                 |    |
                 |  |
                 +-----------+


Dieser Teil des IPSec-Stapels wird bereits ausgefĂŒhrt, normalerweise im Benutzerbereich. Erstens sind dies keine stark belasteten DĂ€monen: Sie können mindestens einmal am Tag miteinander kommunizieren, und der erste Handschlag erfordert einige Roundtrips ĂŒber UDP. Zweitens ist die Anzahl der ISAKMP / IKE-Funktionen so hoch, dass hunderte Male mehr Code vorhanden ist als in der vollstĂ€ndigen SA / SP / ESP-Implementierung. Es gibt viele ISAKMP-DĂ€monen: strongSwan (IKEv1 / v2) (sowie Openswan , Libreswan ), isakmpd (IKEv1), OpenIKED (IKEv2), WaschbĂ€r (IKEv1), racoon2 (IKEv1 / v2, KINK) und andere.



Hinweis: Richtig zu schreiben und zu sprechen "Daemons" ( Daemons)), wie ich in Übersetzungen der Fiktion gesehen habe. Aber in technischen russischsprachigen Kreisen haben "DĂ€monen" bereits Wurzeln geschlagen.



TLS 1.3 : Im Allgemeinen handelt es sich bei dem gesamten TLS-Stapel um Bibliotheksfunktionen, die in jeder einzelnen Anwendung funktionieren und SchlĂŒsselmaterial in ihrem eigenen Speicher speichern. Die gesamte Kryptografie erfolgt durch Umschalten auf den Benutzerbereich, was einen enormen Aufwand bedeutet. Zumindest FreeBSD und Linux verfĂŒgen jedoch bereits ĂŒber nukleare Offload-Implementierungen von TLS, wenn Ă€hnlich wie bei IPSec der Transportteil vollstĂ€ndig im Kernel verarbeitet wird und der Handshake im Benutzerbereich stattfindet.



IKEv2 lĂ€uft standardmĂ€ĂŸig ĂŒber UDP auf Port 500 ( isakmp)Bedienung). Daemons erstellen einen sicheren Kanal, authentifizieren sich gegenseitig, verhandeln / erstellen / löschen ESP SA / SPs, aktualisieren SchlĂŒssel, fĂŒhren einen Heartbeat aus (Dead Peer Detection ( DPD )) und vieles mehr. Die gesamte Kommunikation zwischen DĂ€monen erfolgt in Form eines Austauschs von zwei Anforderungs- / Antwortnachrichten. Jede Anfrage muss beantwortet werden. Was tun, wenn ein Paket verloren geht, da dies UDP ist? BerĂŒcksichtigen Sie dies in Ihrem Bundesstaat, senden Sie Anfragen nach einer ZeitĂŒberschreitung, fĂŒr die keine Antworten eingegangen sind, erneut, senden Sie Antworten auf wiederholte Anfragen erneut, ignorieren Sie wiederholte Antworten. Pakete können in einer chaotischen Reihenfolge ankommen, sie können unvorhersehbar verschwinden - vieles wird im IKEv2-Standard berĂŒcksichtigt und es wird beschrieben, wie man sich unter verschiedenen Rennbedingungen verhĂ€lt.



TLS 1.3: Die TCP-Natur von TLS kĂŒmmert sich um die Bestellung und Zustellung von Nachrichten. TCP beansprucht jedoch erhebliche Ressourcen im Betriebssystemkern und eine große Anzahl von TCP-Sitzungen kann ein Problem darstellen (im Gegensatz zu UDP). In DTLS treten jedoch alle Ă€hnlichen Probleme auf die gleiche Weise wie in IKE auf, und es werden HĂ€morrhoiden bei der Verarbeitung fragmentierter Nachrichten hinzugefĂŒgt. Das Ändern der IP-Adressen von Endpunkten fĂŒr UDP ist kein Problem. IKE-Verbindungen sind in der Regel sehr langlebig (der IKE-Status ist klein und wird nur im Speicher des Userspace-Daemons gespeichert) und erfordern daher seltener einen Handshake, wĂ€hrend Sie dies in TLS nach dem Verlust einer TCP-Verbindung tun mĂŒssen (obwohl es auch beschleunigte Methoden zum Fortfahren von Sitzungen gibt, wenn der Status dies nicht war verloren, zum Beispiel beim Neustart des Programms). Da der IKE-DĂ€mon (in der Regel) einer fĂŒr das gesamte System ist, sollten einige Anwendungen sicher damit kommunizierenMit jemandem, der bereits eine IKE-Verbindung hat, kann er diese entweder sofort verwenden, oder der DĂ€mon erstellt in einem Roundtrip eine zusĂ€tzliche ESP-SA fĂŒr die Anwendung.



Innereien IKE



Der erste Austausch (Request-Response) der Daemons ist IKE_SA_INIT , wodurch eine IKE SA fĂŒr die weitere sichere Kommunikation erstellt wird. Beachten Sie, dass die ESP SA im Kernel "gespeichert" ist und die IKE SA im Userspace-Daemon. Dann kommt der IKE_AUTH- Austausch, bei dem die Parteien authentifiziert werden. Im gleichen Austausch wird eine untergeordnete SA ( Child SA ) erstellt, die fĂŒr die ESP SA verwendet wird. Im Allgemeinen reichen diese beiden Austausche aus, um die Parteien zu authentifizieren und ESP SA-Parameter mit den SchlĂŒsseln auszuhandeln und dann den verschlĂŒsselten ESP-Verkehr zwischen Computern zu steuern. Gleichzeitig bleibt eine funktionierende IKE SA lange Zeit zwischen den DĂ€monen. DarĂŒber hinaus können sie jederzeit CREATE_CHILD_SA austauschen, um mehr untergeordnete Sicherheitszuordnungen sowie INFORMATIONAL zu erstellenAustausch (eine Vielzahl von Zwecken).



Alle IKEv2-Nachrichtenkopfzeilen haben die folgende Struktur:



                     1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       IKE SA Initiator's SPI                  |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       IKE SA Responder's SPI                  |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Next Payload |    Version    | Exchange Type |     Flags     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Message ID                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            Length                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


  • SPIi - 64-Bit-IKE SA-Initiator-SPI. Ein vom Initiator der IKE-Sitzung zufĂ€llig generierter Bezeichner.
  • SPIr - 64-Bit-IKE SA-Responder-SPI. Ebenso aber nur SPI von der Responder-Seite. In der allerersten Nachricht des Initiators wird dieses Feld mit null Bytes gefĂŒllt.
  • NP - 8-Bit NĂ€chste Nutzlast. Nutzlastkennung nach dem Header.
  • Version - 8-Bit-Version des IKE-Protokolls.
  • ExchType - 8-Bit-Typ des IKE-Austauschs: IKE_SA_INIT , IKE_AUTH , CREATE_CHILD_SA oder INFORMATIONAL .
  • Flags — 8- . .
  • MsgID — 32- . , , replay-. — request/response MsgID. , .
  • Len — 32- ( + ).


SPIi + SPIr sind 128-Bit. Warum so viel, wenn ESP nur 32 Bit hat? Erstens, da sie nicht ĂŒbereinstimmen, sondern pseudozufĂ€llig generiert werden, reicht 64-Bit fĂŒr eine Seite aus, um Kollisionen zu vermeiden. Zweitens ist ESP auch an IP-Adressen gebunden, wĂ€hrend dies bei einer IKE-Sitzung im Allgemeinen nicht der Fall ist. Die Parteien können ihre IP-Adressen (mobiler Client) problemlos Ă€ndern und weiterhin kommunizieren.



TLS 1.3: Durch Ändern der IP-Adresse wird die Verbindung getrennt. Selbst mit iPSK mĂŒssen Sie einen Rehandshake durchfĂŒhren, um Ressourcen fĂŒr die asymmetrische Kryptografie zu sparen. Dies sind 1,5 Roundtrips plus Roundtrips, um eine TCP-Verbindung herzustellen. Die Erstellung von untergeordneten ESP-SAs fĂŒr neue IP-Adressen in einer bereits eingerichteten IKE-Verbindung (ungebunden an Adressen) erfordert nur einen Roundtrip (+ Roundtrip zum Entfernen alter Adressen, dies geschieht jedoch bereits im Hintergrund einer neuen funktionierenden ESP-SA).



Auf den IKE-Header folgen eine oder mehrere Nutzdaten. Jede Nutzlast hat einen allgemeinen Formatheader und dann einen fĂŒr ihren Typ spezifischen Inhalt. Der Inhalt ist 32-Bit ausgerichtet. Ein gemeinsamer Header fĂŒr alle:



                     1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Payload  |C|  RESERVED   |         Payload Length        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


  • Next Payload — 8- . payload- . payload. payload IKE . Encrypted Payload, payload- NP ( payload IKE ), payload- .
  • C — «» payload. IKEv2 payload , IKE . payload . IKE vendor-specific , .
  • Len — 16- payload ( + ).


Daher bestehen IKE-Nachrichten aus einem IKE-Header und Nutzdaten, die in einer Kette miteinander verbunden sind. Daemons können unkritische und unbekannte Nutzdaten ignorieren. Der Nutzdateninhalt des Nonce- Typs (nach dem Header) ist nur ein zufĂ€lliger Datensatz, keine feste GrĂ¶ĂŸe. Es gibt aber auch viel komplexere Strukturen. In IKE-Standards werden kurze Bezeichnungen fĂŒr Nutzlasttypen akzeptiert (z. B. N * fĂŒr Nonce-Nachrichten, wobei "*" entweder "i" (Initiator) oder "r" (Responder) ist).



SIGMA



Aus kryptografischer Sicht gehören IKEv1 / IKEv2 zur Klasse der authentifizierten SchlĂŒsselaustauschprotokolle STS, ISO / IEC IS 9798-3 und SIGMA (SIGn-and-MAc). Dies sind sehr gut erforschte und mathematisch verifizierte (SIGMA) Lösungen. In meinem Artikel "P2P F2F E2EE IM an einem Abend" habe ich bereits das Funktionsprinzip und die Implementierung des SIGMA-I-Protokolls beschrieben. IKEv2 ist völlig Ă€hnlich. Was erwarten wir, wenn wir die Sicherheit des Handshake-Protokolls diskutieren?



  • Vertraulichkeit ĂŒbermittelter Nachrichten;
  • AuthentizitĂ€t und IntegritĂ€t der ĂŒbertragenen Nachrichten - ihre Änderung muss erkannt werden;
  • Schutz vor Wiederholungsangriffen - Die Tatsache des Verlusts oder der Wiederholung von Nachrichten muss erkannt werden.
  • ;

    perfect forward secrecy (PFS) — PSK ( IKE ESP SA). ;

    / ( ) IKE . / ( ) ;

    , , . .



Nach einem solchen IKE_SA_INIT- Austausch haben die DĂ€monen die Adressen der anderen, SPIi + SPIr den Wert der IKE-Sitzung, die von der SA ausgehandelten Algorithmen (im Fall von IKE sind dies SchlĂŒsselvereinbarung ( DH ), NachrichtenverschlĂŒsselung / -authentifizierung ( ENCR ), SchlĂŒsselgenerierungsalgorithmen ( PRF )), der öffentliche SchlĂŒssel (DH) der gegenĂŒberliegenden Seite. Dies reicht aus, um den Status im Speicher zu speichern und eine SchlĂŒsselvereinbarung durchzufĂŒhren (Diffie-Hellman, GOST R 34.10-VKO, Kurve 25519 usw.), um einen symmetrischen SchlĂŒssel zum VerschlĂŒsseln der Nutzdaten nachfolgender IKE-Nachrichten zu generieren.



TLS 1.3: Das Format der Handshake-Nachrichten ist sehr unterschiedlich, es gibt viel VermĂ€chtnis, aber im Grunde nichts, was auffĂ€llt. Das Zufallsfeld wird anstelle von Nonce verwendet. Anstelle von Nutzlasten zahlreiche Erweiterungen. Anstelle einer komplexen SA-Vorschlagsstruktur werden VerschlĂŒsselungskennungen verwendet, die kompakter und einfacher sind. Meiner Meinung nach ist die FlexibilitĂ€t von SA-VorschlĂ€gen ĂŒbermĂ€ĂŸig hoch, aber in IKEv2 ist dies immer noch kein Problem, und Werte, die Ciphersuite Ă€hneln, werden in die Konfigurationsdatei geschrieben. Nur mit TLS 1.3 wird der DH-Austausch obligatorisch.



IKE SchlĂŒsselmaterial



Nach IKE_SA_INIT wird SKEYSEED generiert :

SKEYSEED = PRF (Ni [: 8] || Nr [: 8], DH-KEY)


Der PRF-Algorithmus wird in der IKE SA ausgewĂ€hlt. FĂŒr GOST IKEv2 ist dies beispielsweise die HMAC-Stribog-512-Funktion. Der PRF-SchlĂŒssel ist ein 64-Bit-Block aus jeder Nonce.



Es sieht leichtfertig aus, weil Nonces offen ĂŒbertragen werden, was bedeutet, dass der SchlĂŒssel fĂŒr diese PRF jedem bekannt ist, der den Verkehr abgefangen hat. PRF wird hier jedoch ausschließlich verwendet, um aus dem DH-KEY- Ergebnis der Berechnung des DH einen SchlĂŒssel zu generieren, der dem Angreifer bereits unbekannt ist . Das Ergebnis der DH-Funktion kann ein großer und ungleichmĂ€ĂŸiger Entropiewert sein, es kann ein Punkt auf einer elliptischen Kurve sein - all dies kann nicht als kurzer symmetrischer SchlĂŒssel mit hoher Entropie verwendet werden. Daher mĂŒssen Sie die Entropie aus DH-KEY extrahieren (dies ist nur SKEYSEED ) und dann erweitern (erweitern ) auf die erforderliche Anzahl von SchlĂŒsseln:



PRF+(SKEYSEED, Ni || Nr || SPIi || SPIr) ->
    SK_d || SK_ai || SK_ar || SK_ei || SK_er || SK_pi || SK_pr

PRF+(K,S) = T1 || T2 || T3 || T4 || ...
T1 = PRF(K,       S || 0x01)
T2 = PRF(K, T1 || S || 0x02)
T3 = PRF(K, T2 || S || 0x03)
T4 = PRF(K, T3 || S || 0x04)


Dies ist alles eine klassische SchlĂŒsselableitungsoperation mit Extraktions- / Erweiterungsstufen , Ă€hnlich der HKDF- Funktion. Wenn HKDF jedoch die Verwendung von Hash-Funktionen ĂŒbernimmt, kann diese PRF / PRF + -Konstruktion einfach mit symmetrischen Chiffren verwendet werden - im Fall des ĂŒblichen AES-GCM + AES-XCBC-PRF werden wir nirgendwo eine Hash-Funktion verwenden, sondern nur eine kleine Anzahl gebrauchte Grundelemente sind immer gut.



Folgende SchlĂŒssel werden generiert:



  • SK_d- SchlĂŒssel zum Generieren von SchlĂŒsseln fĂŒr untergeordnete ESP-SAs.
  • SK_a [ir] SchlĂŒssel fĂŒr die IKE-Nachrichtenauthentifizierung. Nicht generiert / nicht verwendet, wenn der AEAD-Algorithmus vereinbart ist (AES-GCM, Grasshopper / Magma-MGM, ChaCha20-Poly1305 usw.).
  • SK_e[ir] IKE .
  • SK_p[ir] AUTH.


TLS 1.3: hat eine wesentlich komplexere SchlĂŒsselplanung. Die Entropie wird auf einmal aus den gesamten Handshake-Nachrichten herausgedrĂŒckt und nicht aus einzelnen Feldern. Die generierte erweiterte Sequenz wird nicht nur in eine Reihe von SchlĂŒsseln geschnitten (+ Salz fĂŒr diese bei Bedarf), sondern auch von HMAC-Transformationen mit Labels (Labels) fĂŒr jeden Verwendungskontext dieser SchlĂŒssel oder generierten IVs begleitet. Die Verwendung von Textbezeichnungen / Anwendungen / Kontexten fĂŒr jede Art von generiertem Wert ist eine gute moderne Praxis und einfacher, als sich zu fragen, ob Sie sie benötigen. Alles zu hacken, was auffĂ€llt, ist auch eine sehr gute Praxis: "Es wird nicht schlimmer werden." Dies bedeutet jedoch nicht, dass die Sicherheit von IKEv2 schlechter ist oder dass man leicht zumindest eine entfernt theoretische Situation finden kann, in der das Fehlen eines Labels in den HĂ€nden eines Angreifers liegen kann.In IKEv2 ist der Ansatz minimal, wĂ€hrend es in TLS 1.3 "besser ist, ihn zu ĂŒberschreiben" (weil in frĂŒheren Versionen des Protokolls wie viele Pfosten oder Schwierigkeiten aufgetreten sind!). IKEv2 verwendet weiterhin bewĂ€hrte AnsĂ€tze und Grundelemente, authentifiziert alles, was benötigt wird, drĂŒckt / berĂŒcksichtigt die gesamte ĂŒbertragene Entropie und verwendet unterschiedliche SchlĂŒssel fĂŒr jede Seite und Aufgabe.



IKE_AUTH



Als nĂ€chstes wird ein IKE_AUTH- Austausch durchgefĂŒhrt , der beide Parteien authentifiziert und die ESP SA aushandelt:



    SK{IDi, [CERT, ...], [CERTREQ], [IDr], AUTH, SAi2, TSi, TSr} -->
<-- SK{IDr, [CERT, ...],                   AUTH, SAr2, TSi, TSr}


  • IKE-Nachrichten enthalten eine verschlĂŒsselte Nutzlast ( SK ), die alle anderen enthĂ€lt.
  • Der Initiator stellt seine Kennung ( IDi ), seinen Authentifikator ( AUTH ), sein SA-Angebot fĂŒr ESP ( SAi2 ) und ein Initiator / Responder-Paar bereit , sogenannte Verkehrsselektoren ( TS * ). Optional kann auch die erwartete Responder-ID gesendet werden, die als eine Art SNI-Analogon von TLS betrachtet werden kann.
  • Als Antwort erhĂ€lt es die Kennung des Antwortenden, den ausgehandelten ESP SA-Vorschlag, validierte Verkehrsselektoren und einen Authentifikator.
  • Danach betrachten sich beide Parteien gegenseitig als authentifiziert, haben eine Vereinbarung ĂŒber ESP SA, Datenverkehr, der zu diesem ESP gehören muss, und können dem Kernel bereits einen Befehl zum Erstellen von SA und möglicherweise SP erteilen (es gibt DĂ€monen, die sich ĂŒberhaupt nicht mit SP befassen).


Jetzt genauer ĂŒber diese Nutzlasten:



  • ID - Partei- ID . EnthĂ€lt den Identifikationstyp und die dafĂŒr spezifischen Daten. Die Parteien können auf viele Arten identifiziert werden: IPv4 / IPv6-Adresse, FQDN (vollqualifizierter DomĂ€nenname, nur eine Zeichenfolge, die beliebteste Methode), RFC822-E-Mail-Adresse, ASN.1 DER Distinguished Name (die hĂ€ufigste Methode bei Verwendung von X.509-Zertifikaten) oder Allgemeiner Name sowie herstellerspezifisch.
  • AUTH — . PRF ( MAC-), (pre-shared key (PSK)), . (TBS*):



    TBSi = Msg0 || Nr || PRF(SK_pi, IDi)
    TBSr = Msg1 || Ni || PRF(SK_pr, IDr)
    


    (Msg0), nonce (Nr), (IDi), «» . , SK_pi ( ). «».



    / . . ( Ni Nr), . , , .



    , . ( ), . , - . round-trip-. SIGMA- , IKEv2, ESP SA, . , , . SIGMA MAC c ( SK_*). IKEv2 PRF, . , PRF(ID*) , brute-force ( ) .



    PSK, :



    AUTHi = PRF(PRF(PSK, "Key Pad for IKEv2"), TBSi)
    AUTHr = PRF(PRF(PSK, "Key Pad for IKEv2"), TBSr)
    


    PRF(PSK) PSK ? PSK PRF . PSK , /. PRF() «» . PRF(PSK) PSK PSK , ( Argon2, Balloon ).

  • SA*2 — SA , ESP .
  • TS* — . : IPv4/IPv6 , IP (), / (), / . :



    TSi = ((proto=17, port=100, fc::123 - fc::123),
           (proto=17, port=200, fc::123 - fc::123))
    TSr = ((proto=17, port=300, :: - ffff:..:ffff),
           (proto=17, port=400, :: - ffff:..:ffff))
    


    , UDP ( = 17), 100- 200- fc::123 , UDP 300 400. , IP . , , IP , ( , ICMP ). , .



    UDP . , , , 100 300-, ESP SA .



    Die antwortende Partei sendet ihre bestĂ€tigte Auswahl von Selektoren, die entweder ĂŒbereinstimmen oder engere Auswahlbereiche haben können.


Alle diese Nutzdaten werden auf dem von der IKE SA nach dem ersten Nachrichtenaustausch generierten SchlĂŒssel verschlĂŒsselt. Die VerschlĂŒsselung ist erforderlich, um die ĂŒbermittelten Kennungen der Parteien, ihre Zertifikate und andere private Informationen offen zu verbergen. Ein aktiver Angreifer kann sich jedoch in den ersten IKE_SA_INIT- Austausch einklemmen und diese Informationen anzeigen , obwohl er die Sitzung nicht mehr fortsetzen kann.



TLS 1.3 :



  • application ( ServerHello ||
 || Finished, , , ), (Client Finished). IKEv2 ESP SA round-trip-, TCP/SCTP handshake.
  • , (IDr ), SNI, ClientHello . IKEv2 . ESNI, , DNS, DPI.
  • IKEv2 , «»/«» ( ), PSK, , EAP. TLS 1.3 X.509 . TLS 1.3 X.509 . RFC TLS 1.3 «» . IKEv2 / .
  • TLS 1.3 , , application ClientHello (EarlyData), application Client Finished . TLS 1.3 EarlyData .
  • TLS (session resumption), iPSK , , . IKEv2 , RFC 5723 . IKE , , ( TCP/SCTP/whatever ) IP .
  • TLS . IKEv2 IKE SA ESP SA . , () high-grade , . , , , . - ChaCha20-Poly1305, AES-256-GCM-16, -MGM . IKE SA ESP - NIST-.


Die VerschlĂŒsselung von SK- Nutzlast-AEAD-Chiffren ist nicht schwierig und Ă€hnelt ESP beispielsweise fĂŒr AES-GCM (bei dem das Salz Ă€hnlich wie bei AES-GCM-ESP Teil des SchlĂŒsselmaterials ist):



AES-GCM(
    key             = SK_*e,
    plaintext       = 64-bit IV || payloads || pad || 8-bit padLen,
    nonce           = 32-bit salt || IV,
    associated-data = IKEHdr || unencrypted payloads
) -> ciphertext


Authentifizierung mit EDS



Was ist, wenn sich eine Partei mit Signatur und X.509-Zertifikaten authentifizieren möchte? Zu diesem Zweck kann bereits in IKE_SA_INIT eine CERTREQ- Nutzlast gesendet werden, wobei die gegenĂŒberliegende Seite aufgefordert wird, ein Zertifikat in Form von CERT- Nutzdaten bereitzustellen . CERT und CERTREQ enthalten die Zertifikatsformatkennung und den formatspezifischen Inhalt. In der Regel können Zertifikate als ASN.1 DER oder als SHA1-Hash des Zertifikats + der URL angezeigt werden, von der sie heruntergeladen werden können. Da die GrĂ¶ĂŸe von UDP durch die MTU begrenzt ist und die GrĂ¶ĂŸe von Zertifikaten viel grĂ¶ĂŸer sein kann, ist die Option Hash + URL hier nĂŒtzlich (obwohl sie als KrĂŒcke betrachtet werden kann).



Der IKEv2-RFC allein listet zusĂ€tzlich zu DER-codierten X.509-Zertifikaten und SHA1 + -URLs Folgendes auf: PKCS # 7-umschlossenes X.509-Zertifikat, PGP-Zertifikat, DNS-signierter SchlĂŒssel, SPKI-Zertifikat, X.509-Attributzertifikat, öffentliche RohschlĂŒssel. Wenn Sie IPSec auf die gleiche Weise wie das hĂ€ufigste TLS fĂŒr AnwendungsfĂ€lle verwenden möchten: einen Server, der durch ein X.509-Zertifikat und einen anonymen Client authentifiziert wurde, gibt es in IKEv2 keine Möglichkeit, eine der Parteien nicht zu authentifizieren. Aber RFC 5386 beschreibt einen besser als Nichts-Sicherheit Ansatz , bei dem der „Client“ die nackten öffentlichen SchlĂŒssel verwenden kann , und der Server kann es als anonym behandelt.



DarĂŒber hinaus wird die EAP-Authentifizierung standardmĂ€ĂŸig unterstĂŒtzt, wobei IKE_AUTH Roundtrips hinzugefĂŒgt werdenAustausch. EAP kann sowohl angeben, ob die Partei authentifiziert ist oder nicht, als auch einen SchlĂŒssel generieren, den IKEv2 berĂŒcksichtigt und verwendet. Ich werde Ihnen nur ein Diagramm zeigen, wie EAP funktionieren kann:



                 SAi1, KEi, Ni  -->
                                <--  SAr1, KEr, Nr
SK{IDi, [IDr], SAi2, TSi, TSr}  -->
                                <--  SK{IDr, AUTH, EAP}
                       SK{EAP}  -->
                                <--  SK{EAP(success)}
                      SK{AUTH}  -->
                                <--  SK{AUTH, SAr2, TSi, TSr}


TLS 1.3 : Darin wird die Signatur (oder MAC in der fertigen Nachricht) ĂŒber dem Hash aller gesehenen Nachrichten platziert, die am Handshake teilgenommen haben. Auch ein einfacher und zuverlĂ€ssiger guter Ansatz. Es gibt keine Vielzahl von Authentifizierungsmethoden. Ich wĂŒrde mir aber ein starkes PAKE-Protokoll (Authenticated Password Key Agreement) wĂŒnschen, wie das russische SESPAKE oder OPAQUE .



ESP SA SchlĂŒsselmaterial und seine Erneuerung



Also haben wir die Authentifizierung ĂŒberprĂŒft, ĂŒberprĂŒft, ob die SchlĂŒsselvereinbarung korrekt ist, die ESP SA und die Verkehrsselektoren ausgehandelt. Es mĂŒssen noch symmetrische SchlĂŒssel fĂŒr ESP generiert werden, und die erforderliche SA / SP kann im Kernel installiert werden:

PRF + (SK_d, Ni || Nr) -> KEYMAT0 || KEYMAT1


FĂŒr die bidirektionale Kommunikation sind zwei ESP-SAs erforderlich. Daher generiert IKEv2 zwei SchlĂŒsselmaterialien gleichzeitig, die bereits direkt an den Kern in der entsprechenden SA ĂŒbertragen werden. Die LĂ€nge des Materials hĂ€ngt vom verwendeten ESP-Algorithmus ab (zum Beispiel benötigt AES-GCM-ESP neben dem SchlĂŒssel auch 32-Bit-Salz). Der SPI-Wert ist der SPI-Wert, der von jeder Partei in den ESP SA-VorschlĂ€gen angegeben wird.



Was ist, wenn wir uns beispielsweise auf mehrere ESP SA / SPs einigen mĂŒssen, weil nicht alle WĂŒnsche in einem einzigen TSi / TSr- Paar spezifiziert werden können? Hierzu werden CREATE_CHILD_SA- Austausche verwendet, die jederzeit nach IKE_AUTH stattfinden . Die Erstellung einer untergeordneten SA erfolgt im folgenden Austausch:



    SK {SA, Ni, [KEi], TSi, TSr} ->
<- SK {SA, Nr, [KEr], TSi, TSr}


SA-Angebot wird gemacht, Nonces, Verkehrsselektoren werden gesendet. Alles ist wie zuvor. Das SchlĂŒsselmaterial wird bereits mit diesen neuen Nonces generiert. Optional können Sie Nutzdaten fĂŒr den SchlĂŒsselaustausch verwenden, die die Entropie erhöhen und die Parteien dazu zwingen, eine noch asymmetrischere Kryptografie zu verwenden. Möglicherweise muss die PFS-Eigenschaft stĂ€ndig beachtet werden (im OTR- Protokoll werden mit jeder Nachricht kurzlebige DH-SchlĂŒssel gesendet). Das SchlĂŒsselmaterial in diesem Fall wird wie folgt ausgearbeitet:



PRF + (SK_d, DH-KEY || Ni || Nr) -> KEYMAT0 || KEYMAT1


Was ist, wenn wir die IKE SA der Verbindung erneuern möchten? Wir fĂŒhren den folgenden CREATE_CHILD_SA- Austausch durch:



    SK {SA, Ni, KEi} ->
<- SK {SA, Nr, KEr}


wobei SA bereits IKE SA-VorschlÀge enthalten wird und ein neuer SKEYSEED entwickelt wird :



PRF (SK_d_old, DH-KEY || Ni || Nr) -> SKEYSEED


Der ESP SA-SchlĂŒssel wird entweder durch Erstellen einer neuen ESP SA (mit einem anderen SPI) und Löschen des alten oder durch Senden einer speziellen Benachrichtigung (siehe unten) aktualisiert. Die Umstellung des Datenverkehrs auf die Verwendung der neuen ESP SA ist transparent und verlustfrei. FĂŒr kurze Zeit werden die Parteien zwei aktive ESP-SAs haben, die die Verarbeitung von Verkehr ermöglichen, der noch auf KommunikationskanĂ€len ĂŒbertragen wird.



Das Löschen einer ESP-SA erfolgt durch Senden einer DELETE- Nutzlast in nachfolgenden INFORMATIONAL- Austauschen, in denen die zu löschenden SPIs aufgefĂŒhrt sind. Da alle ESP-SAs paarweise vorhanden sind (fĂŒr bidirektionale Kommunikation), sendet jede Seite SPI-Werte nur an die ESP-SAs, die fĂŒr den ausgehenden Verkehr verantwortlich sind. Empfangen Sie als Antwort SPI ESP SA-Werte fĂŒr eingehenden Datenverkehr.



    SK {D (SPIi)} ->
<- SK {D (SPIr)}


Das Löschen einer IKE SA erfolgt ebenfalls ĂŒber DELETE , jedoch mit einem IKE SPI und Akzeptieren einer leeren authentifizierten Antwort:



    SK {D} ->
<- SK {}


TLS 1.3 : Es gibt einen Mechanismus zum Drehen von SchlĂŒsseln durch KeyUpdate- Nachrichten, es besteht jedoch keine Möglichkeit, zusĂ€tzliche Entropie hinzuzufĂŒgen oder DH durchzufĂŒhren. TLS ist eindeutig nicht fĂŒr sehr langlebige Verbindungen ausgelegt. Im besten Fall können Sie die Sitzung nur unterbrechen und mit iPSK-ECDHE mit einem Handschlag eine neue Sitzung erstellen.



IKEv1 verfĂŒgt sowohl ĂŒber ein separates Verfahren zur Erneuerung des IKE-SchlĂŒssels als auch ĂŒber ein separates Verfahren zur erneuten Authentifizierung. In IKEv2 findet keine erneute Authentifizierung statt. Dazu wird einfach eine neue IKE SA von Grund auf neu erstellt, die alte ĂŒber DELETE gelöscht .



TLS 1.3 : verfĂŒgt ĂŒber eine Post-Handshake-Clientauthentifizierungsfunktion, wenn zu einem beliebigen Zeitpunkt nach dem Handshake ( Fertig)Nachrichten von beiden Seiten) kann der Server eine Anforderung zur Clientauthentifizierung mithilfe eines X.509-Zertifikats senden. Zum Beispiel ging ein Kunde, der auf der Website herumwanderte, auf die Seite seines persönlichen Kontos. In IKEv2 ist dies nicht möglich - die Authentifizierung erfolgt nur zum Zeitpunkt des Handshakes.



BENACHRICHTIGEN



Wie werden Tunnel- / Transportmodi ausgehandelt, TFC? Zu diesem Zweck werden der Anforderung Nutzdaten von "Benachrichtigungen" NOTIFY ( N ) hinzugefĂŒgt . Allein im IKEv2-RFC gibt es Dutzende Arten von Benachrichtigungen. Warnungen werden verwendet, um Fehler, Probleme bei der Aushandlung von SAs fĂŒr VorschlĂ€ge, Verkehrsselektoren usw.



zu signalisieren. Um den Wunsch zu signalisieren, den Transportmodus in einer ausgehandelten ESP-SA zu verwenden, wird sowohl vom Initiator als auch vom Antwortenden eine N- Benachrichtigung (USE_TRANSPORT_MODE) hinzugefĂŒgt, um die Modusaushandlung zu bestĂ€tigen. N (ESP_TFC_PADDING_NOT_SUPPORTED) Alarm signalisiert, dass TFC nicht unterstĂŒtzt wird. Und N (HTTP_CERT_LOOKUP_SUPPORTED) gibt an, dass das Herunterladen eines Zertifikats von einer URL unterstĂŒtzt wird.



Die Möglichkeit, den ESP-SA-SchlĂŒssel zu aktualisieren, ohne neue ESP-SAs zu erstellen, Ă€hnelt dem Verfahren zum Erstellen einer untergeordneten ESP-SA, der Initiator fĂŒgt jedoch eine N- Benachrichtigung (REKEY_SA) hinzu, die den SPI der aktuellen ESP-SA enthĂ€lt:

    SK {N (REKEY_SA), SA, Ni, [KEi], TSi, TSr} ->
<- SK {SA, Nr, [KEr], TSi, TSr}





DPD



Der INFORMATIONSaustausch mit leerem SK wird fĂŒr die Dead Peer Detection ( DPD ) als Herzschlag zwischen DĂ€monen verwendet. Wenn der IKE-DĂ€mon lĂ€ngere Zeit nicht verfĂŒgbar ist, hat er höchstwahrscheinlich seinen Status verloren und daher beobachtet niemand die ESP SA auf der gegenĂŒberliegenden Seite oder sie sind nicht mehr aktiv. Wenn klar ist, dass die Remote-Seite nicht verfĂŒgbar ist, ist es daher sinnvoll, alle zugeordneten ESP / IKE-SAs zu entfernen. Ein leerer SK bedeutet, dass keine Nutzdaten enthalten sind, aber authentifizierte Daten (mindestens IKE-Header mit ZĂ€hlern) vorhanden sind. Die Authentifizierung eines solchen Pakets ist daher ein vertrauenswĂŒrdiges Lebenszeichen.



    SK {} ->
<- SK {}


Was aber, wenn eine Seite schnell neu gestartet wurde, den Status verlor und eine IKE-Verbindung von Grund auf neu aufbaute? Die andere Seite bemerkt möglicherweise nicht einmal, dass die andere nicht verfĂŒgbar ist, und sie wĂŒrde denken, dass sie beschlossen hat, sich entweder erneut zu authentifizieren oder neue untergeordnete Sicherheitszuordnungen in einer anderen IKE-Verbindung zu erstellen. Nichts wird katastrophal sein, aber die alte ESP SA kann noch eine anstĂ€ndige Zeit leben. Ein Initiator kann einen N- Alarm (INITIAL_CONTACT) in seinen IKE_AUTH- Austausch einfĂŒgen , der signalisiert, dass dies die einzige bekannte IKE-Verbindung zu dieser Seite ist. Wenn Sie eine solche authentifizierte Benachrichtigung sehen, können Sie alle alten IKE / ESP-Sicherheitszuordnungen mit gutem Gewissen löschen.



DoS und schlechte KE



Bereits zu Beginn von IKE_SA_INIT wird eine KEi- Nutzlast mit einem kurzlebigen öffentlichen DH-SchlĂŒssel gesendet . Der Initiator hat die IKE SA jedoch noch nicht ausgetauscht, und woher weiß er, welchen Algorithmus die empfangende Seite unterstĂŒtzt? Es kann im LangzeitgedĂ€chtnis nur raten oder sich daran erinnern, was zuvor zur Zuordnung zu dieser Adresse verwendet wurde. Wenn der Responder den Algorithmus nicht unterstĂŒtzt, sendet er N (INVALID_KEY_PAYLOAD) eine Benachrichtigung, die die Kennung des bevorzugten DH-Algorithmus angibt. Der Initiator muss seine Anfrage wiederholen, jedoch mit einem neuen KEi .



TLS 1.3: kann mit verschiedenen Algorithmen mehrere kurzlebige öffentliche SchlĂŒssel gleichzeitig senden, möglicherweise reichen einige aus. Aber das sind Ressourcen und Verkehr. Möglicherweise sendet er den öffentlichen SchlĂŒssel ĂŒberhaupt nicht und der Server antwortet ihm mit HelloRetryRequest mit seinen Einstellungen. Das Plus ist, dass teure asymmetrische Kryptografie erst verwendet wird, wenn die bevorzugten Serveralgorithmen bekannt sind, jedoch auf Kosten eines zusĂ€tzlichen Roundtrips. Wenn der Client ursprĂŒnglich einen unangemessenen Algorithmus fĂŒr öffentliche SchlĂŒssel bereitgestellt hat, erhĂ€lt er wie in IKEv2 eine HelloRetryRequest mit den zur Auswahl stehenden Algorithmen.



Was aber, wenn Sie dasselbe Anfangspaket vom Initiator senden? Dort kann jedes Mal ein neues SPIi generiert werden... Der Responder fĂŒhrt mindestens DH-Berechnungen ehrlich durch und antwortet mit IKE_AUTH . DH ist ein sehr ressourcenintensiver Vorgang, bei dem die CPU und die Entropiequelle verbrannt werden - der Transponder kann also beschĂ€digt werden.



In IKEv2 (aber nicht in IKEv1) gibt es einen Schutz dagegen in Form einer Antwort N (COOKIE) mit einer Benachrichtigung, die eine Cookie-Zeichenfolge enthĂ€lt. Danach muss der Initiator seine Anforderung wiederholen, aber diese N (COOKIE) -Nutzlast hinzufĂŒgen :



           SAi1, KEi, Ni -->
                         <-- N(COOKIE)
SAi1, KEi, Ni, N(COOKIE) -->
                         <-- SAr1, KEr, Nr, [CERTREQ]


Die Anfrage muss identischen SPI / Ni wie die erste haben. Es ist leicht genug, es mit Nutzlast zu ergĂ€nzen. Der Antwortende kann den Status der Verbindung zwischen der Anforderung und dem an ihn gesendeten Cookie speichern . Erst wenn diese ĂŒbereinstimmen, kann der Antwortende nach Abschluss dieser Arbeit zum HinzufĂŒgen des Cookies zur Anforderung durch den Initiator den IKE_AUTH- Austausch routinemĂ€ĂŸig fortsetzen .



Es ist jedoch möglich, den Status direkt im Cookie zu speichern, wodurch er sich selbst authentifiziert. Es kann die Tatsache tragen, dass der Befragte die Anfrage des Initiators gesehen hat ( Ni und SPIi haben sie zumindest gesehen):

Cookie = MAC (ein Geheimnis, Ni || SPIi || Zeitstempel)


Daher muss der DoS-Liebhaber den Status speichern und seine wiederholten Nachrichten recyceln, was den Angriff viel teurer macht. Es ist nur dann sinnvoll, den Cookie-Schutz zu aktivieren, wenn der Verdacht eines DoS-Angriffs besteht, um nicht alle zu einer zusĂ€tzlichen Hin- und RĂŒckfahrt zu zwingen.



TLS 1.3 : Hat Ă€hnliche optionale Sicherheit. Der Server kann mit HelloRetryRequest mit einer Nachricht antworten , die die Cookie- Erweiterung enthĂ€lt, die der Client in sein wiederholtes ClientHello2 einfĂŒgen sollte .



CP



Mit IKEv2 können Sie die Konfiguration von IP-Netzwerken / Adressen aushandeln. Mit Configuration Payload ( CP ) können Sie eine Anforderung zum Empfang einer Konfiguration ( CFG_REQUEST / CFG_REPLY- Pakettypen) stellen und die Konfiguration auf die gegenĂŒberliegende Seite setzen ( CFG_SET / CFG_ACK- Typen). Die Konfigurationsanforderung enthĂ€lt die Attribute, die die Partei kennen / festlegen möchte. Attribute können sein: "interne" Adresse, DNS-Adresse, DHCP, Subnetzkenntnisse oder andere in verwandten RFCs beschriebene Typen. Beispielsweise kann der Initiator im IKE_AUTH- Austausch eine Anfrage stellen, um ihm eine Intranetadresse (Verbindung zum Unternehmensnetzwerk) und einen DNS-Server zu erteilen:



    SK{IDi, [IDr], AUTH, CP(CFG_REQUEST), SAi2, TSi, TSr} -->
<-- SK{IDr,        AUTH, CP(CFG_REPLY),   SAr2, TSi, TSr}

CP(CFG_REQUEST) =
  INTERNAL_IP6_ADDRESS()
  INTERNAL_IP6_DNS()
TSi = (proto=0, port=0-65535, :: - ffff:...:ffff)
TSr = (proto=0, port=0-65535, :: - ffff:...:ffff)

CP(CFG_REPLY) =
  INTERNAL_IP6_ADDRESS(2001:db8::5/64)
  INTERNAL_IP6_DNS(2001:db8::1)
  INTERNAL_IP6_SUBNET(2001:db8:abcd::/64)
TSi = (proto=0, port=0-65535, 2001:db8::5 - 2001:db8::5)
TSr = (proto=0, port=0-65535, 2001:db8::0 - 2001:db8::ffff:ffff:ffff:ffff)


  • Die Adresse 2001: db8 :: 5 wird dem Initiator zugewiesen .
  • ESP SA 2001:db8::/64 .
  • 2001:db8::1 DNS .
  • 2001:db8:abcd::/64 , , ESP SA, 2001:db8:: .


Go?



Um moderne inlĂ€ndische Implementierungen des IPsec-Stacks mit GOST-Algorithmen zu testen, haben wir beschlossen, eine völlig unabhĂ€ngige Implementierung (von Linux, FreeBSD, strongSwan und anderen Stacks) zu schreiben. Und fĂŒr eine schnelle und einfache Entwicklung in der Go- Sprache mit der bereits vorhandenen Implementierung der GoGOST- Bibliothek fĂŒr GOST-Algorithmen . Zuvor hatte ich bereits Erfahrung mit der Integration von GOST in die TLS 1.3-Implementierung von crypto / tls- und crypto / x509 Go-Bibliotheken.



Das Gostipsec- Projekt ist freie Software, die aus zwei DĂ€monen besteht: ESPER (ESPv3) und IKER (IKEv2):



          ┌──────┐          ┌────┐          ┌─────┐          ┌────┐
          │remote│          │iker│          │esper│          │ipfw│
          └──┬───┘          └─┬──┘          └──┬──┘          └─┬──┘
             │                │                │               │
╔══════╀═════â•Ș════════════════â•Ș════════════╗   │               │
║ UDP  │     │                │            ║   │               │
╟──────┘     │    IKEv2...    │            ║   │               │
║            │ <───────────────            ║   │               │
║            │                │            ║   │               │
║            │    IKEv2...    │            ║   │               │
║            │ ───────────────>            ║   │               │
╚════════════â•Ș════════════════â•Ș════════════╝   │               │
             │                │                │               │
             │                │                │               │
             │    ╔═══════════â•Ș══╀═════════════â•Ș════════════╗  │
             │    ║ UNIX-SOCKET  │             │            ║  │
             │    ╟─────────────setkey-commands│            ║  │
             │    ║           │ ───────────────>            ║  │
             │    ╚═══════════â•Ș════════════════â•Ș════════════╝  │
             │                │                │               │
             │                │                │               │
             │                │   ╔════════════â•Ș═══╀═══════════â•Ș════════════╗
             │                │   ║ DIVERT-SOCKET  │           │            ║
             │                │   ╟──────────────encrypted ESP │            ║
             │                │   ║            │ <──────────────            ║
             │                │   ║            │               │            ║
             │                │   ║            │ decrypted ESP │            ║
             │                │   ║            │ ──────────────>            ║
             │                │   ║            │               │            ║
             │                │   ║            │ unencrypted IP│            ║
             │                │   ║            │ <──────────────            ║
             │                │   ║            │               │            ║
             │                │   ║            │  encrypted IP │            ║
             │                │   ║            │ ──────────────>            ║
             │                │   ╚════════════â•Ș═══════════════â•Ș════════════╝
             │                │                │               │


Im Moment funktioniert ESPER nur mit DIVERT- Sockets (ich fand unter Linux nichts so einfaches), daher wird es nur unter FreeBSD-Betriebssystemen (wahrscheinlich OpenBSD, nicht ĂŒberprĂŒft) unterstĂŒtzt. ESPER verwendet wie IKER nicht PF_KEYv2 , fĂŒr das C-Bindungen erforderlich wĂ€ren, als Schnittstelle zwischen ESP <-> IKE- Bindungen, sondern die bereits am Anfang des Artikels erwĂ€hnte Text- Setkey- Ă€hnliche Schnittstelle. IKER kann daher auch zum Aushandeln von SchlĂŒsseln fĂŒr eine Kernel-ESP-Implementierung verwendet werden, indem der eigentliche Befehl setkey aufgerufen wird . Diese Befehle fĂŒr ESPER sehen folgendermaßen aus:



add fc00::ac fc00::dc esp 0x12345678 -u 123 -E aes-gcm-16 0xd3537e657fde5599a2804fbb52d1aaed94b65d3e ;
add fc00::dc fc00::ac esp 0x12345679 -u 234 -E aes-gcm-16 0x9a2dae68e475eacb39d41f23c3cbef890e9f6276 tfc:1320 ;

spdadd fc00::ac/128 fc00::dc/128 all -P in ipsec esp/transport//unique:123 ;
spdadd fc00::dc/128 fc00::ac/128 all -P out ipsec esp/transport//unique:234 ;


ESPER unterstĂŒtzt: AES-128/256-GCM-16, Magma / Grasshopper-MGM, ESN, TFC, Transport- / Tunnelmodi, IPv6 / IPv4 (UnterstĂŒtzung fĂŒr letztere, viel komplexer, wurde nicht grĂŒndlich getestet und wer benötigt IPv4 fĂŒr neue Projekte?), Schutz vor Wiederholungsangriffen. Mit IKER hingegen können Sie Folgendes anpassen: AES-128/256-GCM-16 + AES-XCBC + Kurve25519, Magma / Heuschrecke-MGM + HMAC-Stribog-512 + GOST R 34.10-2012-VKO-256/512, ESN / TFC / Transport / Tunnel-Modi, Authentifizierung mit digitalen PSK- und X.509-Signaturen (ECDSA, GOST R 34.10-2012). Konfiguriert durch eine einzelne Hjson- Datei:



{
    IKEAlgos: [
        gost128-vko512
        aes256gcm16-aesxcbc-curve25519
        aes128gcm16-aesxcbc-curve25519
    ]
    ESPAlgos: [
        gost128-esn
        gost64-esn
        aes256gcm16-esn
        aes256gcm16-noesn
        aes128gcm16-esn
        aes128gcm16-noesn
    ]
    SigHashes: [
        streebog512
        streebog256
        sha512
        sha256
    ]
    DPDTimeout: 300
    Peers: [
        {
            Autostart: true
            OurIP: fc00::dc
            TheirIP: fc00::ac
            OurId: our.company.net
            TheirId: CN=example.com
            OurTSS: [
                fc00::dc/128[tcp]
                fc00::dc/128[udp/53]
            ]
            TheirTSS: [
                fc00::ac/128
            ]
            Mode: transport
            # Won't be used, because of X.509 signature authentication
            PSK: DEADBABE
            TheirCertHash: a948904f2f0f479b8f8197694b30184b0d2ed1c1cd2a1ec0fb85d299a192a447
            OurCert: our.company.net.cer.pem
            OurPrvKey: our.company.net.key.pem
            TFC: 1200
        }
    ]
}


In diesem Beispiel haben wir das einzige Mitglied festgelegt, von dem wir wissen:



  • Mit welchem ​​Daemon wird automatisch eine Verbindung hergestellt?
  • FĂŒhren Sie alle fĂŒnf Minuten eine Dead Peer-Erkennung durch
  • ESN, fallback- , TFC 1200 .
  • TCP DNS fc00::dc fc00::ac .
  • X.509 , CN=example.com subject- SHA256 SubjectPublicKeyInfo . OurId OurCert .
  • OurCert/OurPrvKey , PSK FQDN OurId.


IKER unterstĂŒtzt noch nicht alle IKEv2-Funktionen ( CREATE_CHILD_SA , Rekeying), ĂŒberwacht den Paketverlust nicht und kĂŒmmert sich nicht um das DON'T PANIC- Prinzip. Daher kann es noch nicht als Kandidat fĂŒr eine "industrielle" Verwendung angesehen werden.



Tarball gostipsec enthĂ€lt bereits alle AbhĂ€ngigkeiten, kompilierte .info- Dokumentationen und Ziele fĂŒr das Redo- Build- System , obwohl das Erstellen ausfĂŒhrbarer Dateien mit einem regulĂ€ren Go-Build- Aufruf problemlos möglich ist .



Hjson?



Holywar-Thema, aber ich werde trotzdem mein Phi ausdrĂŒcken:



  • In INI können Sie solche Sweeping-Strukturen nicht angeben, und es gibt keinen Standard fĂŒr INI- Dateien.
  • capabilities database , termcap-like, BSD , (, , ), C. IKER .
  • XML — .
  • JSON — , Python Go . , . - !
  • YAML — , , . , . , YAML , , , . . . - . YAML ( ) - ( StrictYAML ).
  • TOML — : , , , . , :



    [[foo.bar]]
    baz = 123
    
    [[foo.bar]]
    abc = 123
    




    :



    {
      "foo": {
        "bar": [
          {"baz": 123 },
          {"abc": 123 }
        ]
      }
    }
    


    «» / , . , TOML, NNCP , . , , .
  • Hjson — JSON ( , ), Hjson. github.com/hjson/hjson-go Hjson JSON, . . , . , JSON Hjson.




Wenn Sie eine Teilmenge von Funktionen implementieren, die TLS 1.3 Ă€hneln (Authentifizierung nur durch PSK- und X.509-Zertifikate, keine ernsthafte NeuverschlĂŒsselung), ist ESPv3 mit IKEv2 und IPv6 (es ist viel einfacher, damit zu arbeiten!) Aus Sicht des Programmierers etwas schwieriger in der Umsetzung. Der RFC ist nicht einmal verpflichtet, den Austausch von CREATE_CHILD_SA zu unterstĂŒtzen . Die Sicherheit wird ohne die umstrittenen und gefĂ€hrlichen möglichen Modi von TLS 1.3 ausgezeichnet sein. Die Leistung einer IPSec-Lösung ist im Allgemeinen aufgrund des Transports auf nuklearer Ebene und langlebiger IKE-Sitzungen höher.



Es ist ersichtlich, dass in IPSec alles geschĂ€rft wird, um die enorme Menge an Verkehr zwischen ganzen Netzwerken zu schĂŒtzen, aber BTNS(Besser als nichts Sicherheit) Die IETF-Arbeitsgruppe hat mehrere RFCs verfasst, die zeigen, dass IPSec problemlos fĂŒr Verbindungen pro Socket verwendet werden kann, bei denen eine der Parteien (der Client) anonym ist, wodurch die ZweckmĂ€ĂŸigkeit der Verwendung von TLS vollstĂ€ndig in Frage gestellt wird. In diesem Fall wĂŒrde die Verbindungsverriegelung es jeder Netzwerkanwendung ermöglichen, durch einen einfachen Systemaufruf wie setsockopt anzuzeigen, dass ein ESP fĂŒr die Adresse FQDN = bank.com erforderlich ist, sich als X.509-Zertifikat prĂ€sentiert (oder anonym bleibt) und dann transparent, schnell und schnell Sicheres Arbeiten mit dieser bank.com , ohne KrĂŒcken in Form von Userspace-Transportbibliotheken pro Anwendung.



Sergey Matveev , Cypherpunk, Python / Go / C-Entwickler, Chefspezialist von FGUP STC Atlas.



All Articles