Sfondo
Sto sviluppando un servizio che consiste in un piccolo dispositivo client senza testa (ad esempio OLinuXino) che conterrà dati sensibili.
Il dispositivo verrà collegato a una rete remota (magari dietro un firewall) e il suo obiettivo è quello di aprire automaticamente un tunnel ssh inverso a un server (ad esempio, non presidiato).
Il dispositivo conterrà una chiave per connettersi al server ssh e quella chiave non dovrebbe essere utilizzata su un altro dispositivo.
Il dispositivo verrà distribuito ai clienti in modo che chiunque possa avere accesso fisico ad esso.
Non voglio che qualcuno possa ottenere i dati da un determinato dispositivo e il mio obiettivo è rallentare il recupero dei dati sensibili.
Almeno, se dovesse succedere, vorrei che il server lo rilevasse e bloccasse ogni ulteriore accesso usando la chiave da quel dato dispositivo. In realtà, se qualcuno cerca di fare qualcosa di cattivo con il dispositivo, potrei sicuramente bloccarne l'accesso (e mettere in blacklist quella persona o azienda).
Il dispositivo è una piccola macchina Linux (che esegue Debian Wheezy). Per ora non ho intenzione di utilizzare un chip resistente agli smorzatori (come descritto qui )
Avviso
Ho già sentito parlare di Mandos, ma sembra funzionare solo sulla rete locale, sebbene il mio dispositivo e il mio server si trovino su siti remoti.
Ho letto anche questa domanda: Per lo sblocco remoto dei volumi LUKS tramite SSH, come posso verificare l'integrità prima di inviare la passphrase? e sono consapevole che ciò che voglio raggiungere può essere impossibile. Ma il mio obiettivo qui è quello di aggiungere la massima sicurezza possibile a quel dispositivo.
La mia soluzione attuale: Il mio primo pensiero è quello di crittografare il volume rootfs del dispositivo per proteggere i dati su di esso (basato su questa soluzione ). Quando il dispositivo è acceso, si connette incustodito al server (con initramfs) e apre un primo tunnel ssh inverso (con una chiave per me meno importante da perdere).
Ho intenzione di rimuovere i connettori e / o i driver della tastiera o dello schermo sul dispositivo.
Il server quindi (senza supervisione):
- utilizza il tunnel inverso per connettersi al dispositivo;
- carica sul dispositivo un programma che controlla che nessun file sia stato modificato;
- carica sul dispositivo un piccolo programma che controlla l'hardware del dispositivo (indirizzo cpuid e mac) e lo esegue per ottenere queste informazioni;
- se uno dei precedenti non ha funzionato o ha restituito informazioni errate, blocca l'accesso al dispositivo e l'account del cliente (ad esempio il server non li accetterà più per connettersi), eventualmente cancella tutti i dati sul dispositivo;
- se i passaggi 2 e 3 sono andati a buon fine, decodifica il volume rootfs e consente il lancio del vero servizio di sistema;
Tutti i filesystem sul dispositivo sono montati in sola lettura usando union filesystem (aufs).
Dopodiché, il primo tunnel inverso viene chiuso e il dispositivo si avvia.
Dopo l'avvio viene aperto un nuovo tunnel con la chiave "reale". A quel tempo, i dati sensibili vengono decifrati nella RAM del dispositivo.
Il mio obiettivo: Il mio obiettivo è proteggere il rootf del dispositivo o una parte dei dati al suo interno, bloccando o rallentando chiunque voglia leggerlo.
Le mie domande
Domanda 1: quali sono i rischi della mia soluzione? quali sono gli exploit possibili per ogni passaggio?
Domanda 2: ci sono altre possibili soluzioni che sarebbero migliori per raggiungere il mio obiettivo?