Database
 sql >> Base de données >  >> RDS >> Database

Votre base de données est-elle sécurisée ? Détrompez-vous

1. Sécurisez votre serveur

De nombreuses attaques connues ne sont possibles qu'une seule fois en accédant physiquement à une machine. Pour cette raison, il est préférable d'avoir le serveur d'applications et le serveur de base de données sur des machines différentes. Si cela n'est pas possible, il faut être plus prudent, sinon, en exécutant des commandes à distance via un serveur d'application, un attaquant peut être en mesure d'endommager votre base de données même sans autorisations. Pour cette raison, tout service s'exécutant sur la même machine que la base de données doit se voir accorder l'autorisation la plus faible possible qui permet toujours au service de fonctionner.


N'oubliez pas d'installer l'ensemble du package de sécurité :antivirus et anti-spam, pare-feu et tous les packages de sécurité recommandés par le fournisseur de votre système d'exploitation. N'oubliez pas non plus de passer 10 minutes à réfléchir à l'emplacement physique de votre serveur - au mauvais endroit, votre serveur peut être volé, inondé, endommagé par des animaux sauvages ou des vagabonds.

2. Localhost Security ou Désactiver ou restreindre l'accès à distance

Demandez-vous si MySQL sera extrait du système ou directement accessible depuis son propre serveur. Si l'accès à distance est utilisé, assurez-vous que seuls les hôtes caractérisés peuvent accéder au serveur. Cela se fait généralement via des wrappers TCP, des tables IP ou d'autres outils de programmation de pare-feu ou d'accessibilité matérielle.
Pour empêcher MySQL d'ouvrir un socket réseau, le paramètre qui l'accompagne doit être inclus dans la zone [mysqld] de my.cnf ou my.ini :

sauter le réseau

Le document est situé dans le dossier "C:\Program Files\MySQL\MySQL Server 5.1" catalogue sur le système d'exploitation Windows ou "/etc/my.cnf" ou "/etc/mysql/my.cnf" sur Linux.
Cette ligne paralyse le démarrage de l'administration système au milieu du démarrage de MySQL. L'idéal serait de garder à l'esprit qu'une connexion locale peut être utilisée pour établir une connexion au serveur MySQL.

Une autre solution possible est de forcer MySQL à n'écouter que l'hôte local en ajoutant la ligne suivante dans le [mysqld] section de mon.cnf adresse-liaison=127.0.0.1
Vous n'êtes peut-être pas disposé à empêcher l'accès système à votre serveur de base de données si les clients de votre organisation s'interfacent avec le serveur à partir de leurs machines ou du serveur Web introduit sur une autre machine. Dans ce cas, la syntaxe d'attribution restrictive suivante doit être prise en compte :

mysql> GRANT SELECT, INSERT ON mydb.\* TO 'someuser'@'somehost';  

3. Désactiver l'utilisation de LOCAL INFILE

La prochaine modification consiste à désactiver l'utilisation de "LOAD DATA LOCAL INFILE" commande, ce qui aidera à garder la lecture non approuvée des registres du quartier. Ceci est particulièrement vital lorsque de nouvelles vulnérabilités d'injection SQL dans les applications PHP sont découvertes.
De plus, dans certains cas, le "LOCAL INFILE" La commande peut être utilisée pour accéder à d'autres fichiers sur le système d'exploitation, par exemple "/etc/passwd" , à l'aide de la commande suivante :

mysql> LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE table1

Ou même nettement moins difficile :

mysql> SELECT load\_file("/etc/passwd")

Pour désactiver l'utilisation de "LOCAL INFILE" commande, le paramètre suivant doit être ajouté dans le [mysqld] section du fichier de configuration MySQL.

set-variable=local-infile=0

4. Changez le nom d'utilisateur et le mot de passe root, gardez-les forts.

Le nom d'utilisateur par défaut de l'administrateur sur le serveur MySQL est "root" . Les pirates tentent souvent d'accéder à ses autorisations. Pour rendre cette tâche plus difficile, renommez "root" à autre chose et fournissez-lui un mot de passe alphanumérique long et complexe.

Pour renommer le nom d'utilisateur de l'administrateur, utilisez la commande rename dans la console MySQL :

mysql> RENAME USER root TO new\_user;

Le MySQL "RENOMMER L'UTILISATEUR" La commande est apparue pour la première fois dans MySQL version 5.0.2. Si vous utilisez une ancienne version de MySQL, vous pouvez utiliser d'autres commandes pour renommer un utilisateur :

mysql> use mysql;

