Maison > base de données > tutoriel mysql > le corps du texte

【À savoir absolument】Cinq conseils de sécurité importants à suivre pour renforcer MySQL

青灯夜游
Libérer: 2022-10-20 19:30:28
avant
1908 Les gens l'ont consulté

【À savoir absolument】Cinq conseils de sécurité importants à suivre pour renforcer MySQL

La base de données constitue depuis longtemps un élément important de votre architecture équilibrée, et est sans doute la partie la plus importante. Aujourd'hui, la pression s'est portée sur votre infrastructure largement jetable et apatride, ce qui impose une plus grande charge à votre base de données pour qu'elle soit à la fois fiable et sécurisée puisque tous les autres serveurs seront inévitablement sur le serveur avec le reste de vos informations d'état. stockés dans la base de données.

Votre base de données est la récompense de tout attaquant. À mesure que les attaques deviennent plus sophistiquées et que les réseaux deviennent plus hostiles, il est plus important que jamais de prendre des mesures supplémentaires pour renforcer votre base de données.

MySQL est la base de données la plus populaire et préférée des développeurs et des administrateurs en raison de sa rapidité et de sa facilité d'utilisation globale. Malheureusement, cette facilité d’utilisation se fait au détriment de la sécurité. Même si MySQL peut être configuré avec des contrôles de sécurité stricts, votre configuration MySQL par défaut normale ne peut pas les utiliser. Dans cet article, je couvrirai cinq étapes importantes à suivre pour renforcer votre base de données MySQL.

Première étape : définir un mot de passe fort

Pour tous les utilisateurs de bases de données, il est important d'utiliser des mots de passe forts. Étant donné que la plupart des gens ne se connectent pas souvent manuellement à une base de données, utilisez un gestionnaire de mots de passe ou l'outil de ligne de commande pwgen pour créer un mot de passe aléatoire de 20 caractères pour votre compte de base de données. Ceci est toujours important même si vous utilisez des contrôles d'accès MySQL supplémentaires pour limiter l'endroit où des comptes spécifiques peuvent se connecter (par exemple en limitant strictement les comptes à localhost).

Le compte MySQL le plus important pour lequel définir un mot de passe est l'utilisateur root. Par défaut, sur de nombreux systèmes, cet utilisateur n'a pas de mot de passe. En particulier, les systèmes basés sur Red Hat ne définissent pas de mot de passe lors de l'installation de MySQL ; tandis que les systèmes basés sur Debian vous demandent un mot de passe lors d'une installation interactive, une installation non interactive (comme vous pourriez le faire avec Configuration Manager) l'ignorera. De plus, vous pouvez toujours ignorer la définition d'un mot de passe lors d'une installation interactive.

Vous pourriez penser que laisser l'utilisateur root ne pas saisir de mot de passe ne constitue pas un gros risque pour la sécurité. Après tout, l'utilisateur est défini sur "root@localhost", ce qui, pourrait-on penser, signifie que vous devez rooter l'ordinateur avant de pouvoir devenir cet utilisateur. Malheureusement, cela signifie que tout utilisateur pouvant déclencher le client MySQL depuis localhost peut se connecter en tant qu'utilisateur root MySQL en utilisant la commande suivante :

*$ mysql — user root**$ mysql — user root*

因此,如果你不为 root 用户设置密码,那么任何能够在您的 MySQL 机器上获得本地 shell 的人现在都可以完全控制你的数据库。

要修复此漏洞,请使用 mysqladmin 命令为 root 用户设置密码:

$ sudo mysqladmin password

不幸的是,MySQL 以 root 用户身份运行后台任务。一旦你设置了密码,这些任务就会中断,除非采取额外的步骤将密码硬编码到 /root/.my.cnf 文件中:

[mysqladmin]
user = rootpassword = yourpassword
Copier après la connexion

但是,这意味着你必须将密码以纯文本形式存储在主机上。但是你至少可以使用 Unix 文件权限将对该文件的访问限制为仅 root 用户:

sudo chown root:root /root/.my.cnf
sudo chmod 0600 /root/.my.cnf
Copier après la connexion

第二步:删除匿名用户

匿名帐户是既没有用户名也没有密码的 MySQL 帐户。你不希望攻击者在没有密码的情况下对你的数据库进行任何形式的访问,因此请在此命令的输出中查找使用空白用户名记录的任何 MySQL 用户:

