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

Comment s'assurer que votre base de données MySQL est sécurisée

Quelques informations de base avant de commencer :

Source :Oracle MySQL Community Server 5.7 du Center for Internet Security (CIS)

Système d'exploitation : Windows 10

Où exécuter : ligne de commande

mysql -u USERNAME -p

Application cible : Serveur de communauté Oracle MySQL 5.7

Audit et journalisation des systèmes d'information

Les journaux jouent un rôle crucial pour la sécurité en cas de suspicion de cyberattaque. L'examen manuel des journaux est fastidieux pour le personnel de sécurité, qui doit utiliser des outils d'examen des journaux pour extraire des informations et les analyser. Les journaux doivent utiliser une technologie de stockage et de chiffrement WORM (write once read many) pour éviter la corruption et la perte de données de journal. De plus, les journaux doivent avoir un format standardisé pour faciliter la maintenance, l'accès et la comparaison.

Assurez-vous que "log_error" n'est pas vide

commande :

SHOW variables LIKE ‘log_error’;

Les journaux d'erreurs contiennent des données sur les événements lorsque mysqld démarre ou s'arrête. Il indique également quand une table doit être évaluée ou réparée. Il doit générer une « valeur ». La raison de l'activation de la journalisation des erreurs est qu'elle permet d'augmenter la capacité de détection des tentatives malveillantes contre MySQL et d'autres messages vitaux.

Assurez-vous que les fichiers journaux sont stockés sur une partition non système

commande :

SELECT @@global.log_bin_basename;

Les fichiers journaux de MySQL peuvent être stockés n'importe où dans le système de fichiers et définis à l'aide de la configuration MySQL. En outre, il est recommandé de s'assurer que les journaux du système de fichiers ne sont pas encombrés par d'autres journaux tels que les journaux d'application. Vous devez vous assurer que la valeur renvoyée n'indique pas qu'elle se trouve dans la racine "(‘/')", "/var" ou "/usr". La raison en est que le partitionnement réduira la probabilité de déni de service si l'espace disque disponible pour le système d'exploitation est épuisé.

Assurez-vous que "log_error_verbosity" n'est pas défini sur "1"

commande :

SHOW GLOBAL VARIABLES LIKE ‘log_error_verbosity’;

Cette vérification fournit des informations supplémentaires sur les fonctionnalités que le journal MySQL a ou a activées sur les messages d'erreur. La valeur 1 active la journalisation des messages d'erreur. La valeur 2 active à la fois la journalisation des messages d'erreur et d'avertissement. Une valeur de 3 active la journalisation des messages d'erreur, d'avertissement et de note. Cela aide à détecter les comportements malveillants en enregistrant les erreurs de communication et les connexions interrompues.

Assurez-vous que la journalisation d'audit est activée

L'activation de la journalisation d'audit est cruciale pour l'environnement de production pour les sessions utilisateur interactives et les sessions d'application. Avec la journalisation d'audit, cela aide à identifier qui a changé quoi et quand. Cela peut également aider à identifier ce qu'un attaquant a fait et peut même être utilisé comme preuve dans les enquêtes.

commande :

SELECT NAME FROM performance_schema.setup_instruments WHERE NAME LIKE ‘%/alog/%’;

commande :

SET GLOBAL general_log = ‘ON’ ;

commande : CRÉER UN UTILISATEUR ‘user1’@’localhost’ IDENTIFIÉ PAR MOT DE PASSE ‘not-so-secret’ ;

Le chemin du journal dans Windows 10 peut être trouvé en utilisant l'application Services, en regardant pour voir si MySQL est en cours d'exécution et en cliquant avec le bouton droit sur les propriétés.

Le journal dans le système de l'auteur se trouvait dans :C:\ProgramData\MySQL\MySQL Server 5.7\Data\DJ-JASON-CLARK.log

Authentification pour le système d'information

L'authentification garantit que les informations d'identification fournies par l'utilisateur ou la machine correspondent à la base de données des utilisateurs autorisés dans un système d'exploitation local ou dans un serveur d'authentification. L'authentification est ensuite suivie d'une autorisation, qui est accordée par un administrateur aux utilisateurs ou aux machines. Une authentification couramment utilisée dans les réseaux privés et publics est l'authentification par mot de passe.