mysql> update user set user="new\_user" where user="root";

mysql> flush privileges;

Pour modifier le mot de passe d'un utilisateur, utilisez la commande de ligne de commande suivante :

mysql> SET PASSWORD FOR 'username'@'%hostname' = PASSWORD('newpass');

Il est aussi possible de changer le mot de passe en utilisant le "mysqladmin" utilitaire :

shell> mysqladmin -u username -p password newpass

5. Supprimer la base de données "Test"

MySQL est livré avec une base de données "test" destinée à servir d'espace de test. Il est accessible par l'utilisateur anonyme, et est donc utilisé par de nombreuses attaques.
Pour supprimer cette base de données, utilisez la commande drop comme suit :

mysql> drop database test;  

Ou utilisez le "mysqladmin" commande :

shell> mysqladmin -u username -p drop test  

6. Supprimer les comptes anonymes et obsolètes

La base de données MySQL est livrée avec des utilisateurs anonymes avec des mots de passe vides. Par conséquent, n'importe qui peut se connecter à la base de données pour vérifier si c'est le cas, procédez comme suit :

mysql> select \* from mysql.user where user="";  

Dans un système sécurisé, aucune ligne ne doit être renvoyée en écho. Une autre façon de faire la même chose :

mysql> SHOW GRANTS FOR ''@'localhost';

mysql> SHOW GRANTS FOR ''@'myhost';

Si les autorisations existent, alors n'importe qui peut accéder à la base de données et au moins utiliser la base de données par défaut"test" . Vérifiez ceci avec :

shell> mysql -u blablabla

Pour supprimer le compte, exécutez la commande suivante :

mysql> DROP USER "";

Le MySQL "DROP USER" La commande est prise en charge à partir de MySQL version 5.0. Si vous utilisez une ancienne version de MySQL, vous pouvez supprimer le compte comme suit :

mysql> use mysql;

mysql> DELETE FROM user WHERE user="";

mysql> flush privileges;  

7. Augmentez la sécurité avec le contrôle d'accès basé sur les rôles

Une recommandation de sécurité de base de données très courante consiste à réduire les autorisations accordées aux différentes parties. MySQL n'est pas différent. En règle générale, lorsque les développeurs travaillent, ils utilisent l'autorisation maximale du système et accordent moins d'importance aux principes d'autorisation que ce à quoi nous pourrions nous attendre. Cette pratique peut exposer la base de données à des risques importants.
* Toute nouvelle installation de MySQL 5.x déjà installée en utilisant les mesures de sécurité appropriées.
Pour protéger votre base de données, assurez-vous que le répertoire de fichiers dans lequel la base de données MySQL est réellement stockée appartient à l'utilisateur "mysql" et au groupe "mysql".

shell>ls -l /var/lib/mysql

De plus, assurez-vous que seuls les utilisateurs "mysql" et "root" ont accès au répertoire /var/lib/mysql .
Les binaires mysql, qui résident sous le répertoire /usr/bin/, doivent appartenir à "root" ou à l'utilisateur système spécifique "mysql". Les autres utilisateurs ne doivent pas avoir accès en écriture à ces fichiers.

shell>ls -l /usr/bin/my\*  

8. Gardez un contrôle sur les privilèges de la base de données

Les autorisations du système d'exploitation ont été corrigées dans la section précédente. Parlons maintenant des autorisations de base de données. Dans la plupart des cas, il y a un utilisateur administrateur (le "root" renommé) et un ou plusieurs utilisateurs réels qui coexistent dans la base de données. Habituellement, la « racine » n'a rien à voir avec les données de la base de données; au lieu de cela, il est utilisé pour maintenir le serveur et ses tables, pour donner et révoquer des autorisations, etc.
D'autre part, certains identifiants d'utilisateur sont utilisés pour accéder aux données, tels que l'identifiant d'utilisateur attribué au serveur Web pour exécuter des requêtes "select\update\insert\delete" et pour exécuter des procédures stockées. Dans la plupart des cas, aucun autre utilisateur n'est nécessaire; cependant, seul vous, en tant qu'administrateur système, pouvez vraiment connaître les besoins de votre application.

Seuls les comptes administrateur doivent disposer des privilèges SUPER / PROCESS /FILE et accéder à la base de données mysql. En règle générale, il est judicieux de réduire les autorisations de l'administrateur pour accéder aux données.

Passez en revue les privilèges des autres utilisateurs et assurez-vous qu'ils sont correctement définis. Cela peut être fait en suivant les étapes suivantes.

mysql> use mysql;  

[Identifier les utilisateurs]

