viernes, 2 de junio de 2023

Desarrollo seguro: Protección de datos

 La seguridad de los datos debe estar amparada bajo los siguientes preceptos:

  • Autenticación. Se verifica la identidad del usuario para poder acceder al dato.
  • Autorización. El usuario solo puede realizar las operaciones que le permite los privilegios otorgados a sus roles sobre los datos a los que tiene permiso.
  • Confidencialidad. Cuando los datos se almacenan o están en tránsito deben estar protegidos contra la observación o divulgación no autorizada.
  • Integridad. Los datos deben estar protegidos contra manipulaciones por parte de posibles atacantes.
  • Disponibilidad. Los datos siempre han de estar disponibles para los usuarios autorizados. Esto incluye también las políticas de copias de respaldo.

Posibles riesgos

A continuación se describen algunos de los posibles riesgos relativos a la protección de datos:
  • Incumplimiento de normas y leyes relativas al tratamiento de datos personales, lo que supone sanciones legales.
  • Pérdida de información sensible.
  • Pérdida de información sensible de terceros. Esto puede originar acciones legales y sanciones.
  • Pérdida de reputación de la organización.
  • Pérdida de certificaciones.

Mejores prácticas

He aquí algunas recomendaciones para elevar la seguridad en la protección de datos:
  • Identificar toda la información relativa a datos personales y aplicar las políticas de tratamiento de datos personales (acceso, procesamiento, almacenamiento, etc), acorde a las leyes y legislaciones del país.
  • Los datos confidenciales no pueden viajar en los parámetros de las urls. Deben hacerlo en el cuerpo o en las cabeceras HTTP.
  • Los canales de comunicación en los que se transmiten los datos deben utilizar cifrado robusto.
  • Los datos confidenciales deben cifrarse de forma segura antes de su almacenamiento.
  • Evitar que los datos confidenciales se almacenen en la caché de los navegadores.
  • Sobreescribir la memoria con ceros cuando la información confidencial ya no se utilice.
  • Aplicar una política de borrado seguro para los datos que alcanzan el final de su ciclo de vida.



Desarrollo seguro: comunicaciones

La transmisión de información en las aplicaciones es un punto clave de seguridad, por lo que es esencial asegurar la confidencialidad, la integridad y la disponibilidad de las comunicaciones.

Imagen: public domain pictures


Posibles riesgos

A continuación se describen algunos de los posibles riesgos relativos a las comunicaciones:

  • Robo de información confidencial.
  • Interrupción del servicio.
  • Suplantación de identidad.
  • Alteración o destrucción de datos.
  • Propagación de software malicioso.


Mejores prácticas

He aquí algunas recomendaciones para elevar la seguridad en las comunicaciones:

  • Utilizar siempre canales de comunicación cifrados mediante TLS o WebSocket.
  • Usar criptografía robusta. 
  • Utilizar protocolos seguros, como HTTPS o FTPS

Referencias

Desarrollo seguro: transacciones

Las transacciones son operaciones críticas de negocio, como pagos o actividades financieras. Debido a su especial sensibilidad requieren fuertes medidas de seguridad, tales como:

  • Autenticación. Uso de contraseñas seguras y MFA para autorizar el acceso a las transacciones.
  • Criptografía. Asegurar la confidencialidad de las transacciones.
  • Validación. Aseguramiento de la legitimidad de las transacciones, evitando ataques y fraudes.
  • Monitorización. Permite detectar y prevenir de ataques y fraudes en tiempo real.
  • Copias de seguridad. Permite recuperar la disponibilidad de los datos en caso de ataques, caídas del sistema o pérdidas de datos.
Las transacciones deben cumplir las propiedades ACID: Atomicity, Consistency, Isolation y Durability.


Imagen: linnworks

Posibles riesgos

A continuación se describen algunos de los posibles riesgos relativos a las transacciones:
  • Payment Bypass. Vulnerabilidad de configuración que permite a un atacante manipular, en un sistema de pago, los parámetros y la respuesta entre cliente y servidor para eludir el sistema de pago.
  • Fraude. El atacante se beneficia de forma ilícita, manipulando las transacciones o usando información falsa.
  • Robo de información confidencial.  Para ser usada en futuros ataques.
  • Interrupción de las transacciones. Con ataques DoS/DDoS.
  • Pérdida de datos. Puede afectar a la confidencialidad y a la integridad de la información.

Mejores prácticas

He aquí algunas recomendaciones para elevar la seguridad en las transacciones:
  • Evitar un Payment Bypass:
    • Toda compra ha de autorizarse y confirmarse en el servidor.
    • Validar la autenticidad de las firmas durante la comunicación con la pasarela de pago.
    • Verificar el precio correcto en el servidor.
    • Asegurar que los pagos no se reutilizan.
    • Comprobar la fase actual de la transacción en el servidor de pago.
  • Para cada transacción, configurar un tiempo corto de expiración.
  • Llevar una trazabilidad fehaciente de las transacciones.
  • Utilizar comunicaciones con cifrado asimétrico.
  • Registrar el detalle de cada operación, anonimizando los datos sensibles.


Referencias

Desarrollo seguro: gestión de archivos

Los archivos son activos esenciales en la seguridad de un sistema de información, pues contiene y persiste gran parte de la información. Por ello, la gestión de archivos debe contemplarse desde la fase de diseño, identificando los archivos internos, los archivos que se cargan, su ubicación, el control de acceso, la copia de seguridad, el flujo de la información, los datos que contiene, etc.

Imagen: imageapi


Posibles riesgos

A continuación se describen algunos de los posibles riesgos relativos a la gestión de archivos:

  • Acceso no autorizado. Implicaría la revelación, manipulación, pérdida o borrado de datos.
  • Carga de archivos maliciosos. Podría ejecutar archivos de forma remota, provocar una infección de malware o realizar un ataque de denegación de servicio.
  • Carencia de copias de seguridad. Provocaría la pérdida de datos a la organización, la pérdida de datos de usuario o la falta de disponibilidad del servicio. 


Mejores prácticas

He aquí algunas recomendaciones para elevar la seguridad en la gestión de archivos:

  • Exigir la autenticación y la autorización de cada usuario al acceder a un archivo.
  • El nombrado de archivos y directorios no puede ser realizado con entradas de usuario.
  • Validar el tipo de contenido por encima de la extensión del archivo.
  • Verificar el tipo MIME del archivo.
  • Impedir la subida de archivos ejecutables.
  • Para evitar problemas de disponibilidad y de impacto en el servidor, limitar el tamaño del archivo.
  • Procesar los archivos mediante un antivirus y antimalwares.
  • En el directorio de subida de archivos de usuarios, desactivar los privilegios de ejecución.
  • Al proporcionar un enlace de descarga a un usuario, no facilita rutas absolutas (canonización de path).
  • Evitar el nombrado secuencial de archivos.
  • En el nombre de un archivo, no utilizar datos sensibles.
  • El acceso al archivo debe ser de sólo lectura.
  • Poner límite al número de archivos que puede subir un usuario.
  • Para asegurar su integridad, almacenar los hashes de cada archivo subido.

Referencias

Desarrollo seguro: criptografía

 La criptografía protege la información, garantizando la:

  • Autenticidad.  Se verifica la identidad de las personas y sistemas que acceden a la información.
  • Confidencialidad. Solamente las personas autorizadas pueden acceder a la información.
  • Integridad. Solamente las personas autorizadas podrán alterar la información.


La criptografía se puede usar para generar firmas digitales que aseguren la integridad de los datos, o también para cifrar datos sensibles.


Cifrado

Funciones hash

Un hash se obtiene a través de una función matemática, dando como resultado un resumen de datos de una cantidad siempre fija, independientemente del número de datos de entrada. La probabilidad de que se genere el mismo hash con diferentes datos de entrada (colisión) es muy improbable, lo que ofrece un alto nivel de seguridad. 

Un hash concreto solamente puede obtenerse con la misma función, los mismos datos de entrada y en el mismo orden, lo que es idóneo para almacenar contraseñas o para verificar la integridad (no alteración) de los datos. 


Cifrado simétrico

En este tipo de cifrado protege la confidencialidad en la transmisión y el almacenamiento de los datos, utilizando la misma clave para cifrar y descifrar la información. La ventaja es que fácil y rápido de implementar, pero, por contra, tanto el emisor como el receptor deben compartir la clave, lo que se convierte en un punto débil, especialmente en entornos distribuidos.


Cifrado asimétrico

Este cifrado requiere dos claves diferentes. La clave pública es compartida públicamente y se utiliza para cifrar la información, mientras que la clave privada se mantiene en secreto, y solo puede ser usada para descifrar.

La ventaja de este cifrado es que no es necesario compartir la clave privada para establecer una comunicación segura. La desventaja es que es más lento y difícil de implementar que el cifrado simétrico.


