Chaque fois que la sécurité des applications est mentionnée, les gens pensent à sécuriser les applications contre certaines des attaques les plus fréquentes telles que l'injection, l'authentification brisée, l'exposition de données sensibles, etc. Cependant, bien que ces attaques soient répandues, il ne suffit pas de savoir comment protéger votre application contre elles seules, en particulier lorsque vous utilisez MySQL. Aujourd'hui, nous allons examiner un autre aspect de la sécurité - nous allons examiner comment sécuriser correctement MySQL.
Comme la sécurité MySQL est une chose assez importante, considérez ce message comme le début d'une série de messages concernant les mesures de sécurité MySQL. Nous ne couvrirons pas tout, mais cet article devrait fournir la base de certaines des mesures de sécurité de MySQL.
Pourquoi avez-vous besoin de sécuriser MySQL ?
Tout d'abord, nous devons répondre à la question pourquoi nous voudrions sécuriser MySQL. Après tout, si nous sécurisons notre application contre les menaces les plus répandues, nous devrions être en sécurité, n'est-ce pas ? Eh bien, oui et non.
Vous voyez, lorsque vous sécurisez votre application contre certaines attaques, vous vous assurez que les attaquants ont plus de mal à pénétrer les défenses de votre application - afin de sécuriser votre base de données, la protection contre de telles attaques pas être suffisant. La sécurisation de votre base de données pourrait être la dernière goutte qui pourrait sauver votre application (et votre base de données !) de la destruction.
Comment puis-je sécuriser MySQL ?
Maintenant, passons à la question brûlante. Comment sécurisez-vous réellement MySQL ?
Lorsque vous réfléchissez à la sécurité de votre ou vos instances MySQL, vous devez envisager un large éventail d'options possibles. Heureusement, certaines de ces options ne sont même pas limitées à MySQL, ce qui signifie qu'elles seront également applicables dans d'autres scénarios ! Nous allons commencer par les choses générales.
Sécurité MySQL - Général
Lorsque vous sécurisez MySQL, gardez à l'esprit qu'il utilise des listes de contrôle d'accès (ACL) basées sur la sécurité pour les opérations effectuées par les utilisateurs (les listes de contrôle d'accès sont une liste d'autorisations associées à un objet). Voici comment résoudre quelques-uns des problèmes de sécurité les plus élémentaires :
- Sécurisez le compte MySQL initial - c'est très évident, mais vous devez vous assurer que le compte root a un mot de passe. Le compte root peut ou non avoir un mot de passe lors de la première installation de MySQL - vous pouvez déterminer quel est le mot de passe en consultant le journal des erreurs, puis le modifier pour un plus fort si vous le souhaitez. Tous les autres comptes doivent également avoir des mots de passe.
- Ne stockez jamais de mots de passe dans des bases de données MySQL en texte brut :utilisez une fonction de hachage à sens unique comme BCrypt.
- N'accordez à aucun utilisateur l'accès à la table des utilisateurs dans la base de données mysql (l'utilisateur root est une exception).
Familiarisez-vous également avec le contrôle d'accès et la gestion des comptes dans MySQL. Ce sujet mérite un livre entier en lui-même, mais les choses de base que vous devez savoir incluent :
- Contrôler l'accès dans MySQL ;
- Création, modification et suppression d'utilisateurs ;
- Accorder et révoquer des privilèges aux utilisateurs ;
- Savoir vérifier quels privilèges sont attribués ;
- Quelles sont les catégories de compte ?
- Ce que sont les comptes réservés ;
- Quels sont les rôles ?
- Comment fonctionne la gestion des mots de passe ;
- Comment fonctionne le verrouillage de compte ;
- Jeter un coup d'œil sur les plugins de sécurité proposés par MySQL ;
- Savoir comment sécuriser les sauvegardes MySQL.
En ce qui concerne la sécurité de MySQL, les sauvegardes doivent également être couvertes.
Maintenant, nous allons examiner chacune de ces options plus en détail.
Contrôler l'accès dans MySQL
- Comme déjà indiqué ci-dessus, ne donnez jamais à aucun compte, à l'exception du compte root, l'accès à la table des utilisateurs dans la base de données mysql ;
- Assurez-vous que tous les comptes MySQL existants n'utilisent que les privilèges dont ils ont absolument besoin pour effectuer leurs actions.
Créer, modifier et supprimer des utilisateurs dans MySQL
Dans MySQL, les utilisateurs peuvent être créés en exécutant la requête CREATE USER :
CREATE USER ‘demouser’@’localhost’ IDENTIFIED BY ‘password’;
Les utilisateurs peuvent être modifiés en exécutant la requête ALTER USER - la requête vous permet de faire de nombreuses choses différentes, y compris le verrouillage et le déverrouillage des comptes, l'obligation pour le compte de se connecter à l'aide de SSL, d'établir le nombre maximal de connexions par heure, de supprimer les anciens mots de passe, etc. Voici un exemple de requête permettant de modifier votre propre mot de passe :
ALTER USER USER() IDENTIFIED BY ‘password’;
Les utilisateurs peuvent être supprimés en exécutant la requête DROP USER :
DROP USER ‘demouser’@’localhost’;
Accorder et révoquer des privilèges aux utilisateurs de MySQL
L'instruction GRANT doit accorder des privilèges ou des rôles. L'instruction ON est capable de vous dire si des privilèges ou des rôles seront accordés. La requête suivante accorde des privilèges :
GRANT ALL ON demo_db.* TO ‘demouser’@’localhost’;
La requête suivante accorde des rôles :
GRANT ‘demo_role’ TO ‘demouser’@’localhost’;
GRANT devrait répondre avec Query OK, 0 lignes affectées.
Pour révoquer certains privilèges des utilisateurs, utilisez l'instruction REVOKE (la partie nom d'hôte du nom de compte est par défaut " %") :
REVOKE SELECT ON *.* FROM ‘demouser’@’localhost’;
Pour révoquer tous les privilèges, REVOKE ALL peut être utilisé :
REVOKE ALL PRIVILEGES ON *.* FROM ‘demouser’@’localhost’;
Vous voudrez peut-être émettre un FLUSH PRIVILEGES ; déclaration après avoir effectué les étapes ci-dessus.
Vérification des privilèges attribués dans MySQL
- Pour vérifier quels privilèges sont attribués, émettez les SHOW GRANTS ; déclaration.
- Pour chaque requête émise, le serveur détermine l'opération que vous souhaitez effectuer, puis vérifie si vos privilèges sont suffisants pour effectuer l'opération en question.
- Le serveur utilise les tables user et db de la base de données mysql pour assurer le contrôle d'accès.
- Les tables user et global_grants accordent des privilèges globaux.
Le reste des options sera couvert dans les prochains articles.
Résumé
En ce qui concerne la sécurité de MySQL, vous avez le choix entre un très large éventail d'options. Les options incluent des mesures de sécurité de base qui peuvent être applicables à pratiquement toutes les applications, mais certaines options sont assez spécifiques à MySQL. Gardez à l'esprit que toutes les options disponibles n'ont pas encore été couvertes - elles seront également abordées dans les prochaines éditions de la série de sécurité MySQL.