La sécurité des données est un enjeu majeur à l'heure du "tout sur le Cloud". Pouvoir utiliser le Cloud peut être une bonne chose mais il est parfois vital de crypter ses documents avant de les exposer à des tiers.
AKT est un outil simple permettant de signer et crypter les données utilisateurs. Les contenus sont découpés en blocs de moins de 4K et chaque bloc encrypté en AES-256 avec sa propre clef (ChaCha20 sera proposé bientôt). Une signature HMAC-256 pour chaque bloc permet de certifier que celui-ci n'a pas été altéré. L'utilisation d'une clef de chiffrement différente pour encrypter chaque bloc permet d’accroître la sécurité: il est nécessaire de disposer de toutes les clefs de tous les blocs pour déchiffrer un contenu.
AKT utilise un portefeuille de clefs pour conserver les clefs et les informations de chiffrements. Le portefeuille est protégé soit par un mot de passe utilisateur soit par une clef GPG de l'utilisateur. Comme pour le système de chiffrement LUKS, le portefeuille peut être protégé par plusieurs mots de passe ou clefs GPG. Il est donc possible de partager le portefeuille entre plusieurs utilisateurs sans que ceux-ci soient obligés de partager leur mot de passe.
Pour une sécurité maximale, le portefeuille de clefs peut être séparé des données. Il est donc possible de mettre les donnés signées et cryptées sur le Cloud, sans exposer le portefeuille de clefs à des tiers.
AKT est écrit en Ada 2012 afin de garantir un maximum de sûreté de fonctionnement et éviter de nombreuses vulnérabilités (par exemple pas de "buffer overflow").
AKT est distribué avec la license Apache version 2, les sources sont disponibles dans GitHub: https://github.com/stcarrez/ada-keystore.
5. https://github.com/stcarrez/ada-keystore 5
Pourquoi AKT?
● Plusieurs besoins :
– stocker les paramètres sensibles d’un serveur
écrit en Ada
– sauver des numéros de comptes, mots de
passe
– sauver des documents cryptés complets sans
exposer les clefs
6. https://github.com/stcarrez/ada-keystore 6
Pourquoi Ada?
● Ada n’est pas qu’un vieux langage : Ada 2012
● Ada n’est pas que pour les militaires, l’aviation
● Ada est fortement typé et détecte les erreurs de
programmation
● Moins de CWE
(Common Weakness Enumeration)
– Pas de buffer overflow (CWE 120)
8. https://github.com/stcarrez/ada-keystore 8
AKT: avec plusieurs clefs
Directory key
Master key block
Data info key
Data key key
Data keys
Data keys
Signature key
User password
GPG protected
key
Data fragment
Data fragment
Data fragment
Data fragment
Data fragment
Directory keys Encrypted Data
9. https://github.com/stcarrez/ada-keystore 9
AKT: des keystores récursifs
Directory key
Master key block
Data info key
Data key key
Data keys
Data keys
Signature key
Second key
First key
Directory keys
Directory key
Master key block
Data info key
Data key key
Signature key
10. https://github.com/stcarrez/ada-keystore 10
AKT: des blocs sans chaine
HMAC-256HDR
(1815-12-10)
(1852-11-27)
Ada
HMAC-256UUID
Storage
ID
HDR Data Storage Info + HMAC
Directory Name Entry Data block indexes & keys
HMAC-256HDR Data fragment info HMAC-256 Data Fragment
Header block
Directory block
Data block
Master key block
...
HMAC-256HDR Wallet info Key slot 1UUID Key slot 7...
4K
11. https://github.com/stcarrez/ada-keystore 11
AKT: protection des clefs (1)
Wallet master key slot N (512 bytes)
key slot Nsalt key N
HMAC
256
= ?
AES-256
CBC
Wallet Master Keys
(32 bytes) (240 bytes)
key key
(256 bits)
key IV
(128 bits)
dat key
(256 bits)
dat IV
(128 bits)
dir key
(256 bits)
dir IV
(128 bits)
Wallet master key block
AES-256
CBC
PBKDF2
HMAC
256
ctr slot N
(4 bytes)
Sign N HMAC
(32 bytes) (32 bytes)
PBKDF2
HMAC
256
(4 bytes)
salt IV N
(32 bytes)
HMAC-256HDR Wallet info Key slot 1UUID Key slot 7...
Wallet Header Key, wallet header IV, Block ID
User password NO, invalid
password
YES, valid password
dir sign
(256 bits)
dat sign
(256 bits)
key sign
(256 bits)
Key
IV
HMAC
256
= ?
NO, invalid
block
YES, valid block
Wallet Sign
12. https://github.com/stcarrez/ada-keystore 12
AKT: protection des clefs (2)
Wallet master key slot N (512 bytes)
key slot N
HMAC
256
= ?
AES-256
CBC
Wallet Master Keys
(240 bytes)
key key
(256 bits)
key IV
(128 bits)
dat key
(256 bits)
dat IV
(128 bits)
dir key
(256 bits)
dir IV
(128 bits)
Wallet master key block
AES-256
CBC
Sign N HMAC
(32 bytes) (32 bytes)
HMAC-256HDR Wallet info Key slot 1UUID Key slot 7...
NO, invalid
password
YES, valid password
dir sign
(256 bits)
dat sign
(256 bits)
key sign
(256 bits)
Key, IV
GPG2
GPG Private key
Header block
Key
(32 bytes)
IV
(16 bytes)
IV Key
(16 bytes) (32 bytes)
(1815-12-10)
(1852-11-27)
Ada
HMAC-256UUID
Storage
ID
HDR Data Storage Info + HMAC
Sign
(32 bytes)
HMAC
256
= ? NO, invalid
block
YES, valid block
header tag
(4 bytes)
13. https://github.com/stcarrez/ada-keystore 13
AKT: protection des clefs (3)
Directory block
AES-256
CBC
HMAC-256HDR ...
Directory Key, directory IV, Block ID HMAC
256
= ?
NO, invalid
block
YES, valid block
Directory Sign
Directory Name Entry Data block indexes & keys...
Per data fragment encryption keys
Name
(N bytes)
Entry ID
(4 bytes)
key
(256 bits)
IV
(128 bits)
Block NumStore ID
(4 bytes)(4 bytes)(4 bytes)
Entry ID
HMAC-256HDR Data fragment info HMAC-256 Data Fragment HMAC-256HDR Data fragment info HMAC-256 Data Fragment
14. https://github.com/stcarrez/ada-keystore 14
AKT : à retenir
● Plusieurs clefs AES-256 pour un même document
● Intégrité par HMAC-256 sur plusieurs niveaux
● Blocs avec des classes de sécurités différentes
● Partage sécurisé entre N participants (N<=7)
15. https://github.com/stcarrez/ada-keystore 15
AKT : création du Keystore
● Protection par mot de passe :
akt create ks.akt p admin
● Protection par GPG:
akt create ks.akt gpg user
● Protection par GPG et séparation des données:
akt create ks.akt split 10 gpg user
17. https://github.com/stcarrez/ada-keystore 17
AKT : protégez vos scripts
● But : protéger une clef d’API de type OAuth2:
akt set ks.akt api.key Ahn1kos8Ahn1k
● Utiliser akt get pour l’obtenir:
key=`akt get ks.akt api.key`
18. https://github.com/stcarrez/ada-keystore 18
AKT : pas de secret dans le code
● Intégration python
import subprocess
result = subprocess.run([‘akt’, ‘get’,
‘ks.akt’, ‘api.key’],
stdout=subprocess.PIPE)
key = result.stdout
19. https://github.com/stcarrez/ada-keystore 19
AKT : une sauvegarde sécurisée
● Création de la sauvegarde:
tar czf . | akt store ks.akt backup
● Extraction:
akt extract ks.akt backup | tar xzf
20. https://github.com/stcarrez/ada-keystore 20
AKT : un partage sécurisé
● Importer les clefs GPG des participants
● Création du keystore:
akt create ks.akt gpg keyid1 keyid2
● Chaque participant utilise sa propre clef GPG
privée
akt store ks.akt documents.zip
21. https://github.com/stcarrez/ada-keystore 21
AKT : évolutions
● Support de ChaCha20 (alternative à AES-256)
● Support de SmartCart/PKCS#11
● Scellement des blocs avec arbre de Merkle
● Intégration avec le Cloud dans GAKT
22. https://github.com/stcarrez/ada-keystore 22
Conclusion
● Pas de post-it pour les mots de passe
● Pas d’excuse pour les clefs d’API dans GitHub
● AKT pour crypter vos documents sur le Cloud !
● Disponible pour GNU/Linux, FreeBSD, NetBSD
● Open Source, Contributions Welcome !,
License Apache 2.0
● Documentation
– https://ada-keystore.readthedocs.io/en/latest/