Posibles riesgos

A continuación se describen algunos de los posibles riesgos relativos al uso de información que no esté suficientemente encriptada:
  • Exposición de información sensible. Disponibilidad de esta información para usuarios no autorizados.
  • Robo de credenciales y suplantación de identidad. El acceso a contraseñas permitirían a un atacante suplantar a un usuario.
  • Fuga de datos personales. El robo de datos personales son punibles y sancionables según las regulaciones de cada país.
  • Ataques Man in the Middle (MitM). Se pueden interceptar comunicaciones poco aseguradas y descubrir el flujo de datos que lleve a información útil y valiosa para realizar ataques.
  • Reputación para la organización.

Mejores prácticas

He aquí algunas recomendaciones para elevar la seguridad en la criptografía:
  • Evitar el uso de algoritmos criptográficos antiguos u obsoletos, como DES, MD5 o SHA-1.
  • Usar librerías criptográficas reputadas.
  • Toda información sensible y confidencial debe estar fuertemente cifrada para asegurar la confidencialidad.
  • Los números aleatorios utilizados en ids, códigos, nombres de archivos y cadenas se generan a través de un generador de números aleatorios disponible en una librería criptográfica reputada.
  • Los números aleatorios se deben generar con un nivel entropía adecuado.
  • Aplicar políticas de gestión de claves criptográficas para la generación, distribución, revocación y desactualización.
  • Para evitar ataques de volcado de memoria, sobreescribir con ceros la información crítica que deje de utilizarse.


Desarrollo seguro: el registro de seguridad

Es imprescindible tener un registro (o log) en un entorno protegido, el cual registre toda actividad o evento del sistema o de las aplicaciones, en lo concerniente a la seguridad. Este registro es vital para un posible análisis forense en un futuro.

El registro de seguridad ha de cumplir los siguientes requisitos:

  • Trazabilidad. Debe tener un formato temporal que facilite la trazabilidad de los eventos.
  • Auditabilidad. Ha de almacenarse de forma segura y durante un tiempo mínimo de retención, a efectos de auditoría.
  • Autenticación/autorización. El acceso a este registro sólo estará disponible para personas autenticadas y autorizadas.
  • Confidencialidad. El registro ha de asegurar que no puede ser accedido por medios distintos a la autenticación y autorización. Los datos sensibles deben ser cifrados.
  • Integridad. El registro debe asegurar que no hay manipulaciones a nivel de registro ni de entradas. Para ello, se recomienda el uso de firmas de integridad que se actualicen con cada nueva entrada.
  • Disponibilidad. Su almacenamiento debe ser redundante y contar con copias de respaldo.


Posibles riesgos

A continuación se describen algunos de los posibles riesgos relativos al registro de seguridad:

  • Fuga de información. Si hubiera vulnerabilidad en la autorización, un atacante podría acceder a la información sensible del registro.
  • Falsificación de registros. Una falta de integridad permitiría a un usuario no autorizado a manipular las entradas del registro, con lo que rompería la trazabilidad. Esto también podría llegar a provocar la ejecución de código malicioso.
  • Eliminación de registros. Un atacante podría eliminar sus propias entradas en el registro, para eliminar su actividad.

Mejores prácticas

He aquí algunas recomendaciones para elevar la seguridad en el registro de seguridad:
  • Evitar registrar datos sensibles (como datos personales, contraseñas, tarjetas de crédito, información financiera, etc). Si se registra, cifrar esta información mediante criptografía, tokens o anonimización.
  • Validar los datos antes de registrar la entrada, a fin de garantizar la información y evitar inyecciones.
  • Registrar el detalle de cada entrada:
    • Intentos de autenticación, sobre todo, los fallidos.
    • Accesos concedidos con roles, incluyendo el usuario.
    • Acceso a datos sensibles: qué usuario, qué roles, qué acciones se han realizado.
    • Errores de validación de las entradas.
    • Excepciones del sistema.
    • Amenazas e intentos de amenazas detectados.
  • Usar funciones hash para verificar la integridad de las entradas.
  • Mantener el registro de seguridad en un entorno protegido e independiente de otros registros.

Referencias



Desarrollo seguro: gestión de errores

La gestión de errores se refiere, por una parte, al control de la información que se expone cuando ocurre un error, y, por otra parte, a cómo controlar los errores no controlados en una aplicación.


Cuidado con la información mostrada

Hay que tener especial cuidado a la hora de mostrar la información de un error, pues podemos revelar inconscientemente información que podría ser aprovechada por un atacante. Esta información podría ser, por ejemplo, parte de la configuración de la aplicación, algún estado, mensajes de depuración, datos sensibles o confidenciales, el tiempo que tarda en ejecutarse algunas operaciones, códigos importantes, usuarios y/o contraseñas, ids de sesión, elementos de la infraestructura o de la arquitectura, versiones, etc. Esta información promueve algunos riesgos tales como:

  • Fuga de información sensible: estructura de archivos, documentos sensibles, motor de base de datos, versión del servidor, etc.
  • Denegación de servicio. Ciertos errores forzados podrían provocar la caída del sistema.
  • Cross-Site Scripting. Un mensaje de error podría revelar parámetros de entrada sin validación de caracteres de escape.

Control de errores

Es de vital importancia controlar que todas las operaciones prevean y gestionen todas las excepciones posibles, pues una excepción no controlada podría provocar una salida inesperada de la lógica de negocio que exponga vulnerabilidades que puedan ser aprovechadas por un atacante.

Un punto probable de errores inesperados puede surgir cuando no se cierran correctamente los recursos, por lo que se recomiendo el cierre de estos dentro de un bloque try/catch/finally.

Algunos posibles riesgos producidos por un deficiente control de errores podrían ser:

  • Denegación de servicio. El abuso de ciertas operaciones no controladas podrían causar la caída del sistema.
  • Saltarse la lógica de negocio. Se podrían forzar excepciones o errores no controlados, los cuales producirían salidas inesperadas de la lógica de negocio.


Mejores prácticas

He aquí algunas recomendaciones para elevar la seguridad en la gestión de errores:

  • Usar mensajes genéricos en los errores, para no dar pistas sobre datos sensibles.
  • Usar un control de excepciones centralizado.
  • Manejar los errores sin depender de los mensajes de error del servidor mostrados al usuario.
  • Por defecto, denegar el acceso en caso de un error en el control de acceso.
  • Estudiar en profundidad todas las excepciones de una librería para su correcto tratamiento e implementación.
  • Asegurar el cierre de todos los recursos dentro de bloques try/catch/finally.
  • Registrar en detalle todas las excepciones en un registro específico dentro de un entorno seguro.


Referencias

 

Desarrollo seguro: validación de datos

Lo más crítico en la seguridad de un sistema de información son los datos, por lo que hay que asegurar que el tratamiento de los mismos no exponen vulnerabilidades, y por ello, para evitar ataques, es indispensable una correcta validación, tanto en la entrada como en la salida.

Imagen: maxpixel


Técnicas de validación

Sanitización

Consiste en normalizar toda posible representación de un dato a un formato único o estándar, reduciendo los problemas de validación y el número de ataques.

Existen varios métodos de sanitización, algunos de los cuales pueden encontrarse en librerías o paquetes. Los métodos más comunes son:

  • Rutas: Se normalizan rutas a directorios (por ejemplo en Unix), lo que evita que un atacante navegue a un directorio sensible y obtenga información no autorizada.
  • Espacios: Se eliminan espacios, tabulaciones y otros caracteres blancos del dato.
  • Charset: Se normalizan los caracteres del datos a un charset en concreto, tratando de forma concreta aquellos caracteres que no pertenecen a dicho charset.
  • Case: Se convierten los caracteres a mayúsculas o minúsculas.

Tipos de datos

Se verifica que el dato sea de un tipo concreto. El tipo puede ser simple (entero, decimal, carácter, boolean, string) o complejo (email, nif, código postal, url, etc).


Formato

Dentro de los tipos complejos, permite validar el formato de éstos mediante patrones o expresiones regulares. 

Importante: Una expresión regular compleja puede ser vulnerable a un ataque ReDoS, por lo que es aconsejable validar previamente la expresión con herramientas como RegEx Testing o RegEx 101.


Tamaños mínimos y máximos

Controlando un umbral de tamaños (longitud) se evitan cuelgues en el procesamiento del dato.


Valores mínimos y máximos

Ejerce un control sobre un umbral de valores para un dato.


Lista blanca

El dato se encuentra dentro de una lista o conjunto de datos prefijados, como una enumeración.


Lista negra

El dato no se debe encontrar dentro de una lista o conjunto de datos prefijados.


Posibles riesgos

