Giblets IPsec、TLS 1.3、GOST、Goに察しお枬定

こんにちは私は、珟代の機噚をご玹介したいのIPsecのスタックESPv3ずIKEv2のプロトコル。IPsecは、私には䞍圓に倚くの偎面を迂回しおいるように思われ、ロシア語でのその䜜業、プロトコル、および機胜の詳现な分析を芋たこずがありたせん。たた、奇劙なこずをしたす。IPsecESPv3ずIKEv2䞡方ずも2005を、2018幎の最新のトレンディな最先端のTLS1.3ず比范したす。





なぜ私はIPsecにずおも情熱を持っおいるのですかおそらくネットワヌクを保護するための最も耇雑なプロトコルスタックですか結局のずころ、耇雑さは信頌性ず安党性の䞻な敵ですたず、そのプロトコル、特にIKEv2に぀いお孊ぶほど、倚くの可胜性がそこに投入されたこずを理解し、「クラッチがクラッチを駆動する」ずいう開発者の䞀般的なアプロヌチや「雷が発生するたで」深刻な問題の解決策ずは察照的に、その思慮深さに感銘を受けたす。第二に、IPsecプロトコルは暗号化の芳点からよく考えられおおり、実際、叀いESP / IKEv1でさえ、深刻な脆匱性がなかった唯䞀の産業甚の倧量䜿甚プロトコルです。同じSSL1995幎はバヌゞョン1.3からのみきちんず考えられるようになりたした。そしお、IKEv1の巚倧な耇雑さのために倚くの人々がIPsecを嫌いたす。これはv2にはありたせん。



理想的には、オペレヌティングシステムの開発者が、IPsecずIPv6の実装ず実装コンピュヌタの可甚性のため、NATがないためで時間の速床が䜎䞋しおいなければ、SSL / TLSは原則ずしお衚瀺されるべきではありたせん。䞖界は完璧ではないこずが刀明したしたが、IPPE少なくずもスタックのSA / SP + ESP郚分は少なくずもいく぀かの広範なOSにありたす個人的には、サポヌトする開発者が䞍足しおいるためにIPsecを飲んだDragonFly BSDしか知りたせん、たた、䞀郚の先進囜のIPv6は、倧倚数の人々がすぐに利甚できたす。



IPsecは、プロトコル、API呌び出し、フレヌムワヌクのスタックであり、アプリケヌションや管理者が通信䞭に必芁なセキュリティを刀断でき、ネットワヌクレベルで透過的に保蚌されたすIP秒urity。1぀の゜ケットのみのIPパケットTCP接続などず、ネットワヌク党䜓間のトラフィックの䞡方に぀いお話すこずができたす。



トラフィックセキュリティずは、デヌタの機密性、デヌタの信頌性/敎合性、および再生攻撃からの保護を確保するこずを意味したす。ほずんどすべおのプロトコルず同様に、IPsecには、IPパケットを保護するトランスポヌト郚分ず、キヌネゎシ゚ヌション、パラメヌタヌ、構成、およびパヌティの認蚌に関連するハンドシェむク郚分がありたす。



TLS 1.3TCP接続の゜ケットごずのデヌタ保護のみを提䟛したす。DTLSはデヌタグラムの保護を提䟛できたすがDTLS 1.3はただ暙準ではありたせん、すべおのラむブラリがこれをサポヌトしおいるわけではありたせん。



トランスポヌトプロトコル



IPsecトランスポヌトはIPプロトコルを䜿甚したす。



  • AH認蚌ヘッダヌ。AHはデヌタの機密性を提䟛しないため、これ以䞊は説明したせん。私が聞いた限りでは、暗号化の䜿甚制限に関する1990幎代の䞀郚の囜の法埋に䜕らかの圢で「我慢」するためだけに䜜成されたした。暗号化は他のすべおに比べお非垞に軜量であるため、それを犠牲にするこずは意味がありたせん。しかし、ESPが蚀及されおいるほずんどすべおの堎所で、AHも意味されたす。
  • ESPセキュリティペむロヌドのカプセル化。ESPは時間の経過ずずもにわずかに進化し、珟圚はESPv3バヌゞョンを䜿甚しおいたす。これは、倚くの堎合、䞋䜍互換性があり、以前のバヌゞョンず同じです。


IPトラフィックは、トランスポヌト局によっおのみ保護されたす。たた、1秒あたり数癟䞇のパケットに぀いお話すこずができるため、事実䞊のESPは、オペレヌティングシステムのカヌネルレベルで、少なくずもそのネットワヌクスタックに実装され、カヌネルずナヌザヌスペヌスの間でコストのかかるコンテキスト切り替えを行わないようにしたす通垞はTLSで発生したす。 、SSH、OpenVPNなど。



AHずESPはIP局プロトコルであり、ネットワヌクであり、トランスポヌトではないこずを匷調したす。なぜUDPではないのですかチェックサムは冗長でCPUを消費し、暗号化はずにかく敎合性を保蚌したす。しかし、あなたのNATがESPに぀いお䜕も知らないそしお圌が知らない堎合、これはすべお圌にずっおはうたくいきたせん。埌で圌らはNAT-Tクラッチを思い぀いた NATトラバヌサル、IPsecトラフィックがポヌト4500でUDPパケットにラップされ、NATを通過できる堎合、これは䞍芁なオヌバヌヘッドであり、カヌネル内のIPsecスタックを線集する必芁がありたす。これは、これらの特別なUDPパケットをすでに理解し、ESPを抜出する必芁があるためです。通垞の凊理。



SP、SA、SPIおよび最初のIPsec暗号化



カヌネルは、IPパケットをどのように凊理するかをどのように認識したすか。キヌを䜿甚しお暗号化するか、着信ESPを埩号化するか、たたはIPパケットに觊れずに通過させるか。これを行うために、カヌネルにはセキュリティポリシヌSPがありたす。これらはファむアりォヌルのようなルヌルです。それらに加えお、コアにはセキュリティア゜シ゚ヌションSAが含たれおいたす暗号化操䜜キヌ、カりンタヌ、りィンドり再生などを実行するためのコンテキスト。䞀般に、SPはIPsec固有でもSAでもありたせん。他のタスク/プロトコルOSPFなどに䜿甚できたす。



SP / SAは、特別なAPIPF_KEYv2を介しお、たたはいく぀かのsetkeyナヌティリティを介しお手動で構成できたす。たずえば、すべおのIPパケットが送信元であるこずをカヌネルに通知する堎合fc :: 321の123アドレスはESPを介しお保護する必芁がありたす。これは、コマンドラむンから呌び出すこずで簡単に実行できたす。



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


このコマンドの前に、pingが衚瀺されたした。



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


カヌネルは暗号化する「䜕」をただ知らないので、埌でそれを芋るこずができたせん。SAを远加する必芁がありたす。これは手動で行うこずもでき、AES-GCM-16アルゎリズムのAEAD暗号化ずランダムな160ビットキヌの䜿いやすさを蚭定したす。



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


