10.9. IPsec

Przekazane przez Yoshinobu Inoue.

Znaki Kończące: W przykładach tej i innych sekcji, zauważysz znak ``^D'' na końcu listingów. Oznacza to konieczność przytrzymania klawisza Control i wciśnięcie D. Inną specjalną kombinacją jest ``^C'', co oznacza analogicznie wciśnięcie Control a następnie C.

Podpowiedź: Inne HOWTO dotyczące implementacji IPsec znajdują się pod adresami http://www.daemonnews.org/200101/ipsec-howto.html i http://www.freebsddiary.org/ipsec.php.

Mechanizm IPsec zapewnia bezpieczną komunikację dla warstwy IP i warstwy gniazd. Sekcja ta opisuje jak go wykorzystać. Szczegóły implementacji znajdują się w Podręczniku dla Programistów.

Obecna implementacja IPsec wspiera zarówno tryb transportowy jak i tunelowy. Tryb tunelowy dostępny jest jednak z pewnymi ograniczeniami - pod adresem http://www.kame.net/newsletter/ zebrano dokładniejsze przykłady.

Rozważając IPsec, weź pod uwagę że musisz mieć wkompilowane w jądro opcje dotyczące IPsec:

    options          IPSEC              #IP security
    options          IPSEC_ESP          #IP security (crypto; define w/IPSEC)

10.9.1. Przykład Trybu Transportowego i IPv4

Zestawmy związek bezpieczeństwa ( ang. ``Security Association'', SA ) by zapewnić bezpieczny kanał komunikacyjny pomiędzy HOSTEM A ( 10.2.3.4 ) i HOSTEM B ( 10.6.7.8 ). Poniżej pokażemy trochę skomplikowany przykład. W kierunku z HOSTA A do HOSTA B używamy tylko starej wersji AH. Natomiast w kierunku od HOSTA B do HOSTA A, używamy połączonych protokołów - AH w nowej wersji oraz nowej wersji ESP.

Powinniśmy wybrać algorytm pasujący do ``AH''/``nowego AH''/``ESP''/ ``nowego ESP''. Zajrzyj do strony podręcznika setkey(8) by sprawdzić nazwy poszczególnych algorytmów. My wybieramy MD5 dla AH, new-HMAC-SHA1 dla nowego AH oraz new-DES-expIV z 8-bajtowym IV dla nowego ESP.

Długość klucza mocno zależy od konkretnego algorytmu. Na przykład, dla MD5 klucz musi mieć dokładnie 16 bajtów, dla new-HMAC-SHA1 20, a 8 dla new-DES-expIV. Wybieramy klucze odpowiednio: ``MYSECRETMYSECRET'', ``KAMEKAMEKAMEKAMEKAME'' oraz ``PASSWORD''.

Teraz przydzielimy SPI ( ang. ``Security Parameter Index'', Indeks Parametrów Bezpieczeństwa ) dla każdego z wybranych protokołów. Zauważ, że potrzebujesz 3 SPI dla zestawienia tego kanału, ponieważ używane są trzy nagłówki protokołów bezpieczeństwa ( jeden z HOSTA A do HOSTA B oraz dwa z HOSTA B do HOSTA A ). Zauważ również, że identyfikator SPI musi być większy lub równy 256. Wybieramy wartości 1000, 2000 oraz 3000.

                    (1)
           HOST A ------> HOST B
    
           (1)PROTO=AH
                  ALG=MD5(RFC1826)
                  KEY=MYSECRETMYSECRET
                  SPI=1000
    
                    (2.1)
           HOST A <------ HOST B
                  <------
                    (2.2)
    
           (2.1)
           PROTO=AH
                  ALG=new-HMAC-SHA1(nowe AH)
                  KEY=KAMEKAMEKAMEKAMEKAME
                  SPI=2000
    
           (2.2)
           PROTO=ESP
                  ALG=new-DES-expIV(nowe ESP)
                         długość IV= 8
                  KEY=PASSWORD
                  SPI=3000

Skonfigurujmy teraz SA. Wykonaj na HOŚCIE A i B polecenie setkey(8):

    # setkey -c
    add 10.2.3.4 10.6.7.8 ah-old  1000 -m transport -A keyed-md5 "MYSECRETMYSECRET" ;
    add 10.6.7.8 10.2.3.4 ah  2000 -m transport -A hmac-sha1 "KAMEKAMEKAMEKAMEKAME" ;
    add 10.6.7.8 10.2.3.4 esp 3000 -m transport -E des-cbc "PASSWORD" ;
    ^D

