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

Comment configurer SELinux pour les systèmes basés sur MySQL (MySQL/MariaDB Replication + Galera)

À l'ère dans laquelle nous vivons, tout ce qui se trouve dans un environnement moins sécurisé est facilement la cible d'une attaque et devient une prime pour les attaquants. Par rapport aux 20 dernières années, les pirates informatiques sont aujourd'hui plus avancés non seulement avec les compétences mais aussi avec les outils qu'ils utilisent. Il n'est pas surprenant que certaines entreprises géantes soient piratées et que leurs précieuses données soient divulguées.

Pour la seule année 2021, il y a déjà plus de 10 incidents liés à des violations de données. L'incident le plus récent a été signalé par BOSE, un fabricant audio bien connu qui s'est produit en mai. BOSE a découvert que certaines des informations personnelles de ses employés actuels et anciens ont été consultées par les attaquants. Les informations personnelles exposées dans l'attaque comprennent les noms, les numéros de sécurité sociale, les informations de rémunération et d'autres informations liées aux ressources humaines.

Quel est selon vous le but de ce type d'attaque et qu'est-ce qui motive le pirate à le faire ? C'est évidemment une question d'argent. Étant donné que les données volées sont également fréquemment vendues, en attaquant de grandes entreprises, les pirates peuvent gagner de l'argent. Non seulement les données importantes peuvent être vendues aux concurrents de l'entreprise, mais les pirates peuvent également demander une énorme rançon en même temps.

Alors, comment pourrions-nous relier cela aux bases de données ? Étant donné que la base de données est l'un des grands atouts de l'entreprise, il est recommandé d'en prendre soin avec une sécurité renforcée afin que nos précieuses données soient protégées la plupart du temps. Dans mon dernier article de blog, nous avons déjà présenté une introduction à SELinux, comment l'activer, quel type de mode SELinux a et comment le configurer pour MongoDB. Aujourd'hui, nous allons voir comment configurer SELinux pour les systèmes basés sur MySQL.

Les 5 principaux avantages de SELinux

Avant d'aller plus loin, peut-être que certains d'entre vous se demandent si SELinux offre des avantages positifs étant donné qu'il est un peu compliqué de l'activer. Voici les 5 principaux avantages de SELinux que vous ne voulez pas manquer et que vous devriez considérer :

  • Faire respecter la confidentialité et l'intégrité des données tout en protégeant les processus

  • La possibilité de confiner les services et les démons pour qu'ils soient plus prévisibles

  • Réduire le risque d'attaques d'escalade de privilèges

  • La politique est appliquée à l'échelle du système, non définie à la discrétion de l'utilisateur et définie par l'administrateur

  • Fournir un contrôle d'accès précis

Avant de commencer à configurer SELinux pour nos instances MySQL, pourquoi ne pas expliquer comment activer SELinux avec ClusterControl pour tous les déploiements basés sur MySQL. Même si l'étape est la même pour tous les systèmes de gestion de base de données, nous pensons que c'est une bonne idée d'inclure quelques captures d'écran pour votre référence.

Étapes pour activer SELinux pour la réplication MySQL

Dans cette section, nous allons déployer la réplication MySQL avec ClusterControl 1.8.2. Les étapes sont les mêmes pour MariaDB, Galera Cluster ou MySQL :en supposant que tous les nœuds sont prêts et que SSH sans mot de passe est configuré, commençons le déploiement. Pour activer SELinux pour notre configuration, nous devons décocher "Désactiver AppArmor/SELinux", ce qui signifie que SELinux sera défini comme "permissif" pour tous les nœuds.

Ensuite, nous choisirons Percona comme fournisseur (vous pouvez également choisir MariaDB , Oracle ou MySQL 8 également), puis indiquez le mot de passe « root ». Vous pouvez utiliser un emplacement par défaut ou vos autres répertoires en fonction de votre configuration.

Une fois tous les hôtes ajoutés, nous pouvons démarrer le déploiement et le laisser terminer avant de pouvoir commencer la configuration de SELinux.

Étapes pour activer SELinux pour la réplication MariaDB

Dans cette section, nous allons déployer MariaDB Replication avec ClusterControl 1.8.2.

Nous choisirons MariaDB comme fournisseur et la version 10.5 ainsi que spécifier le mot de passe "racine". Vous pouvez utiliser un emplacement par défaut ou vos autres répertoires en fonction de votre configuration.