リモヌトホストで同じコマンドを実行するずで-Pを指定するこずを忘れないでください、次のように衚瀺されたす。



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


リク゚ストはESPによっお暗号化されたすが、返信は暗号化されたせん。ESPはデフォルトで「䞀方向」で動䜜するため、双方向通信の堎合は、反察方向に別のSP / SAを远加する必芁がありたす。この䟋の



0xdeadbabeは、セキュリティパラメヌタむンデックスSPIです。これは、2぀のIPアドレス間のESP「トンネル」の䞀意の識別子であり、カヌネルは察応するSAコンテキストを芋぀けお、そこから埩号化キヌを取埗できたす。たた、esp / transport // requireは、ESPをトランスポヌトモヌドで䜿甚するための芁件です詳现は以䞋を参照。



Giblets ESP



ESPパッケヌゞは、次のように抂略的に構成されおいたす。



  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 -IPアドレス間のESPセッション/トンネル/接続の32ビットの䞀意の識別子。通垞、{SrcIP、DstIP、SPI}はSAおよび暗号化コンテキストです。
  • 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).


ペむロヌドから次のヘッダヌ たでのパケットのすべおの郚分が暗号化されたす。 MAC以倖はすべお認蚌されたす。 ICVの長さ、IV初期化ベクトルの存圚は、䜿甚される暗号化および認蚌モヌド/アルゎリズムによっお異なりたす。



TLS 1.3指定されたサむズぞのオプションのデヌタのパディングはバヌゞョン1.3でのみ登堎したした。それ以倖の点では、暗号化ず認蚌は完党に䌌おいたす。 TLS 1.3は、AEADアルゎリズムのみを䜿甚するこずを矩務付けおいたす。これは正しくお優れおいたす。 ESPはAEADをサポヌトしおいたすが、より叀颚な゜リュヌションの遞択肢がありたす。タむプフィヌルドSPIたたはSeqNumいいえ、TCPはシヌケンスず配信を保蚌するため、さらに、実際には、初期化ベクトルは明瀺的に送信されたせん。したがっお、TLSレコヌドレむダヌパケットはわずかに短くなりたす。 DTLSには、SeqNumずメッセヌゞフラグメンテヌションデヌタがすでに含たれおいたす。



32ビットのパケット番号は実際には短すぎる可胜性がありたす。これはわずか40億以䞊のIPパケットであり、10Mpps以䞊の速床で数分で飛行できたす。カりンタヌがオヌバヌフロヌするずどうなりたすかれロにリセットされたす。ただし、これは、SPI + SeqNumの倀が繰り返され始め、以前にむンタヌセプトされたESPパケットを䜿甚しお攻撃を再生できるこずを意味したす。この問題を解決するために、ESNが発明されたした拡匵シヌケンス番号。これは64ビットのカりンタヌですが、その「䞋䜍」の32ビットのみがSeqNumフィヌルドに転送され、䞊䜍の32ビットがメモリに保存されたす。ESNの党額が認蚌されたす。したがっお、圓事者はESNの䜿甚に぀いお事前に合意する矩務がありたす。



ESP暗号化



たずえば、AES-GCM-16を䜿甚しおいる堎合、ESPパケットの暗号化/認蚌はどの皋床正確に行われたすか ESPを操䜜するには、ペむロヌドの先頭にある64ビットの初期化ベクトルを䜿甚したす。たた、キヌマテリアルの䞀郚ずしお32ビット゜ルトを䜿甚しおいたす。setkeyの䟋では、128ビットのキヌではなく、128 +32ビットのキヌを指定したした。キヌが再利甚され、IVが倀を繰り返すこずができる䞍良な疑䌌ランダム番号ゞェネレヌタヌPRNGで満たされおいる堎合がありたす。゜ルトは、傍受されたパケットの埩号化に぀ながる可胜性のあるこの最も危険なケヌスから保護するように蚭蚈されおいたす。 AES-128-GCM-16-ESPモヌドでのESP暗号化/認蚌自䜓は次のずおりです。



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


ロシアのGOSTアルゎリズムMagmaたたはGrasshopper暗号の堎合、入力デヌタは類䌌しおいたす。䞡方の暗号はMGMモヌドで䜿甚されGCMの改良版ず蚀えたす、HMAC-Stribog-256を䜿甚しお通垞のESPTREEキヌマテリアルロヌテヌションが適甚されたす。これにより、キヌの負荷が軜枛されたす。䞻にIPsecのコンテキストでは、これはサむドチャネルを介した攻撃面を枛らすほど、䜿甚時間を増やすこずではありたせん。たずえば、キヌメッシュ䞀定のキヌロヌテヌションの同様のテクノロゞにより、64ビットブロックサむズのGOST28147-89ブロック暗号はSWEET32攻撃に察しお無防備であるこずが刀明したした。



安党性の芳点から、AEADアルゎリズムを䜿甚したESPに぀いおの䞍満はありたせん。ただし、AEADアルゎリズムの堎合、IVは単なる64ビットのカりンタヌであり、パケット内のスペヌスを浪費する各パケットずずもに明瀺的に枡されたす。SeqNumは短すぎ、ESNは完党には送信されたせんが、IVずしお完党に適合したす。非AEADアルゎリズムの堎合、IVはすでに必芁であり、予枬できない倀を持っおいる可胜性がありたすが、決しおカりンタヌではありたせん。これはレガシヌであり、パッケヌゞ内の貎重なスペヌスを食い尜くし、重量はここでの信頌性に圱響を䞎えたせん。







AEADのIVが128ビットからの倀を持぀こずができる堎合、192ビットのナンスでXSalsa20 / XChaCha20のようなアルゎリズムを䜿甚するこずが可胜であり、そのうちの128ビットは起動時に疑䌌ランダムに生成され、残りの64ビットはカりンタヌに䜿甚できたす..。これは、カりンタヌ状態を倱ったが、既存のキヌを匕き続き䜿甚したいシステムにずっおは呜の恩人になる可胜性がありたす。



TLS 1.3XORは、メッセヌゞカりンタヌずキヌで生成された初期化ベクトルの間のナンスずしお䜿甚されたす。メヌタヌもIVも明瀺的に送信されないため、TLS1.3はもう少しコンパクトです。ESPが非AEADアルゎリズムを䜿甚する堎合、予枬できないIVの生成が必芁になる可胜性があり、これは著しくCPUに負荷をかける可胜性がありたす。



トンネルモヌドずトランスポヌトモヌド



パッケヌゞ のペむロヌドには䜕が含たれおいたすかこれは、ESPがトランスポヌトモヌドで動䜜しおいるかトンネルモヌドで動䜜しおいるかによっお異なりたす。トランスポヌトモヌドは、送信されたIPパケットのペむロヌドをこのペむロヌドのESPに眮き換えたす。぀たり、次のようになりたした。



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


なりたした



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


トンネルモヌドでは、IPパケット党䜓がESPで完党にラップされ、通垞は新しいヘッダヌずSrcIP / DstIPアドレスを䜿甚しお新しいIPパケットが圢成されたす。このモヌドは、ネットワヌク間でパケットをトンネリングするために䜿甚されたす。



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


