sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo configurar SELinux para conjuntos de réplicas de MongoDB

Para 2025, el mundo almacenará aproximadamente 200 zettabytes de datos. Esos datos se almacenarán en almacenamiento público, privado, local o en la nube, PC, portátiles, teléfonos inteligentes y también dispositivos de Internet de las cosas (IoT). En la proyección, también se espera que la cantidad de dispositivos conectados a Internet aumente a casi 75 mil millones en 2025. Para algunos de nosotros o personas con menos experiencia en TI, esos números no son nada. Pero para los entusiastas de la seguridad, esto es preocupante porque cada vez hay más datos en riesgo.

En el mundo de la tecnología y las bases de datos de código abierto, la seguridad es uno de los temas importantes. De vez en cuando habrá una gran cantidad de nuevos inventos y desarrollos asociados con la seguridad. Uno de ellos es Security-Enhanced Linux o (SELinux) para abreviar, que fue desarrollado hace casi 21 años por la Agencia de Seguridad Nacional de los Estados Unidos (NSA). Aunque esto se introdujo hace tantos años, ha evolucionado rápidamente y se usa ampliamente como una de las medidas de seguridad para el sistema Linux. Si bien no es fácil encontrar información sobre cómo configurarlo con una base de datos, MongoDB se ha aprovechado de esto. En esta publicación de blog, analizaremos SELinux y cómo configurarlo en conjuntos de réplicas de MongoDB.

Para este propósito, usaremos 3 máquinas virtuales CentOS 8 para nuestro entorno de prueba y usaremos MongoDB 4.4. Antes de continuar, profundicemos un poco más en SELinux.

Modo obligatorio, permisivo y deshabilitado

Estos son los tres modos que SELinux puede ejecutar en un momento dado. Por supuesto, todos ellos tienen su propia función y finalidad en cuanto a la política de seguridad. Lo revisaremos uno por uno.

Cuando está en modo de aplicación, cualquier política configurada se aplicará en el sistema y SELinux negará cada intento de acceso no autorizado tanto por parte de los usuarios como de los procesos. No solo eso, esas acciones de acceso denegado también se registrarán en los archivos de registro relacionados. Si bien este es el modo más recomendado, la mayoría de los sistemas Linux en la actualidad no tienen habilitado este modo por parte del administrador del sistema debido a varias razones, como la complejidad del propio SELinux.

Para el modo permisivo, podemos decir con seguridad que SELinux está en un estado semihabilitado. En este modo, SELinux no aplicará ninguna política y, al mismo tiempo, no se negará el acceso. A pesar de eso, cualquier violación de la política aún se registra y se registra en los registros de auditoría. Por lo general, este modo se usa para probar SELinux antes de finalizarlo y proceder a aplicarlo.

Para el último modo que está deshabilitado, no se está ejecutando seguridad mejorada en el sistema. ¿Sabe qué modo SELinux ejecuta su sistema ahora? Simplemente ejecute el siguiente comando para ver:

$ 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

Para nuestros sistemas de prueba, SELinux ha sido habilitado y configurado para que podamos continuar con el resto de la guía. En caso de que SELinux esté deshabilitado o sea permisivo en su sistema, puede seguir los pasos a continuación para habilitarlo y cambiar a cumplimiento.

  1. Edite el archivo /etc/selinux/config para cambiar la directiva a cumplir

vi /etc/sysconfig/selinux
...
SELINUX=enforcing
…

Debe asegurarse de que la directiva anterior esté configurada para hacer cumplir.

  1. Reinicie el sistema para aplicar la configuración

$ reiniciar

Una vez que el sistema esté en línea, debemos confirmar que SELinux se haya configurado correctamente y que se haya realizado el cambio. Ejecute el siguiente comando para verificar, esta es otra forma de verificarlo aparte de la primera que mencioné anteriormente (sestatus).

$ getenforce

Cumplimiento

Una vez que vemos la palabra "Cumplir", podemos confirmar que está listo. Dado que vamos a utilizar un conjunto de réplicas, debemos asegurarnos de que SELinux se haya configurado en todos los nodos de MongoDB. Creo que esta es la parte más importante que debemos cubrir antes de continuar con la configuración de SELinux para MongoDB.

