Ejemplos para dotar de mas seguridad para nuestros dispositivos conectados


A pesar de los beneficios que ofrece el Iot ( Internet de las Cosas), ésta también tiene sus propios peligros. La seguridad es el Talón de Aquiles de IoT.
Internet de las Cosas ofrece numerosas ventajas tanto a empresas como a ciudadanos, pero, a su vez, conlleva una serie de peligros  que exigen  precaución para evitar el riesgo catastrófico que suponen los ciberataques

Aunque todos sabemos la gran expansión del IoT , también es cierto  que se ha abierto  una gran puerta al mundo y que  no esta exento de riesgo especialmente para delicuentes cibercriminales que quieren aprovechar las vulnerabilidades detectadas  para su propio lucro personal.

En este contexto desde la empresa Eleven Path , pensando en el símil del pestillo de toda la vida de nuestra puerta que impide la apertura  de esta  desde el exterior si este esta cerrado, crearon Latch ,el cual constituye un servicio en la nube para que los usuarios pueden crear «pestillos digitales» para poner a sus identidades digitales, y que les permita poner ON/OFF las cuentas con tan solo hacer clic en la identidad que quiere desbloquear o bloquear cuando la vaya a utilizar usando uns app desde su terminal móvil.

 Como ejemplo de uso de latch ,en el siguiente vídeo se puede ver cómo desde Telegram se envía un comando determinado  (en el video es «Abracadabra») a un bot de Telegram que es controlado vía una topología Sinfonier( este ultimo un producto también de Eleven Path).

La Topología comprueba si Latch autoriza ese comando o no a una  placa Intel Edison  al que hay conectado un led . Si Latch está abierto, entonces se enciende el LED, pero si Latch está cerrado, entonces sale un mensaje de Latch Protected.

Hay muchos mas ejemplos de uso de Latch como el de  una hucha regulada mediante esta solución de seguridad, a través de la cual es posible apreciar perfectamente cómo funcionan los ‘pestillos virtuales’.

En esta solución conectan a una placa Intel Edison a Internet   y esta vez  también a un lector Biométrico  en el que los usuarios de esa hucha protegida  grabarían sus huellas dactilares. Una vez reconocidos los usuarios, los padres podrían bloquear, desbloquear con Latch la hucha  , o elegir la cantidad que la hucha dispensa a cada una de las huellas vinculadas. «Rizando mas el rizo» incluso se podría diferenciar cuánto dinero nos da la hucha dependiendo del dedo que utilicemos para autenticarnos.

 

Aunque esta hucha no está concebida con el objetivo de comercializarse, sí que demuestra de una manera clara el potencial de Latch con respecto a Internet de las Cosas enfocandose claramente en hacer mas segura cualquier acción sobre un dispositivo IoT.

Y ahora por ultimo  veamos una demostración   mas sencilla  de cómo se puede integrar Latch usando una Raspberry Pi  para controlar un cerrojo físico desde la aplicación de Latch

El hardware  esta vez es una Raspberry PI  desde la que hemos hablado en numerosas ocasiones en este  blog, la  cual servirá  para realizar las llamadas al servidor de Latch y manejar los elementos físicos que se necesiten; tanto la API de Latch, como la API de la GPIO, están disponibles en diferentes lenguajes comunes,pero en el caso de la Rasberry ,Python es uno  de los lenguajes  mas sencillos .  En el ejemplo el actuador  del cerrrojo es un simple motor  paso a paso con la electrónico necesarias   y  para evitar actuar sobre el cerrojo cuando la puerta no esté cerrada,también han  incorporado  un sensor que permita determinar el estado de la puerta, saber si está abierta o cerrada (por simplicidad ha optado por un simple sensor capacitivo)

Con sólo integrar tres elementos podemos pues poner un Latch a un sistema de acceso físico de nuestra vida real, como una puerta, una ventana, o un cajón; incluso sin que necesiten una llave para su accionamiento. Lo único que necesitamos es:

–          Detectar el intento de acceso.

–          Evaluar el estado del acceso, si está abierto o cerrado.

–          Actuar sobre el acceso para bloquearlo o desbloquearlo.

 En el siguiente vídeo podemos ver el ejemplo funcionando:

Si esta interesado en este link puede obtener el código completo  y adaptarlo  a su propia necesidad

 