䟋えば、貫通はsetkey私の間のすべおのパケットのように指定するこずができ、AC :: / 642001および2001DC :: / 64ネットワヌクがアドレスずトンネルの2぀の゚ンドポむントを介しお暗号化された枡す必芁2001 :: 123、2001 :: 321 ..。



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 ;


トランスポヌトモヌドは、倚くの堎合、ホスト間接続ず呌ばれたす。2぀の゚ンドポむント間ですでに機胜しおいるトンネリングにGREたたはIPv * -over-IPv *プロトコルが䜿甚されおいる堎合、この堎合、IPsecレベルでトンネリングモヌドを䜿甚するこずは意味がありたせん。ただし、トランスポヌトモヌドはIPヘッダヌを認蚌したせん。原則ずしお、これは重芁でも重芁でもありたせんが、拡匵IPv6ヘッダヌたたはパケットのフロヌラベルが倉曎されおいないこずを確認する堎合は、2぀のホスト間であっおも、オヌバヌヘッドを犠牲にしおトンネルモヌドを䜿甚する必芁がありたす。



ISAKMP



コンピュヌタヌを再起動するず、すべおのカりンタヌ倀を持぀SAがメモリから消え、叀いSP / SAコマンドを手で再床ロヌドするずどうなりたすかたず、IVに䞀臎するパケットを埩号化できたす。これは、暗号パッドを2回䜿甚するのず同じだからです。次に、SPI / salt / ESN / SeqNumが䞀臎するため、以前にむンタヌセプトされたすべおのパケットが有効に認蚌され、それらを再生できたす。このようなセットキヌSAを再利甚するこずは、セキュリティにずっお悲惚です。第3に、特にESNが䜿甚されおいない堎合たずえば、この蚘事の執筆時点でFreeBSDでは、ただサポヌトされおいたせん、長いSA操䜜では、カりンタヌが「䜿い果たされおいる」こずに気付かない堎合がありたす。



これはすべお、ESPキヌを定期的に倉曎する必芁があるこずを意味したす。たた、暗号化アルゎリズム、ESN、TFC、トランスポヌト/トンネルモヌド、SPI倀の存圚に぀いおもネゎシ゚ヌトしたす。事実䞊、これにはISAKMPプロトコルむンタヌネットセキュリティア゜シ゚ヌションおよびキヌ管理プロトコルが䜿甚されたす。ただし、OTR / PGP / OMEMO認蚌暗号化を䜿甚しおIMを簡単にねじ蟌み、シェルスクリプトのsetkeyコマンドをサヌバヌに送信するだけで、キヌは/ dev / urandomを読み取るこずで生成されたす。それがどのように合意されたかは、カヌネルにずっお重芁ではありたせん。 OpenVPNの堎合ず同様に、蚌明曞を䜿甚したX.509認蚌ずキヌネゎシ゚ヌションは通垞TLSを介しお行われ、VPNトランスポヌトプロトコル自䜓はすでに独自のものです。



「玔粋な」圢匏では、暗号化が含たれおいないため、ISAKMPは䜿甚されたせん。察話者を認蚌し、䞻芁な資料を生成するために、ISAKMPを内郚にカプセル化するサヌドパヌティのプロトコルが䜿甚されたす。知っおいる



  • KINK -キヌのKerberos察応のむンタヌネット亀枉第䞉は、Kerberos KDCを信頌し、認蚌ずの亀枉のために䜿甚されおいたす。りィキペディアからの説明に加えお、私はKINKに぀いおこれ以䞊䜕も知らず、ラむブで芋たこずがありたせん。
  • IKEv1-むンタヌネットキヌ亀換。1998幎に䜜成されたしたが、おそらくただ最も人気のあるプロトコルです。
  • IKEv2は、2005幎のIKEの2番目のバヌゞョンです。これに぀いおは埌で説明したす。


IKEプロトコルは、さたざたなペむロヌドタむプが倚数あるため、非垞に拡匵性がありたす。 IKEv1には、1぀のトンネルだけを機胜させるように構成するための倚数のオプションがありたす。共通のペむロヌドを持぀ISAKMPずIKEv1の党䜓を説明する12以䞊のRFC。恐ろしい耇雑さ。さらに、絶察に確実でない構成を簡単に台無しにする機胜ず、IKEv1がほが完党に構成ファむルをコピヌした堎合にのみ機胜するこずが保蚌されおいるずいう、よく知られおいる、郚分的には圓然の神話です。



幞いなこずに、IKEv2が登堎したした。1぀の䟿利なRFCほずんどの機胜、パラメヌタヌをネゎシ゚ヌトするための倧幅に簡玠化されたプロトコル、したがっおその構成です。原則ずしお、IKEv1よりもハンドシェむクおよびキヌ合意プロセス党䜓のラりンドトリップが少なくなりたす。したがっお、IKEv1には意味がなくなったため、圌だけが考慮されたすただし、すでに実行䞭および動䜜䞭のむンスタンスは動䜜しおいるため、眮き換えるこずはほずんど䟡倀がありたせん。IKEv2は、IKEv1ずは異なり、ESPずたったく同様のアルゎリズムずアプロヌチを䜿甚しお、独自のメッセヌゞを暗号化したす。たた、EAP認蚌ず、各圓事者がさたざたな方法で認蚌する機胜も導入されたしたたずえば、クラむアントはPSKを䜿甚し、X.509サヌバヌは蚌明曞を䜿甚したす。



IKEデヌモン



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


IPsecスタックのこの郚分は、通垞はナヌザヌスペヌスですでに実行されおいたす。たず、これらは負荷の高いデヌモンではありたせん。少なくずも1日に1回は盞互に通信でき、最初のハンドシェむクにはUDPを介した数回のラりンドトリップが必芁です。第二に、ISAKMP / IKE機胜の数は、完党なSA / SP / ESP実装の数癟倍のコヌドがあるようなものです。 ISAKMPデヌモンはたくさんありたすstrongSwanIKEv1 / v2およびOpenswan、Libreswan、isakmpdIKEv1、OpenIKEDIKEv2、racoonIKEv1、racoon2IKEv1 / v2、KINKなど。



泚「デヌモン」デヌモンを蚘述しお話すのは正しいです、私がフィクションの翻蚳で芋たように。しかし、技術的なロシア語圏では、「悪魔」はすでに根付いおいたす。



TLS 1.3䞀般に、TLSスタック党䜓は、個々のアプリケヌションで機胜し、キヌマテリアルを独自のメモリに栌玍するラむブラリ関数です。すべおの暗号化は、ナヌザヌスペヌスぞの切り替えで行われたす。これは倧きなオヌバヌヘッドです。ただし、IPsecず同様に、トランスポヌト郚分が完党にカヌネルで凊理され、ハンドシェむクがナヌザヌスペヌスで行われる堎合、少なくずもFreeBSDずLinuxにはすでにTLSのカヌネルオフロヌド実装がありたす。



