chiffrer et sécuriser mariadb

50
Ubuntu paris 1610 - Chiffrer et sécuriser MariaDB Christophe Villeneuve @hellosct1 Le 13 novembre 2016

Upload: christophe-villeneuve

Post on 16-Apr-2017

506 views

Category:

Internet


1 download

TRANSCRIPT

Page 1: Chiffrer et sécuriser MariaDB

Ubuntu paris 1610 -

Chiffrer et sécuriserMariaDB

Christophe Villeneuve@hellosct1

Le 13 novembre 2016

Page 2: Chiffrer et sécuriser MariaDB

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

Page 3: Chiffrer et sécuriser MariaDB

Ubuntu paris 1610 -

Aujourd'hui

● Les possibilités de MariaDB● La sécurité● Le chiffrement

Page 4: Chiffrer et sécuriser MariaDB
Page 5: Chiffrer et sécuriser MariaDB

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

Page 6: Chiffrer et sécuriser MariaDB

Ubuntu paris 1610 -

GO MariaDB

Page 7: Chiffrer et sécuriser MariaDB

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

Page 8: Chiffrer et sécuriser MariaDB

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

Page 9: Chiffrer et sécuriser MariaDB

Ubuntu paris 1610 -

Moteur de stockagestorage engine

Page 10: Chiffrer et sécuriser MariaDB

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

Page 11: Chiffrer et sécuriser MariaDB

Ubuntu paris 1610 -

TokuDB : exemple

Page 12: Chiffrer et sécuriser MariaDB

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

Page 13: Chiffrer et sécuriser MariaDB

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 |

+---------------+---------------+-------------+

Page 14: Chiffrer et sécuriser MariaDB

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)

Page 15: Chiffrer et sécuriser MariaDB

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';

Page 16: Chiffrer et sécuriser MariaDB

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

Page 17: Chiffrer et sécuriser MariaDB

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

Page 18: Chiffrer et sécuriser MariaDB

Ubuntu paris 1610 -

CassandraSE : Utilisation (1/2)

> create table t2 (rowkey varchar(36) primary key,

data1 varchar(60),data2 varchar(60)) engine=cassandrakeyspace='mariadbtest'thrift_host='localhost'column_family='cf1';

Clé primaire obligatoire

Colonnes statiques

Sous ensemble des colonnes CF

Page 19: Chiffrer et sécuriser MariaDB

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';

Page 20: Chiffrer et sécuriser MariaDB

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

Page 21: Chiffrer et sécuriser MariaDB

Ubuntu paris 1610 -

NewSQL

Page 22: Chiffrer et sécuriser MariaDB

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

Page 23: Chiffrer et sécuriser MariaDB

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

Page 24: Chiffrer et sécuriser MariaDB

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

Page 25: Chiffrer et sécuriser MariaDB

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

Page 26: Chiffrer et sécuriser MariaDB

Ubuntu paris 1610 -

Utilisation / Installation

Page 27: Chiffrer et sécuriser MariaDB

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

Page 28: Chiffrer et sécuriser MariaDB

Ubuntu paris 1610 -

✔ sudo apt-get install mariadb-server mariadb-client

✔ Vous retrouvez :✔ /etc/mysql/my.cnf✔ > mysql

✔ Au final

Linux

Page 29: Chiffrer et sécuriser MariaDB

Ubuntu paris 1610 -

sécuriser

Page 30: Chiffrer et sécuriser MariaDB

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

Page 31: Chiffrer et sécuriser MariaDB

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

Page 32: Chiffrer et sécuriser MariaDB

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/

Page 33: Chiffrer et sécuriser MariaDB

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/

Page 34: Chiffrer et sécuriser MariaDB

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

AttentionSi un des serveurs n'est pas configuré pour les connexions sécurisés → les connexions ne seront pas cryptées

Page 35: Chiffrer et sécuriser MariaDB

Ubuntu paris 1610 -

Réplication : exemple (1/3)

● Création SSL dans chaque serveursudo 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

Page 36: Chiffrer et sécuriser MariaDB

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ésultatserver-cert.pem: OK

client-cert.pem: OK

● Copier le certificat vers les autres serveurssudo scp /etc/mariadb/ssl/*.pem [email protected]:/etc/mariadb/ssl/

● Installation MariaDBsudo apt-get install mariadb mariadb-server -y

Page 37: Chiffrer et sécuriser MariaDB

Ubuntu paris 1610 -

Réplication : exemple (3/3)

● Configuration de my.cnf – pour chaque serveur

# SSLssl-ca=/etc/mariadb/ssl/ca-cert.pem

ADD under [mysqld]:# SSLssl-ca=/etc/mariadb/ssl/ca-cert.pemssl-cert=/etc/mariadb/ssl/server-cert.pemssl-key=/etc/mariadb/ssl/server-key.pem

CHANGE under [mysqld]:server-id = 1log-bin=mysql-binbinlog_format=mixed

Pas de modifications (processus identique) pour :La réplication / MariaDB Galera Cluster

Page 38: Chiffrer et sécuriser MariaDB

Ubuntu paris 1610 -

Le chiffrement

Page 39: Chiffrer et sécuriser MariaDB

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';

Page 40: Chiffrer et sécuriser MariaDB

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

Page 41: Chiffrer et sécuriser MariaDB

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/

Page 42: Chiffrer et sécuriser MariaDB

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

Page 43: Chiffrer et sécuriser MariaDB

Ubuntu paris 1610 -

config MariaDB : my.cnf

[mysqld]

plugin-load-add=file_key_management.sofile-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

Page 44: Chiffrer et sécuriser MariaDB

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 sensiblePassword...

● En mode fixe

Page 45: Chiffrer et sécuriser MariaDB

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

Page 46: Chiffrer et sécuriser MariaDB

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/

Page 47: Chiffrer et sécuriser MariaDB

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

Page 48: Chiffrer et sécuriser MariaDB

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;

Page 49: Chiffrer et sécuriser MariaDB

Ubuntu paris 1610 -

En résumé

Page 50: Chiffrer et sécuriser MariaDB

Ubuntu paris 1610 -

Merci

Questions

Christophe Villeneuve@hellosct1

Supports :

- MariaDB