Los datos son el activo más importante de una empresa, por lo que debe tener en cuenta todas las consideraciones de seguridad en su base de datos para mantenerla lo más segura posible. Una función de seguridad importante en los sistemas operativos basados en RedHat es SELinux. En este blog, veremos qué es esta función y cómo configurarla para las bases de datos PostgreSQL y TimescaleDB.
¿Qué es SELinux?
Security-Enhanced Linux (SELinux) es una arquitectura de seguridad para sistemas Linux que permite a los administradores tener más control sobre quién puede acceder al sistema. Define controles de acceso para las aplicaciones, procesos y archivos en un sistema utilizando políticas de seguridad, que son un conjunto de reglas que le indican a SELinux a qué se puede acceder.
Cuando una aplicación o proceso, conocido como sujeto, realiza una solicitud para acceder a un objeto, como un archivo, SELinux verifica con un caché de vector de acceso (AVC), donde se almacenan en caché los permisos para sujetos y objetos . Si SELinux no puede tomar una decisión sobre el acceso en función de los permisos almacenados en caché, envía la solicitud al servidor de seguridad. El servidor de seguridad comprueba el contexto de seguridad de la aplicación o el proceso y el archivo. El contexto de seguridad se aplica desde la base de datos de políticas de SELinux y el permiso se concede o deniega.
Hay diferentes formas de configurarlo. Puede echar un vistazo al archivo de configuración principal de SELinux en /etc/selinux/config para ver cómo está configurado actualmente.
$ 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
Hay dos directivas en este archivo. La directiva SELINUX especifica el modo SELinux y puede tener tres valores posibles:Enforcing, Permissive o Disabled.
-
Cumplimiento (Predeterminado):Habilitará y aplicará la política de seguridad de SELinux en el sistema, negando los intentos de acceso no autorizado por usuarios y procesos.
-
Permisivo:Usándolo, SELinux está habilitado pero no aplicará la política de seguridad. Todas las infracciones de la política se registran en los registros de auditoría. Es una buena manera de probar SELinux antes de implementarlo.
-
Desactivado:SELinux está desactivado.
La directiva SELINUXTYPE especifica la política que se utilizará. El valor predeterminado es específico y con esta política, SELinux le permite personalizar y ajustar los permisos de control de acceso.
Incluso cuando el modo Enforcing es el predeterminado, deshabilitar SELinux se ha convertido en una práctica común ya que es más fácil que manejarlo. Por supuesto, esto no es recomendable y deberías tenerlo configurado al menos en modo Permisivo y revisar los registros periódicamente en busca de comportamientos inusuales.
Cómo configurar SELinux
Si SELinux está deshabilitado en su entorno, puede habilitarlo editando el archivo de configuración /etc/selinux/config y configurando SELINUX=permisivo o SELINUX=enforcing.
Si nunca ha usado SELinux, la mejor manera de configurarlo es usando primero el modo Permisivo, verifique los registros en busca de mensajes denegados en el archivo de registro de mensajes y corríjalo si es necesario:
$ grep "SELinux" /var/log/messages
Después de que todo haya sido revisado y sea seguro continuar, puede configurar SELinux para que se cumpla usando el método anterior o sin reiniciar usando el siguiente comando:
$ setenforce 1
Si necesita retroceder, ejecute:
$ setenforce 0
Este comando se puede usar para alternar entre los modos Ejecución y Permiso sobre la marcha, pero estos cambios no persisten si reinicia el sistema. Deberá configurar el valor en el archivo de configuración para que sea persistente.
Puede verificar el estado actual de SELinux usando el comando getenforce:
$ getenforce
Enforcing
O para obtener información más detallada, puede usar sestatus en su lugar:
$ 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
Cómo configurar SELinux para PostgreSQL y TimescaleDB
Si está instalando PostgreSQL/TimescaleDB usando la configuración predeterminada y el directorio de datos predeterminado, y SELinux también está configurado de manera predeterminada, lo más probable es que no tenga ningún problema, pero el problema es si desea use, por ejemplo, una ubicación específica donde almacenar su base de datos, así que veamos cómo configurar SELinux para que funcione. Para este ejemplo, instalaremos PostgreSQL 13 en CentOS 8 y usaremos /pgsql/data/ como directorio de datos.
Primero, habilite el módulo postgresql:
$ dnf module enable postgresql:13
Instalar los paquetes de PostgreSQL 13 correspondientes:
$ dnf -y install postgresql-server postgresql-contrib postgresql-libs
Habilitar el servicio:
$ systemctl enable postgresql.service
Inicialice su base de datos PostgreSQL:
$ postgresql-setup --initdb
Ahora, si simplemente inicia el servicio sin cambiar nada, como el directorio de datos, comenzará bien; de lo contrario, verá un error como:
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'.
Entonces, veamos cómo solucionarlo. Primero, cambie su directorio de datos en su archivo y servicio de configuración de PostgreSQL. Para ello, edite el archivo de servicio de PostgreSQL y cambie la ubicación de PGDATA:
$ vi /etc/systemd/system/multi-user.target.wants/postgresql.service
Environment=PGDATA=/pgsql/data
Edite el archivo de perfil bash de PostgreSQL y cambie la ubicación de PGDATA:
$ vi /var/lib/pgsql/.bash_profile
PGDATA=/pgsql/data
Lea los cambios:
$ systemctl daemon-reload
Inicialice la nueva base de datos PostgreSQL:
$ postgresql-setup --initdb
* Initializing database in '/pgsql/data'
* Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
No es necesario especificar la nueva ubicación del directorio de datos como lo hizo anteriormente en los archivos de configuración. Ahora, antes de iniciarlo, debe cambiar la etiqueta de SELinux:
$ chcon -Rt postgresql_db_t /pgsql/data
Este comando cambiará el contexto de seguridad de SELinux, y las banderas son:
-
-R, --recursive:Opera en archivos y directorios recursivamente
-
-t, --type=TYPE:establece el tipo TYPE en el contexto de seguridad de destino
Luego, inicie el servicio PostgreSQL:
$ systemctl start postgresql.service
Y su base de datos se está ejecutando ahora:
$ 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
Este es solo un ejemplo básico de cómo configurar SELinux para PostgreSQL/TimescaleDB. Hay diferentes formas de hacer esto con diferentes restricciones o herramientas. La mejor implementación o configuración de SELinux depende de los requisitos comerciales.
Cómo usar PostgreSQL y TimescaleDB con ClusterControl y SELinux
ClusterControl no administra ningún módulo de seguridad del kernel de Linux como SELinux. Al implementar un clúster de PostgreSQL o TimescaleDB mediante ClusterControl, puede especificar si desea que ClusterControl deshabilite SELinux durante el proceso de implementación para reducir el riesgo de errores:
Si no desea deshabilitarlo, puede usar el Permisivo mode y controle el registro en sus servidores para asegurarse de que tiene la configuración correcta de SELinux. Después de eso, puede cambiarlo a Cumplimiento siguiendo las instrucciones mencionadas anteriormente.
Puede encontrar más información sobre la configuración de SELinux en los sitios oficiales de RedHat o CentOS.