A continuación se describen algunos de los posibles riesgos relativos a la validación de datos:

  • Cross-Site Scripting: Un atacante podría inyectar código a través de un dato, por ejemplo en un navegador web.
  • Inyección SQL: Un atacante inyectaría código SQL a través de los datos, siendo ejecutado por la base de datos.
  • Inyección LDAP: Un atacante inyectaría consultas LDAP para obtener más privilegios o para acceder a datos restringidos.
  • Inyección de Log: Un atacante podría inyectar comandos de ejecución en el sistema usando los logs que registran los datos.
  • Inyección XEE: Un atacante podría acceder a datos restringidos o la información de la estructura de un árbol XML a través de una inyección XPATH.
  • Bomba XML: Un atacante podría provocar un ataque de denegación de servicio sobrecargando el XML y agotando los recursos de la memoria de la aplicación.
  • DoS, DDoS y ReDoS: Un atacante podría provocar una denegación de servicio del sistema o de la aplicación si no hay una validación adecuada de las entradas. 

Mejores prácticas

He aquí algunas recomendaciones para elevar la seguridad en la validación de datos:
  • Las validaciones son siempre obligatorias en el servidor y recomendadas en el cliente.
  • Utilizar esquemas de validación de datos y mecanismos estándar que aseguren la validación de datos mediante las técnicas de validación vistas anteriormente.
  • Realizar las validaciones utilizando librerías estandarizadas.
  • Los datos estructurados han de estar bien tipificados y validados por un esquema definido.
  • Los datos no estructurados deben ser sanitizados, utilizando alguna librería de sanitización.
  • No mostrar información sensible ante un error de validación.
  • En las entradas de datos, solamente aceptar aquellos datos que sean los esperados. Si alguno de los datos de entrada no es el esperado, rechazarlo.
  • El servidor debe rechazar cualquier petición en la que exista algún error de validación de entrada.
  • Las consultas a bases de datos deben estar parametrizadas, para así evitar la inyección SQL.
  • Los frameworks ORM no están exentos de vulnerabilidades de inyección SQL. Consultar la documentación del ORM y utilizar consultas parametrizadas siempre que sea posible.
  • Verificar si la aplicación es vulnerable a inyección de comandos.
  • Asegurar que las páginas web utilizan plantillas que automaticen las variables dentro del código HTML, para evitar XSS (Cross-Site Scripting)
  • Utilizar la configuración más restrictiva posible para el análisis XML, desactivando funciones peligrosas, como la resolución de entidades externas.
  • Evitar la deserialización de datos no confiables o protegerse contra éstos.

Referencias





Desarrollo seguro: gestión de sesiones

Cuando un usuario se autentica en el sistema y obtiene la autorización en el mismo, se crea una nueva sesión identificada mediante un id, la cual crea una conexión activa usuario-sistema, almacenando información temporal sobre las operaciones y la lógica de negocio exclusivas de ese usuario mientras dure dicha sesión.

Imagen: Wallpaperflare

Una vez establecida la sesión, para poder llevar a cabo las operaciones, el usuario se identificará con el servidor mediante cookies o mediante tokens. En el caso de las cookies, éstas se almacenan en el navegador del cliente, lo que es un sistema poco seguro y no recomendable. Los tokens, sin embargo, se asocian al id de la sesión y viajan en la cabecera de las peticiones, y pueden modificarse por intercambio cada cierto tiempo sin necesidad de cambiar el id de la sesión, la cual permanece en el lado del servidor, lo que es un método mucho más seguro que el de las cookies.


Aspectos de seguridad

Aspectos básicos

  • Asegurar que la autenticación sólo permite acceder a las personas acreditadas.
  • Asegurar las autorizaciones correctas para las personas autenticadas.
  • Asegurar la comunicación cliente-servidor mediante cifrado fuerte.

Sesión del lado cliente

  • La información persistente del id de sesión del cliente quedará asociada a la pestaña, y si ésta se cierra o desaparece, desaparecerá toda esa información. Esto se logra mediante código en la propia página o mediante el objeto sessionStorage.
  • La información persistente de la sesión del cliente se ha de borrar en la pantalla de login y generarse una vez creada la sesión en el servidor.
  • En pantallas que puedan necesitar mucho tiempo (por ejemplo, un formulario), permitir que la sesión de cliente realice transacciones vacías contra el servidor, para indicar que la sesión sigue activa y no expire.
  • El cliente también debe controlar el tiempo de inactividad, lanzando una petición al servidor para que cierre la sesión, tras lo cual se redirigirá a la pantalla de login.
  • La información de la sesión del cliente ha de ser mínima para la lógica de navegación. No debe contener información sensible. A lo sumo, puede contener el token de acceso para no arrastrarlo en todas las peticiones.
  • Evitar ataques de fijación de sesión mediante un tiempo de espera de inicio de sesión.
  • Capturar los eventos de cierre de pestaña o de la ventana del navegador, a fin de forzar tanto el cierre de la sesión de cliente como del servidor.

ID de sesión

  • El id de sesión ha de ser único, aleatorio y con una longitud muy grande, como un hash criptográfico seguro.
  • El id ha de ser validado por el servidor, verificando su formato y que está presente en una sesión válida y activa.
  • En los registros no usar nunca el id de sesión.
  • Para evitar ataques de fijación de sesión, cambiar el id de sesión en cada inicio de sesión o en un cambio de privilegios de usuario.
  • Al monitorizar y almacenar los ids de sesión activos, asegurarse de que no pueden ser consultados por usuarios no autorizados.

Cierre de sesión

  • Redirección a la pantalla de login en cada cierre.
  • Eliminación de toda la información de la cookie o del token de acceso.
  • Eliminación de toda la información de la sesión cliente.
  • Registro del cierre (registro de seguridad).

Caducidad de la sesión

  • Definir un tiempo máximo de vida, para que no esté permanentemente activa.
  • Definir un tiempo máximo absoluto de duración para la sesión.
  • Toda la información de la sesión debe eliminarse del servidor cuando caduca.
  • Registrar (registro de seguridad) cada vez que una sesión expira.
En aplicaciones móviles:
  • Usar tokens, con el fin de que no sean usados en caso de que el dispositivo se pierda o se sustraiga.
  • El token de sesión no puede contener el id del dispositivo.
  • La caducidad de la sesión ha de configurarse según la sensibilidad de la app.
  • Para utilizar la sesión en varias páginas apoyarse en un repositorio de datos basado en servidor.

Posibles riesgos