Assurez-vous que les mots de passe ne sont pas stockés dans la configuration globale

La section [client] d'un fichier de configuration MySQL permet de définir un utilisateur et un mot de passe. La vérification est importante car autoriser un utilisateur et un mot de passe dans le fichier de configuration a un impact négatif sur la confidentialité du mot de passe de l'utilisateur.

Pour auditer, ouvrez le fichier de configuration MySQL et examinez la section [client] - aucun mot de passe ne doit être stocké. Aucun mot de passe n'a été défini dans le système de l'auteur (voir figure ci-dessous). Si un mot de passe a été défini dans le fichier de configuration, utilisez mysql_config_editor pour stocker les mots de passe sous forme chiffrée dans .mylogin.cnf.

Assurez-vous que 'sql_mode' contient 'NO_AUTO_CREATE_USER'

Le "no_auto_create_user" est une option pour empêcher la création automatique de l'utilisateur lorsque les informations d'authentification ne sont pas fournies.

commande :

SELECT @@global.sql_mode;

commande :

SELECT @@session.sql_mode;

Assurez-vous que les mots de passe sont définis pour tous les comptes MySQL

Un utilisateur peut créer un mot de passe vide. Avoir un mot de passe vide est risqué car n'importe qui peut simplement assumer l'identité de l'utilisateur, entrer l'ID de connexion de l'utilisateur et se connecter au serveur. Cela contourne l'authentification, ce qui est mauvais.

commande :

SELECT User,host FROM mysql.user WHERE authentication_string=’’;

Assurez-vous que 'default_password_lifetime' est inférieur ou égal à '90'

Changer la durée de vie du mot de passe à 90 jours réduit le temps dont dispose l'attaquant pour compromettre le mot de passe, et diminue ainsi la probabilité d'être attaqué.

commande :

SHOW VARIABLES LIKE ‘default_password_lifetime’;

commande :

SET GLOBAL default_password_lifetime=90;

Assurez-vous que la complexité du mot de passe est en place

La complexité des mots de passe renforce la sécurité des authentifications et inclut l'ajout ou l'augmentation de la longueur, de la casse, des chiffres et des caractères spéciaux. Plus le mot de passe est complexe, plus il est difficile pour les attaquants d'utiliser la force brute pour obtenir le mot de passe. Les mots de passe faibles sont facilement obtenus dans un dictionnaire de mots de passe.

commande :

SHOW VARIABLES LIKE ‘validate_password%’;

Assurez-vous qu'aucun utilisateur n'a de noms d'hôte génériques

Les utilisateurs avec des noms d'hôte génériques (%) sont autorisés à accéder à n'importe quel emplacement. Il est préférable d'éviter de créer des noms d'hôte génériques. Au lieu de cela, créez des utilisateurs et attribuez-leur des emplacements spécifiques à partir desquels un utilisateur donné peut se connecter et interagir avec la base de données.

commande :

SELECT user, host FROM mysql.user WHERE host = ‘%’;

Assurez-vous qu'aucun compte anonyme n'existe

Les utilisateurs peuvent avoir un nom d'utilisateur anonyme (vide ou vide). Ces noms d'utilisateur anonymes n'ont pas de mot de passe et tout autre utilisateur peut utiliser ce nom d'utilisateur anonyme pour se connecter au serveur MySQL. La suppression de ces comptes anonymes garantit que seuls les utilisateurs identifiés et de confiance peuvent accéder au serveur MySQL.

commande :

SELECT user,host FROM mysql.user WHERE user = ‘’;

Connexion réseau au serveur MySQL

La connexion réseau joue un rôle important pour la communication entre l'utilisateur et le serveur MySQL. Les connexions réseau non sécurisées sont très vulnérables aux attaques. Voici les vérifications de la sécurité de la connexion réseau.

Assurez-vous que 'have_ssl' est défini sur 'YES'

Pour éviter que des attaquants malveillants ne pénètrent dans votre système, il est préférable d'utiliser SLL/TLS pour tout le trafic réseau lorsque vous utilisez des réseaux non fiables.

commande :

WHERE variable_name = ‘have_ssl’;