> SELECT Host, User FROM mysql.user;
+ — — — — — — — — — — — — + — — — -+
| Host | User |
+ — — — — — — — — — — — — + — — — -+
| 127.0.0.1 | root |
| ::1 | root |
| localhost | |
| localhost | root |
+ — — — — — — — — — — — — + — — — -+
4 rows in set (0.00 sec)
Copier après la connexion

在这些根用户中间有一个匿名用户( localhost ),它在 User 列中为空。你可以使用下面命令清除特定的匿名用户:

> drop user ""@"localhost";
> flush privileges;
Copier après la connexion

如果你发现任何其他匿名用户,请确保将其删除。

第三步:遵循最小特权原则

最小特权原则是一项安全原则,可以总结如下:

只为账户提供执行作业所需的访问权限,而不提供更多权限。

此原则可以通过多种方式应用于 MySQL。首先当使用 GRANT 命令向特定用户添加数据库权限时,请确保仅限制该用户需要访问数据库的权限:

> grant all privileges on mydb.* to someuser@"localhost" identified by 'astrongpassword';
> flush privileges;
Copier après la connexion

如果该用户只需要访问一个特定的表(例如,users 表),用mydb.users  或者任何你的表的名字替换 mydb.*

Donc, si vous n'en avez pas En définissant un mot de passe pour l'utilisateur root, toute personne pouvant obtenir un shell local sur votre machine MySQL a désormais le contrôle total de votre base de données.

Pour corriger cette vulnérabilité, utilisez la commande mysqladmin pour définir un mot de passe pour l'utilisateur root :

$ sudo mysqladmin password

Malheureusement, MySQL exécute des tâches en arrière-plan en tant qu'utilisateur root. Une fois que vous avez défini un mot de passe, ces tâches s'interrompent à moins que vous ne preniez l'étape supplémentaire consistant à coder en dur le mot de passe dans le fichier /root/.my.cnf : 🎜
> grant select privileges on mydb.* to someuser@"localhost" identified by 'astrongpassword';
> flush privileges;
Copier après la connexion
🎜 Cependant, cela signifie que vous devez stocker le mot de passe en texte brut sur l'hôte supérieur. Mais vous pouvez au moins utiliser les autorisations de fichier Unix pour restreindre l'accès au fichier uniquement à l'utilisateur root : 🎜
> grant all privileges on mydb.* to someuser@"%"  identified by 'astrongpassword';
> flush privileges;
Copier après la connexion
🎜🎜Deuxième étape : supprimer les utilisateurs anonymes 🎜🎜🎜Les comptes anonymes sont des comptes MySQL qui n'ont ni nom d'utilisateur ni mot de passe. Vous ne voulez pas qu'un attaquant ait accès à votre base de données sans mot de passe, alors recherchez dans le résultat de cette commande tous les utilisateurs MySQL connectés avec un nom d'utilisateur vide : 🎜
> grant all privileges on mydb.* to someuser@10.0.1.0/255.255.255.0 identified by 'astrongpassword';
> flush privileges;
Copier après la connexion
Copier après la connexion
🎜 Parmi ces utilisateurs root se trouve un utilisateur anonyme ( localhost ), qui est vide dans la colonne Utilisateur. Vous pouvez effacer des utilisateurs anonymes spécifiques à l'aide de la commande suivante : 🎜
[mysqld]
ssl-ca=/path/to/ca.crt
ssl-cert=/path/to/server.crt
ssl-key=/path/to/server.key
Copier après la connexion
Copier après la connexion
🎜 Si vous trouvez d'autres utilisateurs anonymes, assurez-vous de les supprimer. 🎜🎜🎜Troisième étape : suivre le principe du moindre privilège 🎜🎜🎜Le principe du moindre privilège est un principe de sécurité qui peut être résumé comme suit : 🎜🎜Donnez aux comptes uniquement l'accès dont ils ont besoin pour effectuer leur travail et pas plus. . 🎜🎜Ce principe peut être appliqué à MySQL de différentes manières. Tout d'abord, lorsque vous utilisez la commande GRANT pour ajouter des autorisations de base de données à un utilisateur spécifique, veillez à restreindre uniquement les autorisations dont l'utilisateur a besoin pour accéder à la base de données : 🎜
> grant all privileges on mydb.* to someuser@10.0.1.0/255.255.255.0 identified by 'astrongpassword' REQUIRE SSL;