IKEv2はUDP䞊で実行され、デフォルトではポヌト500isakmpサヌビス。デヌモンは、安党なチャネルの䜜成、盞互の認蚌、ESP SA / SPのネゎシ゚ヌション/䜜成/削陀、キヌの曎新、ハヌトビヌトの実行Dead Peer DetectionDPDなどを行いたす。デヌモン間のすべおの通信は、芁求/応答メッセヌゞのペアの亀換の圢で行われたす。すべおの芁求に答える必芁がありたす。これはUDPなので、パケットが欠萜しおいる堎合はどうすればよいですかあなたの州ではこれを考慮に入れ、応答が受信されおいないタむムアりト埌に芁求を再送信し、繰り返される芁求ぞの応答を再送信し、繰り返される応答を無芖したす。パケットは混沌ずした順序で到着する可胜性があり、予期せず消える可胜性がありたす。IKEv2暙準では倚くのこずが考慮されおおり、さたざたなレヌス条件䞋での動䜜方法が説明されおいたす。



TLS 1.3TLSのTCPの性質により、メッセヌゞの順序ず配信が凊理されたす。ただし、TCPはOSカヌネルでかなりのリ゜ヌスを消費し、UDPずは異なり膚倧な数のTCPセッションが問題になる可胜性がありたす。ただし、DTLSでは、IKEの堎合ず同じようにすべおの同様の問題が発生し、さらに断片化されたメッセヌゞの凊理を䌎う痔栞が远加されたす。 UDPの゚ンドポむントのIPアドレスを倉曎するこずは問題ではありたせん。 IKE接続は、原則ずしお非垞に長寿呜であるためIKE状態は小さく、ナヌザヌスペヌスデヌモンのメモリにのみ保存されたす、ハンドシェむクの必芁性は少なくなりたすが、TLSでは、TCP接続を倱った埌、それを行う必芁がありたすただし、状態がない堎合はセッションを継続する高速化された方法もありたすたずえば、プログラムを再起動したずきに倱われたす。 IKEデヌモンは原則ずしおシステム党䜓のデヌモンであるため、䞀郚のアプリケヌションがそれず安党に通信したい堎合すでにIKE接続を持っおいる人ず䞀緒にいる堎合、その人はすぐにそれを䜿甚するか、デヌモンが1回のラりンドトリップでアプリケヌション甚の远加のESPSAを䜜成したす。



Giblets IKE



デヌモンの最初の亀換芁求-応答はIKE_SA_INITになりたす。これにより、さらに安党な通信のためにIKESAが䜜成されたす。ESP SAはカヌネルに「栌玍」され、IKESAはナヌザヌスペヌスデヌモンにあるこずに泚意しおください。次に、圓事者が認蚌されるIKE_AUTH亀換が行われたす。同じ亀換で、ESP SAに䜿甚される子SA子SAが䜜成されたす。䞀般に、これら2぀の亀換は、圓事者を認蚌し、キヌを䜿甚しおESP SAパラメヌタヌをネゎシ゚ヌトし、コンピュヌタヌ間で暗号化されたESPトラフィックを駆動するのに十分です。この堎合、動䜜䞭のIKESAがデヌモン間に長時間残りたす。さらに、い぀でも、CREATE_CHILD_SA亀換を行っお、より倚くの子SAを䜜成したり、INFORMATIONALを䜜成したりできたす。亀換さたざたな目的。



すべおのIKEv2メッセヌゞヘッダヌの構造は次のずおりです。



                     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ビットIKESAむニシ゚ヌタヌSPI。IKEセッションの開始者によっおランダムに生成された識別子。
  • SPIr -64ビットIKESAレスポンダヌSPI。同様ですが、レスポンダヌ偎からのSPIのみです。むニシ゚ヌタヌからの最初のメッセヌゞでは、このフィヌルドはれロバむトで埋められおいたす。
  • NP -8ビットの次のペむロヌド。ヘッダヌに続くペむロヌドの識別子。
  • バヌゞョン-IKEプロトコルの8ビットバヌゞョン。
  • ExchType - IKE亀換の8ビットタむプIKE_SA_INIT、IKE_AUTH、CREATE_CHILD_SA、たたはINFORMATIONAL。
  • Flags — 8- . .
  • MsgID — 32- . , , replay-. — request/response MsgID. , .
  • Len — 32- ( + ).


SPIi + SPIrは128ビットです。 ESPに32ビットしかないのに、なぜそんなに倚いのでしょうか。たず、それらは䞀臎したせんが、疑䌌ランダムに生成されるため、衝突を回避するには片偎に64ビットで十分です。次に、ESPもIPアドレスに関連付けられおいたすが、IKEセッションは通垞は関連付けられおいたせん。圓事者は、IPアドレスモバむルクラむアントを簡単に倉曎しお、通信を継続できたす。



TLS 1.3IPアドレスを倉曎するず、接続が切断されたす。 iPSKを䜿甚しおいる堎合でも、非察称暗号化のリ゜ヌスを節玄するために再ハンドシェむクを行う必芁がありたす。これは、1.5ラりンドトリップずTCP接続を確立するためのラりンドトリップです。すでに確立されおいるIKE接続アドレスにバむンドされおいないでの新しいIPアドレスでの子ESP SAの䜜成には、1回のラりンドトリップしかかかりたせん+叀いものを削陀するためのラりンドトリップですが、これは新しい動䜜䞭のESP SAのバックグラりンドですでに発生したす。



IKEヘッダヌの埌には、1぀以䞊のペむロヌドが続きたす。各ペむロヌドには、䞀般的なフォヌマットヘッダヌず、そのタむプに固有のコンテンツがありたす。コンテンツは32ビットに揃えられおいたす。すべおに共通のヘッダヌ



                     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 ( + ).


したがっお、IKEメッセヌゞは、チェヌンでリンクされたIKEヘッダヌずペむロヌドで構成されたす。デヌモンは、重芁ではない未知のペむロヌドを無芖できたす。Nonceタむプヘッダヌの埌のペむロヌドコンテンツは、固定サむズではなく、単なるランダムなデヌタセットです。しかし、はるかに耇雑な構造もありたす。IKE暙準では、ペむロヌドタむプの短い指定が受け入れられたすたずえば、ナンスメッセヌゞの堎合はN *、「*」は「i」むニシ゚ヌタヌたたは「r」レスポンダヌのいずれかです。



シグマ



暗号化の芳点から、IKEv1 / IKEv2は、STS、ISO / IEC IS 9798-3、および認蚌枈みキヌ亀換プロトコルのSIGMASIGn-and-MAcクラスに属しおいたす。これらは非垞によく研究され、数孊的に怜蚌されたSIGMA゜リュヌションです。私の「P2PF2FE2EE IM in one night」の蚘事では、SIGMA-Iプロトコルの動䜜原理ず実装に぀いおすでに説明したした。IKEv2は完党に䌌おいたす。ハンドシェむクプロトコルのセキュリティに぀いお議論するずき、私たちは䜕を期埅しおいたすか



  • 送信されたメッセヌゞの機密性。
  • 送信されたメッセヌゞの信頌性ず敎合性-それらの倉曎を怜出する必芁がありたす。
  • リプレむ攻撃からの保護-メッセヌゞの損倱たたはリプレむの事実を怜出する必芁がありたす。
  • ;

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

    / ( ) IKE . / ( ) ;

    , , . .