Es obvio que existen muchísimos mas ejemplos: por ejemplo usando  Mobile Connect para autenticarnos con la SIM de nuestro móvil , plugins que permiten integrar Latch en el proceso de autenticación en Ruby, en Liferay, en cerraduras electrónicas utilizando DNIe, NFC y apps móviles, y en una centralita Asterik para configurar el funcionamiento de las llamadas,etc

Para todos los interesados, Eleven Paths celebrará este año otra edición de su concurso Plugin Latch, destinado a desarrolladores que quieran trabajar con esta solución de seguridad y crear aplicaciones innovadoras. El premio: 5.000 dólares en Bitcoins que irán destinados al ganador.

 

 

Más información sobre Latch en latch.elevenpaths.com.

Raspberry Pi Cero conectada a pantalla de información


Raspberry Pi Zero es un nuevo dispositivo que entra fuerte en el terreno de los dispositivos conectados y a la Internet de las Cosas. Gracias a su reducido tamaño y consumo podemos darle un montón de posibilidades en casa, como por ejemplo la automatización de determinadas tareas o simplemente mostrar información en un espacio ínfimo. Especialmente si la complementamos con unpequeño display OLED como éste, comercializado por Adafruit.

Frederic Vandenbosch ha creado un interesante proyecto con la Raspberry Pi Zero, usando un  display de Adafruit anteriormente mencionado y un par de pulsadores soldados en los terminales GPIO de la Raspberry Pi.

Para conectar la Zero a internet, Frederic ha utilizado  una extensión wifi de la que ya hablamos en este blog   y que permite agregar conectividad Wi-Fi a la menor de las Raspberry Pi soldándolo directamente a la placa. Como podéis ver en el vídeo que acompaña la imagen, los dos pulsadores son programables y en los ejemplos propuestos permiten navegar por una serie de opciones, como por ejemplo mostrar la dirección IP o forzar la reconexión de la Raspberry Pi Zero a internet.

 

 

Hardware

El hardware consiste en los siguientes componentes:

  • Raspberry Pi Cero
  • Adafruit 128 × 64 SSD1306 OLED
  • Edimax wifi dongle
  • 2 grandes pulsadores

El cableado del OLED y botones es bastante sencillo, como se ilustra a continuación:

adafrut

El dongle wifi se conecta de la misma manera como lo hice anteriormente con el hub USB:

  • Pi Zero PP1 a dongle 5V
  • Pi Cero PP6 al dongle GND
  • Pi Cero PP22 para dongle D +
  • Pi Cero PP23 para dongle D-

Por último, para mantener todo en su lugar, he diseñado una caja sencilla lo suficientemente grande para encajar todo. Un panel trasero se atornilla en el lugar para mantener todos los componentes en el interior, dejando al descubierto el puerto microUSB entrada de energía en el lado.

 

Un poco de cinta kapton evita contactos expuesto a tocarse y mantiene el cableado en su lugar. El dongle wifi se coloca en la parte superior para una mejor conectividad. Su LED azul brillante brilla a través del recinto, dando una clara indicación de su estado y la actividad.

Los archivos para el recinto de impresión 3D se pueden encontrar en Thingiverse: http://www.thingiverse.com/thing:1193350

Software

Por el lado del software del proyecto, se necesita la creación de la tarjeta microSD con la última imagen Raspbian Jessie disponible.Arrancando  desde el combo hub Pi Cero / USB con el teclado y wifi dongle conectado  porque el puerto USB de este proyecto Pi Cero se ha cableado a un dongle wifi y un teclado ya no se puede conectar .

Se configura el wifi añadiendo el SSID y la frase de contraseña correcta en el archivo / etc / network / interfaces. Después de probar la conectividad wifi, poner la tarjeta microSD de vuelta en el Pi correcta. Con la conectividad de red, es posible iniciar sesión con SSH y trabajar en el guión para mostrar la información deseada.

Uso de la Biblioteca de Python Adafruit OLED SSD1306 y algo de código Python personalizada, en el ejemplo se programan  tres pantallas diferentes:

  • Hora y fecha
  • Configuración de la red
  • Los medios sociales suscriptores / seguidores

El botón izquierdo a través de las diferentes pantallas, mientras que el botón derecho desencadena una acción personalizada por pantalla.

