Este documento describe conceptos clave relacionados con la seguridad informática como el software libre, código abierto, encriptación y protocolos de seguridad. Explica las ventajas del software libre para la seguridad, como la capacidad de auditar el código y aplicar mejoras. También describe métodos de encriptación como TLS que permiten comunicaciones seguras entre clientes y servidores.
1. República Bolivariana de Venezuela
Ministerio del Poder Popular Para la Educación
Universidad Nacional Experimental de Guayana
Ingeniería en Informática
Unidad Curricular: Tendencias Informáticas
Profesora: Integrantes:
Isabel García Lopez Ángel
Klie Daniel
Zambrano Arturo
Cordero Raelyx
Rojas Luis
Aguilar Jefferson
Julio 2016
Seguridad vs Software Libre
2. SOFTWARE LIBRE Y CÓDIGO ABIERTO
Software Libre
Para entender la situación de este tipo de software con respecto a su uso en
seguridad informática es imprescindible describir, en primer lugar, a qué se refiere
el concepto de “software libre”.
En general se entiende como software libre aquel programa o conjunto de ellos de
los que el usuario puede disponer del código fuente, sin restricciones, y el cual
puede modificar y redistribuir también sin restricciones.
El principio del Software Libre cumple con cuatro libertades básicas que la FSF
(Free Software) establece para los usuarios:
Libertad 1: La libertad de ejecutar el programa como se desea, con
cualquier propósito.
Libertad 2: La libertad de estudiar cómo funciona el programa, y cambiarlo
para que haga lo que usted quiera. El acceso al código fuente es una
condición necesaria para ello.
Libertad 3: La libertad de redistribuir copias para ayudar a su prójimo.
Libertad 4: La libertad de distribuir copias de sus versiones modificadas a
terceros. Esto le permite ofrecer a toda la comunidad la oportunidad de
beneficiarse de las modificaciones. El acceso al código fuente es una
condición necesaria para ello.
Estas libertades garantizadas al usuario del software (o a aquel que lo recibe) no
son contrarias a los derechos legítimos del autor del programa, es decir, éste no
tiene por qué perder sus derechos sobre el mismo. No se incluye, por tanto, en esta
definición software en el “domino público” (aquél para en el que el autor ha cedido
todos sus derechos).
Un programa informático es software libre si otorga a los usuarios todas estas
libertades de manera adecuada. De lo contrario no es libre. Existen diversos
esquemas de distribución que no son libres, y si bien podemos distinguirlos sobre
la base de cuánto les falta para llegar a ser libres, su uso bien puede ser considerado
contrario a la ética en todos los casos por igual.
El software libre suele estar disponible gratuitamente, o al precio de coste de la
distribución a través de otros medios; sin embargo, no es obligatorio que sea así,
3. por lo tanto, no hay que asociar software libre a software gratuito, ya que,
conservando su carácter de libre, puede ser distribuido comercialmente.
Análogamente, el software gratis o gratuito incluye en ocasiones el código fuente;
no obstante, este tipo de software no es libre en el mismo sentido que el software
libre, a menos que se garanticen los derechos de modificación y redistribución de
dichas versiones modificadas del programa.
Código abierto
Open Source o código abierto, es la expresión con la que se conoce al software
distribuido y desarrollado libremente. Es un movimiento más pragmático, se enfoca
más en los beneficios prácticos como acceso al código fuente que en aspectos
éticos o de libertad que son tan relevantes en el Software Libre.
Su premisa es que al compartir el código, el programa resultante tiende a ser de
calidad superior al software propietario, es una visión técnica. Obviamente para
lograr calidad técnica lo ideal es compartir el código, pero no estás obligado a
hacerlo.
VENTAJAS DEL SOFTWARE LIBRE EN EL MUNDO DE LA SEGURIDAD
El software libre deriva una serie de ventajas sobre el propietario, como lo son:
Al disponer del código fuente de los programas en su totalidad, éste puede
ser analizado por terceras personas ajenas a sus autores en busca de fallos
de diseño o de implementación. Es decir, cualquiera con los conocimientos
necesarios puede realizar una auditoría del código del programa.
La posibilidad de realizar modificaciones libremente al código fuente y
distribuirlas permite que cualquiera pueda ofrecer mejoras sobre éste. Estas
mejoras podrán ser nuevas funcionalidades que se incorporen al mismo o
parches que corrijan problemas detectados anteriormente.
Las características del software libre hacen que no sea lógico cargar costes
sobre el software en sí (dado que se ha de distribuir sin cargo), lo que permite
que este tipo de software pueda ser utilizado por organizaciones y personas
con menos recursos económicos. Esto se presenta como una ventaja cuando
se compara con los precios de lo que cuesta el software de seguridad
propietario hoy en día (licencias de cortafuegos, vpns, sistemas de detección
4. de intrusos, etc.). El software libre pone en manos de cualquiera el tipo de
tecnología que, hoy por hoy, sólo podían tener grandes corporaciones.
De igual forma, la posibilidad de modificar libremente el software permite a
las organizaciones que lo adapten a sus propias necesidades, pudiendo
eliminar funcionalidades que no le sean de interés. En el mundo de la
seguridad existe la máxima de “lo más sencillo es más seguro” por ello
poder eliminar funciones innecesarias de las herramientas las puede
convertir de forma inmediata en más seguras (porque no podrán ser
utilizadas estas funcionalidades para subvertirlas).
SEGURIDAD INFORMÁTICA Y EL USO DEL SOFTWARE LIBRE
Habitualmente los usuarios no tienen en cuenta cuando hacen uso de los sistemas
ya que ignoran los temas relacionados sobre la seguridad en internet en el trabajo
o en las empresas, ya que las personas no consideran los tipos de seguridad lo
toman como una molestia porque suele ir en contra de sus comodidades y
facilidades los usuarios suelen tomar este tema de forma negativa lo consideran
molesto porque algunas veces les impide la realización de un determinado trabajo
porque encuentran tareas que le pueden resultar incomodas al recordar
contraseñas por ejemplo por razones de memoria o rapidez les cuesta mucho
recordad o ingresar claves cada vez que sea necesario.
Pero hoy en día la seguridad es fundamental a la hora de proteger o afrontan tareas
sobre sistemas de información de seguridad en el día, día de cada persona ya que
la seguridad es una medida que permite garantizar cantidades de información que
se requiera proteger para ciertas personas que intenten violar el acceso a aquello
que pueda estar protegido.
¿Son necesarios los mecanismos de seguridad?
Es necesario para tener privacidad en cuanto el intercambio de información porque
sin darse cuenta esa información puede ir a parar en manos equivocadas o
desconocidas o que otros violen dicha privacidad. Por otro lado, tampoco no se
puede estar seguro de que el sistema que se esté conectado o usando resulte quien
dice ser, no existe una certeza de los sistemas que se estén usando sean realmente
auténticos o confiables, además no es solamente enviar o utilizar los sistemas es
también adquirir productos que pueden ocasionar daños involuntarios por ejemplo
virus espías que te pueden roban los archivos entre otros.
5. Otro tema que es muy resaltante en la seguridad informática en el uso del software
libre del cual ya se habló en ése trabajo, además de las ventajas del software libre
en el mundo de la seguridad son fundamentales porque al disponer del código
fuente cualquiera con los conocimientos necesarios puede realizar una auditoría del
código del programa entonces quiere decir que cualquiera persona que tenga los
conocimientos necesarios puede mejorar dicho programa, por su parte en el
software propietario no se tiene acceso al código fuente, esto puede llevar que el
fabricante tenga una sensación de seguridad y los usuarios tienen la necesidad de
confiar totalmente en el fabricante. Por eso ahora se distribuye el software libre por
su libre acceso se puede modificar libremente pero el software libre no está libre de
desventajas no porque las posibilidades de generar más fácilmente los virus y
también con la evolución futura los componentes del software no están seguros.
ENCRIPTACIÓN
Encriptación
Es el proceso mediante el cual cierta información o texto sin formato es cifrado de
forma que el resultado sea ilegible a menos que se conozcan los datos necesarios
para su interpretación. Es una medida de seguridad utilizada para que al momento
de almacenar o transmitir información sensible ésta no pueda ser obtenida con
facilidad por terceros.
Opcionalmente puede existir además un proceso de desencriptación a través del
cuál la información puede ser interpretada de nuevo a su estado original, aunque
existen métodos de encriptación que no pueden ser revertidos. El término
encriptación es traducción literal del inglés y no existe en el idioma español. La
forma más correcta de utilizar este término sería cifrado.
Criptología
Es la ciencia que estudia la transformación de un determinado mensaje en un código
de forma tal que a partir de dicho código solo algunas personas sean capaces de
recuperar el mensaje original.
La mayoría de los algoritmos modernos del cifrado se basan en una de las
siguientes dos categorías de procesos:
Problemas matemáticos que son simples pero que tienen una inversa que se
cree (pero no se prueba) que es complicada
6. Secuencias o permutaciones que son en parte definidos por los datos de
entradas.
La primera categoría, que resume la mayoría de los métodos del cifrado de clave
pública, sufre de la incapacidad de probar la dificultad de los algoritmos. El segundo
método, que contiene a la mayoría de los códigos, sufre a menudo de correlaciones
teóricas entre la entrada ("texto de entrada") y la salida ("texto cifrado").
Usos de la Encriptación
Algunos de los usos más comunes de la encriptación son el almacenamiento y
transmisión de información sensible como contraseñas, números de identificación
legal, números de tarjetas de crédito, reportes administrativo-contables y
conversaciones privadas, entre otros.
Como sabemos, en un Sistema de Comunicación de Datos, es de vital importancia
asegurar que la Información viaje segura, manteniendo su autenticidad, integridad,
confidencialidad y el no repudio de la misma entre otros aspectos.
Estas características solo se pueden asegurar utilizando las Técnicas de Firma
Digital Encriptada y la Encriptación de Datos.
Métodos de Encriptación
Para poder Encriptar un dato, se pueden utilizar tres procesos matemáticos
diferentes:
1. Algoritmo HASH:
Este algoritmo efectúa un cálculo matemático sobre los datos que constituyen
el documento y da como resultado un número único llamado MAC. Un mismo
documento dará siempre un mismo MAC.
2. Criptografía de Clave Secreta o Simétrica:
Utilizan una clave con la cual se encripta y desencripta el documento. Todo
documento encriptado con una clave, deberá desencriptarse, en el proceso
inverso, con la misma clave. Es importante destacar que la clave debería
viajar con los datos, lo que hace arriesgada la operación, imposible de utilizar
en ambientes donde interactúan varios interlocutores.
3. Algoritmos Asimétricos (RSA):
Requieren dos Claves, una Privada (única y personal, solo conocida por su
dueño) y la otra llamada Pública, ambas relacionadas por una fórmula
matemática compleja imposible de reproducir. El concepto de criptografía de
7. clave pública fue introducido por Whitfield Diffie y Martin Hellman a fin de
solucionar la distribución de claves secretas de los sistemas tradicionales,
mediante un canal inseguro. El usuario, ingresando su PIN genera la clave
Publica y Privada necesarias. La clave Publica podrá ser distribuida sin
ningún inconveniente entre todos los interlocutores. La Privada deberá ser
celosamente guardada. Cuando se requiera verificar la autenticidad de un
documento enviado por una persona se utiliza la Clave Publica porque el
utilizó su Clave Privada.
TLS (TRANSPORT LAYER SECURITY)
El protocolo TLS (Transport Layer Security) es una evolución del protocolo SSL
(Secure Sockets Layer), es un protocolo mediante el cual se establece una conexión
segura por medio de un canal cifrado entre el cliente y servidor. Así el intercambio
de información se realiza en un entorno seguro y libre de ataques.
Normalmente el servidor es el único que es autenticado, garantizando así su
identidad, pero el cliente se mantiene sin autenticar, ya que para la autenticación
mútua se necesita una infraestructura de claves públicas (o PKI) para los clientes.
Estos protocolos permiten prevenir escuchas (eavesdropping), evitar la falsificación
de la identidad del remitente y mantener la integridad del mensaje en una aplicación
cliente-servidor.
Descripción Del Protocolo
El protocolo SSL/TSL se basa en tres fases básicas:
Negociación: Los dos extremos de la comunicación (cliente y servidor)
negocian que algoritmos criptográficos utilizarán para autenticarse y cifrar la
información. Actualmente existen diferentes opciones:
Para criptografía de clave pública: RSA, Diffie-Hellman, DSA (Digital
Signature Algorithm).
Para cifrado simétrico: RC2, RC4, IDEA (International Data Encryption
Algorithm), DES (Data Encryption Standard), Triple DES o AES (Advanced
Encryption Standard).
Con funciones hash: MD5 o de la familia SHA.
Autenticación y Claves: Los extremos se autentican mediante certificados
digitales e intercambian las claves para el cifrado, según la negociación.
Transmisión Segura: los extremos pueden iniciar el tráfico de información
cifrada y autentica.
8. Objetivos Del Protocolo TLS
Los objetivos del protocolo son varios:
Seguridad criptográfica. El protocolo se debe emplear para establecer una
conexión segura entre dos partes.
Interoperabilidad. Aplicaciones distintas deben poder intercambiar
parámetros criptográficos sin necesidad de que ninguna de las dos conozca
el código de la otra.
Extensibilidad. El protocolo permite la incorporación de nuevos algoritmos
criptográficos.
Eficiencia. Los algoritmos criptográficos son costosos computacionalmente,
por lo que el protocolo incluye un esquema de cache de sesiones para reducir
el número de sesiones que deben inicializarse desde cero (usando
criptografía de clave pública).
Funcionamiento Del Protocolo TLS
El protocolo está dividido en dos niveles:
Protocolo de registro TLS (TLS Record Protocol).
Protocolo de mutuo acuerdo TLS (TLS Handshake Protocol).
El de más bajo nivel es el Protocolo de Registro, que se implementa sobre un
protocolo de transporte fiable como el TCP. El protocolo proporciona seguridad en
la conexión con dos propiedades fundamentales:
La conexión es privada. Para encriptar los datos se usan algoritmos de
cifrado simétrico. Las claves se generan para cada conexión y se basan en
un secreto negociado por otro protocolo (como el de mutuo acuerdo). El
protocolo también se puede usar sin encriptación.
La conexión es fiable. El transporte de mensajes incluye una verificación de
integridad.
El Protocolo de mutuo acuerdo, proporciona seguridad en la conexión con tres
propiedades básicas:
La identidad del interlocutor puede ser autentificada usando criptografía de
clave pública. Esta autentificación puede ser opcional, pero generalmente es
necesaria al menos para uno de los interlocutores.
La negociación de un secreto compartido es segura.
9. La negociación es fiable, nadie puede modificar la negociación sin ser
detectado por los interlocutores.
AUTENTICACION JWT
Una funcionalidad que casi no puede faltar cuando estamos desarrollando una
aplicación web Java moderna (por ejemplo nuestra startup), es la autenticación de
usuarios, esto puede implementarse usando los mecanismos estándar provistos por
Java EE o siguiendo la tendencia actual de integración con los servicios de
autenticación de las redes sociales más conocidas, los famosos botones login with
Facebook/Google/Twitter ... entre otros.
La intención de este post es conocer sobre la autenticación con JSON Web Tokens
y entender en que se diferencia y porque en algunos escenarios, es más beneficiosa
que los métodos tradicionales de autenticación web. Adicionalmente como ejemplo
práctico crearemos una aplicación web Cloud Friendly con Spring-Boot,
AngularJs, MongoDB y la librería open source de autenticación con JSON Web
tokens Satellizer la cual incluye soporte para Java y javascript, en esta aplicación
nos integraremos con la autenticación OAuth de Facebook y Google.
Autenticación tradicional en las aplicaciones Web Java
Los mecanismos tradicionales de autenticación de usuarios en las aplicaciones Web
funcionan de la siguiente manera: Cuando un usuario se da de alta en un sitio, el
nombre de usuario y pasabordo se comparan con una entrada en un
almacenamiento persistente de información, como una base de datos relacional, si
la información concuerda, en la memoria del servidor se almacena el estado de
autenticación del usuario y se envía de vuelta un cookie que en la mayoría de los
casos contiene el id de usuario, o el id de la sesión.
El browser por su parte almacenará el cookie para el dominio de donde viene y
automáticamente la enviara de regreso en cada petición futura. Este mecanismo
funciona bien en muchos escenarios, de hecho una gran cantidad de aplicaciones
web de hoy día funcionan de esta manera. Sin embargo, vamos a ver ahora como
ciertas características de las aplicaciones web modernas hacen que usar estos
mecanismos sea todo un desafío.
Un gran desafío: La necesidad de escalar horizontalmente
Las aplicaciones web modernas ya no se despliegan en un único servidor, para
manejar altos volúmenes de usuarios concurrentes con baja latencia y alta
disponibilidad, la aplicación debe ser distribuida en varios servidores, lo cual tiene
10. como efecto que cuando un usuario accede a la aplicación no se garantice que
siempre acceda al mismo servidor.
Conociendo que la autenticación tradicional se basa en almacenamiento de estado
de la memoria del servidor, en una arquitectura como esta, un usuario estaría
autenticado en un servidor pero no en los demás. Para solucionar esto, se tiene la
alternativa de replicar en tiempo real los datos de sesión en todos los servidores, o
usar Sticky sessions. Sticky sessions, es un mecanismo donde se crea afinidad
entre el usuario y el servidor donde inicialmente se autenticó, de manera que las
peticiones del usuario siempre son enrutadas al servidor donde se dio de alta
inicialmente. Ninguno de estos dos mecanismos funciona bien en la arquitectura de
las aplicaciones web modernas.
AUTENTICACIÓN STATELESS CON JSON WEB TOKENS
Para enfrentar los desafíos mencionados, afortunadamente existe como alternativa
la autenticación basada en tokens, usando JSON Web tokens(JWT) para
autenticación. Un JWT es una estructura JSON codificada que contiene tres partes:
1. Header
Es información en formato JSON que contiene el tipo y la codificación utilizada, la
información se codifica en Base64URL.
Información JSON sin codificar:
{
"typ": "JWT",
"alg": "HS256
}
2. Payload
El Payload contiene cualquier información importante para la aplicacion en la forma
de Claims. El id del usuario debe ser enviado como un sub claim, pero
adicionalmente cual otra información importante como nombre de usuario, email y
otros puede ser incluido. El Payload también está codificado en Base64URL.
{
"sub":"64a8c8e91b07892bsn42965e2f9",
"exp":1300819380,
"email":"user@mail.com"
}
11. 3. Signature
La signature es usada para verificar la autenticidad del JWT, básicamente está
compuesta la información del Header y Payload cifrados en Base64 con una clave
secreta (almacenada en nuestro backend). Existen diferentes algoritmos que
pueden ser usadas para la firma (HMAC, RSA).
Desde la perspectiva del usuario, darse de alta en una aplicación que usa JWT, no
tiene diferencia con una aplicación con autenticación tradicional. El usuario ingresa
sus credenciales, el servidor las verifica contra un almacenamiento o servicio, pero
en lugar de crear una sesión y retornar un cookie, retornará un objeto JSON que
contienen un JWT. Del lado del cliente el JWT necesita ser almacenado, lo cual se
hace normalmente en el almacenamiento local.
El JWT debe ser enviado al servidor para acceder rutas protegidas, y generalmente
es enviado en un Header HTTP de autorización.
Los servicios en el API o ruta protegida esperan y chequean un JWT válido, y si hay
uno, procesarán la petición y retornará la respuesta esperada. Dado que la
información del usuario está contenida dentro del JWT, no hay necesidad de validar
el usuario en la base datos, lo cual disminuye la latencia de la aplicación.
Resaltaremos que el estado del usuario nunca es almacenado en la memoria del
servidor, lo cual significa que el usuario no está autenticado en el sentido tradicional.
Sin embargo, un JWT válido le da al usuario la llave para acceder a los datos cada
vez que hace una petición, de esta manera es implementada la autenticación sin
estado.
MIDDLEWARE'S
Los middleware, son funciones que nos permiten agregar filtros a cada petición
HTTP realizada por un usuario en una aplicación. La finalidad de este componente
es disminuir la carga de trabajo en los controladores y proporcionar una solución
mucho más simple y estándar a la hora de aplicar las restricciones necesarias en el
proyecto.
La versatilidad de los middleware te permite agregar restricciones por zona horaria,
geolocalización, login, edad, genero, rol o tipo de usuario, y básicamente todo lo
que quieras. esto te permite bloquear acceso a ciertas áreas de tu aplicación para
un usuario o un grupo de usuarios en específico.