Une fois tous les hôtes ajoutés, nous pouvons démarrer le déploiement et le laisser terminer avant de pouvoir procéder à la configuration de SELinux.

Étapes pour activer SELinux pour Galera Cluster

Dans cette section, nous allons déployer Galera Cluster avec ClusterControl 1.8.2. Encore une fois, décochez "Désactiver AppArmor/SELinux", ce qui signifie que SELinux sera défini comme "permissif" pour tous les nœuds :

Ensuite, nous choisirons Percona comme fournisseur et MySQL 8 ainsi que spécifiez le mot de passe "root". Vous pouvez utiliser un emplacement par défaut ou vos autres répertoires en fonction de votre configuration. Une fois tous les hôtes ajoutés, nous pouvons démarrer le déploiement et le laisser se terminer.


 

Comme d'habitude, nous pouvons surveiller l'état du déploiement dans la section "Activité" de l'interface utilisateur.

Comment configurer SELinux pour MySQL

Étant donné que tous nos clusters sont basés sur MySQL, les étapes de configuration de SELinux sont également les mêmes. Avant de commencer la configuration et puisqu'il s'agit d'un environnement nouvellement configuré, nous vous suggérons de désactiver le mode de récupération automatique pour le cluster et le nœud, conformément à la capture d'écran ci-dessous. En procédant ainsi, nous pourrions éviter que le cluster ne tombe en panne pendant que nous effectuons les tests ou redémarrons le service :

D'abord, voyons quel est le contexte de "mysql". Allez-y et exécutez la commande suivante pour afficher le contexte :

$ ps -eZ | grep mysqld_t

Et l'exemple de sortie est comme ci-dessous :

system_u:system_r:mysqld_t:s0       845 ?        00:00:01 mysqld

La définition de la sortie ci-dessus est :

  • system_u - Utilisateur

  • system_r - Rôle

  • mysqld_t - Type

  • s0 845 - Niveau de sensibilité

Si vous vérifiez le statut de SELinux, vous pouvez voir que le statut est "permissif" qui n'est pas encore entièrement activé. Nous devons changer le mode en "application" et pour ce faire, nous devons modifier le fichier de configuration SELinux pour le rendre permanent.

$ vi /etc/selinux/config
SELINUX=enforcing

Continuez à redémarrer le système après les modifications. Comme nous changeons le mode de « permissif » à « application », nous devons à nouveau réétiqueter le système de fichiers. En règle générale, vous pouvez choisir de réétiqueter l'ensemble du système de fichiers ou uniquement pour une application. La raison pour laquelle un réétiquetage est nécessaire est due au fait que le mode "application" a besoin de l'étiquette ou de la fonction correcte pour s'exécuter correctement. Dans certains cas, ces étiquettes sont modifiées pendant le mode "permissif" ou "désactivé".

Pour cet exemple, nous ne renommerons qu'une seule application (MySQL) à l'aide de la commande suivante :

$ fixfiles -R mysqld restore

Pour un système qui a été utilisé pendant un certain temps, c'est une bonne idée de réétiqueter tout le système de fichiers. La commande suivante fera le travail sans redémarrer et ce processus peut prendre un certain temps en fonction de votre système :

$ fixfiles -f -F relabel

Comme beaucoup d'autres bases de données, MySQL demande également de lire et d'écrire beaucoup de fichiers. Sans un contexte SELinux correct pour ces fichiers, l'accès sera incontestablement refusé. Pour configurer la règle pour SELinux, "semanage" est requis. "semanage" permet également toute configuration sans qu'il soit nécessaire de recompiler les sources de politique. Pour la majorité des systèmes Linux, cet outil est déjà installé par défaut. Quant à notre cas, il est déjà installé avec la version suivante :

$ rpm -qa |grep semanage
python3-libsemanage-2.9-3.el8.x86_64
libsemanage-2.9-3.el8.x86_64

Pour le système qui ne l'a pas installé, la commande suivante vous aidera à l'installer :

$ yum install -y policycoreutils-python-utils

Maintenant, voyons quels sont les contextes des fichiers MySQL :

$ semanage fcontext -l | grep -i mysql

