MySQL est un système de base de données relationnelle multiplateforme entièrement en réseau et un système de gestion de bases de données distribuées avec une architecture client/serveur. MySQL est un système de base de données relationnelle multiplateforme entièrement en réseau et un système de gestion de bases de données distribuées avec une architecture client/serveur. Il présente les avantages de fonctions puissantes, d'une utilisation facile, d'une gestion pratique, d'une vitesse d'exécution rapide, d'une sécurité et d'une fiabilité élevées. Les utilisateurs peuvent utiliser de nombreux langages pour écrire des programmes permettant d'accéder à la base de données MySQL, en particulier lorsqu'il est combiné avec PHP, c'est un. combinaison dorée et est largement utilisé.
Puisque MySQL est une base de données multiplateforme, sa configuration par défaut doit être considérée comme applicable dans diverses situations, c'est pourquoi un renforcement supplémentaire de la sécurité doit être effectué dans notre propre environnement d'utilisation. En tant qu'administrateur système MySQL, nous sommes responsables du maintien de la sécurité et de l'intégrité des données du système de base de données MySQL.
La configuration de la sécurité de la base de données MySQL doit commencer par deux aspects : la sécurité interne du système et la sécurité du réseau externe. De plus, nous présenterons également brièvement quelques problèmes et astuces auxquels il faut prêter attention lors de la programmation.
Sécurité interne du système
Tout d’abord, présentons brièvement la structure des répertoires de la base de données MySQL. Une fois MySQL installé, le répertoire de données et la base de données seront initialisés après l'exécution du script mysql_db_install. Si nous utilisons le package de code source MySQL pour l'installation et que le répertoire d'installation est /usr/local/mysql, alors le répertoire de données sera généralement /usr/local/mysql/var. Un système de base de données se compose d’une série de bases de données, chacune contenant une série de tables de base de données. MySQL utilise le nom de la base de données pour créer un répertoire de base de données dans le répertoire de données. Chaque table de base de données utilise le nom de la table de base de données comme nom de fichier, et trois fichiers avec les extensions MYD, MYI et frm sont placés dans le répertoire de base de données.
La table d'autorisation de MySQL offre un contrôle flexible des autorisations pour l'accès à la base de données, mais si l'utilisateur local dispose d'autorisations de lecture sur le fichier de bibliothèque, l'attaquant n'a qu'à empaqueter et copier le répertoire de la base de données, puis le copier dans son propre répertoire de données pour accéder aux données volées. bases de données. Par conséquent, la sécurité de l'hôte sur lequel se trouve MySQL est le problème le plus important. Si l'hôte n'est pas sécurisé et contrôlé par des attaquants, la sécurité de MySQL ne peut pas être discutée. La seconde est la sécurité du répertoire de données et des fichiers de données, qui relève de la question des paramètres d'autorisation.
À en juger par certaines anciennes versions binaires du site principal de MySQL, l'attribut du répertoire de données dans la version 3.21.xx est 775, ce qui est très dangereux. Tout utilisateur local peut lire le répertoire de données, le fichier de base de données est donc très dangereux. L'attribut du répertoire de données dans la version 3.22.xx est 770. Cet attribut est également quelque peu dangereux. Les utilisateurs locaux du même groupe peuvent à la fois lire et écrire, les fichiers de données ne sont donc pas sécurisés. L'attribut du répertoire de données dans la version 3.23.xx est 700, ce qui est mieux. Seul l'utilisateur qui démarre la base de données peut lire et écrire le fichier de la base de données, garantissant ainsi la sécurité des fichiers de données locaux.
Si l'utilisateur qui démarre la base de données MySQL est mysql, alors les répertoires et fichiers suivants sont sécurisés. Veuillez faire attention au répertoire de données et aux attributs suivants :
shell>ls -l /usr/local/mysql
total 40
drwxrwxr-x 2 racine racine 4096 27 février 20:07 bin
drwxrwxr-x 3 racine racine 4096 27 février 20:07 inclure
drwxrwxr-x 2 racine racine 4096 27 février 20:07 info
drwxrwxr-x 3 racine racine 4096 27 février 20:07 lib
drwxrwxr-x 2 racine racine 4096 27 février 20:07 libexec
drwxrwxr-x 3 racine racine 4096 27 février 20:07 homme
drwxrwxr-x 6 racine racine 4096 27 février 20:07 test mysql
drwxrwxr-x 3 racine racine 4096 27 février 20:07 partager
drwxrwxr-x 7 racine racine 4096 27 février 20:07 sql-bench
drwx------ 4 mysql mysql 4096 27 février 20:07 variable
shell>ls -l /usr/local/mysql/var
total 8
drwx------ 2 mysql mysql 4096 27 février 20:08 mysql
drwx------ 2 mysql mysql 4096 27 février 20:08 test
shell>ls -l /usr/local/mysql/var/mysql
total 104
-rw------- 1 mysql mysql 0 27 février 20:08 columns_priv.MYD
-rw------- 1 mysql mysql 1024 27 février 20:08 columns_priv.MYI
-rw------- 1 mysql mysql 8778 27 février 20:08 columns_priv.frm
-rw------- 1 mysql mysql 302 27 février 20:08 db.MYD
-rw------- 1 mysql mysql 3072 27 février 20:08 db.MYI
-rw------- 1 mysql mysql 8982 27 février 20:08 db.frm
-rw------- 1 mysql mysql 0 27 février 20:08 func.MYD
-rw------- 1 mysql mysql 1024 27 février 20:08 func.MYI
-rw------- 1 mysql mysql 8641 27 février 20:08 func.frm
-rw------- 1 mysql mysql 0 27 février 20:08 hôte.MYD
-rw------- 1 mysql mysql 1024 27 février 20:08 hôte.MYI
-rw------- 1 mysql mysql 8958 27 février 20:08 host.frm
-rw------- 1 mysql mysql 0 27 février 20:08 tables_priv.MYD
-rw------- 1 mysql mysql 1024 27 février 20:08 tables_priv.MYI
-rw------- 1 mysql mysql 8877 27 février 20:08 tables_priv.frm
-rw------- 1 mysql mysql 428 27 février 20:08 utilisateur.MYD
-rw------- 1 mysql mysql 2048 27 février 20:08 utilisateur.MYI
-rw------- 1 mysql mysql 9148 27 février 20:08 user.frm
Si les propriétaires et les attributs de ces fichiers ne correspondent pas à cela, veuillez utiliser les deux commandes suivantes pour le corriger :
shell>chown -R mysql.mysql /usr/local/mysql/var
shell>chmod -R go-rwx /usr/local/mysql/var
Utiliser l'utilisateur root pour démarrer des services distants a toujours été un tabou en matière de sécurité, car en cas de problème avec le programme de service, un attaquant distant est très susceptible de prendre le contrôle total de l'hôte. MySQL a apporté des modifications mineures depuis la version 3.23.15. Par défaut, le service doit être démarré par l'utilisateur mysql après l'installation, et l'utilisateur root n'est pas autorisé à démarrer. Si vous devez utiliser l'utilisateur root pour démarrer, vous devez ajouter le paramètre --user=root (./safe_mysqld --user=root &). Parce qu'il existe des instructions SQL de LOAD DATA INFILE et SELECT... INTO OUTFILE dans MySQL, si l'utilisateur root démarre le serveur MySQL, alors l'utilisateur de la base de données a l'autorisation d'écriture de l'utilisateur root. Cependant, MySQL a encore certaines restrictions. Par exemple, LOAD DATA INFILE ne peut lire que des fichiers lisibles globalement, et SELECT... INTO OUTFILE ne peut pas écraser les fichiers existants.
Les fichiers journaux locaux ne peuvent pas être ignorés, y compris les journaux du shell et les propres journaux de MySQL. Pour plus de commodité lors de la connexion locale ou de la sauvegarde de la base de données, certains utilisateurs incluent parfois directement le mot de passe de la base de données dans les paramètres de ligne de commande, tels que :
shell>/usr/local/mysql/bin/mysqldump -uroot -ptest test>test.sql
shell>/usr/local/mysql/bin/mysql -uroot -ptest
Ces commandes seront enregistrées dans le fichier historique par le shell. Par exemple, bash écrira le fichier .bash_history dans le répertoire utilisateur si ces fichiers sont accidentellement lus, le mot de passe de la base de données sera divulgué. Les commandes SQL exécutées après la connexion de l'utilisateur à la base de données seront également enregistrées par MySQL dans le fichier .mysql_history du répertoire utilisateur. Si l'utilisateur de la base de données modifie le mot de passe de la base de données à l'aide d'instructions SQL, il sera également divulgué via le fichier .mysql_history. Par conséquent, nous ne devons pas ajouter le mot de passe directement après -p lors de la connexion au shell et de la sauvegarde, mais saisir le mot de passe de la base de données après l'invite.
De plus, il ne faut pas laisser ces deux fichiers enregistrer nos opérations, au cas où.
shell>rm .bash_history .mysql_history
shell>ln -s /dev/null .bash_history
shell>ln -s /dev/null .mysql_history
Ces deux commandes relient ces deux fichiers à /dev/null, nos opérations ne seront donc pas enregistrées dans ces deux fichiers.
Sécurité du réseau externe
Une fois la base de données MySQL installée, la table user sur la plateforme Unix ressemble à ceci :
mysql> utiliser mysql ;
Base de données modifiée
mysql> sélectionnez Hôte, Utilisateur, Mot de passe, Select_priv, Grant_priv de l'utilisateur ;
+---------------+------+----------+-------------+--------- -------+
| Hôte | Utilisateur | Mot de passe | Select_priv |
+---------------+------+----------+-------------+--------- -------+
| racine de l'hôte local |
| racine rouge |
| hôte local |
|
+---------------+------+----------+-------------+--------- -------+
4 lignes dans un ensemble (0,00 sec)
La table des utilisateurs sur la plateforme Windows ressemble à ceci :
mysql> utiliser mysql ;
Base de données modifiée
mysql> sélectionnez Hôte, Utilisateur, Mot de passe, Select_priv, Grant_priv de l'utilisateur ;
+---------------+------+----------+-------------+--------- -------+
| Hôte | Utilisateur | Mot de passe | Select_priv |
+---------------+------+----------+-------------+--------- -------+
| racine de l'hôte local |
| % racine |
| hôte local |
|
+---------------+------+----------+-------------+--------- -------+
4 lignes dans un ensemble (0,00 sec)
Regardons d'abord la table des utilisateurs sur la plateforme Unix. Parmi eux, redhat n'est que le nom de ma machine de test, donc en fait, MySQL sur la plate-forme Unix permet uniquement à cette machine de se connecter à la base de données par défaut. Cependant, le mot de passe de l'utilisateur root par défaut est vide, la priorité absolue est donc d'ajouter un mot de passe à l'utilisateur root. Il existe trois manières d'ajouter un mot de passe à un utilisateur de base de données :
1) Utilisez la commande mysqladmin à l'invite du shell pour modifier le mot de passe de l'utilisateur root :
shell>mysqladmin -uroot test de mot de passe
De cette façon, le mot de passe de l'utilisateur root de la base de données MySQL est modifié pour tester. (le test n'est qu'un exemple, le mot de passe que nous utilisons réellement ne doit pas utiliser un mot de passe aussi faible et facile à deviner)
2) Utilisez set password pour modifier le mot de passe :
mysql> définir le mot de passe pour root@localhost=password('test' );
A ce moment, le mot de passe de l'utilisateur root est modifié pour tester.
3) Modifiez directement le mot de passe de l'utilisateur root de la table user :
mysql> utiliser mysql ;
mysql> mettre à jour l'utilisateur défini password=password('test') où user='root';
mysql> vider les privilèges ;
De cette façon, le mot de passe de l'utilisateur root de la base de données MySQL a également été modifié pour tester. La dernière commande, flush privilèges, signifie actualiser de force la table d'autorisation de mémoire. Sinon, le mot de passe dans le cache sera toujours utilisé. À ce moment, les utilisateurs illégaux peuvent également se connecter avec l'utilisateur root et un mot de passe vide jusqu'au serveur MySQL. est redémarré.
Nous voyons également l'utilisateur anonyme dont l'utilisateur est vide Bien qu'il n'ait aucune autorisation sous la plateforme Unix, nous devons le supprimer pour des raisons de sécurité :
mysql> supprimer de l'utilisateur où user='';