Configuración "ulimit" recomendada 

En este ejemplo, asumimos que MongoDB 4.4 se ha instalado en 3 nodos. La instalación es muy simple y fácil, para ahorrarnos tiempo no vamos a mostrarle los pasos, pero aquí está el enlace a la documentación.

En algunos casos, "ulimit" del sistema causará algunos problemas si los límites tienen un valor predeterminado bajo. Para asegurarse de que MongoDB se ejecute correctamente, recomendamos configurar el "ulimit" según la recomendación de MongoDB aquí. Si bien cada implementación puede tener sus requisitos o configuraciones únicos, es mejor seguir la siguiente configuración "ulimit":

-f (file size): unlimited
-t (cpu time): unlimited
-v (virtual memory): unlimited
-l (locked-in-memory size): unlimited
-n (open files): 64000
-m (memory size): unlimited
-u (processes/threads): 64000

Para cambiar el valor de “ulimit”, simplemente emita el siguiente comando, por ejemplo, cambiando el valor de “-n” (archivos abiertos):

$ ulimit -n 64000

Después de cambiar todos los límites, se debe reiniciar la  instancia de mongod para garantizar que se realicen los nuevos cambios de límite:

$ sudo systemctl restart mongod

Configuración de SELinux

Según la documentación de MongoDB, la política actual de SELinux no permite que el proceso de MongoDB acceda a /sys/fs/cgroup, que es necesario para determinar la memoria disponible en su sistema. Entonces, para nuestro caso, en el que SELinux está en modo de aplicación, se debe realizar el siguiente ajuste.

Permitir acceso a cgroup

El primer paso es asegurar que nuestro sistema tenga instalado el paquete “checkpolicy”:

$ sudo yum install checkpolicy

yum install checkpolicy

Last metadata expiration check: 2:13:40 ago on Fri 11 Jun 2021 05:32:10 AM UTC.

Package checkpolicy-2.9-1.el8.x86_64 is already installed.

Dependencies resolved.

Nothing to do.

Complete!

A continuación, debemos crear un archivo de política personalizado para “mongodb_cgroup_memory.te”:

cat > mongodb_cgroup_memory.te <<EOF
module mongodb_cgroup_memory 1.0;
require {
      type cgroup_t;
      type mongod_t;
      class dir search;
      class file { getattr open read };
}

#============= mongod_t ==============
allow mongod_t cgroup_t:dir search;
allow mongod_t cgroup_t:file { getattr open read };
EOF

Después de crear el archivo de política, los últimos pasos son compilar y cargar el módulo de política personalizado ejecutando estos tres comandos:

$ checkmodule -M -m -o mongodb_cgroup_memory.mod mongodb_cgroup_memory.te
$ semodule_package -o mongodb_cgroup_memory.pp -m mongodb_cgroup_memory.mod
$ sudo semodule -i mongodb_cgroup_memory.pp

El último comando debería tomar un tiempo y una vez hecho, el proceso de MongoDB debería poder acceder a los archivos correctos con el modo de aplicación de SELinux.

Permitir acceso a netstat para FTDC

Se requiere

/proc/net/netstat para la captura de datos de diagnóstico a tiempo completo (FTDC). FTDC en resumen es un mecanismo para facilitar el análisis del servidor MongoDB. Los archivos de datos en FTDC están comprimidos, no son legibles por humanos y heredan el mismo permiso de acceso a archivos que los archivos de datos de MongoDB. Debido a esto, solo los usuarios con acceso a los archivos de datos de la FTDC pueden transmitir los datos.

Los pasos para configurarlo son casi idénticos al anterior. Es solo que la política personalizada es diferente.

$ sudo yum install checkpolicy
Create a custom policy file “mongodb_proc_net.te”:
cat > mongodb_proc_net.te <<EOF
module mongodb_proc_net 1.0;
require {
    type proc_net_t;
    type mongod_t;
    class file { open read };
}

#============= mongod_t ==============
allow mongod_t proc_net_t:file { open read };
EOF

Los últimos pasos son compilar y cargar la política personalizada:

$ checkmodule -M -m -o mongodb_proc_net.mod mongodb_proc_net.te
$ semodule_package -o mongodb_proc_net.pp -m mongodb_proc_net.mod
$ sudo semodule -i mongodb_proc_net.pp

Ruta personalizada del directorio MongoDB

Una cosa importante a tener en cuenta es que si instaló MongoDB en el directorio personalizado, también deberá personalizar la política de SELinux. Los pasos son ligeramente diferentes al anterior pero no es demasiado complejo.

Primero, necesitamos actualizar la política de SELinux para permitir que el servicio mongod use el nuevo directorio, vale la pena señalar que debemos asegurarnos de incluir .* al final del directorio:

$ sudo semanage fcontext -a -t <type> </some/MongoDB/directory.*>
  • mongod_var_lib_t para el directorio de datos

  • mongod_log_t para el directorio de archivos de registro

  • mongod_var_run_t para el directorio de archivos pid

Luego, actualice la política de usuario de SELinux para el nuevo directorio:

$ sudo chcon -Rv -u system_u -t <type> </some/MongoDB/directory>
  • mongod_var_lib_t para el directorio de datos

  • mongod_log_t para el directorio de registro

  • mongod_var_run_t para el directorio de archivos pid

El último paso es aplicar las políticas actualizadas de SELinux al directorio:

restorecon -R -v </some/MongoDB/directory>

Dado que MongoDB usa la ruta predeterminada tanto para datos como para archivos de registro, podemos ver los siguientes ejemplos sobre cómo aplicarlo:

Para la ruta de datos MongoDB no predeterminada de /mongodb/data:

$ sudo semanage fcontext -a -t mongod_var_lib_t '/mongodb/data.*'
$ sudo chcon -Rv -u system_u -t mongod_var_lib_t '/mongodb/data'
$ restorecon -R -v '/mongodb/data'
For non-default MongoDB log directory of /mongodb/log (e.g. if the log file path is /mongodb/log/mongod.log):

$ sudo semanage fcontext -a -t mongod_log_t '/mongodb/log.*'
$ sudo chcon -Rv -u system_u -t mongod_log_t '/mongodb/log'
$ restorecon -R -v '/mongodb/log'

Puerto MongoDB personalizado

En algunas situaciones, algunas de las instalaciones de MongoDB utilizan un número de puerto diferente al predeterminado, que es 27017. En este caso particular, también debemos configurar SELinux y el comando es bastante simple. :

$ sudo semanage port -a -t mongod_port_t -p tcp <portnumber>
For example, we are using port 37017:
$ sudo semanage port -a -t mongod_port_t -p tcp 37017

Implementación de MongoDB SELinux habilitado con ClusterControl

Con ClusterControl, tiene la opción de habilitar SELinux durante la implementación de su conjunto de réplicas MongoDB. Sin embargo, aún debe cambiar el modo para que se cumpla, ya que ClusterControl solo lo configura como permisivo. Para habilitarlo durante la implementación, puede desmarcar "Deshabilitar AppArmor/SELinux" como se muestra en la siguiente captura de pantalla.

Después de eso, puede continuar y agregar los nodos para su conjunto de réplicas MongoDB e iniciar el despliegue. En ClusterControl, estamos usando la versión 4.2 para MongoDB.

Una vez que el clúster esté listo, debemos cambiar el SELinux para que se cumpla todos los nodos y proceda a configurarlo consultando los pasos que acabamos de seguir.

Conclusión

Hay 3 modos de SELinux disponibles para cualquier sistema Linux. Para el modo de aplicación de SELinux, hay algunos pasos que deben seguirse para asegurarse de que MongoDB se ejecute sin problemas. También vale la pena señalar que algunas de las configuraciones "ulimit" también deben cambiarse para adaptarse a los requisitos y especificaciones del sistema.

Con ClusterControl, SELinux se puede habilitar durante la implementación, sin embargo, aún debe cambiar al modo de aplicación y configurar la política después de que el conjunto de réplicas esté listo.

Esperamos que esta publicación de blog lo ayude a configurar SELinux para sus servidores MongoDB