そのような埌のIKE_SA_INIT亀換、デヌモンが互いのアドレスを有する、SPII + SPIR IKEセッションの倀、SAはIKEの堎合、これらは、鍵合意あるアルゎリズムをネゎシ゚ヌトDH、メッセヌゞの暗号化/認蚌ENCR、鍵生成PRFアルゎリズム反察偎の公開鍵DH。これは、状態をメモリに保存しおキヌ合意Diffie-Hellman、GOST R 34.10-VKO、curve25519などを実行し、埌続のIKEメッセヌゞのペむロヌドを暗号化するための察称キヌを生成するのに十分です。



TLS 1.3ハンドシェむクメッセヌゞの圢匏は非垞に異なり、倚くのレガシヌがありたすが、基本的に目立぀ものはありたせん。nonceの代わりにランダムフィヌルドが䜿甚されたす。ペむロヌドの代わりに、倚数の拡匵機胜。耇雑なSA提案構造の代わりに、よりコンパクトでシンプルな暗号スむヌト識別子が䜿甚されたす。私の意芋では、SA提案の柔軟性は過床ですが、IKEv2ではこれはただ問題ではなく、ciphersuiteず同様の倀が構成ファむルに曞き蟌たれたす。TLS1.3バヌゞョンでのみDH亀換が必須になりたす。



IKEキヌ玠材



埌IKE_SA_INIT、SKEYSEEDがされお生成されたした

SKEYSEED = PRFNi [8] || Nr [8]、DH-KEY


PRFアルゎリズムはIKESAで遞択されおいたす。たずえば、GOST IKEv2の堎合、これはHMAC-Stribog-512関数です。 PRFキヌは、各ナンスからの64ビットチャンクです。



ナンスはオヌプンに送信されるため、軜薄に芋えたす。぀たり、このPRFのキヌは、トラフィックを傍受したすべおの人に知られおいたす。ただし、ここではPRFは、DHの蚈算結果からキヌを生成するためにのみ䜿甚されたす。これは攻撃者にはすでに知られおいたせん。 DH関数の結果は、巚倧で䞍均䞀な゚ントロピヌ倀になる可胜性があり、楕円曲線䞊の点になる可胜性がありたす。これはすべお、短い高゚ントロピヌ察称キヌずしお䜿甚するこずはできたせん。したがっお、DH-KEYこれはSKEYSEEDですから゚ントロピヌを抜出しおから展開する必芁がありたす展開必芁な数のキヌに拡匵したす。



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)


これはすべお、HKDF関数ず同様に、抜出/展開ステヌゞを䜿甚した埓来のキヌ導出操䜜です。しかし、HKDFがハッシュ関数の䜿甚を想定しおいる堎合、このPRF / PRF +構造は、察称暗号で簡単に䜿甚できたす-䞀般的なAES-GCM + AES-XCBC-PRFの堎合、ハッシュ関数はどこにも䜿甚されたせんが、少数です䜿甚されるプリミティブは垞に良奜です。



次のキヌが生成されたす。



  • 子ESPSAのキヌを生成するためのSK_dキヌ。
  • IKEメッセヌゞ認蚌甚のSK_a [ir]キヌ。AEADアルゎリズムAES-GCM、Grasshopper / Magma-MGM、ChaCha20-Poly1305などが合意されおいる堎合、生成されない/䜿甚されたせん。
  • SK_e[ir] IKE .
  • SK_p[ir] AUTH.


TLS 1.3はるかに耇雑なキヌスケゞュヌリングがありたす。゚ントロピヌは、個々のフィヌルドではなく、ハンドシェむクメッセヌゞ党䜓から䞀床に絞り出されたす。生成された拡匵シヌケンスは、いく぀かのキヌにカットされるだけでなく+必芁に応じお゜ルト、これらのキヌたたは生成されたIVの䜿甚状況ごずにラベルラベルを䜿甚したHMAC倉換も䌎いたす。生成されたあらゆる皮類の倀にテキストラベル/アプリケヌション/コンテキストを䜿甚するこずは、珟代の優れた慣行であり、必芁かどうか疑問に思うよりも垞に行う方が簡単です。出くわすすべおのものをハッシュするこずも、「悪化するこずはない」ずいう非垞に良い習慣です。ただし、これはIKEv2のセキュリティが悪いこずを意味するものではなく、ラベルがないこずが攻撃者の手に枡る可胜性がある、少なくずもリモヌトで理論的な状況を簡単に思い付くこずができるずいう意味でもありたせん。IKEv2では、アプロヌチは最小限ですが、TLS 1.3では、「オヌバヌラむドする方が良い」以前のバヌゞョンのプロトコルで実行された劚害たたは問題の数が倚いため。 IKEv2は、実瞟のあるアプロヌチずプリミティブを匕き続き䜿甚し、必芁なすべおを認蚌し、転送されたすべおの゚ントロピヌを圧瞮/考慮し、各サむドずタスクに異なるキヌを䜿甚したす。



IKE_AUTH



次に、IKE_AUTH亀換が実行され、䞡方の圓事者が認蚌され、ESPSAがネゎシ゚ヌトされたす。



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


  • IKEメッセヌゞには、他のすべおを含む暗号化SKペむロヌドが含たれおいたす。
  • むニシ゚ヌタヌは、そのIDIDi、オヌセンティケヌタヌAUTH、ESPのSAオファヌSAi2、およびむニシ゚ヌタヌ/レスポンダヌのペア、いわゆるトラフィックセレクタヌTS *を提䟛したす。オプションで、期埅されるレスポンダヌIDを送信するこずもできたす。これは、TLSからの䞀皮のSNIアナログず芋なすこずができたす。
  • 応答ずしお、レスポンダヌのID、ネゎシ゚ヌトされたESP SAプロポヌザル、確認枈みのトラフィックセレクタヌ、およびオヌセンティケヌタヌを受け取りたす。
  • その埌、䞡方の圓事者がお互いを認蚌枈みず芋なし、ESP SA、このESPに属する必芁のあるトラフィックに぀いお合意し、SAおよび堎合によっおはSPを䜜成するコマンドをカヌネルにすでに発行できたすSPをたったく凊理しないデヌモンがありたす。


これらのペむロヌドに぀いお詳しく説明したす。



  • ID-パヌティ識別子。識別タむプずそれに固有のデヌタが含たれおいたす。パヌティは、IPv4 / IPv6アドレス、FQDN完党修食ドメむン名、文字列のみ、最も䞀般的な方法、RFC822電子メヌルアドレス、ASN.1 DER識別名X.509蚌明曞を䜿甚する堎合の最も䞀般的な方法たたは䞀般名など、さたざたな方法で識別できたす。ベンダヌ固有だけでなく。
  • 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 .



    応答偎は、確認枈みのセレクタヌの遞択を送信したす。セレクタヌは、䞀臎するか、遞択範囲が狭くなる可胜性がありたす。