mysql> select \* from users;  

[Liste des subventions de tous les utilisateurs]

mysql> show grants for ‘root’@’localhost’;

L'instruction ci-dessus doit être exécutée pour chaque utilisateur ! Notez que seuls les utilisateurs qui ont vraiment besoin des privilèges root doivent en bénéficier.

Un autre privilège intéressant est « AFFICHER LES BASES DE DONNÉES ». Par défaut, la commande peut être utilisée par toute personne ayant accès à l'invite MySQL. Ils peuvent l'utiliser pour collecter des informations (par exemple, obtenir des noms de base de données) avant d'attaquer la base de données, par exemple en volant les données. Pour éviter cela, il est recommandé de suivre les procédures décrites ci-dessous.

  • Ajoutez " --skip-show-database" au script de démarrage de MySQL ou ajoutez-le au fichier de configuration MySQL
  • Accordez le privilège SHOW DATABASES uniquement aux utilisateurs auxquels vous souhaitez utiliser cette commande

Pour désactiver l'utilisation de la commande "SHOW DATABASES", le paramètre suivant doit être ajouté dans la section [mysqld] du /etc/my.cnf :

[mysqld]

skip-show-database  

9. Activer la journalisation

Si votre serveur de base de données n'exécute pas beaucoup de requêtes, il est recommandé d'activer la journalisation des transactions en ajoutant la ligne suivante à la section [mysqld] du /etc/my.cnf fichier :

[mysqld]

log =/var/log/mylogfile  

Ceci n'est pas recommandé pour les serveurs MySQL à forte production car cela entraîne une surcharge élevée sur le serveur.
De plus, vérifiez que seuls les identifiants "root" et "mysql" ont accès à ces fichiers journaux (au moins un accès en écriture).

Journal des erreurs Assurez-vous que seuls "root" et "mysql" ont accès au fichier journal "hostname.err". Le fichier est stocké dans le répertoire de données mysql. Ce fichier contient des informations très sensibles telles que des mots de passe, des adresses, des noms de table, des noms de procédure stockée et des parties de code. Il peut être utilisé pour collecter des informations et, dans certains cas, peut fournir à l'attaquant les informations nécessaires pour exploiter la base de données, la machine sur laquelle la base de données est installée ou les données qu'elle contient.

Journal MySQL Assurez-vous que seuls "root" et "mysql" ont accès au fichier journal "logfile XY". Le fichier est stocké dans le répertoire de données mysql.

10. Changer le répertoire racine

Un chroot sur les systèmes d'exploitation UNIX {système d'exploitation} est une opération qui modifie le répertoire racine apparent du disque pour la méthode en cours d'exécution et ses enfants. Un programme qui est ré-enraciné dans un répertoire différent ne peut pas accéder ou nommer des fichiers en dehors de ce répertoire, et par conséquent le répertoire est appelé une "prison chroot" ou (moins communément) une "prison chroot".

En utilisant l'environnement chroot, l'accès en écriture des processus mySQL (et des processus enfants) peut être limité, ce qui augmente la sécurité du serveur.

Assurez-vous qu'un répertoire dédié existe pour l'environnement chrooté. Cela devrait ressembler à :/chroot/mysql De plus, pour faciliter l'utilisation des outils d'administration de la base de données, le paramètre suivant doit être modifié dans la section [client] du fichier de configuration MySQL :

[client]

socket = /chroot/mysql/tmp/mysql.sock

Grâce à cette ligne de code, il ne sera plus nécessaire de fournir les commandes mysql, mysqladmin, mysqldump etc. avec le --socket=/chroot/mysql/tmp/mysql.sock paramètre à chaque exécution de ces outils.

11. Supprimez régulièrement les anciens journaux

Au cours des procédures d'installation, de nombreuses données sensibles aideront les utilisateurs indésirables à attaquer une base de données. Ces données sont conservées dans l'historique du serveur et peuvent être extrêmement utiles en cas de problème lors de l'installation. En analysant les fichiers d'historique, les administrateurs peuvent comprendre ce qui ne va pas et probablement réparer les choses. Cependant, ces fichiers ne sont plus nécessaires une fois l'installation terminée.
Nous devrions supprimer le contenu du fichier d'historique MySQL (~/.mysql_history), partout où toutes les commandes SQL mortes sont conservées (en particulier les mots de passe, qui sont conservés en texte brut) :

cat /dev/null > ~/.mysql\_history

En conclusion, nous devons insister sur la sécurité des bases de données. Cependant, cela devrait être la première chose pour tout individu ou entreprise.