Les données sont l'actif le plus important d'une entreprise, vous devez donc prendre en compte toutes les considérations de sécurité dans votre base de données pour la garder aussi sûre que possible. SELinux est une fonctionnalité de sécurité importante sur les systèmes d'exploitation basés sur RedHat. Dans ce blog, nous verrons en quoi consiste cette fonctionnalité et comment la configurer pour les bases de données PostgreSQL et TimescaleDB.
Qu'est-ce que SELinux ?
Security-Enhanced Linux (SELinux) est une architecture de sécurité pour les systèmes Linux qui permet aux administrateurs de mieux contrôler qui peut accéder au système. Il définit les contrôles d'accès pour les applications, les processus et les fichiers sur un système à l'aide de politiques de sécurité, qui sont un ensemble de règles qui indiquent à SELinux ce qui est accessible.
Lorsqu'une application ou un processus, appelé sujet, fait une demande d'accès à un objet, comme un fichier, SELinux vérifie avec un cache vectoriel d'accès (AVC), où les autorisations sont mises en cache pour les sujets et les objets . Si SELinux n'est pas en mesure de prendre une décision concernant l'accès en fonction des autorisations mises en cache, il envoie la demande au serveur de sécurité. Le serveur de sécurité vérifie le contexte de sécurité de l'application ou du processus et du fichier. Le contexte de sécurité est appliqué à partir de la base de données de politiques SELinux et l'autorisation est accordée ou refusée.
Il existe différentes manières de le configurer. Vous pouvez consulter le fichier de configuration principal de SELinux dans /etc/selinux/config pour voir comment il est actuellement configuré.
$ cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
Il y a deux directives dans ce fichier. La directive SELINUX spécifie le mode SELinux et peut avoir trois valeurs possibles :Enforcing, Permissive ou Disabled.
-
Application (par défaut) :il activera et appliquera la politique de sécurité SELinux sur le système, en refusant les tentatives d'accès non autorisées par les utilisateurs et les processus.
-
Permissif :en l'utilisant, SELinux est activé mais n'appliquera pas la politique de sécurité. Toutes les violations de stratégie sont consignées dans les journaux d'audit. C'est un bon moyen de tester SELinux avant de l'appliquer.
-
Désactivé :SELinux est désactivé.
La directive SELINUXTYPE spécifie la politique à utiliser. La valeur par défaut est ciblée et avec cette politique, SELinux vous permet de personnaliser et d'affiner les autorisations de contrôle d'accès.
Même lorsque le mode d'application est celui par défaut, la désactivation de SELinux est devenue une pratique courante car il est plus facile que de s'en occuper. Bien sûr, ce n'est pas recommandé et vous devriez l'avoir configuré au moins en mode permissif et vérifier périodiquement les journaux à la recherche d'un comportement inhabituel.
Comment configurer SELinux
Si SELinux est désactivé dans votre environnement, vous pouvez l'activer en modifiant le fichier de configuration /etc/selinux/config et en définissant SELINUX=permissive ou SELINUX=enforcing.
Si vous n'avez jamais utilisé SELinux, la meilleure façon de le configurer est d'utiliser d'abord le mode Permissif, de vérifier les journaux à la recherche de messages refusés dans le fichier journal des messages et de le corriger si nécessaire :
$ grep "SELinux" /var/log/messages
Une fois que tout a été examiné et que vous pouvez continuer en toute sécurité, vous pouvez configurer SELinux pour appliquer la méthode précédente ou sans redémarrer à l'aide de la commande suivante :
$ setenforce 1
Si vous devez revenir en arrière, exécutez :
$ setenforce 0
Cette commande peut être utilisée pour basculer entre les modes Application et Permissif à la volée, mais ces modifications ne persistent pas si vous redémarrez le système. Vous devrez configurer la valeur dans le fichier de configuration pour la rendre persistante.
Vous pouvez vérifier l'état actuel de SELinux à l'aide de la commande getenforce :
$ getenforce
Enforcing
Ou pour des informations plus détaillées, vous pouvez utiliser sestatus à la place :
$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 33
Comment configurer SELinux pour PostgreSQL et TimescaleDB
Si vous installez PostgreSQL/TimescaleDB en utilisant la configuration par défaut et le répertoire de données par défaut, et que SELinux est également configuré par défaut, vous n'aurez probablement aucun problème, mais le problème est que si vous voulez utilisez, par exemple, un emplacement spécifique où stocker votre base de données, voyons donc comment configurer SELinux pour le faire fonctionner. Pour cet exemple, nous installerons PostgreSQL 13 sur CentOS 8 et utiliserons /pgsql/data/ comme répertoire de données.
Tout d'abord, activez le module postgresql :
$ dnf module enable postgresql:13
Installez les packages PostgreSQL 13 correspondants :
$ dnf -y install postgresql-server postgresql-contrib postgresql-libs
Activer le service :
$ systemctl enable postgresql.service
Initialisez votre base de données PostgreSQL :
$ postgresql-setup --initdb
Maintenant, si vous démarrez simplement le service sans rien changer, comme le répertoire de données, il démarrera correctement, sinon, vous verrez une erreur comme :
Jun 15 19:41:40 ip-172-31-24-90.us-east-2.compute.internal postmaster[29116]: postmaster: could not access the server configuration file "/pgsql/data/postgresql.conf": Permission denied
Jun 15 19:41:40 ip-172-31-24-90.us-east-2.compute.internal systemd[1]: postgresql.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
Jun 15 19:41:40 ip-172-31-24-90.us-east-2.compute.internal systemd[1]: postgresql.service: Failed with result 'exit-code'.
Alors, voyons comment y remédier. Tout d'abord, modifiez votre répertoire de données dans votre fichier et service de configuration PostgreSQL. Pour cela, éditez le fichier de service PostgreSQL et changez l'emplacement de PGDATA :
$ vi /etc/systemd/system/multi-user.target.wants/postgresql.service
Environment=PGDATA=/pgsql/data
Modifiez le fichier de profil bash PostgreSQL et changez l'emplacement de PGDATA :
$ vi /var/lib/pgsql/.bash_profile
PGDATA=/pgsql/data
Lisez les modifications :
$ systemctl daemon-reload
Initialisez la nouvelle base de données PostgreSQL :
$ postgresql-setup --initdb
* Initializing database in '/pgsql/data'
* Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
Il n'est pas nécessaire de spécifier le nouvel emplacement du répertoire de données comme vous l'avez fait précédemment dans les fichiers de configuration. Maintenant, avant de le démarrer, vous devez changer le label SELinux :
$ chcon -Rt postgresql_db_t /pgsql/data
Cette commande va changer le contexte de sécurité SELinux, et les drapeaux sont :
-
-R, --recursive :opérer sur les fichiers et les répertoires de manière récursive
-
-t, --type=TYPE :définir le type TYPE dans le contexte de sécurité cible
Ensuite, démarrez le service PostgreSQL :
$ systemctl start postgresql.service
Et votre base de données fonctionne maintenant :
$ ps aux |grep postgres |head -1
postgres 28566 0.0 3.0 497152 25312 ? Ss 21:16 0:00 /usr/bin/postmaster -D /pgsql/data
Ceci n'est qu'un exemple de base de la configuration de SELinux pour PostgreSQL/TimescaleDB. Il existe différentes façons de le faire avec différentes restrictions ou outils. La meilleure implémentation ou configuration de SELinux dépend des besoins de l'entreprise.
Comment utiliser PostgreSQL et TimescaleDB avec ClusterControl et SELinux
ClusterControl ne gère aucun module de sécurité du noyau Linux comme SELinux. Lors du déploiement d'un cluster PostgreSQL ou TimescaleDB à l'aide de ClusterControl, vous pouvez spécifier si vous souhaitez que ClusterControl désactive SELinux pour vous pendant le processus de déploiement afin de réduire le risque d'erreur :
Si vous ne voulez pas le désactiver, vous pouvez utiliser le Permissive mode et surveillez le journal de vos serveurs pour vous assurer que vous disposez de la bonne configuration SELinux. Après cela, vous pouvez le changer en Application en suivant les instructions mentionnées ci-dessus.
Vous pouvez trouver plus d'informations sur la configuration de SELinux sur les sites officiels RedHat ou CentOS.