これらのペむロヌドはすべお、最初のメッセヌゞ亀換埌にIKESAによっお生成されたキヌで暗号化されたす。送信された圓事者の識別子、その蚌明曞、その他の個人情報を公開するために暗号化が必芁です。ただし、アクティブな攻撃者は、最初のIKE_SA_INIT亀換にりェッゞしおこの情報を確認できたすが、セッションを続行するこずはできなくなりたす。



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-.


AEAD暗号を 䜿甚したSKペむロヌドの暗号化はトリッキヌではなく、たずえばAES-GCMの堎合のESPず完党に䌌おいたすAES-GCM-ESPず同様に、塩は䞻芁な材料の䞀郚です。



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


EDSによる認蚌



眲名ずX.509蚌明曞で認蚌したい堎合はどうなりたすかこのため、既にIKE_SA_INIT、CERTREQのペむロヌドを送信するこずができるの圢で蚌明曞を提䟛するために、反察偎を芁求する、CERTのペむロヌドを。CERTおよびCERTREQには、蚌明曞フォヌマットIDずフォヌマット固有のコンテンツが含たれおいたす。通垞、蚌明曞はASN.1 DERずしお、たたは蚌明曞のSHA1ハッシュ+ダりンロヌド元のURLずしお提瀺できたす。 UDPのサむズはMTUによっお制限されおおり、蚌明曞のサむズははるかに倧きくなる可胜性があるため、ここではハッシュ+ URLオプションが有効ですただし、クラッチず芋なすこずができたす。



IKEv2 RFCだけで、DERで゚ンコヌドされたX.509蚌明曞ずSHA1 + URLに加えお、PKCS7ラップされたX.509蚌明曞、PGP蚌明曞、DNS眲名付きキヌ、SPKI蚌明曞、X.509属性蚌明曞、生の公開キヌがリストされたす。最も䞀般的なナヌスケヌスTLSず同じ方法でIPsecを䜿甚する堎合、぀たりX.509蚌明曞ず匿名クラむアントによっお認蚌されたサヌバヌの堎合、IKEv2ではいずれかの圓事者を認蚌しない方法はありたせん。しかし、RFC 5386は、「クラむアント」が裞の公開鍵を䜿甚でき、サヌバヌがそれを匿名ずしお扱うこずができる、Better-Than-Nothing-Securityアプロヌチに぀いお説明しおいたす。



さらに、EAP認蚌が暙準でサポヌトされおおり、IKE_AUTHにラりンドトリップが远加されおいたす。䞡替。EAPは、パヌティが認蚌されおいるかどうかを刀断できるだけでなく、IKEv2が考慮しお䜿甚するキヌを生成するこずもできたす。EAPがどのように機胜するかを瀺す図のみを瀺したす。



                 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その䞭で、眲名たたはFinishedメッセヌゞのMAC は、ハンドシェむクに参加したすべおの衚瀺されたメッセヌゞのハッシュの䞊に配眮されたす。たた、シンプルで信頌性の高い優れたアプロヌチ。さたざたな認蚌方法はありたせん。しかし、ロシアのSESPAKEやOPAQUEなど、匷力なAuthenticated Password Key AgreementPAKEプロトコルが必芁です。



ESPSAの䞻芁資料ずその曎新



そのため、認蚌を怜蚌し、キヌ合意が正しいこずを怜蚌し、ESPSAずトラフィックセレクタヌをネゎシ゚ヌトしたした。ESPの察称キヌを生成するこずは残っおおり、必芁なSA / SPをカヌネルにむンストヌルできたす。

PRF +SK_d、Ni || Nr-> KEYMAT0 || KEYMAT1


双方向通信には2぀のESPSAが必芁であるため、IKEv2は䞀床に2぀の䞻芁なマテリアルを生成し、それらはすでに察応するSAのコアに盎接送信されおいたす。マテリアルの長さは、䜿甚するESPアルゎリズムによっお異なりたすたずえば、AES-GCM-ESPでは、キヌに加えお、32ビットの゜ルトも必芁です。SPI倀は、ESPSAプロポヌザルの各圓事者によっお指定されたSPI倀です。



たずえば、すべおの垌望を単䞀のTSi / TSrペアで指定できるわけではないため、耇数のESP SA / SPに぀いお合意する必芁がある堎合はどうなりたすかこのために、IKE_AUTHの埌い぀でも発生するCREATE_CHILD_SA亀換が䜿甚されたす。子SAの䜜成は、次の亀換で行われたす。



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


SAオファヌが行われ、ナンス、トラフィックセレクタヌが送信されたす。すべおが以前ず同じです。キヌマテリアルは、これらの新しいナンスを䜿甚しおすでに生成されおいたす。オプションで、キヌ亀換ペむロヌドを䜿甚できたす。これにより、゚ントロピヌが远加され、圓事者はさらに非察称の暗号化を䜿甚するようになりたす。PFSプロパティを垞に監芖する必芁がある堎合がありたすOTRプロトコルでは、゚フェメラルDHキヌが各メッセヌゞずずもに送信されたす。この堎合の重芁な資料は次のようになりたす。



PRF +SK_d、DH-KEY || Ni || Nr-> KEYMAT0 || KEYMAT1


接続のIKESAを曎新したい堎合はどうなりたすか次のCREATE_CHILD_SA亀換を行いたす。



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


SAにはすでにIKESAの提案が含たれおおり、新しいSKEYSEEDが開発されたす。



PRFSK_d_old、DH-KEY || Ni || Nr-> SKEYSEED


ESP SAキヌは、新しいESP SA別のSPIを䜿甚を䜜成しお叀いものを削陀するか、特別な通知以䞋でそれに぀いおを送信するこずによっお曎新されたす。新しいESPSAを䜿甚するようにトラフィックを切り替えるず、透過的で損倱がなくなりたす。短期間、圓事者は2぀のアクティブなESP SAを持ち、通信チャネルでただ転送䞭のトラフィックを凊理できるようになりたす。



ESP SAの削陀は、削陀するSPIをリストする埌続のINFORMATIONAL亀換でDELETEペむロヌドを送信するこずによっお行われたす。すべおのESPSAはペアで存圚するため双方向通信の堎合、各サむドは送信トラフィックを担圓するESPSAにのみSPI倀を送信したす。それに応じお、着信トラフィックのSPI ESPSA倀を受信したす。



    SK {DSPIi}->
<-SK {DSPIr}


IKE SAの削陀もDELETEを介しお行われたすが、IKE SPIを䜿甚し、空の認蚌枈み応答を受け入れたす。



    SK {D}->
<-SK {}


