       Verificacion independiente de la funcionalidad de IPsec en FreeBSD

  David Honig

   <honig@sprynet.com>

   Revision: adedee47c4

   FreeBSD is a registered trademark of the FreeBSD Foundation.

   Motif, OSF/1, and UNIX are registered trademarks and IT DialTone and The
   Open Group are trademarks of The Open Group in the United States and other
   countries.

   Many of the designations used by manufacturers and sellers to distinguish
   their products are claimed as trademarks. Where those designations appear
   in this document, and the FreeBSD Project was aware of the trademark
   claim, the designations have been followed by the "(TM)" or the "(R)"
   symbol.

   2019-03-29 15:17:05 +0000 por Gabor Kovesdan.
   Resumen

   Instalo IPsec y parece estar funcionando. ?Como lo sabe? Describo un
   metodo para verificar de forma experimental que IPsec esta funcionando.

   [ Split HTML / Single HTML ]

     ----------------------------------------------------------------------

   Tabla de contenidos

   1. El problema

   2. La solucion

   3. El experimento

   4. Advertencia

   5. IPsec---Definicion

   6. Instalando IPsec

   7. src/sys/i386/conf/KERNELNAME

   8. Maurer's Universal Statistical Test (tamano de bloque=8 bits)

1. El problema

   Primero, asumamos que ha instalado IPsec. ?Como sabe que esta funcionando?
   Claro, su conexion no funcionara si esta mal configurada, y funcionara
   cuando finalmente lo haga bien. netstat(1) la listara. ?Pero puede
   confirmarlo de forma independiente?

2. La solucion

   Primero, alguna informacion teorica relevante sobre criptografia:

    1. Los datos cifrados se distribuyen uniformemente, es decir, tienen una
       entropia maxima por simbolo;

    2. Los datos sin procesar y sin comprimir suelen ser redundantes, es
       decir, tienen una entropia submaxima.

   Suponga que usted pudiera medir la entropia de los datos que van hacia -y
   desde- su interfaz de red. Entonces podria ver la diferencia entre los
   datos no cifrados y los cifrados. Esto seria verdad incluso si algunos de
   los datos en "modo cifrado" no lo estuvieran---ya que el encabezado IP mas
   externo debe estarlo para que el paquete sea enrutable.

  2.1. MUST

   El "Universal Statistical Test for Random Bit Generators" (MUST) de Ueli
   Maurer mide rapidamente la entropia de una muestra. Utiliza un algoritmo
   de compresion. El codigo se proporciona a continuacion para una variante
   que mide partes sucesivas (~cuarto de megabyte) de un archivo

  2.2. Tcpdump

   Tambien necesitamos una forma de capturar los datos de red sin procesar.
   Un programa llamado tcpdump(1) le permite hacerlo, si tiene habilitada la
   interfaz de Berkeley Packet Filter en el archivo de configuracion de su
   kernel.

   El comando:

 tcpdump -c 4000 -s 10000 -w dumpfile.bin

   capturara 4000 paquetes sin procesar en el fichero dumpfile.bin. En este
   ejemplo se capturaran hasta 10.000 bytes por paquete.

3. El experimento

   Aqui esta el experimento:

    1. Abra una ventana a un host IPsec y otra ventana a un host inseguro.

    2. Ahora empiece a capturar paquetes.

    3. En la ventana "segura", ejecute el comando UNIX(R) yes(1), que
       transmitira el caracter y. Despues de un rato, detenga el comando.
       Cambie a la ventana insegura, y repita. Espere un poco, detenga el
       comando.

    4. Ahora ejecute MUST en los paquetes capturados. Deberia ver algo como
       lo siguiente. Lo importante a tener en cuenta es que la conexion
       segura tiene un 93% (6,7) del valor esperado (7,18), y la conexion
       "normal" tiene un 29% (2,1) del valor esperado.

 % tcpdump -c 4000 -s 10000 -w ipsecdemo.bin
 % uliscan ipsecdemo.bin

 Uliscan 21 Dec 98
 L=8 256 258560
 Measuring file ipsecdemo.bin
 Init done
 Expected value for L=8 is 7.1836656
 6.9396 --------------------------------------------------------
 6.6177 -----------------------------------------------------
 6.4100 ---------------------------------------------------
 2.1101 -----------------
 2.0838 -----------------
 2.0983 -----------------

