Chiffrer et sécuriser MariaDB

344 vues

Publié le

Chiffrer et sécuriser MariaDB - Présentation effectuée à "Ubuntu Paris 1610" par Christophe Villeneuve
MariaDB est la base de données NewSQL (NoSQL + SQL) et libre à utiliser au quotidien

Publié dans : Internet
0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
344
Sur SlideShare
0
Issues des intégrations
0
Intégrations
2
Actions
Partages
0
Téléchargements
4
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Chiffrer et sécuriser MariaDB

  1. 1. Ubuntu paris 1610 - Chiffrer et sécuriser MariaDB Christophe Villeneuve @hellosct1 Le 13 novembre 2016
  2. 2. Qui ??? Christophe Villeneuve mozilla reps - firefox os - B2GOS - ausy - afup – lemug.fr – mysql – mariadb – drupal – demoscene – firefoxos – drupagora – phptour – forumphp – solutionlinux – Libre@toi – eyrolles – editions eni – programmez – linux pratique – webriver – phptv – elephpant - owasp -security
  3. 3. Ubuntu paris 1610 - Aujourd'hui ● Les possibilités de MariaDB ● La sécurité ● Le chiffrement
  4. 4. Ubuntu paris 1610 - ✔ Fondé par ✔ Monty Widenius ✔ David Axmark ✔ 1983 – 1ère idée ✔ Fondé en 1995 ✔ 2007 Préparation pour Nasdaq ✔ 2008 Rachat par Sun ✔ 2009 Sun racheté par Oracle ✔ Promesse de Oracle sur 5 ans (fin 2014) L'origine Dates importantes Histoire de début
  5. 5. Ubuntu paris 1610 - GO MariaDB
  6. 6. Ubuntu paris 1610 - ✔ Communauté d'amis ✔ 100 % Open source et compatible MySQL ✔ Plateforme d'innovation ✔ Des commiteurs ✔ Dec 2008 Création de Monty  Program   → Monty Widenius ✔ MariaDB 5.1 (Fev 2010) ✔ MariaDB 5.2 (Nov 2010) ✔ MariaDB 5.3 (Avril 2012) ✔ MariaDB 5.5 (Avril 2012) ✔ MariaDB 10.0 (Mars 2013) ✔ 2013 Fondation ✔ MariaDB 10.1 (fin 2013)Galera people Compression Multimaster Replication MariaDB : un jeune projet... MATURE
  7. 7. Ubuntu paris 1610 - ✔ PHP (driver natif) → BSD licence ✔ Python ✔ Perl ✔ Ruby ✔ .NET avec MyODBC ✔ JDBC (basé sur drizzle driver) ✔ C ✔ Oracle connector (licence GPL) Tous sont LGPL → Aucune licence commerciale Différents connecteurs avec MariaDB
  8. 8. Ubuntu paris 1610 - Moteur de stockage storage engine
  9. 9. Ubuntu paris 1610 - Insertion de données : TokuDB ● Moteur de stockage ● Natif dans MariaDB 5.5 & MariaDB 10.0+ ● (R)Tokutek & MariaDB ● Technique utilise l'arbre fractal – Amélioration indexation – Amélioration des requêtes ● Schéma de vitesse ● Compression ● Réplication ● Souple
  10. 10. Ubuntu paris 1610 - TokuDB : exemple
  11. 11. Ubuntu paris 1610 - Manipuler les données : Connect ● Dispo MariaDB 10.0+ ● ETL : Extract, transform et Load ● Lecture / Ecriture / MAJ – TXT, DBF, INI, XML – MS Access, MS Excel, TBL (similaire à MERGE) – ODBC, MySQL,SQLite, Oracle, DB2, WMI... ● Locale ou distant ● Custom possible ● Accès en parallèle sur multitables ● Installation dans My.cnf [mysqld] plugin-load=ha_connect.so
  12. 12. Ubuntu paris 1610 - Connect : exemple CSV ● Fichier – first,last,birthday – "Christophe","Villeneuve","Jan 1" – "PHP","ODBC","Nov 22" > CREATE TABLE users_csv ( first varchar(32) NOT NULL, last varchar(32) NOT NULL, birthday varchar(50) NOT NULL ) ENGINE=CONNECT TABLE_TYPE =CSV FILE_NAME ='/var/lib/mysql/users.csv' HEADER=1 SEP_CHAR=',' QUOTED=1; > SELECT * FROM users_csv; | first | last | birthday | +---------------+---------------+-------------+ | Christophe | Villeneuve | Jan 1 | | PHP | ODBC | Nov 22 | +---------------+---------------+-------------+
  13. 13. Ubuntu paris 1610 - Connect : exemple ODBC > create Table table2 ENGINE=CONNECT TABLE_TYPE=ODBC SRCDEF='select key, sum(l_quantity) qt from dbt3.table1 group by key' CONNECTION='DSN=oracle;UID=login;PWD=password'; > MariaDB [dbt3]> select sum(qt) from (select qt from table2) as result; → 31444 Valeur de sum(qt)
  14. 14. Ubuntu paris 1610 - Recherche SphinxSE ● Dispo MariaDB 5.2+ ● Recherche Full-text ● Ne stocke pas les données ● Client haut pour permettre à MariaDB de parler à Sphinx searchd ● Installation dans My.cnf [mysqld] plugin-load= 'ha_sphinx.so';
  15. 15. Ubuntu paris 1610 - Exemple SphinxSE ● CREATE TABLE t1 ( id INTEGER UNSIGNED NOT NULL, weight INTEGER NOT NULL, query VARCHAR(3072) NOT NULL, group_id INTEGER, INDEX(query) ) ENGINE=SPHINX CONNECTION="sphinx://localhost:9312/test"; ● SELECT * FROM t1 WHERE query='test it;mode=any'; Poids Entier Votre requete Indexation Requete Group
  16. 16. Ubuntu paris 1610 - Ouverture vers le NewSQL ● Moteur de stockage : CassandraSE ● Dispo MariaDB 10.0+ ● Brique de Apache Cassandra ● Données non relationnelles (NoSQL) ● Assurer l'intégration des données SQL / NoSQL ● Mapping possible ● Manipulations : static columns, dynamic columns, rowkey ● Installation dans My.cnf [mysqld] plugin-load=ha_cassandra.so
  17. 17. Ubuntu paris 1610 - CassandraSE : Utilisation (1/2) > create table t2 (rowkey varchar(36) primary key, data1 varchar(60), data2 varchar(60) ) engine=cassandra keyspace='mariadbtest' thrift_host='localhost' column_family='cf1'; Clé primaire obligatoire Colonnes statiques Sous ensemble des colonnes CF
  18. 18. Ubuntu paris 1610 - CassandraSE : Utilisation (2/2) > insert into t1 values ('rowkey10', 'data1-value', 123456), ('rowkey11', 'data1-value2', 34543); > select * from t1 where rowkey='rowkey11';
  19. 19. Ubuntu paris 1610 - XA en Spider ● Dispo MariaDB 10.0+ ● Moteur de stockage fédérés comme – Sharding / partitionnement * – Transactions * – Intégré dans le pool de connexion – Haute disponibilité Cluster Shared­Nothing   ● Load balancing :  – Accès par Spider cluster avec plusieurs serveurs  MariaDB
  20. 20. Ubuntu paris 1610 - NewSQL
  21. 21. Ubuntu paris 1610 - ✔ Pont entre les BDD relationnelles et non relationnelles ✔ Toutes les colonnes stockées dans un « blob » ✔ Possibilité de le manipuler ✔ Possibilité de créer des index Virtuels Colonnes Dynamiques
  22. 22. Ubuntu paris 1610 - create table newsql(  id int      auto_increment         primary key, nom varchar(40), type enum       ('animal',      'ordinateur'), prix int, nosql blob); COLUMN_CREATE( column_nr,  value [as type], [ column_nr,  value [as type] ],  ...) Exemple (colonne dynamique) 1/3 ID nom type Prix blob Multi produits
  23. 23. Ubuntu paris 1610 - Exemple (colonne dynamique) 2/3 >INSERT into newsql values (NULL, 'Atari' ,'ordinateur',500,  COLUMN_CREATE('couleur', 'Noir', 'type' , 'STe')); >INSERT into newsql values (NULL, 'elePHPant','animal',20,  COLUMN_CREATE('taille', 'normal', 'description' , 'peluche')); >UPDATE newsql SET nosql = COLUMN_ADD(nosql, 'couleur' , 'blue')  WHERE id=2; ID Nom type prix couleur type taille description 1 Atari Ordinateur 500 Noir Ste 2 elePHPant animal 20 bleu normal peluche >SELECT nom, column_list (nosql) FROM newsql; Multi produits
  24. 24. Ubuntu paris 1610 - Exemple (colonne dynamique) 3/3 >SELECT nom, COLUMN_JSON(nosql) FROM newsql; >SELECT id,type,nom, COLUMN_GET(nosql, 'couleur' as char) AS couleur,prix FROM newsql; Multi produits
  25. 25. Ubuntu paris 1610 - Utilisation / Installation
  26. 26. Ubuntu paris 1610 - MariaDB Repositories > sudo apt-get install software-properties-common > sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db > sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://fr.mirror.babylon.network/mariadb/repo/10.1/ubuntu trusty main' https://downloads.mariadb.org/mariadb/repositories/#mirror=babylon-fr&distro=Ubuntu&distro_release=trusty--ubuntu_trusty&version=10.1
  27. 27. Ubuntu paris 1610 - ✔ sudo apt-get install mariadb-server mariadb-client ✔ Vous retrouvez : ✔ /etc/mysql/my.cnf ✔ > mysql ✔ Au final Linux
  28. 28. Ubuntu paris 1610 - sécuriser
  29. 29. Ubuntu paris 1610 - Lors de l'installation > mysql_secure_installation Enter current password for root (enter for none): ← Entrée Set root password? [Y/n] ← y New password: ← saisir nouveau Mot de passes Re-enter new password: ← resaisir Remove anonymous users? [Y/n] ← y Disallow root login remotely? [Y/n] ← y Reload privilege tables now? [Y/n] ← y
  30. 30. Ubuntu paris 1610 - Les connexions 'SSL / TLS' sécurisés disponibles ● Connexions client / serveur → protocole TLS – Les données peuvent être cryptées pendant le transfert à l'aide du protocole TLS ● Variable système SSL / TLS ● Variable d'état SSL / TLS ● Réplication avec connexions sécurisées – Maîtres / Esclaves avec des données cryptées
  31. 31. Ubuntu paris 1610 - Connexion 'SSL / TLS' ● Par défaut – Connexion non chiffré ● Si le serveur prend en charge les connexions sécurisées → OUI ● Pour activer TLS – Démarrer le serveur avec l'option --ssl > SHOW VARIABLES LIKE 'have_ssl'; +---------------+----------+ | Variable_name | Value | +---------------+----------+ | have_ssl | DISABLED | +---------------+----------+ https://mariadb.com/kb/en/mariadb/secure-connections-overview/
  32. 32. Ubuntu paris 1610 - ● Cryptage de données ● Transfert TLS ● Exemple – have_openssl – have_ssl ● Interchangeable SSL ● SSL n'est plus considéré comme sécurisé ● Exemple – ssl_ca – ssl_capath – ... Options 'SSL / TLS' Système/Status de variables Attention https://mariadb.com/kb/en/mariadb/ssltls-system-variables/ https://mariadb.com/kb/en/mariadb/ssltls-status-variables/
  33. 33. Ubuntu paris 1610 - Réplication https://mariadb.com/kb/en/mariadb/replication-with-secure-connections/ ● Maître(s) / Esclave(s) ● Répliqués des données cryptées ● Activation des connexions sécurisées (obligatoire) ● Cluster Attention Si un des serveurs n'est pas configuré pour les connexions sécurisés → les connexions ne seront pas cryptées
  34. 34. Ubuntu paris 1610 - Réplication : exemple (1/3) ● Création SSL dans chaque serveur sudo mkdir -p /etc/mariadb/ssl ● Gestion des certificats $ sudo openssl genrsa 4096 > ca-key.pem $ sudo openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca-cert.pem ● Créer un certificat de serveur sur serveur1 $ sudo openssl req -newkey rsa:4096 -days 3600 -nodes -keyout server-key.pem -out server-req.pem $ sudo openssl rsa -in server-key.pem -out server-key.pem $ sudo openssl x509 -req -in server-req.pem -days 3600 -CA ca-cert.pem -CAkey ca- key.pem -set_serial 01 -out server-cert.pem
  35. 35. Ubuntu paris 1610 - Réplication : exemple (2/3) ● Vérification des certificats (serveur1) sudo openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem ● Résultat server-cert.pem: OK client-cert.pem: OK ● Copier le certificat vers les autres serveurs sudo scp /etc/mariadb/ssl/*.pem root@10.0.0.2:/etc/mariadb/ssl/ ● Installation MariaDB sudo apt-get install mariadb mariadb-server -y
  36. 36. Ubuntu paris 1610 - Réplication : exemple (3/3) ● Configuration de my.cnf – pour chaque serveur # SSL ssl-ca=/etc/mariadb/ssl/ca-cert.pem ADD under [mysqld]: # SSL ssl-ca=/etc/mariadb/ssl/ca-cert.pem ssl-cert=/etc/mariadb/ssl/server-cert.pem ssl-key=/etc/mariadb/ssl/server-key.pem CHANGE under [mysqld]: server-id = 1 log-bin=mysql-bin binlog_format=mixed Pas de modifications (processus identique) pour : La réplication / MariaDB Galera Cluster
  37. 37. Ubuntu paris 1610 - Le chiffrement
  38. 38. Ubuntu paris 1610 - Pourquoi chiffrer ? ● Avec MySQL / MariaDB / Percona ● Mariadb → cryptage au niveau des tables – Innodb – XtraDB (Percona) $ INSERT INTO users (username, password) VALUES ('root', AES_ENCRYPT('somepassword', 'key12346123')); $ SELECT AES_DECRYPT(password, 'key12346123') FROM users WHERE username = 'admin';
  39. 39. Ubuntu paris 1610 - Chiffrement (1/2) ● Disponible pour 10.1+ ● Contribution Google ● Chiffrer – Pas de modification pour vos applications – Pas de dégradation des performances globales – Une meilleure pratique en matière de sécurité de données ● Storage engine supporté – XtraDB – InnoDB
  40. 40. Ubuntu paris 1610 - Chiffrement (2/2) ● Chiffrement : support de clefs (AES Algorithm) table individuel → PAGE_ENCRYPTION=1 tablespace encryption → Crypte tout ainsi que les logs ● Plugin : file_key_management – Plugin de cryptage – Lit les clés de cryptage d'un fichier – Options : ● File_key_management_filename → Où se trouve le fichier ● File_key_management_filekey → Clé facultative pour déchiffrer le fichier de clés ● File_key_management_encryption_algorithm → Algorithme de cryptage à utiliser. https://mariadb.com/kb/en/mariadb/data-at-rest-encryption/
  41. 41. Ubuntu paris 1610 - Avantages ● Par rapport à d'autres BDD Open Source – Chiffrement des données au repos . Chiffrement au niveau des instances et des tables . Avec support des clés tournantes (contribution Google) – Validation des mots de passe – Contrôle d'accès de base de profils (par défaut) . Renforcé et optimisé ● Type de cryptage supporté – Clefs de chiffrement identifier (32 bit) – Advanced Encryption Standard (AES) 128 / 192 / 256 bit – Exemple : $ openssl enc -aes-256-cbc -md sha1 -k secret -in keys.txt -out keys.enc
  42. 42. Ubuntu paris 1610 - config MariaDB : my.cnf [mysqld] plugin-load-add=file_key_management.so file-key-management file-key-management-filename = /home/mdb/keys.enc innodb-encrypt-tables innodb-encrypt-log innodb-encryption-threads=4 aria-encrypt-tables=1 # PAGE row format encrypt-tmp-disk-tables=1 # this is for Aria
  43. 43. Ubuntu paris 1610 - Chiffrer une table CREATE TABLE client ( client_id bigint not null primary key, client_name varchar(80), client_infosensible varchar(20) ) ENGINE=InnoDB page_encryption=1 page_encryption_key=1; Clef 1 Chiffrement 1 Information très sensible Password... ● En mode fixe
  44. 44. Ubuntu paris 1610 - Chiffrer : mode avancé ● Tablespace encrypton (Google) ● Choisir un algorithme de cryptage ● Spécifier ce qui doit être chiffrer – Innodb-encrypt-tables – Aria – Aria-encrypt-tables – Crypter-tmp-disk-tables – Innodb-encrypt-log ● Prévoir les rotations (impératif) – innodb-encryption-threads = 4 – innodb-encryption-rotate-key-age = 1800
  45. 45. Ubuntu paris 1610 - Validation du mot de passe ● Les rappels du mot de passe ● MariaDB propose : Validation de mot de passe – S'assurer que les mots de passe 'utilisateur' répondent à certaines exigences de sécurité – Plugin dédiée – Contrôle par rapport à la configuration ● Fonctions : SET PASSWORD et GRAND https://mariadb.com/kb/en/mariadb/password-validation/
  46. 46. Ubuntu paris 1610 - Exemple (1/2) SET PASSWORD = PASSWORD('plain-text password'); SET PASSWORD FOR `user`@`host` = PASSWORD('plain-text password'); SET PASSWORD = OLD_PASSWORD('plain-text password'); SET PASSWORD FOR `user`@`host` = OLD_PASSWORD('plain-text password'); CREATE USER `user`@`host` IDENTIFIED BY 'plain-text password'; GRANT privileges TO `user`@`host` IDENTIFIED BY 'plain-text password'; https://mariadb.com/kb/en/mariadb/password-validation/ SET PASSWORD = 'password hash'; SET PASSWORD FOR `user`@`host` = 'password hash'; CREATE USER `user`@`host` IDENTIFIED BY PASSWORD 'password hash'; CREATE USER `user`@`host` IDENTIFIED VIA mysql_native_password USING 'password hash'; CREATE USER `user`@`host` IDENTIFIED VIA mysql_old_password USING 'password hash'; GRANT privileges TO `user`@`host` IDENTIFIED BY PASSWORD 'password hash'; GRANT privileges TO `user`@`host` IDENTIFIED VIA mysql_native_password USING 'password hash'; GRANT privileges TO `user`@`host` IDENTIFIED VIA mysql_old_password USING 'password hash'; ● Avant ● Avec clé de hash
  47. 47. Ubuntu paris 1610 - Exemple (2/2) ● Vérification ● Erreur de validation $ UPDATE mysql.user SET password='password hash' WHERE user='user' AND host='host'; $ FLUSH PRIVILEGES; SUCCES > grant select on *.* to foobar identified by 'toto'; ERROR HY000: Your password does not satisfy the current policy requirements > show warnings;
  48. 48. Ubuntu paris 1610 - En résumé
  49. 49. Ubuntu paris 1610 - Merci Questions Christophe Villeneuve @hellosct1 Supports : - MariaDB

×