TLS 1.3KeyUpdateメッセヌゞを介しおキヌを回転させるメカニズムがありたすが、゚ントロピヌを远加したり、DHを実行したりする可胜性はありたせん。 TLSは明らかに、非垞に長寿呜の接続甚に蚭蚈されおいたせん。最良の堎合、セッションを䞭断しお続行/ハンドシェむクを䜿甚しおiPSK-ECDHEで新しいセッションを䜜成するこずしかできたせん。



IKEv1には、個別のIKEキヌ曎新手順ず、再認蚌甚の個別の手順の䞡方がありたす。 IKEv2には再認蚌はありたせん。これを行うには、新しいIKE SAを最初から䜜成し、叀いものをDELETEで削陀したす。



TLS 1.3ハンドシェむク埌の任意の時点で、ハンドシェむク埌のクラむアント認蚌機胜を備えおいたす終了䞡偎からのメッセヌゞ、サヌバヌはX.509蚌明曞を䜿甚しおクラむアント認蚌の芁求を送信できたす。たずえば、サむトをさたよっおいるクラむアントが、自分の個人アカりントのペヌゞにアクセスしたした。IKEv2では、これは䞍可胜です。認蚌は、ハンドシェむク時にのみ実行されたす。



通知



では、トンネル/トランスポヌトモヌドはどのようにネゎシ゚ヌトされたすか、TFCこのために、「通知」NOTIFYNのペむロヌドが芁求に远加されたす。 IKEv2 RFCだけでも、数十皮類の通知がありたす。アラヌトは、゚ラヌ、オファヌのSAネゎシ゚ヌションの問題、トラフィックセレクタヌなど



を通知するために䜿甚されたす。ネゎシ゚ヌトされたESP SAでトランスポヌトモヌドを䜿甚する垌望を通知するために、NUSE_TRANSPORT_MODE通知がむニシ゚ヌタヌずレスポンダヌの䞡方によっお远加され、モヌドネゎシ゚ヌションを確認したす。NESP_TFC_PADDING_NOT_SUPPORTEDアラヌトは、TFCがサポヌトされおいないこずを瀺したす。たた、NHTTP_CERT_LOOKUP_SUPPORTEDは、URLからの蚌明曞のダりンロヌドがサポヌトされおいるこずを瀺したす。



新しいESPSAを䜜成せずにESPSAキヌを曎新する機胜は、子ESP SAを䜜成する手順ず䌌おいたすが、むニシ゚ヌタヌは珟圚のESP SAのSPIを含むNREKEY_SA通知を远加したす。

    SK {NREKEY_SA、SA、Ni、[KEi]、TSi、TSr}->
<-SK {SA、Nr、[KEr]、TSi、TSr}





DPD



空のSKずのINFORMATIONAL亀換は、デヌモン間のハヌトビヌトずしお、デッドピア怜出DPDに䜿甚されたす。IKEデヌモンが長期間䜿甚できない堎合は、その状態が倱われおいる可胜性が高いため、反察偎でESP SAを監芖しおいないか、アクティブではありたせん。したがっお、リモヌト偎が䜿甚できないこずが明らかな堎合は、関連するすべおのESP / IKESAを削陀するのが理にかなっおいたす。空のSKは、ペむロヌドが含たれおいないが、認蚌されたデヌタ少なくずも、カりンタヌ付きのIKEヘッダヌがあるこずを意味したす。したがっお、このようなパケットの認蚌は、信頌できる生呜の兆候です。



    SK {}->
<-SK {}


しかし、䞀方の偎がすぐに再起動しお状態を倱い、最初からIKE接続の確立を開始した堎合はどうなるでしょうか。反察偎は、もう䞀方が利甚できないこずに気付かない可胜性があり、別のIKE接続で再認蚌するか新しい子SAを䜜成するこずを決定したず考えられたす。壊滅的なこずは䜕もありたせんが、叀いESPSAはただたずもな時間生きるこずができたす。むニシ゚ヌタは、IKE_AUTH亀換にNINITIAL_CONTACTアラヌトを配眮しお、その偎ぞの唯䞀の既知のIKE接続であるこずを通知しおもよい[MAY]。このような認蚌された通知を確認したら、明確な良識を持っおすべおの叀いIKE / ESPSAを削陀できたす。



DoSず悪いKE



すでにIKE_SA_INITの最初に、䞀時的な公開キヌDHを持぀KEiペむロヌドが送信されたす。しかし、むニシ゚ヌタヌはただIKE SAを亀換しおおらず、受信偎がどのアルゎリズムをサポヌトしおいるかをどのようにしお知るこずができたすかこれは、このアドレスに関連付けるために以前に䜿甚されたものを掚枬したり、長期的なメモリに蚘憶したりするこずしかできたせん。レスポンダヌがアルゎリズムをサポヌトしおいない堎合は、NINVALID_KEY_PAYLOADに通知を送信したす。これは、優先DHアルゎリズムの識別子を瀺したす。むニシ゚ヌタヌは芁求を繰り返す必芁がありたすが、新しいKEiを䜿甚したす。



TLS 1.3異なるアルゎリズムを䜿甚しお、䞀床に耇数の䞀時的な公開鍵を送信できたす。しかし、これらはリ゜ヌスずトラフィックです。圌は公開鍵をたったく送信しない可胜性があり、サヌバヌはその蚭定を䜿甚しおHelloRetryRequestで応答したす。さらに、優先サヌバヌアルゎリズムがわかるたで、高䟡な非察称暗号化はたったく䜿甚されたせんが、远加のラりンドトリップが発生したす。クラむアントが最初に䞍適切な公開鍵アルゎリズムを提䟛した堎合、IKEv2の堎合ず同様に、遞択するアルゎリズムを含むHelloRetryRequestを受け取りたす。



しかし、むニシ゚ヌタヌから同じ初期パケットを送信するずどうなりたすかそこで毎回新しいSPIiを生成するこずが可胜です..。レスポンダヌは、少なくずもDH蚈算を正盎に実行し、IKE_AUTHで応答したす。 DHは、CPUず゚ントロピヌの゜ヌスを消費する非垞にリ゜ヌスを消費する操䜜であるため、トランスポンダヌが損傷する可胜性がありたす。



IKEv2IKEv1ではないでは、これに察する保護があり、Cookie文字列を含むアラヌトを含む応答NCOOKIEの圢匏で、その埌、むニシ゚ヌタヌは芁求を繰り返す必芁がありたすが、このNCOOKIEペむロヌドを远加したす。



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


リク゚ストには、最初ず同じSPI / Niが必芁です。単にペむロヌドで補足するだけで十分です。レスポンダヌは、リク゚ストず送信されたCookieの間の接続に関する状態を保存でき、それらが䞀臎した埌でのみ、むニシ゚ヌタヌによるリク゚ストぞのCookieの远加に関するこの䜜業を完了した埌、レスポンダヌは通垞の方法でIKE_AUTH亀換を続行できたす。



ただし、状態をCookie内に盎接保存しお、「自己認蚌」にするこずは可胜です。回答者がむニシ゚ヌタヌからの芁求を芋たずいう事実を䌝えるこずができたす少なくずもNiずSPIiはそれを芋たした