4. Advertencia

   Este experimento muestra que IPsec parece estar distribuyendo los datos de
   la carga util uniformemente, como debe hacerlo el cifrado. Sin embargo, el
   experimento aqui descrito puede no detectar muchas de las posibles fallas
   del sistema (para las cuales no tengo evidencias). Esto incluye la
   generacion o intercambio de claves deficientes, datos o claves visibles
   para otros, uso de algoritmos debiles, subversion del kernel, etc. Estudie
   el codigo; conozca el codigo.

5. IPsec---Definicion

   Extensiones de seguridad del Protocolo de Internet para IPv4; requerido
   para IPv6. Un protocolo para negociar el cifrado y la autenticacion a
   nivel de IP (host a host). SSL solo protege un socket de aplicacion. SSH
   protege solo el login. PGP protege un archivo o mensaje especifico. IPsec
   encripta todo entre dos hosts.

6. Instalando IPsec

   La mayoria de las versiones modernas de FreeBSD soportan IPsec en su
   codigo base. Por lo tanto, debera incluir la opcion IPSEC en la
   configuracion de su kernel y, despues de recompilar y reinstalar el
   kernel, configure las conexiones de IPsec usando el comando setkey(8).

   En el Manual de FreeBSD se proporciona una guia completa sobre como
   ejecutar IPsec en FreeBSD.

7. src/sys/i386/conf/KERNELNAME

   Esto debe estar presente en el archivo de configuracion del kernel para
   capturar datos de red con tcpdump(1). Asegurese de ejecutar config(8)
   despues de agregar esto, recompilar y reinstalar.

 device  bpf

8. Maurer's Universal Statistical Test (tamano de bloque=8 bits)

   Puede encontrar el mismo codigo fuente en este enlace.

 /*
   ULISCAN.c   ---blocksize of 8

   1 Oct 98
   1 Dec 98
   21 Dec 98       uliscan.c derived from ueli8.c

   This version has // comments removed for Sun cc

   This implements Ueli M Maurer's "Universal Statistical Test for Random
   Bit Generators" using L=8

   Accepts a filename on the command line; writes its results, with other
   info, to stdout.

   Handles input file exhaustion gracefully.

   Ref: J. Cryptology v 5 no 2, 1992 pp 89-105
   also on the web somewhere, which is where I found it.

   -David Honig
   honig@sprynet.com

   Usage:
   ULISCAN filename
   outputs to stdout
 */

 #define L 8
 #define V (1<<L)
 #define Q (10*V)
 #define K (100   *Q)
 #define MAXSAMP (Q + K)

 #include <stdio.h>
 #include <math.h>

 int main(argc, argv)
 int argc;
 char **argv;
 {
   FILE *fptr;
   int i,j;
   int b, c;
   int table[V];
   double sum = 0.0;
   int iproduct = 1;
   int run;

   extern double   log(/* double x */);

   printf("Uliscan 21 Dec 98 \nL=%d %d %d \n", L, V, MAXSAMP);

   if (argc < 2) {
     printf("Usage: Uliscan filename\n");
     exit(-1);
   } else {
     printf("Measuring file %s\n", argv[1]);
   }

   fptr = fopen(argv[1],"rb");

   if (fptr == NULL) {
     printf("Can't find %s\n", argv[1]);
     exit(-1);
   }

   for (i = 0; i < V; i++) {
     table[i] = 0;
   }

   for (i = 0; i < Q; i++) {
     b = fgetc(fptr);
     table[b] = i;
   }

   printf("Init done\n");

   printf("Expected value for L=8 is 7.1836656\n");

   run = 1;

   while (run) {
     sum = 0.0;
     iproduct = 1;

     if (run)
       for (i = Q; run && i < Q + K; i++) {
         j = i;
         b = fgetc(fptr);

         if (b < 0)
           run = 0;

         if (run) {
           if (table[b] > j)
             j += K;

           sum += log((double)(j-table[b]));

           table[b] = i;
         }
       }

     if (!run)
       printf("Premature end of file; read %d blocks.\n", i - Q);

     sum = (sum/((double)(i - Q))) /  log(2.0);
     printf("%4.4f ", sum);

     for (i = 0; i < (int)(sum*8.0 + 0.50); i++)
       printf("-");

     printf("\n");

     /* refill initial table */
     if (0) {
       for (i = 0; i < Q; i++) {
         b = fgetc(fptr);
         if (b < 0) {
           run = 0;
         } else {
           table[b] = i;
         }
       }
     }
   }
 }