En el caso de la visualización de la hora y la fecha, el botón, cambia entre las 12h y las 24h representación. Para la configuración de red, obliga al wifi de volver a conectar mediante un descenso de la interfaz y obligando de nuevo. Por último, para evitar el tráfico excesivo, información de medios sociales solamente se recupera cada cinco minutos, al pulsar el botón de fuerza a la recuperación de la información.

Por supuesto, esto es sólo un subconjunto de lo que podría ser mostrado. Podría recuperar la información del tiempo, el correo electrónico, últimos tweets, etc … Usted también podría tener que desplazarse por pantallas diferentes sin necesidad de pulsar un botón. Todo es posible.

El código actual se puede encontrar a continuación. Está lejos de ser perfecto, pero hace el trabajo.

Por último, para conseguir que se inicie automáticamente al arrancar el sistema, cree un script lanzador (por ejemplo, «launcher.sh«) que contiene la ruta de acceso a la secuencia de comandos, así:

  #! / bin / sh
 cd / home / pi
 sudo python info_display.py y

Y por último, añadir el cronjob con el comando «sudo crontab -e«:

  reboot sh /home/pi/launcher.sh

Cada vez que el Pi se inicia, se pondrá en marcha el script.

#!/usr/bin/env python
import time
import Adafruit_SSD1306
import RPi.GPIO as GPIO
import Image
import ImageFont
import ImageDraw
import os
def display_time():
# Collect current time and date
if(time_format):
current_time = time.strftime(«%I:%M«)
else:
current_time = time.strftime(«%H:%M«)
current_date = time.strftime(«%d/%m/%Y«)
# Clear image buffer by drawing a black filled box
draw.rectangle((0,0,width,height), outline=0, fill=0)
# Set font type and size
font = ImageFont.truetype(Minecraftia.ttf, 35)
# Position time
x_pos = (disp.width/2)/2)
y_pos = 2 + (disp.height48)/2 (35/2)
# Draw time
draw.text((x_pos, y_pos), current_time, font=font, fill=255)
# Set font type and size
font = ImageFont.truetype(Minecraftia.ttf, 8)
# Position date
x_pos = (disp.width/2)(string_width(font,current_date)/2)
y_pos = disp.height10
# Draw date
draw.text((x_pos, y_pos), current_date, font=font, fill=255)
# Draw the image buffer
disp.image(image)
disp.display()
def display_social():
# Collect social media subscribers/followers/… by parsing webpages
twitter = os.popen(«curl https://twitter.com/f_vdbosch?lang=en | grep ‘data-nav=followers‘ | grep -o ‘[0-9]\+’«).read()
youtube = os.popen(«curl https://www.youtube.com/c/FrederickVandenbosch | grep -o ‘[0-9]\+ subscribers’ | grep -o ‘[0-9]\+’«).read()
facebook = «0«
instagram = os.popen(«curl https://www.instagram.com/f_vdbosch/ | grep -o ‘followed_by:{count:[0-9]\+}’ | grep -o ‘[0-9]\+’«).read()
googleplus = «0«
# Put data in lists that can be iterated over
channels = [«YouTube«, «Twitter«, «Facebook«, «Instagram«, «Google+«]
subscribers = [youtube, twitter, facebook, instagram, googleplus]
# Clear image buffer by drawing a black filled box
draw.rectangle((0,0,width,height), outline=0, fill=0)
# Set font type and size
font = ImageFont.truetype(Minecraftia.ttf, 8)
# Iterate over lists
for i in range(0, 5):
# Position channel name
x_pos = 2
y_pos = 2 + (((disp.height4)/5)*i)
# Draw channel name
draw.text((x_pos, y_pos), channels[i], font=font, fill=255)
# Position subcribers/followers/…
x_pos = disp.width 2 string_width(font, subscribers[i])
y_pos = 2 + (((disp.height4)/5)*i)
# Draw subcribers/followers/…
draw.text((x_pos, y_pos), subscribers[i], font=font, fill=255)
# Draw the image buffer
disp.image(image)
disp.display()
def display_network():
# Collect network information by parsing command line outputs
ipaddress = os.popen(«ifconfig wlan0 | grep ‘inet addr’ | awk -F: ‘{print $2}’ | awk ‘{print $1}’«).read()
netmask = os.popen(«ifconfig wlan0 | grep ‘Mask’ | awk -F: ‘{print $4}’«).read()
gateway = os.popen(«route -n | grep ‘^0.0.0.0’ | awk ‘{print $2}’«).read()
ssid = os.popen(«iwconfig wlan0 | grep ‘ESSID’ | awk ‘{print $4}’ | awk -F\\ ‘{print $2}’«).read()
# Clear image buffer by drawing a black filled box
draw.rectangle((0,0,width,height), outline=0, fill=0)
# Set font type and size
font = ImageFont.truetype(Minecraftia.ttf, 12)
# Position SSID
x_pos = 2
y_pos = 2
# Draw SSID
draw.text((x_pos, y_pos), ssid, font=font, fill=255)
# Set font type and size
font = ImageFont.truetype(Minecraftia.ttf, 8)
# Position IP
y_pos += 12 + 10
# Draw IP
draw.text((x_pos, y_pos), «IP: «+ipaddress, font=font, fill=255)
# Position NM
y_pos += 10
# Draw NM
draw.text((x_pos, y_pos), «NM: «+netmask, font=font, fill=255)
# Position GW
y_pos += 10
# Draw GW
draw.text((x_pos, y_pos), «GW: «+gateway, font=font, fill=255)
# Draw the image buffer
disp.image(image)
disp.display()
def display_custom(text):
# Clear image buffer by drawing a black filled box
draw.rectangle((0,0,width,height), outline=0, fill=0)
# Set font type and size
font = ImageFont.truetype(Minecraftia.ttf, 8)
# Position SSID
x_pos = (width/2) (string_width(font,text)/2)
y_pos = (height/2) (8/2)
# Draw SSID
draw.text((x_pos, y_pos), text, font=font, fill=255)
# Draw the image buffer
disp.image(image)
disp.display()
def string_width(fontType,string):
string_width = 0
for i, c in enumerate(string):
char_width, char_height = draw.textsize(c, font=fontType)
string_width += char_width
return string_width
# Set up GPIO with internal pull-up
GPIO.setmode(GPIO.BCM)
GPIO.setup(12, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# 128×64 display with hardware I2C
disp = Adafruit_SSD1306.SSD1306_128_64(rst=24)
# Initialize library
disp.begin()
# Get display width and height
width = disp.width
height = disp.height
# Clear display
disp.clear()
disp.display()
# Create image buffer with mode ‘1’ for 1-bit color
image = Image.new(1, (width, height))
# Load default font
font = ImageFont.load_default()
# Create drawing object
draw = ImageDraw.Draw(image)
prev_millis = 0
prev_social = 0
display = 0
time_format = True
while True:
millis = int(round(time.time() * 1000))
# Software debouncing
if((millis prev_millis) > 250):
# Cycle through different displays
if(not GPIO.input(12)):
display += 1
if(display > 2):
display = 0
prev_millis = int(round(time.time() * 1000))
# Trigger action based on current display
elif(not GPIO.input(16)):
if(display == 0):
# Toggle between 12/24h format
time_format = not time_format
time.sleep(0.01)
elif(display == 1):
# Reconnect to network
display_custom(«reconnecting wifi …«)
os.popen(«sudo ifdown wlan0; sleep 5; sudo ifup –force wlan0«)
time.sleep(0.01)
elif(display == 2):
# Refresh social media now
display_custom(«fetching data …«)
display_social()
time.sleep(0.01)
prev_millis = int(round(time.time() * 1000))
if(display == 0):
display_time()
prev_social = 0
elif(display == 1):
display_network()
prev_social = 0
elif(display == 2):
# Only fetch social media data every 5 minutes when active
if((millis prev_social) > 300000):
display_custom(«fetching data …«)
display_social()
prev_social = millis
time.sleep(0.1)

 

El uso de una pantalla OLED Adafruit, dos pulsadores, un dongle wifi y un pi Cero, permite como vemos  una pantalla de información conectada a internet. La información podría ser cualquier cosa: fecha y hora, el clima, el estado de las redes sociales, etc … Los dos botones se utilizan para desplazarse por los datos y desencadenar ciertas acciones.
Sin duda el abanico de posibilidades es inmenso..