La sécurité de l'installation de MySQL est quelque chose qui devrait être à l'esprit de chaque administrateur de bases de données MySQL. Bien que nous ayons discuté de la manière dont vous devez prendre soin de votre sécurité MySQL dans son ensemble (consultez certains de nos articles précédents, en particulier la série sur la sécurité MySQL, première et deuxième parties), nous n'avons pas abordé de problèmes spécifiques liés à la sécurité, y compris les problèmes liés aux privilèges. Nous le faisons ici.
Que sont les privilèges dans MySQL ?
Des privilèges dans MySQL peuvent être accordés aux comptes. Si vous accordez des privilèges de compte dans MySQL, vous déterminez les opérations que le compte peut effectuer. Les privilèges peuvent être accordés aux bases de données ou aux objets de base de données (tables, index, vues, etc.). Les privilèges peuvent également être dynamiques ou statiques. Les privilèges statiques sont intégrés au serveur tandis que les privilèges dynamiques peuvent être définis au moment de l'exécution.
Comment utiliser les privilèges pour la sécurité MySQL
Afin d'utiliser les privilèges dans MySQL, voici ce dont vous devez vous souvenir :
-
Pour attribuer ou révoquer des privilèges, vous devez avoir un utilisateur MySQL. Les utilisateurs peuvent être créés en exécutant une requête CREATE USER :
CREATE USER ‘demouser’@’localhost’ IDENTIFIED BY ‘password’;
-
Pour attribuer ou révoquer des privilèges, utilisez respectivement les instructions GRANT et REVOKE :
GRANT ALL ON demo_db.* TO ‘demouser’@’localhost’; REVOKE INSERT ON *.* FROM ‘demouser’@’localhost’;
-
Vous pouvez enregistrer des privilèges en exécutant FLUSH PRIVILEGES. Affichez-les en exécutant SHOW GRANTS.
-
L'instruction GRANT ne peut pas être utilisée pour accorder à la fois des privilèges et des rôles ; l'instruction doit accorder des privilèges ou des rôles.
Afin de rendre votre installation MySQL plus sécurisée, considérez ce qui suit :
-
N'accordez à vos utilisateurs que les privilèges nécessaires pour accomplir leurs tâches (par exemple, n'utilisez pas GRANT ALL si c'est pas nécessaire)
-
En général, évitez d'exécuter MySQL en tant qu'utilisateur root Unix car tout utilisateur disposant du privilège FILE peut provoquer le serveur pour créer des fichiers en tant que root.
-
N'accordez pas le privilège FILE aux utilisateurs qui ne sont pas administrateurs (reportez-vous à l'explication ci-dessus)
-
Envisagez d'exécuter mysqld en tant qu'utilisateur ordinaire sans privilèges.
-
N'accordez pas les privilèges PROCESS ou SUPER aux utilisateurs qui ne sont pas administrateurs. Le privilège PROCESS permet à l'utilisateur d'afficher tous les processus en cours d'exécution dans MySQL. Le privilège SUPER, entre autres, permet des modifications de la configuration du serveur, permet l'utilisation des instructions CREATE SERVER, ALTER SERVER et DROP SERVER, et permet également l'utilisation de l'instruction KILL permettant à l'utilisateur de supprimer les instructions appartenant à d'autres comptes. Gardez à l'esprit que MySQL réserve une connexion supplémentaire aux utilisateurs qui ont le privilège SUPER. Le privilège SUPER permet également à un utilisateur de contrôler les serveurs de réplication.
Suivez les conseils ci-dessus et vous devriez être sur la bonne voie pour une installation MySQL plus sécurisée. Cependant, si vous utilisez une version plus récente de MySQL, il y a encore une chose dont nous avons besoin que vous soyez conscient :MySQL a introduit des rôles dans MySQL 8.0.16.
Rôles dans la sécurité MySQL
Si vous n'avez jamais entendu parler de rôles dans MySQL, ne vous inquiétez pas. Les rôles sont très similaires aux privilèges, c'est pourquoi nous les avons inclus dans cet article de blog. En fait, les rôles ne sont que cela :ce sont des ensembles de privilèges, c'est-à-dire que lorsqu'un rôle est attribué à un utilisateur, un utilisateur se voit attribuer tous les privilèges liés à ce rôle. Des rôles peuvent être ajoutés et supprimés à l'aide des instructions CREATE ROLE et DROP ROLE. Pour utiliser des rôles dans MySQL, créez un nom de rôle, accordez des privilèges à ce rôle, puis attribuez-le à un utilisateur comme ceci :
CREATE ROLE [IF NOT EXISTS] ‘role_1’;
GRANT SELECT ON db_name.* TO user_name;
GRANT role_1 TO [email protected];
Quels privilèges devriez-vous accorder ?
Lorsque vous accordez des privilèges, suivez le principe du moindre privilège :un compte MySQL ne doit recevoir que les privilèges nécessaires à ses fins. Les privilèges les plus couramment utilisés sont :
-
ALL PRIVILEGES qui accorde tous les privilèges à un compte.
-
CREATE accorde les privilèges nécessaires pour créer des bases de données et des tables.
-
DROP accorde les privilèges nécessaires pour supprimer des bases de données et des tables.
-
DELETE accorde les privilèges nécessaires pour supprimer des lignes des tables.
-
INSERT accorde les privilèges nécessaires pour insérer des lignes dans les tables.
-
SELECT accorde les privilèges nécessaires pour exécuter des requêtes SELECT.
-
UPDATE accorde les privilèges nécessaires pour mettre à jour les lignes d'une table (pour exécuter des requêtes UPDATE)
En général, c'est une bonne idée d'éviter d'accorder tous les privilèges à un compte ; envisagez plutôt de suivre le principe du moindre privilège. Gardez également à l'esprit que l'octroi de privilèges supplémentaires à un certain utilisateur ne supprime pas les privilèges qui étaient en place auparavant. Vous pouvez également afficher les privilèges d'un utilisateur spécifique en utilisant cette syntaxe (remplacez nom d'utilisateur par le nom d'utilisateur de votre utilisateur) :
SHOW GRANTS FOR ‘username’;
Résumé
Lorsque vous traitez avec des privilèges dans MySQL, gardez à l'esprit que vous devez suivre le principe du moindre privilège (c'est-à-dire, n'accorder que les privilèges qui sont nécessaires). Suivre les conseils décrits dans ce blog devrait vous aider à rendre votre installation MySQL plus sécurisée. N'oubliez pas que vos privilèges doivent être enregistrés pour prendre effet (l'instruction FLUSH PRIVILEGES peut vous aider à le faire), en outre, gardez à l'esprit qu'à partir de MySQL 8.0.16, vous pouvez utiliser des rôles dans MySQL pour attribuer des ensembles de privilèges à un utilisateur spécifique.
Nous espérons que cet article de blog vous a aidé à sécuriser votre ou vos instances MySQL. Si vous avez des questions ou des réflexions, n'hésitez pas à commenter, pensez également à consulter notre série sur la sécurité MySQL (ici et ici)