Komunikacja IPsec nie zostaje rozpoczęta dopóki nie ma w kernelu wpisów dotyczących zasad bezpieczeństwa. W tym przypadku, musisz skonfigurować każdego hosta.

    Na HOŚCIE A:
    
    # setkey -c
    spdadd 10.2.3.4 10.6.7.8 any -P out ipsec
       ah/transport/10.2.3.4-10.6.7.8/require ;
    ^D
    
    Na HOŚCIE B:
    
    # setkey -c
    spdadd 10.6.7.8 10.2.3.4 any -P out ipsec
       esp/transport/10.6.7.8-10.2.3.4/require ;
    spdadd 10.6.7.8 10.2.3.4 any -P out ipsec
       ah/transport/10.6.7.8-10.2.3.4/require ;
    ^D
    
    
       HOST A --------------------------------------> HOST B
      10.2.3.4                                       10.6.7.8
              |                                     |
              ========= stary AH keyed-md5 =========>
    
              <======== nowe AH hmac-sha1 ===========
              <======== nowe ESP des-cbc ============

10.9.2. Przykład Trybu Transportowego dla IPv6

Inny przykład, tym razem wykorzystujący IPv6.

Używamy trybu transportowego ESP, dla komunikacji TCP pomiędzy portami 110 na HOŚCIE A i HOŚCIE B.

                  ============ ESP ============
                  |                           |
               HOST-A                        HOST-B
              fec0::10 -------------------- fec0::11

Algorytm szyfrujący to blowfish-cbc, z kluczem ``kamekame''. Algorytm uwierzytelniający to hmac-sha1 z kluczem ``maly testowy kluczyk''. Konfiguracja na HOŚCIE A:

    # setkey -c <<EOF
    spdadd fec0::10[any] fec0::11[110] tcp -P out ipsec
       esp/transport/fec0::10-fec0::11/use ;
    spdadd fec0::11[110] fec0::10[any] tcp -P in ipsec
       esp/transport/fec0::11-fec0::10/use ;
    add fec0::10 fec0::11 esp 0x10001
       -m transport
       -E blowfish-cbc "kamekame"
       -A hmac-sha1 "maly testowy kluczyk" ;
    add fec0::11 fec0::10 esp 0x10002
       -m transport
       -E blowfish-cbc "kamekame"
       -A hmac-sha1 "maly testowy kluczyk" ;
    EOF

...oraz na HOŚCIE B:

    # setkey -c <<EOF
    spdadd fec0::11[110] fec0::10[any] tcp -P out ipsec
       esp/transport/fec0::11-fec0::10/use ;
    spdadd fec0::10[any] fec0::11[110] tcp -P in ipsec
       esp/transport/fec0::10-fec0::11/use ;
    add fec0::10 fec0::11 esp 0x10001 -m transport
       -E blowfish-cbc "kamekame"
       -A hmac-sha1 "maly testowy kluczyk" ;
    add fec0::11 fec0::10 esp 0x10002 -m transport
       -E blowfish-cbc "kamekame"
       -A hmac-sha1 "maly testowy kluczyk" ;
    EOF

Zwróć uwagę na kierunek SP.

10.9.3. Przykład Trybu Tunelowego z IPv4

Tryb tunelowy pomiędzy dwoma bramkami bezpieczeństwa.

Protokół bezpieczeństwa to stary tryb tunelowy AH, określony w RFC1826 z dodatkiem algorytmu uwierzytelniającego keyed-md5 i kluczem ``to moj maly test''.

                                 ======= AH =======
                                 |                |
               Siec-A         Bramka-A         Bramka-B         Siec-B
            10.0.1.0/24 ---- 172.16.0.1 ----- 172.16.0.2 ---- 10.0.2.0/24

Konfiguracja Bramki-A:

    # setkey -c <<EOF
    spdadd 10.0.1.0/24 10.0.2.0/24 any -P out ipsec
       ah/tunnel/172.16.0.1-172.16.0.2/require ;
    spdadd 10.0.2.0/24 10.0.1.0/24 any -P in ipsec
       ah/tunnel/172.16.0.2-172.16.0.1/require ;
    add 172.16.0.1 172.16.0.2 ah-old 0x10003 -m any
       -A keyed-md5 "to moj maly test" ;
    add 172.16.0.2 172.16.0.1 ah-old 0x10004 -m any
       -A keyed-md5 "to moj maly test" ;

EOF

Jeśli pominięte zostanie pole numeru portu ( tak jak w przykładzie powyżej ), przyjmowany jest wpis [any]. Parametr -m określa używane SA, a -m any oznacza pełną dowolność w wyborze protokołu bezpieczeństwa. Opcji tych można używać zarówno dla trybu tunelowego jak i transportowego.

Konfiguracja Bramki-B:

    # setkey -c <<EOF
    spdadd 10.0.2.0/24 10.0.1.0/24 any -P out ipsec
       ah/tunnel/172.16.0.2-172.16.0.1/require ;
    spdadd 10.0.1.0/24 10.0.2.0/24 any -P in ipsec
       ah/tunnel/172.16.0.1-172.16.0.2/require ;
    add 172.16.0.1 172.16.0.2 ah-old 0x10003 -m any
       -A keyed-md5 "to moj maly test" ;
    add 172.16.0.2 172.16.0.1 ah-old 0x10004 -m any
       -A keyed-md5 "to moj maly test" ;

