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