Cookie = MACsome-secret、Ni || SPIi ||タむムスタンプ


したがっお、DoS愛奜家は状態を保存し、繰り返されるメッセヌゞをリサむクルする必芁がありたす。これにより、攻撃のコストが倧幅に高くなりたす。DoS攻撃の疑いがある堎合にのみ、Cookie保護を有効にしお、党員に䜙分なラりンドトリップを匷制しないようにするこずは理にかなっおいたす。



TLS 1.3同様のオプションのセキュリティがありたす。サヌバヌは、クラむアントが繰り返されるClientHello2に挿入する必芁があるCookie拡匵機胜を含むメッセヌゞでHelloRetryRequestで応答しおもよい[MAY]。



CP



IKEv2を䜿甚するず、IPネットワヌク/アドレスの構成をネゎシ゚ヌトできたす。構成ペむロヌドCPを䜿甚するず、構成の受信を芁求しCFG_REQUEST / CFG_REPLYパケットタむプ、構成を反察偎に蚭定できたすCFG_SET / CFG_ACKタむプ。構成芁求には、圓事者が知りたい/蚭定したい属性が含たれおいたす。属性には、「内郚」アドレス、DNSアドレス、DHCP、サブネットナレッゞ、たたは関連するRFCで説明されおいるその他のタむプがありたす。たずえば、IKE_AUTH亀換のむニシ゚ヌタは、むントラネットアドレス䌚瀟のネットワヌクに接続しおいるずDNSサヌバヌを発行するように芁求できたす。



    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)


  • 2001db8 :: 5アドレスがむニシ゚ヌタヌに割り圓おられたす。
  • ESP SA 2001:db8::/64 .
  • 2001:db8::1 DNS .
  • 2001:db8:abcd::/64 , , ESP SA, 2001:db8:: .


Go?



GOSTアルゎリズムを䜿甚したIPsecスタックの最新の囜内実装をテストするために、完党に独立したLinux、FreeBSD、strongSwan、およびその他のスタックからの実装を䜜成するこずにしたした。たた、Go蚀語での開発のスピヌドず容易さのために、GOSTアルゎリズムの既存の実装であるGoGOSTラむブラリを䜿甚したす。以前、私はすでにGOSTをcrypto / tlsおよびcrypto / x509GoラむブラリのTLS1.3実装に統合した経隓がありたした。gostipsec プロゞェクトは、ESPERESPv3ずIKERIKEv2の2぀のデヌモンで構成される無料の゜フトりェアです。







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


珟時点では、ESPERはDIVERT゜ケットでのみ機胜したすLinuxではそれほど単玔なものは芋぀かりたせんでした。したがっお、FreeBSDおそらくOpenBSD、チェックしなかったOSでのみサポヌトされたす。 ESPERは、IKERず同様に、ESP <-> IKEバむンディング間のむンタヌフェむスずしお、Cバむンディングを必芁ずするPF_KEYv2を䜿甚したせんが、蚘事の冒頭ですでに説明したテキストセットキヌのようなむンタヌフェむスを䜿甚したす。したがっお、IKERを䜿甚しお、実際のsetkeyコマンドを呌び出すこずにより、カヌネルESP実装のキヌをネゎシ゚ヌトするこずもできたす。 ESPERのこれらのコマンドは次のようになりたす。



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 ;


゚スパヌサポヌトAES-128/256 GCM-16、マグマ/バッタ-MGM、ESN、TFC、トランスポヌト/トンネルモヌドはIPv6 / IPv4の埌者のサポヌト、はるかに耇雑で、十分にテストされおおらず、誰のIPv4を必芁ずするため新しいプロゞェクト、リプレむ攻撃に察する保護。IKERでは、AES-128 / 256-GCM-16 + AES-XCBC + curve25519、Magma / Grasshopper-MGM + HMAC-Stribog-512 + GOST R 34.10-2012-VKO-256 / 512、ESN / TFC /トランスポヌトを䞀臎させるこずができたす。 /トンネルモヌド、PSKおよびX.509デゞタル眲名ECDSA、GOST R 34.10-2012を䜿甚しお認蚌したす。単䞀のHjsonファむルで構成



{
    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
        }
    ]
}


この䟋では、私たちが知っおいる唯䞀のメンバヌを蚭定したした。



  • どのデヌモンに自動的に接続したすか
  • 5分ごずにデッドピア怜出を実行したす
  • 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は、すべおのIKEv2機胜CREATE_CHILD_SA、キヌの再生成の完党なセットをただサポヌトしおおらず、パケットの損倱を監芖せず、DO N'TPANICの原則を気にしたせん。したがっお、ただ「産業甚」甚途の候補ずは芋なされおいたせん。



Tarball gostipsecには、すべおの䟝存関係、コンパむルされた.infoドキュメント、およびREDOビルドシステムのタヌゲットがすでに含たれおいたすが、実行可胜ファむルのビルドは、通垞のgoビルド呌び出しで簡単に実行できたす。



Hjson



Holywarのテヌマですが、ずにかくファむをあげたす



  • INIでは、このようなスむヌプ構造を指定するこずはできたせん。たた、.iniファむルの暙準もありたせん。
  • 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.




䞀般に、TLS 1.3ず同様の機胜のサブセットを実装する堎合PSKおよびX.509蚌明曞のみによる認蚌、深刻なキヌの再生成はありたせん、IKEv2およびIPv6を䜿甚するESPv3操䜜がはるかに簡単です、プログラマヌの芳点からは、少し難しくなりたす。実装䞭。 RFCは、CREATE_CHILD_SA亀換をサポヌトするこずさえ矩務付けおいたせん。 TLS 1.3の物議を醞す危険な動䜜モヌドがなくおも、セキュリティは優れおいたす。栞レベルでのトランスポヌトず長寿呜のIKEセッションにより、IPsec゜リュヌションのパフォヌマンスは䞀般的に高くなりたす。



IPsecでは、ネットワヌク党䜓間の膚倧な量のトラフィックを保護するためにすべおがシャヌプになっおいるこずがわかりたすが、BTNSセキュリティがないよりはたしですIETFワヌキンググルヌプは、IPPEが゜ケットごずの接続に問題なく䜿甚できるこずを瀺すいく぀かのRFCを䜜成したした。この堎合、圓事者の1人クラむアントは匿名であるため、TLSを䜿甚するこずの劥圓性に完党に疑問を投げかけたす。この堎合、接続ラッチを䜿甚するず、setsockoptのような簡単なシステム呌び出しを行うこずで、任意のネットワヌクアプリケヌションが、FQDN = bank.comアドレスぞのESPが必芁であるこずを瀺し、X.509蚌明曞ずしお提瀺たたは匿名のたたし、透過的、迅速、か぀アプリケヌションごずのナヌザヌスペヌストランスポヌトラむブラリの圢でクラッチを䜿甚せずに、このbank.comで安党に䜜業したす。



セルゲむ・マトベヌ゚フ、サむファヌパンク、Python / Go / C-開発者、FGUP STCAtlasのチヌフスペシャリスト。



All Articles