EOF

Tworzenie SA pomiędzy dwoma bramami bezpieczeństwa

Musimy użyć transportowego trybu AH i tunelu ESP pomiędzy Bramą-A a Bramą-B. W tym przypadku najpierw tunelujemy ruch w ESP a potem stosujemy transportową hermetyzację AH.

                                ========== AH =========
                                |  ======= ESP =====  |
                                |  |               |  |
           Sieć-A             Brama-A            Brama-B            Sieć-B
        fec0:0:0:1::/64 --- fec0:0:0:1::1 ---- fec0:0:0:2::1 --- fec0:0:0:2::/64

10.9.4. Przykład Trybu Tunelowego z IPv6

Algorytmem szyfrowania jest 3des-cbc, uwierzytelniania w ramach ESP - hmac-sha1. Natomiast algorytm uwierzytelniający w AH to hmac-md5. Konfiguracja dla Bramy-A:

    # setkey -c <<EOF
    spdadd fec0:0:0:1::/64 fec0:0:0:2::/64 any -P out ipsec
       esp/tunnel/fec0:0:0:1::1-fec0:0:0:2::1/require
       ah/transport/fec0:0:0:1::1-fec0:0:0:2::1/require ;
    spdadd fec0:0:0:2::/64 fec0:0:0:1::/64 any -P in ipsec
       esp/tunnel/fec0:0:0:2::1-fec0:0:0:1::1/require
       ah/transport/fec0:0:0:2::1-fec0:0:0:1::1/require ;
    add fec0:0:0:1::1 fec0:0:0:2::1 esp 0x10001 -m tunnel
       -E 3des-cbc "kamekame12341234kame1234"
       -A hmac-sha1 "this is the test key" ;
    add fec0:0:0:1::1 fec0:0:0:2::1 ah 0x10001 -m transport
       -A hmac-md5 "this is the test" ;
    add fec0:0:0:2::1 fec0:0:0:1::1 esp 0x10001 -m tunnel
       -E 3des-cbc "kamekame12341234kame1234"
       -A hmac-sha1 "this is the test key" ;
    add fec0:0:0:2::1 fec0:0:0:1::1 ah 0x10001 -m transport
       -A hmac-md5 "this is the test" ;

    EOF

Nawiązywanie SA z różnymi końcami tunelu

W tym przykładzie w ramach tunelowania ESP łączymy Host-A i Bramę-A. Algorytm szyfrowania to cast128-cbc a uwierzytelniania hmac-sha1. Stosujemy również ESP w trybie transportowym pomiędzy Hostem-A a Hostem-B. Algorytmem szyfrowania będzie rc5-cbc a uwierzytelniania hmac-md5.

                  ================== ESP =================
                  |  ======= ESP =======                 |
                  |  |                 |                 |
                 Host-A             Brama-A           Host-B
              fec0:0:0:1::1 ---- fec0:0:0:2::1 ---- fec0:0:0:2::2

Konfiguracja Hosta-A:

    # setkey -c <<EOF
    spdadd fec0:0:0:1::1[any] fec0:0:0:2::2[80] tcp -P out ipsec
       esp/transport/fec0:0:0:1::1-fec0:0:0:2::2/use
       esp/tunnel/fec0:0:0:1::1-fec0:0:0:2::1/require ;
    spdadd fec0:0:0:2::1[80] fec0:0:0:1::1[any] tcp -P in ipsec
       esp/transport/fec0:0:0:2::2-fec0:0:0:l::1/use
       esp/tunnel/fec0:0:0:2::1-fec0:0:0:1::1/require ;
    add fec0:0:0:1::1 fec0:0:0:2::2 esp 0x10001
       -m transport
       -E cast128-cbc "12341234"
       -A hmac-sha1 "this is the test key" ;
    add fec0:0:0:1::1 fec0:0:0:2::1 esp 0x10002
       -E rc5-cbc "kamekame"
       -A hmac-md5 "this is the test" ;
    add fec0:0:0:2::2 fec0:0:0:1::1 esp 0x10003
       -m transport
       -E cast128-cbc "12341234"
       -A hmac-sha1 "this is the test key" ;
    add fec0:0:0:2::1 fec0:0:0:1::1 esp 0x10004
       -E rc5-cbc "kamekame"
       -A hmac-md5 "this is the test" ;

    EOF

This, and other documents, can be downloaded from ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

For questions about FreeBSD, read the documentation before contacting <questions@FreeBSD.org>.
For questions about this documentation, e-mail <doc@FreeBSD.org>.