> flush privileges;
Copier après la connexion
Copier après la connexion
🎜 Si l'utilisateur n'a besoin d'accéder qu'à une table spécifique (par exemple, la users), utilisez mydb Remplacez <code>mydb.* par .users ou quel que soit le nom de votre table (pour accorder des autorisations sur toutes les tables). 🎜🎜De nombreuses personnes accorderont aux utilisateurs un accès complet à la base de données ; mais si l'utilisateur de votre base de données a uniquement besoin de lire les données et non de les modifier, vous devrez prendre une mesure supplémentaire en accordant un accès en lecture seule à la base de données : 🎜rrreee 🎜Enfin, de nombreux utilisateurs de base de données n'accéderont pas à la base de données depuis localhost, généralement l'administrateur les créera, comme ceci : 🎜rrreee🎜Cela permettra à "certains utilisateurs" d'accéder à la base de données depuis n'importe quel réseau. Cependant, si vous disposez d'un ensemble bien défini d'adresses IP internes, ou - encore mieux - si vous avez configuré des VLAN de manière à ce que tous vos serveurs d'applications se trouvent sur des sous-réseaux différents de ceux des autres hôtes, vous pouvez en profiter pour limiter "certains utilisateurs", afin que le compte ne puisse accéder à la base de données que depuis un réseau spécifique : 🎜
> grant all privileges on mydb.* to someuser@10.0.1.0/255.255.255.0 identified by 'astrongpassword';
> flush privileges;
Copier après la connexion
Copier après la connexion

第四步:启用 TLS

设置强密码仅只有攻击者可以在网络上读取你的密码或者其他敏感数据的情况下才能达到此目的。因此,使用 TLS 保护你的所有网络流量比以往任何时候都更加重要。

MySQL 也不例外。

幸运的是,在 MySQL 中启用 TLS 比较简单。一旦你有了你的主机的有效证书,只需要在你的主 my.cnf 文件的 [mysqld]部分添加以下几行 :

[mysqld]
ssl-ca=/path/to/ca.crt
ssl-cert=/path/to/server.crt
ssl-key=/path/to/server.key
Copier après la connexion
Copier après la connexion

为了额外的安全性,还可以添加 ssl-cipher 配置选项,其中包含一个被认可的密码列表,而不是只接受默认的密码列表,这可能包括较弱的 TLS 密码。我推荐使用  Mozilla Security/Server Side TLS page 所推荐的现代或者中级密码套件。

一旦服务器端设置了 TLS ,你可以限制客户端必须采用 TLS 进行连接,通过在 GRANT 语句中添加 REQUIRE SSL :

> grant all privileges on mydb.* to someuser@10.0.1.0/255.255.255.0 identified by 'astrongpassword' REQUIRE SSL;

> flush privileges;
Copier après la connexion
Copier après la connexion

第五步:加密数据库密钥

虽然现在很多人都知道使用单向散列(理想情况下是像 bcrypt 这样慢速散列 ),保护用户数据库存储的密码有多重要,但通常没过多考虑使用加密来保护数据库上其他的敏感数据。事实上,许多管理员会告诉你他们的数据库是加密的,因为磁盘本身是加密的。这实际上会影响你的数据库加固,不是因为磁盘加固有缺陷或糟糕的做法,而是因为它会给你一种错误的信任感。

磁盘加密保护你的数据库数据,以防止有人从你的服务器窃取磁盘(或者你买了二手磁盘后忘记擦除磁盘),但是磁盘加密并不能在数据库本身运行时保护你,因为驱动器需要处于解密状态才能被读取。

要保护数据库中的数据,你需要采取额外的措施,在存储敏感字段之前对它们进行加密。这样如果攻击者找到了某种方法来转存完整的数据库,你的敏感字段仍然会受到保护。

有许多加密数据库中字段的方法,而且 MySQL 支持本地加密命令。无论你采取哪种加密方法,我都建议避免你需要将解密密钥存储在数据库本身的加密方法。

理想情况下,你会把解密的密钥存储在应用服务器上,作为本地GPG密钥(如果你使用GPG进行加密)或者将其存储为应用程序服务器上的环境变量。这样即使攻击者可能找到一种方法来破坏应用程序服务器的服务器,他也必须将攻击转换为本地shell访问,以此来获取你的解密密钥。

MySQL 加固原则:掌握最小权限原则

有很多方法来锁定你的MySQL服务器。确切地说,你如何实施这些步骤取决于你如何设置自己的数据库,以及它在网络中的位置。

虽然前面的五个步骤将有助于保护你的数据库,但我认为更需要掌握的最重要的整体步骤是最小权限原则。你的数据库可能存储来一些非常有用的数据,如果你确保用户和应用程序只具有执行其工作的所需的最小访问权限,那么你将限制攻击者能够做什么,如果黑客找到来危害该用户或者应用程序的方法。

【相关推荐:mysql视频教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!