Title: Presentaci
 1Sockets, el interfaz
-  Seguridad en nuestros Sockets 
 -  Adaptación de nuestros Sockets a IPv6
 
  2-  Seguridad en programas de red
 
-  Mejora su funcionalidad un programa seguro? 
 
-  Qué niveles de seguridad podemos implementar?
 
  3-  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 
 
  4-  Seguridad en programas de red
 
-  Idea Establecer niveles de seguridad y 
determinar donde aplicar dicha seguridad  -  Primer paso Identificación del usuario 
 
  5-  Seguridad en programas de red
 
-  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 )
 
  6-  Seguridad en programas de red
 
-  Información que se intercambiará 
 
-  Escrutinio (Revelación de información) 
 -  Intrusión (Puede agregar e incluso modificar)
 
  7-  Seguridad en programas de red
 
-  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
 
  8-  Seguridad en programas de red
 
-  Seguridad en un nodo de red
 
-  Acceso restringido 
 -  Firewalls 
 -  Zonas desmilitarizadas (DMZ) 
 
  9-  Seguridad en programas de red
 
-  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
 
  10-  Seguridad en programas de red
 
-  Filtrado Activo (direccionamiento ) 
 -  Filtrado Pasivo (detalle )
 
  11-  Seguridad en programas de red
 
-  Zonas desmilitarizadas (DMZ). 
 
-  Firewall tras firewall 
 -  Problema sincronización con la red 
 -  Solución Túneles
 
  12-  Seguridad en programas de red
 
-  Seguridad a nivel de Sockets (Secure 
 Sockets Layer SSL) 
-  Uso de la API SSL OpenSSL 
 -  http//www.openssl.org
 
  13-  Seguridad en programas de red
 
- Descargue el paquete completo 
 - Ejecutar config (./config) (./config linux-elf) 
 - Ejecutar make 
 - Ejecutar make test 
 - Entrar como root. Ejecutar make install 
(/usr/local/ssl/)  - Crear las referencias a las bibliotecas 
 -  ln s /usr/local/ssl/lib/libssl.a /usr/lib/ 
 -  ln s /usr/local/ssl/lib/libcrypto.a /usr/lib/
 
  14-  Seguridad en programas de red
 
- Crear la referencia a los archivos incluidos 
 -  ln s /usr/local/ssl/include/openssl/ /usr/inclu
de  - 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
 
  15-  Seguridad en programas de red
 
-  Creación de un cliente SSL
 
-  Lo primero es configurar la biblioteca SSL
 
SSL_METHOD method SSL_CTX ctx OpenSSL_add_all_
algorithms() //Cargar el cifrado, 
etc. SSL_load_error_strings() 
 //Cargar el mensaje de error method  
SSLv2_client_method() //Crear el nuevo 
método/cliente ctx  SSL_CTX_new(method) 
//Crear el nuevo contexto 
 16-  Seguridad en programas de red
 
-  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) //Crea el 
socket bzero(addr, sizeof(addr)) addr.sin_family
  AF_INET addr.sin_port  htons(port) //puer
to del servidor addr.sin_addr.s_addr  
(long)(host-gth_addr) //IP del 
servidor connect(sd, addr, sizeof(addr)) //con
exión con el servidor  
 17-  Seguridad en programas de red
 
-  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 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  
 18-  Seguridad en programas de red
 
-  Conexión SSL con cifrado completo. Ahora, leer 
certificados 
// Leer certificados Char line1024 X509 
x509X509_get_subject_name(cert) //Obtener 
asunto X509_NAME_oneline(x509, line, 
sizeofline) //convertirlo Printf(Subject s 
\n, line) X509X509_get_issuer_name(cert) //O
btener emisor de certificado X509_NAME_oneline(x5
09, line, sizeofline) //convertirlo Printf(Is
suer s \n, line) 
 19-  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)) //obtener/descif
rar bytes  SSL_write(ssl, msg, 
strlen(msg)) //cifrar/enviar  
 20-  Seguridad en programas de red
 
-  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 SSL_METHOD 
method SSL_CTX ctx OpenSSL_add_all_algorithms(
) //Cargar el cifrado. SSL_load_e
rror_strings() //Cargar el mensaje de 
error method  SSLv2_server_method() 
//Crear el nuevo método-servidor ctx  
SSL_CTX_new(method) //Crear el nuevo 
contexto  
 21-  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, 
CertFile, SSL_FILETYPE_PEM) //Establecer la 
clave privada KeyFile SSL_CTX_use_PrivateKey_file(
ctx, CertFile, SSL_FILETYPE_PEM) //verificar la 
clave privada if( !SSL_CTX_check_private_key(ctx) 
) fprintf(stderr, Key and Certificate dont 
match)  
 22-  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  
 23-  Seguridad en programas de red
 
//Crea estado de sesión SSL en función del 
contexto y SSL_accept ssl  SSL_new(ctx) //obten
er 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  
 24-  Seguridad en programas de red
 
-  Cliente servidor seguro 
 -  Incremento de productividad 
 -  Presencia en Internet 
 
  25-  IPv6 La próxima generación de IP
 
  26-  Las direcciones de IPv4 son reasignadas a una 
dirección de IPv6 (todos los bits superiores se 
establecen a cero y los últimos 48 bits son 
0xFFFF seguidos de la dirección IPv4)  -  No funciona al revés (Obviamente)
 
  27-  Se debe entrar al directorio /proc/net y 
buscar un archivo llamado igmp6 o if_inet  -  Necesitamos cargar el módulo ipv6.o. 
 
  28-  Configuración de las herramientas 
 
-  Ejecutar iconfig 
 -  Ejecutar iconfig helpp 
 -  Necesitamos conseguir el RPM net_tools 
 -  configure.sh 
 -  Reiniciar el host, 
 
  29-  Transformación de las llamadas IPv4 a IPv6 
 
-  En la estructura del socket, en vez de la 
utilización de sockaddr_in, usar sockaddr_in6  -  
 -  struct sockaddr_in6 addr 
 -  bzero( addr, sizeof( addr )) 
 
  30-  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 esta estructura nueva.  
  31-  El segundo cambio es el tipo de socket, no 
puede recibir protocolos distintos desde el mismo 
socket. Aunque IPv6 es un superconjunto de IPv4, 
se debe elegir un tipo de socket distinto  
sd  socket(PF_INET6, SOCK_STREAM, 0) // para 
TCP6 sd  socket(PF_INET6, SOCK_DGRAM, 
0) //para UDP6 sd  socket(PF_INET6, SOCK_RAW, 
0) //paar Raw-6 o ICMP6 
 32-  Otros campos que debemos cambiar levemente 
son  - addr.sin6_family  AF_INET6 
 - addr.sin6_port  htons(MY_PORT) 
 - if( inet_pton(AF_INET6, 2FFF809AC0351, 
addr.sin6_addr)  0)  -  perror(inet_pton failed)
 
  33-  Este fragmento de código utiliza la nueva 
llamada, inet_pton().  
include ltarpa/inet.hgt int inet_pton(int domain, 
const char prstn, void buf) char inet_ntop(int 
domain, void buf, char prstn, int len)  
 34-  La dirección de 128 bits 
 -  Mayor tamaño de paquete (64kB -gt 4GB) 
 -  Multidifusión
 
  35-  Desde Linux V2.2.0 
 -  Aún no es estándar 
 -  Soporta lo que puede 
 -  Objetivo en movimiento