Assurez-vous que 'ssl_type' est défini sur 'ANY', 'X509', ou 'SPECIFIED' pour tous les utilisateurs distants

SSL/TLS doit être configuré par utilisateur. Cela empêche en outre l'écoute clandestine d'attaquants malveillants.

commande :

SELECT user, host, ssl_type FROM mysql.user WHERE NOT HOST IN (‘::1’, ‘127.0.0.1’, ‘localhost’);

Réplication

La vérification de l'état de la réplication vous permet de surveiller les performances et les vulnérabilités de sécurité. Microsoft SQL Server Management Studio dispose des outils suivants pour surveiller la réplication :

  1. afficher l'état de l'agent instantané,
  2. afficher l'état de l'agent du lecteur de journal, et
  3. afficher l'état de la synchronisation.

Assurez-vous que le trafic de réplication est sécurisé

Réplication le trafic entre les serveurs doit être sécurisé. Lors des transferts de réplication, les mots de passe peuvent fuir.

Pour auditer, vérifiez s'ils utilisent :un réseau privé, un VPN, SSL/TLS ou un tunnel SSH. Espérons que le système de l'auteur utilise un réseau privé. Corrigez le cas contraire et sécurisez en utilisant le réseau privé, un VPN, SSL/TLS ou un tunnel SSH.

Assurez-vous que "MASTER_SSL_VERIFY_SERVER_CERT" est défini sur "YES" ou "1"

'MASTER_SSL_VERIFY_SERVER_CERT' vérifie si le réplica doit vérifier le certificat du primaire ou non. Le réplica doit vérifier le certificat du primaire pour authentifier le primaire avant de poursuivre la connexion.

commande :

SELECT ssl_verify_server_cert FROM mysql.slave_master_info;

Assurez-vous que 'master_info_repository' est défini sur 'TABLE'

Le « master_info_repository » détermine où le réplica enregistre le statut et les informations de connexion du primaire. Le mot de passe est stocké dans le référentiel d'informations principal qui est un fichier texte brut. Stocker le mot de passe dans la TABLE master_info est plus sûr.

commande :

SHOW GLOBAL VARIABLES LIKE ‘master_info_repository’;

Assurez-vous que "super_priv" n'est pas défini sur "Y" pour les utilisateurs de réplication

Le Le privilège "SUPER" ('super_priv') situé dans la table "mysql.user" a des fonctions comme "CHANGE", "MASTER TO", "KILL", "mysqladmin kill", "PURGE BINARY LOGS", "SET GLOBAL", "mysqladmin debug" et d'autres contrôles de journalisation. Donner à un utilisateur le privilège "SUPER" permet à l'utilisateur d'afficher et de terminer les instructions SQL en cours d'exécution, même pour la gestion des mots de passe. Si l'attaquant exploite et obtient le privilège "SUPER", il peut désactiver, modifier ou détruire les données de journalisation.

commande :

SELECT user, host FROM mysql.user WHERE user=’repl’ and Super_priv = ‘Y’;

Assurez-vous qu'aucun utilisateur de réplication n'a de noms d'hôte génériques

MySQL vous permet d'accorder des autorisations aux noms d'hôte génériques. Les noms d'hôte génériques doivent être évités et vous devez créer ou modifier des utilisateurs et leur attribuer des emplacements spécifiques à partir desquels un utilisateur donné peut se connecter et interagir avec la base de données.

Conclusion

Les vérifications suivantes sont effectuées pour un environnement de travail unique utilisant MySQL comme système d'information à la fois côté application et côté utilisateur.

L'évaluation est impérative pour vérifier la journalisation standard de MySQL et activer des fonctions de journalisation supplémentaires (elle permet également de vérifier les vulnérabilités d'authentification). Les vérifications du réseau sont importantes pour empêcher d'autres utilisateurs malveillants de jeter un coup d'œil sur votre réseau. Implémentez toujours SSL/TLS pour chiffrer. La sécurisation du transfert unidirectionnel est nécessaire. La sécurisation du trafic de réplication ajoute une couche défensive.

Le résultat de l'évaluation peut vous indiquer si le système est capable de fonctionner à un niveau de confiance.

Merci d'avoir lu mon blog! Vous avez maintenant commencé le chemin vers la sécurisation de votre base de données MySQL.=)