
053cf8566aae7dbfeb3368c03de9b338.ppt
- Количество слайдов: 35
Sockets, el interfaz Ø Seguridad en nuestros Sockets Ø Adaptación de nuestros Sockets a IPv 6 1
Ø Seguridad en programas de red • ¿Mejora su funcionalidad un programa seguro? • ¿Qué niveles de seguridad podemos implementar? 2
Ø Seguridad en programas de red • Compartir información: Base de la programación en red • Necesitamos conocer con quién se trabaja • Problemas: Naturaleza de la red y Hackers 3
Ø Seguridad en programas de red • Idea: Establecer niveles de seguridad y determinar “donde” aplicar dicha seguridad • Primer paso: Identificación del usuario 4
Ø Seguridad en programas de red v Niveles de seguridad en identificación de usuarios: • Autenticación (Nombre de usuario y contraseña) • Autorización (autorizar o no el acceso a los servicios del sistema) • Certificación (servidor de certificados ) 5
Ø Seguridad en programas de red v Información que se intercambiará • Escrutinio (Revelación de información) • Intrusión (Puede agregar e incluso modificar) 6
Ø Seguridad en programas de red v El siguiente paso es conocer las formas de ataque a las que estamos expuestos • Intervención de la línea. • Corte de la línea. • Secuestro de la línea 7
Ø Seguridad en programas de red v Seguridad en un nodo de red • Acceso restringido • Firewalls • Zonas desmilitarizadas (DMZ) 8
Ø Seguridad en programas de red v Acceso Restringido • • • Permisos de archivos Limitaciones en la conexión Reducción de los agujeros en los puertos Centrarse en las tarjetas Separación de los servicios no necesarios 9
Ø Seguridad en programas de red v Firewalls: • Filtrado Activo (direccionamiento ) • Filtrado Pasivo (detalle ) 10
Ø Seguridad en programas de red v Zonas desmilitarizadas (DMZ). • Firewall tras firewall • Problema: sincronización con la red • Solución: Túneles 11
Ø Seguridad en programas de red v Seguridad a nivel de Sockets (Secure Sockets Layer SSL) • Uso de la API SSL: Open. SSL http: //www. openssl. org 12
Ø Seguridad en programas de red v Uso de Open. SSL 1. 2. 3. 4. 5. 6. Descargue el paquete completo Ejecutar config (. /config) (. /config linux-elf) Ejecutar make test Entrar como root. Ejecutar make install (/usr/local/ssl/) Crear las referencias a las bibliotecas: ln –s /usr/local/ssl/libssl. a /usr/lib/ ln –s /usr/local/ssl/libcrypto. a /usr/lib/ 13
Ø Seguridad en programas de red v Uso de Open. SSL 7. Crear la referencia a los archivos incluidos: ln –s /usr/local/ssl/include/openssl/ /usr/include 8. Incorporar MANPATH /usr/local/ssl/man al archivo /etc/man. config. 9. Incorporar en la ruta de acceso /usr/local/ssl/bin. Todo listo para programar sockets seguros 14
Ø Seguridad en programas de red v Creación de un cliente SSL • Lo primero es configurar la biblioteca SSL: SSL_METHOD *method; SSL_CTX *ctx; Open. SSL_add_all_algorithms(); SSL_load_error_strings(); method = SSLv 2_client_method(); ctx = SSL_CTX_new(method); //Cargar el cifrado, etc. //Cargar el mensaje de error //Crear el nuevo método/cliente //Crear el nuevo contexto 15
Ø Seguridad en programas de red v Luego, crear un socket normal: //Conecta el socket del cliente al servidor SSL struct sockaddr_in addr; struct hostent *host = gethostbyname(hostname); int sd = socket(PF_INET, SOCK_STREAM, 0); bzero(&addr, sizeof(addr)); addr. sin_family = AF_INET; addr. sin_port = htons(port); addr. sin_addr. s_addr = *(long*)(host->h_addr); connect(sd, &addr, sizeof(addr)); //Crea el socket //puerto del servidor //IP del servidor //conexión con el servidor 16
Ø Seguridad en programas de red v Luego de la conexión de los sockets entre cliente y servidor, se debe crear una instancia SSL y asociarla a la conexión //Establecer el protocolo SSL y crear el enlace de cifrado SSL *ssl =SSL_new(ctx); //crea un nuevo estado de conexión SSL_set_fd(ssl, sd); //adjunta el descriptor del socket if( SSL_connect(ssl) == -1) //realiza la conexión ERR_print_errors_fp(stderr); //informa el error si hay 17
Ø Seguridad en programas de red v Conexión SSL con cifrado completo. Ahora, leer certificados: // Leer certificados Char line[1024] X 509 *x 509=X 509_get_subject_name(cert); //Obtener asunto X 509_NAME_oneline(x 509, line, sizeof[line]); //convertirlo Printf(“Subject: %s n”, line); X 509=X 509_get_issuer_name(cert); //Obtener emisor de certificado X 509_NAME_oneline(x 509, line, sizeof[line]); //convertirlo Printf(“Issuer: %s n”, line); 18
Ø Seguridad en programas de red • Ya estamos preparados para enviar y recibir datos con: //Enviar y recibir mensajes int bytes; bytes = SSL_read(ssl, buf, sizeof(buf)); bytes = SSL_write(ssl, msg, strlen(msg)); //obtener/descifrar //cifrar/enviar 19
Ø Seguridad en programas de red v Creación de un servidor SSL El Cliente y el Servidor son muy parecidos, ahora vemos la creación del servidor: // Iniciar el estado del servidor SSL_METHOD *method; SSL_CTX *ctx; Open. SSL_add_all_algorithms(); //Cargar el cifrado. SSL_load_error_strings(); //Cargar el mensaje de error method = SSLv 2_server_method(); //Crear el nuevo método-servidor ctx = SSL_CTX_new(method); //Crear el nuevo contexto 20
Ø Seguridad en programas de red • El servidor debe cargar su archivo de certificados. //Cargar archivos de clave privada y certificado //Establecer el certificado local de certfile SSL_CTX_use_certificate_file(ctx, Cert. File, SSL_FILETYPE_PEM); //Establecer la clave privada Key. File SSL_CTX_use_Private. Key_file(ctx, Cert. File, SSL_FILETYPE_PEM); //verificar la clave privada if( !SSL_CTX_check_private_key(ctx) ) fprintf(stderr, “Key and Certificate don’t match); 21
• El socket es escencialmente un socket normal de servidor: //Establecer el puerto del servidor struct sockaddr_in addr; int sd, client; sd = socket(PF_INET, SOCK_STREAM, 0); //crea el socket bzero(&addr, sizeof(addr)); addr. sin_family = AF_INET; addr. sin_port = htons(port); addr. sin_addr. s_addr = INADDR_ANY; //permite cualquier puerto bind(sd, &addr, sizeof(addr); //enlazar a un puerto listen(sd, 10); //prepara al socket para la escucha client = accept(server, &addr, &len); //acepta conexión 22
Ø Seguridad en programas de red • Creación de estado SSL: //Crea estado de sesión SSL en función del contexto y SSL_accept ssl = SSL_new(ctx) //obtener nuevo estado SSL con el contexto SSL_set_fd(ssl, client); //asociar el socket con el estado SSL if( SSL_accept(ssl) == FAIL) //aceptar el protocolo SSL ERR_print_errors_fp(stderr); else { int bytes; bytes = SSL_read(ssl, buf, sizeof(buf)); //obtener petición SSL_write(ssl, reply, strlen(reply)); //enviar réplica } 23
Ø Seguridad en programas de red • Cliente servidor seguro • Incremento de productividad • Presencia en Internet 24
Ø Sockets en IPv 6 v IPv 6: La próxima generación de IP 25
Ø Sockets en IPv 6 • ¿IPv 4 e IPv 6 juntos? • Las direcciones de IPv 4 son reasignadas a una dirección de IPv 6 (todos los bits superiores se establecen a cero y los últimos 48 bits son 0 x. FFFF seguidos de la dirección IPv 4) • No funciona al revés (Obviamente) 26
Ø Sockets en IPv 6 v Configuración del Núcleo: • Se debe entrar al directorio /proc/net y buscar un archivo llamado igmp 6 o if_inet Necesitamos cargar el módulo ipv 6. o. 27
Ø Sockets en IPv 6 v Configuración de las herramientas: • Ejecutar iconfig –helpp • Necesitamos conseguir el RPM net_tools configure. sh • Reiniciar el host, 28
Ø Sockets en IPv 6 v Transformación de las llamadas IPv 4 a IPv 6: • En la estructura del socket, en vez de la utilización de sockaddr_in, usar sockaddr_in 6: struct sockaddr_in 6 addr; bzero( &addr, sizeof( addr )); 29
Ø Sockets en IPv 6 Esta estructura se debe usar para las llamadas del sistema accept(), connect() y bind(). Similarmente, la opción socket para obtener la dirección del socket origen o del socket remoto necesita estructura nueva. • 30
Ø Sockets en IPv 6 • El segundo cambio es el tipo de socket, no puede recibir protocolos distintos desde el mismo socket. Aunque IPv 6 es un superconjunto de IPv 4, se debe elegir un tipo de socket distinto: sd = socket(PF_INET 6, SOCK_STREAM, 0); // para TCP 6 sd = socket(PF_INET 6, SOCK_DGRAM, 0); //para UDP 6 sd = socket(PF_INET 6, SOCK_RAW, 0); //paar Raw-6 o ICMP 6 31
Ø Sockets en IPv 6 • Otros campos que debemos cambiar levemente son: addr. sin 6_family = AF_INET 6; addr. sin 6_port = htons(MY_PORT); if( inet_pton(AF_INET 6, “ 2 FFF: : 80: 9 AC 0: 351”, &addr. sin 6_addr) == 0) perror(“inet_pton failed”); 32
Ø Sockets en IPv 6 • Este fragmento de código utiliza la nueva llamada, inet_pton(). #include
Ø Sockets en IPv 6 v Ventajas de IPv 6: • La dirección de 128 bits • Mayor tamaño de paquete (64 k. B -> 4 GB) • Multidifusión 34
Ø Sockets en IPv 6 v Linux & IPv 6: • Desde Linux V 2. 2. 0 • Aún no es estándar • Soporta lo que puede • Objetivo en movimiento 35