A continuación se describen algunos de los posibles riesgos relativos a la gestión de sesiones:

    • Predicción de sesión. El id de sesión podría adivinarse y así evitar la autenticación.
    • Secuestro de sesión. Aprovecha el mecanismos de control de la sesión web, normalmente mediante un token de sesión.
    • Fijación de sesión. Mediante la obtención de un id de sesión correcto, permitiría a un usuario autenticarse y secuestrar la sesión.
    • Suplantación de sesión. Ejemplo: mediante phishing, se engaña a una víctima para entrar en un sitio web malicioso que suplante un sitio legítimo.

    Mejores prácticas

    He aquí algunas recomendaciones para elevar la seguridad en la gestión de sesiones:
    • El id de sesión nunca debe exponerse bajo tráfico no cifrado.
    • Implementar cabeceras seguras, como strict-transport security ó cache-control.
    • La sesión ha de expirar pasado un tiempo de inactividad.
    • Las páginas que necesiten autenticación han de tener la opción de cierre de sesión.
    • El id de sesión nunca debe aparecer en urls, registros o mensajes de error.
    • Cada autenticación y re-autenticación ha de destruir la sesión anterior y crear una nueva.
    • El id de sesión almacenado en cookies se define mediante los atributos HttpOnly y Secure.
    • Para evitar el acceso a otros dominios, configurar el atributo Path de las cookies.
    • La aplicación debe realizar seguimiento de las sesiones activas, así como permitir al usuario finalizar éstas de forma selectiva o global desde su cuenta.
    • Al cambiar una contraseña, se deben cerrar todas las sesiones activas.
    • Asegurarse de que sólo los usuarios autorizados acceden a recursos protegidos: urls, funciones, datos de la aplicación, atributos de usuario y datos de configuración de acceso.
    • Registrar (registro de seguridad) todas la actividades (o eventos) de las sesiones, tanto del cliente como del servidor.
     

    Referencias


    jueves, 1 de junio de 2023

    Desarrollo seguro: la autorización

    La autorización determina qué puede hacer un usuario o un sistema en nuestra aplicación.

    Si la autenticación gestiona el acceso de un usuario, la autorización gestiona los permisos de ese usuario a las diferentes funciones, operaciones y recursos de la aplicación.


    Imagen: CPO Magazine


    Posibles riesgos

    A continuación se describen algunos de los posibles riesgos relativos a la autorización:

    • Acceso no autorizado. Un usuario no autorizado podría acceder a recursos no permitidos.
    • Escalada vertical de privilegios. Acceso a los recursos de otro usuario con un nivel más alto de permisos.
    • Escalada horizontal de privilegios. Acceso a los recursos de otro usuario con el mismo nivel de acceso.
    • Revelación de información sensible. La aplicación podría dar más información de la necesaria, lo cual podría ser usada de forma perniciosa.
    • Violación de la privacidad. Un atacante accede a datos privados de otros usuarios.
    • Robo de identidad. Un atacante obtiene la identidad de un usuario y la usa para acceder a la aplicación y realizar acciones con sus permisos.
    • Robo de datos. Un atacante obtiene datos de forma ilícita.
    • Disponibilidad del servicio. Un atacante podría interrumpir o dañar el servicio o la ejecución de la aplicación.
    • Manipulación de datos. Un atacante podría interceptar datos entre cliente y servidor y manipular éstos.
    • Modificación de registros. Acceso a los registros de la aplicación o del sistema y modificación de éstos alterando su integridad.
    • Path transversal. Acceso fuera del contexto autorizado en el sistema de archivos del servidor.
    • Lógica de negocio. Un mal diseño de la aplicación podría permitir a un usuario realizar operaciones no permitidas, debido a que no sigue una lógica de negocio controlada.


    Mejores prácticas

    He aquí algunas recomendaciones para elevar la seguridad en la autorización:

    • Principio de privilegio mínimo. El usuario solo tiene permitido lo mínimo para realizar su trabajo.
    • Roles de aplicación. El usuario solo tiene roles, y los privilegios son tomados de dichos roles.
    • El acceso a los registros ha de estar protegido.
    • Cada usuario sólo puede acceder a los datos y recursos que le son autorizados.
    • Acceso al sistema de archivos esté deshabilitado. Este acceso solo puede ser habilitado de forma excepcional, justificada y expresa.
    • Las reglas de control de acceso solamente se han de aplicar en el servidor.
    • La gestión de acceso a datos, atributos, información, roles, políticas, etc. de los usuarios no pueden ser manipulados por usuarios no autorizados.
    • Uso de un servicio centralizado que proteja el acceso a cada recurso.
    • Uso de tokens aleatorios robustos anti-CSRF.
    • Registro de todo intento de control de acceso (registro de seguridad).
    • Registro específico y detallado (registro de seguridad) de todas las operaciones sobre datos sensibles.
    • Uso de captchas en operaciones sensibles.


    Referencias

    miércoles, 31 de mayo de 2023

    Desarrollo seguro: la autenticación

    La autenticación determina el acceso a los recursos de un sistema de información, a través de la verificación de la identidad de un usuario o de un dispositivo. Dada su relevancia, la autenticación debe estar presente en el diseño.

    Fuente: OptimalIdm

    Existen diferentes tipos de autenticación:

    • Autenticación de red: Se utilizan unas credenciales de red (como el usuario+contraseña, un certificado digital, etc.) para acceder al sistema.
    • Autenticación basada en contraseñas: El usuario debe proporcionar su nombre de usuario y su contraseña.
    • Autenticación basada en tokens: Un token único permite acceder al sistema. Dicho token puede ser físico o digital.
    • Autenticación basada en algo poseído: Mediante un soporte que solamente el usuario pueda tener físicamente, como un código QR, una tarjeta de identidad, un smartcard, un USB, un token físico, una tarjeta de coordenadas, etc.
    • Autenticación de dos o más factores: La identidad es requerida mediante varios métodos de identificación, como por ejemplo la contraseña y un SMS. También se lo conoce como 2FA (2 Factor Authentication) y MFA (Multi-Factor Authentication).
    • Autenticación biométrica: La identidad se obtiene a partir de características físicas, tales como la huella dactilar, el iris del ojo, la voz, el reconocimiento facial, etc.
    • Autenticación basada en comportamientos: Uso de patrones de dibujo sobre una pantalla táctil, movimientos de alguna parte del cuerpo, etc.
    • Autenticación basada en ubicación: Por ejemplo, mediante una IP específica.

    Posibles riesgos

    A continuación se exponen algunas de las amenazas y riesgos posibles relativos a la autenticación:
    • Ataques de diccionario. Pruebas de contraseñas mediante combinaciones comunes y predefinidas de letras y números.
    • Ataques de fuerza bruta. Pruebas de contraseñas generadas mediante combinaciones de caracteres.
    • Ataques Man in the Middle (MitM). Interviniendo las comunicaciones se pueden obtener las credenciales de acceso (contraseñas, tokens, tickets de acceso).
    • Ataques de replay. Si se obtiene un ticket de acceso, éste puede ser reutilizado.
    • Vulnerabilidades de software. Aplicaciones y sistemas operativos con vulnerabilidades.
    • Enumeración de usuarios. Es posible encontrar usuarios registrados probando identidades y analizando las respuestas del servidor (mensajes, tiempos de respuesta, etc).
    • Suplantación de identidad. Se suplanta al servidor de autenticación para engañar al usuario y obtener así sus credenciales.
    • Robo de identidad. Se obtiene la identidad de un usuario, por ejemplo, robando una cookie.

    Mejores prácticas

    He aquí algunas recomendaciones para tener un alto nivel de seguridad en la autenticación:
    • Las contraseñas han de guardarse en un formato no legible, a ser posible, que la operación de obtener la contraseña en plano sea irreversible, como el uso de hashes fuertes.
    • Proporcionar opciones y enlaces para la desconexión del usuario en la aplicación.
    • Automatizar la desconexión pasado un tiempo de inactividad.
    • No exponer las credenciales en las urls.
    • Los formularios de petición de credenciales deben usar métodos POST.
    • Uso de la autenticación multi-factor en aplicaciones sensibles (múltiples capas de seguridad).
    • Uso del doble factor de autenticación en operaciones críticas, como el cambio de contraseña o el acceso a recursos sensibles.
    • Implementar el bloqueo de una cuenta tras varios intentos de autenticación fallidos.
    • Implementar CAPTCHA para limitar los ataques de fuerza bruta.
    • Usar errores genéricos para evitar la enumeración de usuarios. Por ejemplo: "El usuario y/o la contraseña son incorrectos".
    • Implementar tiempos de espera aleatorios en respuestas a intentos fallidos de autenticación, con lo que se evita la enumeración de usuarios.
    • En la funcionalidad de recuperación de contraseñas, evitar la enumeración de usuarios.
    • El campo de contraseña debe tener desactivado la opción de "autocompletar".
    • Utilizar una buena política de contraseñas:
      • Uso de caracteres alfabéticos, números y caracteres especiales, con distinción de mayúsculas y minúsculas).
      • Longitud amplia (por ejemplo, 16 caracteres).
      • Una contraseña distinta por cada sitio.
      • Establecimiento de una caducidad de contraseña (por ejemplo cada mes). Una vez transcurrido ese tiempo será necesario cambiarla.
    • No almacenar la cookie de autenticación en el navegador del cliente.
    • Cada vez que el usuario se conecte con éxito, la sesión debe ser diferente.
    • Registrar todas las operaciones que afecten a datos sensibles.

    Tipos de autenticación más comunes

    Autenticación basada en claves

    Una autenticación basada en claves (por ejemplo, mediante nombre de usuario y contraseña), es bastante débil en términos de seguridad, se utilice en texto claro, en base64, cifrado o mediante formularios. Sus principales riesgos son:
    • Ingeniería social. 
    • Ataques Man in the Middle (MitM). Un usuario con acceso a la red podría interceptar la información de autenticación.
    • Reutilización de claves. Si se utiliza la misma clave en varios sitios, si se intercepta en uno, el resto queda comprometido.
    • Ataque de fuerza bruta o diccionario. 
    • Autenticación débil. No permite la implementación de medidas de autenticación más seguras, como el MFA o los certificados digitales.

    Las mejores recomendaciones son las siguientes:
    • Buena política de contraseñas
    • Uso de autenticación multifactor. Por ejemplo, añadir a la contraseña una verificación de código que se envíe por email, SMS o por aplicaciones externas de autenticación, tales como Google Authenticator o oneLogin Protect.

    Autenticación implícita

    En este caso, la autenticación no se basa en credenciales proporcionadas por el usuario, si no que la identificación se obtiene automáticamente mediante la dirección IP del usuario, la información de una cookie, un token, etc. Aunque puede ser seguro, existen ciertos riesgos:
    • Acceso no autorizado. Es posible falsificar la ip de un usuario para obtener el acceso. También es posible acceder a la cookie de un usuario y utilizarla para obtener el acceso. 
    • Ataque de fuerza bruta o diccionario. Es vulnerable a este ataque si no usa algoritmos de cifrado robustos. 
    • Autenticación débil. No permite la implementación de medidas de autenticación más seguras, como el MFA o los certificados digitales.
    La mejor recomendación es utilizar una contraseña basada en un hash criptográfico lo bastante largo y robusto que haga inútil un ataque de fuerza bruta.


    Autenticación de cliente HTTP

    Este tipo de autenticación utiliza un par de claves criptográficas para verificar la identidad del usuario o del dispositivo: una clave pública (usada para cifrar la información) y una clave privada (usada para descrifrar la información). Este sistema es bastante seguro y se utiliza para comunicaciones HTTPS, pero su implementación es más compleja y costosa, además de existir otro tipo de riesgos:
    • Acceso no autorizado. Si se obtiene la clave privada del usuario, podemos utilizarla para acceder a los recursos de ese usuario. Por otra parte, si se emite un certificado falso con una clave pública falsa, es posible acceder a recursos protegidos de forma no autorizada.
    • Ataque Man in the Middle (MitM). Es posible interceptar un certificado en tránsito y usarlo para acceder de forma no autorizada.
    • Manipulación de un certificado SSL. En el caso de implementar certificados auto-firmados o certificados no verificados por una CA (Certification Authority).

    martes, 30 de mayo de 2023

    Desarrollo seguro: todo empieza en la arquitectura

    La arquitectura constituye los cimientos sobre los cuales se erigirán nuestras aplicaciones. 

    Desarrollo seguro: todo comienza en la arquitectura

    Fuente: open stand

    Posibles riesgos

    El desarrollo seguro comienza con el diseño y la definición de nuestra arquitectura, teniendo en mente las posibles amenazas que pudieran poner en riesgo nuestro sistema, especialmente aquellas derivadas por el uso de componentes que:

    • no estén identificados.
    • sean antiguos o incompatibles, que estén obsoletos o hayan dejado de ser soportados.
    • posean vulnerabilidades conocidas.
    • tengan puertos abiertos no indispensables.

    Mejores prácticas

    A continuación se detallan las mejores prácticas a la hora de diseñar, definir y mantener una arquitectura segura:
    • Inventario que identifique cada componente de la arquitectura. Todo componente debe estar identificado, o de lo contrario se incurrirá en riesgos de seguridad.
    • Revisión del bastionado de componentes:
      • Identificación de dependencias internas:
        • Módulos.
        • Librerías.
        • Frameworks.
        • Plugins o complementos.
        • Servicios.
        • Otras.
      • Estado de actualización.
      • Configuraciones:
        • Puertos activados (solo los indispensables).
        • Usuarios y contraseñas personalizados (no por defecto).
        • Modo de depuración desactivado.
        • Otras configuraciones de seguridad (ajustadas a una mayor seguridad).
    • Identificación de vulnerabilidades y sus parches de seguridad. En caso de no existir parche:
      • analizar el riesgo y su impacto
      • proponer y adoptar:
        • un plan de vigilancia.
        • un plan de contingencias.
      • realizar un estudio de viabilidad de componentes alternativos.
    • Asegurar la seguridad perimetral lógica mediante la segmentación de red, firewalls, dispositivos IDS, etc.
    • Asegurar la protección de datos mediante:
      • autorización entre entornos.
      • copias de seguridad.
    • Proporcionar un entorno virtual como zona de trabajo, a ser posible, por lenguaje de programación.
    • Mantener las actualizaciones más recientes de:
      • lenguajes de programación
      • paquetes instalados
      • frameworks y librerías
      • herramientas de análisis y seguridad de los IDEs
    • En caso de trabajar con DevSecOps, dotar de herramientas de análisis de seguridad a lo largo del ciclo de vida del software, antes del despliegue en cada entorno.

    Referencias

    jueves, 27 de octubre de 2022

    Entender la Computación cuántica

     

    En los últimos años, el interés por la computación cuántica ha ido aumentando gracias a los avances que se están consiguiendo y a las increíbles aplicaciones que promete satisfacer. 

    En este artículo vamos a realizar una breve introducción al fascinante mundo de la computación cuántica. Para ello, aprenderemos qué es la computación cuántica, de dónde viene, qué diferencias tiene con respecto a la computación convencional y hacia donde se dirige.


    Un poco de historia

    La computación cuántica no es un concepto nuevo, si no que arranca en la década de 1970, cuando el físico estadounidense Paul Benioff comenzó su investigación sobre la información cuántica  y la viabilidad teórica de la computación cuántica. En 1980 describió una máquina de Turing trabajando con algunos de los principios de la mecánica cuántica. A este planteamiento le seguiría la teoría de la información cuántica en ordenadores y robots, aplicando los fundamentos de la física, las matemáticas y la lógica. Su mayor logro fue demostrar que era posible la creación de un modelo reversible de computación cuántica.

    En 1982, el Nobel de física estadounidense Richard Feynman, propuso en una conferencia del MIT sobre Física de la Computación, el uso de fenómenos cuánticos para realizar cálculos complejos mediante un ordenador cuántico.

    En 1985, el físico británico (nacido en Israel) David Deutsch, de la Universidad de Oxford, y miembro de la Royal Society, describió el primer ordenador cuántico universal, el cual aplicaría el principio de Church-Turing ampliado en el que dicho ordenador cuántico podría simular cualquier otro ordenador cuántico. Tras ello,  fue el primero en formular un algoritmo cuántico y en exponer la idea de que el ordenador cuántico podría ejecutar este tipo de algoritmos. 

    En 1995, el matemático estadounidense Peter Shor, diseñó un algoritmo cuántico que demostró que un cálculo tan complejo como el de los factores primos es muchísimo más rápido ejecutándose en un ordenador cuántico. Poco después planteó un sistema de de corrección de errores en el cálculo cuántico. Gracias a este algoritmo, se puede reventar los sistemas actuales de criptografía, con lo que descubrió a todo el mundo el increíble potencial de la computación cuántica.  

    En 1998, el MIT consiguió el primer medio para el análisis de información en un qubit, al difundir el primer qubit usando una solución de aminoácidos. Al mismo tiempo, la Universidad de Berkeley presentó el primer computador de 2 qubits

    En 2001, se consigue ejecutar el algoritmo de Shor en un ordenador cuántico de 7 qubits del Laboratorio Nacional de Los Álamos, gracias a IBM y a la Universidad de Stanford.

    En 2007, investigadores de la Universidad de Yale y del NIST consiguen crear el primer bus cuántico, uniendo componentes cuánticos mediante superconductores. Este bus puede usarse como memoria cuántica para almacenamiento temporal.

    En 2008, la NSF consigue por vez primera almacenar un qubit en un átomo de fósforo, aumentando el tiempo de persistencia de la información (1,75 segundos).

    En 2009, investigadores de la Universidad de Yale crean el primer procesador cuántido de estado sólido, muy similar a un microprocesador clásico.

    En 2012, IBM creó un chip cuántico estable que podría llegar a empresas y hogares en una década.

    En 2017, IBM presentó un procesador cuántico comercial de 17 qubits

    En 2019, IBM presentó el primer ordenador cuántico comercial, el IBM Q System One. También presentó el ordenador cuántico más potente del mundo, compuesto de 53 qubits. Google demostró la supremacía cuántica, es decir, la demostración de que un ordenador cuántico podría desempeñar una tarea extremadamente compleja en unos pocos segundos, mientras que a un superordenador convencional le costaría miles de años. Por cierto, en el diseño de esta demostración participó el informático y matemático español Sergio Boixo.

    En 2021, IBM consigue el primer procesador de 127 qubits.

    En 2022, investigadores de la Universidad Tecnológica de Delft (Países Bajos) lograron desarrollar el primer procesador de silicio de 6 qubits. El Instituto Japonés de Ciencia Molecular consiguió utilizar una doble compuerta cuántica, lo que permitió el intercambio de energía e información entre dos átomos en tan sólo 6,5 nanosegundos, usando un láser molecular. Un equipo de la Universidad de Gales del Sur ha diseñado un procesador cuántico a escala atómica que simula el comportamiento de una molécula, tal y como planteó el físico Richard Feynman hace casi 60 años. Científicos de Harvard y del MIT desarrollan un ordenador cuántico de 256 qubits, dentro del proyecto QuEra Computing.

    En este repaso histórico hemos sintetizado unos pocos de los hitos más relevantes, pero ha habido muchos e importantes acontecimientos en la reciente historia de la computación cuántica. 

      

    ¿Qué es la computación cuántica?

    La computación cuántica (también conocida como informática cuántica) aborda la computación desde un paradigma diferente a la que conocemos actualmente, abriendo una nueva puerta a posibilidades que hasta hoy eran inalcanzables o muy difíciles de alcanzar.


    Diferencias entre la computación cuántica y la computación clásica

    La primera diferencia entre la computación cuántica y la computación clásica está basada en la forma de la unidad básica de información. 

    La computación básica trata la información en secuencias de unos y ceros (bits), que representan puertas lógicas por las que pasa electricidad (1) o no (0) en un momento determinado. La secuencia combinada de bits conforma la generación de valores numéricos representados de forma binaria. Así, los chips y microprocesadores basan su capacidad de almacenar y realizar cálculos en este formato: 4 bits (nibbles), 8 bits, 16 bits, 32 bits, 64 bits, etc.

    La computación cuántica trata la información mediante qubits (quantum bits ó bits cuánticos), los cuales pueden valer, 0, 1 o ambos valores a la vez (lo que se conoce como superposición cuántica). 

    Estos valores cuánticos se pueden representar en una esfera de Bloch, basada en la mecánica cuántica:

    Fuente: Wikimedia

    Esta característica ofrece nuevas posibilidades lógicas que requieren de nuevos algoritmos para tratar problemas complejos que son inalcanzables para la computación clásica. 

    Entre algunas de las soluciones que ofrece la computación cuántica se encuentra la posibilidad de generar números aleatorios reales (lo cual es esencial para generar hashes para la blockchain), o resolver en unos segundos cálculos complejos que a un ordenador clásico le llevaría años realizar. Investigadores de Google confirmaron que un cálculo que le hubiera llevado realizar 10.000 (diez mil) años a un superordenador actual, en su ordenador cuántico se realizó en apenas 200 segundos.

    Entre muchas de las virtudes de la computación cuántica se encuentra la posibilidad de resolver en apenas unos segundos problemas complejos que le llevaría a la computación clásica decenas o cientos de años, como puede ser el descifrado de información encriptada. 

    Para entender un poco la magnitud de procesamiento de la computación cuántica, imaginemos un ordenador cuántico de apenas 30 qubits, el cual podría ejecutar 10 billones (10 millones de millones) de FLOPS (operaciones en coma flotante por segundo). Para hacernos una idea, comparado con las videoconsolas más potentes de la actualidad, una XBox One Series X trabaja con 12 TFLOPS, la PlayStation 5 tiene una capacidad de 10,28 FLOPS. Es decir, que este ordenador cuántico tendría la potencia de casi 1 billón de PlayStations 5.


    Diferencias entre ordenadores cuánticos y ordenadores clásicos

    La arquitectura de un ordenador cuántico es más sencilla, ya que solo se limita a un conjunto de qubits para funcionar, por lo que no requiere de memoria ni de procesadores.

    Sin embargo, los ordenadores cuánticos son muy sensibles ante cambios ambientales. Por ello, requieren que la presión atmosférica sea casi inexistente, que estén aislados del campo magnético terrestre y que la temperatura ambiente sea lo más próxima al cero absoluto (-273º C). Estos ordenadores están sellados y manejados desde ordenadores normales.

    Fuente: clipset.com

    Estas condiciones son extremas, pues si hay interacción con partículas externas se producirían fallos de medición o se borrarían las superposiciones de estados. Los átomos no deben moverse ni colisionar entre sí. Por este motivo, estos ordenadores están funcionando durante intervalos muy cortos de tiempo.

    ¿Sustituirá la computación cuántica a la computación clásica?

    La computación clásica ha revolucionado la forma en que resolvemos problemas complejos en todos los ámbitos: empresarial, personal, educacional, investigación, comunicaciones, etc. Y seguirá dándonos muchas sorpresas y grandes satisfacciones por mucho (muchísimo) tiempo.

    La computación cuántica se erige para resolver otro tipo de problemas, concretamente aquellos que la computación clásica no es capaz de afrontar o que sería inviable de resolver. El enfoque de la computación cuántica es explorar nuevas posibilidades de resolver problemas complejos.

    Por tanto, la computación cuántica complementará a la computación convencional y viceversa. Ante problemas sencillos y poco complejos, la computación clásica seguirá siendo más eficiente y viable que la computación cuántica. Se abre un mundo de oportunidades y posibilidades en que lo mejor de ambas se complementen para afrontar nuevos e interesantes retos.

    Conceptos básicos de la computación cuántica

    Durante los últimos años se están logrando muchos e importantes avances en la computación cuántica. Empresas, universidades, institutos y laboratorios de tecnología como el MIT, Universidad de Berkeley, Universidad de Stanford, Universidad de Yale, IBM, Microsoft, Rigetti, D-Wave Systems, Xanadu o QCI están compitiendo en investigación y desarrollo, proponiendo nuevos modelos de hardware y software cada vez más sofisticados y eficientes.

    No obstante, vamos a hacer una breve revisión de algunos conceptos básicos en los que está basada la computación cuántica.


    Superposición cuántica y la paradoja del gato de Schrödinger

    Quizá sea está la característica básica más importante y conocida de la computación cuántica. El principio de superposición es una regla de la física cuántica en la que pueden existir, al mismo tiempo, dos estados. 

    La paradoja del gato de Schrödinger es una representación de dicho principio, propuesto por el físico y premio Nobel austríaco Erwin Schrödinger. Esta paradoja explica la superposición a través de un experimento mental en la que tenemos un gato dentro de una caja opaca, la cual, en su interior, posee un mecanismo que une un detector de electrones a un martillo. Justo debajo del martillo se encuentra un frasco de cristal con un letal veneno. Este mecanismo se activaría si el detector detectase un electrón, con lo que el martillo se desplomaría y rompería el frasco, con el fatal desenlace para el pobre gato.

    Si abrimos la caja puede que encontremos al gato muerto, o puede que el electrón tome otra dirección y el detector no lo perciba y el gato se salve.

    Al final del experimento hay un 50% de probabilidades sobre el estado del gato: vivo o muerto.

    Pero la paradoja de la mecánica cuántica estriba en que un electrón es, al mismo tiempo, onda y partícula. Es decir, que toma caminos distintos a la vez, pero no se excluyen, si no que se superponen, como las ondas de agua en un lago. Por tanto, el electrón tomaría el camino del detector y el camino contrario al mismo tiempo. Ambas probabilidades se cumplen simultáneamente, por lo que el gato acabaría vivo y muerto a la vez. Solamente, al abrir la caja, veremos si el gato está vivo o muerto.


    Entrelazamiento

    Un conjunto de 2 qubits puede representar, a la vez, la siguiente superposición de valores: 00, 01, 10 y 11. A medida que se incrementa el número de qubits, también se incrementa exponencialmente la capacidad de superposición y aumenta la representación de información. A esto se denomina entrelazamiento, pues los qubits se entrelazan en una correlación cuántica, pudiendo realizar operaciones en paralelo o simultáneamente (lo que se conoce como paralelismo cuántico).

    En la física, el entrelazamiento cuántico ocurre cuando dos partículas están tan conectadas que lo que le ocurre a una le afecta a la otra, sin importar su distancia. Esta es la clave del teletransporte, y fue una propiedad predicha por Einstein, Podolsky y Rosen (paradoja EPR).


    La decoherencia cuántica

    El principio de superposición del qubit nos lleva a la posibilidad de obtener simultáneamente múltiples resultados, como consecuencia de la multiplicidad de estados de los qubits implicados en una operación lógica cuántica. Esto se vuelve exponencial a medida que realicemos operaciones con más qubits. 

    La decoherencia cuántica se produce en el momento en que las condiciones requeridas para mantener un estado cuántico entrelazado desaparecen. Básicamente, el sistema deja de comportarse según las reglas de la mecánica cuántica y comienza a comportarse acorde a las reglas de la física convencional. Esto provoca que el estado de los qubits se rompa con facilidad, afectando a la superposición y al entrelazamiento, desapareciendo los efectos cuánticos.

    Los estados cuánticos se mantienen durante un período de tiempo limitado, durante el cual hay que realizar las operaciones con los qubits. Esto se vuelve más difícil a medida que se añaden más qubits. Pasado este tiempo, la decoherencia de un sistema cuántico producirá errores, ya que los algoritmos no retornarán los resultados esperados. Por este motivo, los ordenadores cuánticos tienen unas características muy especiales para funcionar (tales como su temperatura de trabajo a -273 grados), con el fin de evitar perturbaciones y ruido.

    Algoritmo cuántico

    Un algoritmo cuántico difiere bastante de un algoritmo convencional. 

    Un algoritmo cuántico permite la ejecución de una serie de puertas cuánticas sobre entidades (qubits o registros cuánticos), a los que les sigue un punto de medición. 

    Los cómputos se realizan utilizando qubits que operan entre sí a través de puertas cuánticas, manipulando estados. Cuando se enlazan puertas cuánticas es posible calcular funciones complejas.

    El algoritmo cuántico se suele representar en un circuito formado por puertas cuánticas, en donde se transforma el estado de un conjunto de qubits desde una superposición inicial hasta una superposición final. 
    Ejemplo de circuito con un algoritmo cuántico. Fuente: Towards Data Science


    Ya se han desarrollado algunos algoritmos importantes, entre los que cabe destacar:
    • Algoritmo Deutsch-Jozsa (1992): Desarrollado por David Deutsch y Richard Jozsa. Determina si una función de tipo caja negra es constante o balanceada. 
    • Algoritmo de Shor (1995): Desarrollado por Peter Shor. Descompone un número N en factores en tiempo y espacio. Se ha convertido en un referente debido a su papel en el desencriptado de datos.
    • Algoritmo de Grover (1996): Desarrollado por Lov K. Grover. Demuestra que una búsqueda en una base de datos sin ordenación es mucho más rápida usando computación cuántica.  
    Existe una multitud de algoritmos cuánticos. Pueden consultarse parte de ellos en el Zoo de Algoritmos Cuánticos.

    Campos de aplicación de la computación cuántica

    La computación cuántica genera grandes expectativas para dar solución a importantes retos y problemas que hoy en día, con la computación y los ordenadores convencionales, serían impensables. Por ejemplo:
    • Ciberseguridad. Al principio comentamos que en pocos segundos se podría desencriptar cualquier dato encriptado con los potentes algoritmos actuales. Pero también da pie a utilizar nuevos algoritmos de encriptación más robustos, como QKD (Quantum Key Distribution). Esto llevará a redefinir la seguridad en internet y el uso de criptografía cuántica.
    • Medicina y Salud. Ayudará y mejorará la investigación del ADN, y permitirá desarrollar nuevos medicamentos y tratamientos personalizados. Creación y simulación de estructuras moleculares, como las proteínas.
    • Finanzas. Optimización de los sistemas de detección del fraude, gestión de riesgos, simulaciones de previsiones de "crashes" financieros e inversiones seguras, recomendaciones de inversiones.
    • Transporte. Mejora de la planificación del tráfico, optimización de rutas, eficiencia de asignación de aviones en aeropuertos o la eficiencia de los aviones.
    • Industria 4.0. Resolución de problemas logísticos en las cadenas de suministro. Creación de materiales verdes alternativos. Desarrollo de superconductores eficientes. 
    • Química. Investigación de las reacciones químicas (aplicado, por ejemplo, a las baterías). Investigación de estructuras moleculares y simulación de sus reacciones.
    • Ciencia. Testeo de teorías científicas aún sin validar. Búsqueda de eventos de Higgs y el origen del universo. Investigación en la ciencia cuántica.
    • Meteorología. Análisis y predicción del clima.
    • Inteligencia Artificial. Se está avanzando en el campo de la inteligencia artificial cuántica. IBM está produciendo y mejorando un algoritmo de clasificación de aprendizaje automático cuántico. También se está trabajando en el comportamiento hiperrealista de personajes autónomos (no controlados) en videojuegos. También se está avanzando en la inteligencia artificial de vehículos autónomos.
    • Comunicaciones. Se está trabajando en un Internet cuántico, más rápido, seguro y libre de espionaje. Esto podría ser clave en nuevos servicios, tales como el metaverso. 
    • Blockchain. La computación cuántica será clave para la web3, basada en tecnología Blockchain. Algunos de los factores clave de Blockchain son la generación de hashes, la encriptación y la firma de de las cadenas de bloques, asegurando la inmutabilidad de los mismos. La criptografía postcuántica resolvería este problema y aseguraría la inmutabilidad y la seguridad de la blockchain. 

    Programación en computación cuántica

    ¿Podemos iniciarnos en el apasionante mundo de la computación cuántica sin tener un ordenador cuántico? La respuesta es SI.

    No es necesario ser miembro de un equipo restringido de investigadores en una prestigiosa universidad, ni trabajar en una de las pocas empresas que construyen ordenadores cuánticos. 

    Afortunadamente, tanto Google, como IBM y Microsoft desarrollan software y herramientas para que podamos aprender y construir código y algoritmos, y ponen a nuestra disposición capacidad de cómputo en uno o varios de sus ordenadores cuánticos para testearlo y ejecutarlo.

    Google proporciona una plataforma muy completa llamada Google Quantum AI, en la que ofrecen una librería de Python llamada Cirq con la que podemos desarrollar nuestros algoritmos cuánticos. Para testear y ejecutar nuestros algoritmos, Google nos facilita la Quantum Virtual Machine

    En el caso de IBM, ofrece un entorno de ejecución llamado Qiskit. Mediante sus herramientas podemos, de manera visual, algoritmos cuánticos usando circuitos usando qubits, puertas lógicas y otros recursos esenciales. También podemos generar estos circuitos directamente con código, usando una librería en Python, que también nos permite visualizar el circuito y simular su ejecución. Adicionalmente, IBM ofrece recursos cuánticos para poder ejecutar estos algoritmos. Podemos elegir uno de estos recursos o máquinas a lo largo del planeta (según la carga y pool que haya), y esperar nuestro turno. IBM también ofrece sistemas y simuladores (de pago) para planes empresariales.

    La solución de Microsoft se llama Azure Quantum, en donde tenemos a nuestra disposición los servicios y recursos en la nube suficientes para poder usar el potencial de la computación cuántica. Para desarrollar, Microsoft ha desarrollado el lenguaje Q# y el kit de desarrollo Quantum, el cual puede ser utilizado desde Visual Studio o desde Visual Studio Code. Esta herramienta de desarrollo permite utilizar el lenguaje F#,  Qiskit o Cirq. Al igual que IBM, Microsoft también nos proporciona hardware cuántico y simuladores para poder testear y ejecutar nuestros algoritmos.


    Los retos de la computación cuántica

    Día a día se logran pequeños avances, y hay algunos objetivos clave para los próximos años.

    El reto más importante y urgente es conseguir qubits de calidad, que mantengan la integridad de los estados cuánticos durante más tiempo, lo que permitirá realizar operaciones y algoritmos cada vez más complejos. Adicionalmente, los sistemas de corrección de errores serán claves para garantizar los resultados.

    Recientemente, en España, se ha creado el proyecto CUCO, subvencionado por el CDTI y el Ministerio de Ciencia e Innovación, y formado por un consorcio de siete empresas. El objetivo de CUCO es la investigación y la implantación de tecnologías basadas en computación cuántica que puedan ser aplicadas a la industria.

    Para 2024 se prevé establecer un estándar de criptografía postcuántica, lo que abre el camino a desarrollar criptosistemas que se puedan ejecutar en ordenadores clásicos pero que no puedan ser atacados por ordenadores cuánticos. 

    Para 2025, IBM tiene como objetivo lanzar un ordenador cuántico de 4000 qubits, usando múltiples grupos de procesadores escalados modularmente y ejecutándose en paralelo. Esta tecnología mejoraría la mitigación de errores y orquestaría las cargas de trabajo de forma inteligente. 

    Para 2030 se prevé alcanzar el millón de qubits

    Para 2040 se prevé romper la criptografía RSA y la curva elíptica.

    Queda pendiente saber si llegaremos a usar algún día un ordenador personal o un teléfono móvil cuántico. Pero, sin duda alguna, la carrera de la innovación en la computación cuántica no ha hecho más que empezar. Y las sorpresas que nos deparan son apasionantes.

    Referencias


    Noticias sobre Computación cuántica:
    Desarrollo con IBM Quantum:

    jueves, 14 de abril de 2022

    Super Windows: Cómo optimizar y acelerar tu Windows (parte 3)

    Windows es un gran sistema operativo, pero necesita de un mantenimiento para exprimir su potencial y rendimiento. A medida que lo usamos parece ralentizarse y ser muy pesado. Esta motivación me ha llevado a escribir estos artículos para enseñarte cómo optimizar y acelerar tu Windows.

    En esta serie de artículos vamos a aprender cómo podemos acelerar su velocidad y a liberar muchos de sus recursos. Con ello conseguiremos que nuestro ordenador se convierta en un Fórmula 1, entregándonos toda su potencia y su velocidad.


    En esta tercera parte vamos a abordar otras configuraciones esenciales para optimizar y acelerar nuestro Windows.

    La mayor parte de estas opciones pueden ser accedidas desde las opciones de configuración de Windows, o bien, desde el menú Inicio, escribir el título de la opción para que lo busque y acceda directamente a la opción.

    La relación de opciones aquí presentadas aplican completamente a Windows 11. Algunas de estas opciones pueden ser también aplicables a Windows 10 y anteriores, pero la forma de acceder a ellas puede ser diferente. El porcentaje de opciones comunes va decrementándose cuanto más antigua sea la versión de Windows.


    Configuración para juegos si no eres Gamer

    Si no eres gamer, o tus necesidades de juego no están alineadas con XBox, podemos cambiar algunas configuraciones de la opción "Juegos" dentro de la configuración de Windows.

    Si no utilizas tu equipo para jugar con XBox, te conviene desactivar la "XBox Game bar", así como también el "Modo Juego" y las "Capturas de pantalla".


    Configuración para juegos y aplicaciones que exprimen los gráficos

    Tanto si eres gamer como si eres un grafista, diseñador o un editor de vídeos, esta configuración te interesa.

    En la Configuración de Windows, accedemos a la opción "Juegos", luego "Pantalla" "Modo de juego" y, después, "Gráficos". Aparecerá una lista de aplicaciones que utilizan de forma especializada los gráficos de tu equipo. En la parte superior podemos agregar aplicaciones de forma manual (como juegos) si es que dicha aplicación no aparece en la lista. Para ello, seleccionamos el valor "Aplicación de escritorio" y pulsamos el botón "Examinar", donde buscaremos el archivo ejecutable de la aplicación en el disco.

    Una vez tengas la aplicación (o el juego) en la lista, se selecciona esta aplicación en la lista y se pulsa el botón "Opciones". Mostrará un cuadro de diálogo, en donde seleccionaremos la opción "Alto Rendimiento".


    Privacidad y Seguridad

    Si no damos un uso profesional de nuestro equipo, como pueda ser de programador, conviene deshabilitar todas las opciones de la sección "Seguridad" ("Buscar mi dispositivo" y "Para programadores"), dentro de la opción "Privacidad y Seguridad" en la configuración de Windows, desde la categoría "Ubicación" hasta la categoría "Captura de aplicaciones y pantalla".

    También es recomendable deshabilitar (si realmente no lo necesitas) todas las configuraciones de las opciones "General", "Voz", "Personalización de entrada manuscrita y escritura", "Diagnóstico y comentarios", "Historial de actividades", etc., así como también todos aquellos permisos que realmente no necesitas o no quieres tener activos (como ubicación, cámara, micrófono, notificaciones, etc). Todas estas opciones están consumiendo recursos en segundo plano y pueden no ser tan necesarias.

    En general, la mayor parte de estas opciones se pueden deshabilitar. No obstante, es mejor que analices cada una de estas opciones para que decidas qué dejar activo. Por ejemplo, las opciones de cámara y micrófono pueden ser necesarias, especialmente si realizas videoconferencias o si eres músico y realizas grabaciones de audio.


    Windows Defender

    Hay una configuración que, por defecto, Microsoft activa para realizar una monitorización exhaustiva de todo lo que Windows Defender está realizando. Esta monitorización es a efectos de información y reporte, más que de diagnóstico y acción.

    Para ello, accedemos a Windows Defender, y accedemos a la opción "Seguridad del dispositivo", y a la sección "Aislamiento del núcleo" (detalles del aislamiento). Aquí desactivaremos la opción.


    Red

    Por defecto, Windows se reserva parte del ancho de banda para uso propio, como, por ejemplo, para las actualizaciones de Windows. Si queremos aprovechar al máximo nuestro ancho de banda realizaremos los siguientes pasos:
    1) Ejecutar regedit como administrador del sistema (pulsa las teclas Windows + R, y escribir "regedit", o desde el menú Inicio escribir en la búsqueda "regedit")
    2) Buscar la siguiente ruta:
    \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile

    3) Seleccionar la variable NetworkThrottlingIndex y cambiar su valor en modo hexadecimal a "FFFFFFF"
    4) Aceptar el cambio

    Tras reiniciar el equipo, adoptará esta nueva configuración.


    Discos y almacenamiento

    Configuraciones automáticas sobre almacenamiento

    Dentro de la configuración de Windows, en Sistema, tenemos la opción "Almacenamiento". Una de sus opciones, "Sensor de almacenamiento", permite, de forma automática, detectar aquellos componentes de almacenamiento no son necesarios para su eliminación automática.

    En la opción "Recomendaciones de limpieza" encontraremos varias configuraciones que nos ayudan a limpiar de forma automática elementos de almacenamiento importantes, como "Instalaciones anteriores de Windows" o la carpeta "Descargas", o "Archivos grandes o sin usar", "Archivos sincronizados a la nube" o "Aplicaciones sin usar".

    También podemos seleccionar la estadística de "Archivos temporales" y configurar las opciones que más se ajusten a nuestras necesidades o preferencias.


    Eliminar archivos temporales y "prefetch"

    Para eliminar directamente archivos temporales, podemos lanzar el cuadro "Ejecutar" (Windows + R o clic derecho en menú Inicio y opción "Ejecutar", y escribimos %temp%. Con ello aparecerán todos los archivos temporales actuales de aplicaciones de terceros. Basta con seleccionar todos (Ctrl + E) y borrar (Supr). Es posible que algunos archivos no se puedan eliminar (se están utilizando), por lo que seleccionaremos la opción "Omitir".

    Para eliminar directamente archivos temporales internos (de Windows), realizamos lo mismo que lo indicado arriba, pero en lugar de especificar %temp%, omitimos el símbolo de porcentaje (es decir, especficicamos sólo la palabra temp).

    Otros archivos que podemos eliminar son los denominados "prefetch", que son generados por Windows durante la gestión de la memoria, y que se van quedando ahí. Para ello, repetimos los pasos anteriores y escribimos "prefetch" en el cuadro "Ejecutar". El resto de pasos son los mismos.


    Liberar espacio de disco

    Otra forma para liberar espacio de almacenamiento es arrancar el Administrador de Archivos (el atajo serían las teclas Windows + E), localizar la unidad de disco que queremos liberar, hacer clic con el botón derecho del ratón y seleccionar la opción "Propiedades, y pulsamos el botón "Liberar espacio". En la ventana de diálogo podemos seleccionar previamente los elementos que queremos eliminar y desmarcar aquellos elementos que queremos conservar.


    Defragmentar unidades de discos

    Una configuración interesante para acelerar el acceso al disco, es su defragmentación. Esta técnica junta la información de los archivos en sectores contiguos de disco, por lo que el acceso a los mismos se acelera al no tener que buscar en diferentes sitios y mover los cabezales. Esta configuración sólo aplica a discos duros mecánicos o rígidos (HDD), no a discos de estado sólido (SSD). 

    Si tienes un disco mecánico, arranca el Administrador de Archivos (el atajo serían las teclas Windows + E), localizar la unidad de disco que queremos liberar, hacer clic con el botón derecho del ratón y seleccionar la opción "Propiedades, y en la sección "Optimizar y defragmentar unidad" pulsamos el botón "Analizar" y, cuando termine, pulsamo la opción "Optimizar". Este proceso lleva un rato, por lo que ten paciencia.


    Optimizar unidades de disco

    En el caso de tener unidades de disco sólido (SSD), siguiendo los pasos de la sección anterior, observaremos que el botón "Analizar" estará deshabilitado. Estará disponible únicamente el botón "Optimizar" para nuestro disco SSD, que nos permitirá una mejora del rendimiento de ese disco.

    Nota: En Windows 11 se agregó esta mejora, con lo que no se defragmenta el disco si es SSD. En Windows 10 y anteriores, se recomiendo no utilizarlo. 


    Papelera de reciclaje

    Como medida de seguridad, Windows envía todos los archivos y elementos que eliminamos a la Papelera de reciclaje, a fin de que, si nos equivocamos o arrepentimos, podamos recuperarlo nuevamente. 

    Básicamente, mueve los archivos de su origen a una carpeta especial, por lo que seguimos ocupando espacio en el disco.

    Si queremos eliminar definitivamente el contenido de la Papelera, haremos clic derecho sobre ésta y seleccionamos la opción "Vaciar".



    Visor de Eventos


    Todo lo que sucede en Windows es almacenado en el Visor de Eventos. Esta herramienta es útil en el caso de que haya sucedido algún problema que impacte en el funcionamiento de Windows, ya que teniendo un registro de lo que ha ocurrido puede ayudar a diagnosticar los problemas.

    Con el tiempo, su tamaño puede ser considerable. Si no has tenido problemas críticos en el funcionamiento de Windows, puedes acceder a esta herramienta y eliminar todos los eventos para liberar espacio. Esto se realiza en desde el árbol de la izquierda, en "Registros de Windows".

    Nota: No te preocupes. Windows sigue capturando eventos desde el momento actual de forma constante.


    Puntos de restauración

    A medida que vamos actualizando Windows vamos generando puntos de restauración. También los generamos de forma manual, a modo de backup. Esto, lógicamente, consume bastante espacio en nuestro equipo. Así pues, podemos configurar y eliminar puntos de eliminación para optimizar este espacio.

    Para ello, en el Explorador de Archivos, haremos clic sobre "Este Equipo", opción "Mostrar más opciones" y seleccionar "Propiedades". A continuación seleccionamos "Opciones avanzadas del Sistema". Aparece una nueva ventana de diálogo. Seleccionamos la pestaña "Protección del sistema", y en la sección de "Configuración de la protección" pulsamos el botón "Configurar...", en donde tendremos a nuestra disposición las opciones de restauración.