Comme vous pouvez le remarquer, de nombreux fichiers sont connectés à MySQL une fois la commande ci-dessus exécutée. Si vous vous souvenez du début, nous utilisons un « répertoire de données de serveur » par défaut. Si votre installation utilise un emplacement de répertoire de données différent, vous devez mettre à jour le contexte pour "mysql_db_t" qui fait référence à /var/lib/mysql/

La première étape consiste à modifier le contexte SELinux en utilisant l'une de ces options :

$ semanage fcontext -a -t mysqld_db_t /var/lib/yourcustomdirectory
$ semanage fcontext -a -e /var/lib/mysql /var/lib/yourcustomdirectory

After the step above, run the following command:

$ restorecon -Rv /var/lib/yourcustomdirectory

Et enfin, redémarrez le service :

$ systemctl restart mysql

Dans certaines configurations, un emplacement de journal différent est probablement requis pour n'importe quel objectif. Pour cette situation, "mysqld_log_t" doit également être mis à jour. "mysqld_log_t" est un contexte pour l'emplacement par défaut /var/log/mysqld.log et les étapes ci-dessous peuvent être exécutées pour le mettre à jour :

$ semanage fcontext -a -t mysqld_log_t "/your/custom/error.log"
$ restorecon -Rv /path/to/my/custom/error.log
$ systemctl restart mysql

Il y aura une situation où le port par défaut est configuré en utilisant un port différent autre que 3306. Par exemple, si vous utilisez le port 3303 pour MySQL, vous devez définir le contexte SELinux avec la commande suivante :

$ semanage port -a -t mysqld_port_t -p tcp 3303

Et pour vérifier que le port a été mis à jour, vous pouvez utiliser la commande suivante :

$ semanage port -l | grep mysqld

Utilisation d'audit2allow pour générer une stratégie

Une autre façon de configurer la politique consiste à utiliser "audit2allow" qui a déjà été inclus lors de l'installation de "semanage" tout à l'heure. Cet outil extrait les événements du journal de audit.log et utilise ces informations pour créer une stratégie. Parfois, MySQL peut avoir besoin d'une politique non standard, c'est donc la meilleure façon d'y parvenir.

Tout d'abord, définissons le mode sur permissif pour le domaine MySQL et vérifions les modifications :

$ semanage permissive -a mysqld_t
$ semodule -l | grep permissive
permissive_mysqld_t
permissivedomains

L'étape suivante consiste à générer la stratégie à l'aide de la commande ci-dessous :

$ grep mysqld /var/log/audit/audit.log | audit2allow -M {yourpolicyname}
$ grep mysqld /var/log/audit/audit.log | audit2allow -M mysql_new

Vous devriez voir la sortie comme suit (diffèrera selon le nom de la politique que vous avez défini) :

******************** IMPORTANT ********************* **

Pour activer ce package de règles, exécutez :

semodule -i mysql_new.pp

Comme indiqué, nous devons exécuter "semodule -i mysql_new.pp" pour activer la politique. Allez-y et exécutez-le :

$ semodule -i mysql_new.pp

La dernière étape consiste à remettre le domaine MySQL en mode "enforcement" :

$ semanage permissive -d mysqld_t

libsemanage.semanage_direct_remove_key :suppression du dernier module permissive_mysqld_t (aucun autre module permissive_mysqld_t n'existe à une autre priorité).

Que faire si SELinux ne fonctionne pas ?

Souvent, la configuration de SELinux nécessite tellement de tests. L'une des meilleures façons de tester la configuration est de changer le mode en "permissif". Si vous souhaitez le définir uniquement pour le domaine MySQL, vous pouvez simplement utiliser la commande suivante. C'est une bonne pratique pour éviter de configurer tout le système en "permissif":

$ semanage permissive -a mysqld_t

Une fois que tout est fait, vous pouvez revenir au mode "enforcement" :

$ semanage permissive -d mysqld_t

En plus de cela, /var/log/audit/audit.log fournit tous les journaux liés à SELinux. Ce journal vous aidera beaucoup à identifier la cause première et la raison. Tout ce que vous avez à faire est de filtrer "refusé" en utilisant "grep".

$ more /var/log/audit/audit.log |grep "denied"

Nous avons maintenant terminé la configuration de la politique SELinux pour le système basé sur MySQL. Une chose à mentionner est que la même configuration doit être effectuée sur tous les nœuds de votre cluster, vous devrez peut-être répéter le même processus pour eux.