MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como configurar o SELinux para conjuntos de réplicas do MongoDB

Até 2025, o mundo armazenará aproximadamente 200 zettabytes de dados. Esses dados serão armazenados em armazenamento público, privado, local ou em nuvem, PCs, laptops, smartphones e também dispositivos de Internet das Coisas (IoT). Na projeção, o número de dispositivos conectados à Internet também deve aumentar para quase 75 bilhões em 2025. Para alguns de nós ou pessoas com menos experiência em TI, esses números não são nada. Mas para os entusiastas da segurança, isso é preocupante porque cada vez mais dados estão em risco.

No mundo da tecnologia de código aberto e bancos de dados, a segurança é um dos tópicos importantes. De vez em quando, haverá muitas novas invenções e desenvolvimentos associados à segurança. Um deles é o Security-Enhanced Linux ou (SELinux), abreviado, que foi desenvolvido há quase 21 anos pela Agência de Segurança Nacional dos Estados Unidos (NSA). Mesmo que isso tenha sido introduzido há tantos anos, ele evoluiu rapidamente e amplamente utilizado como uma das medidas de segurança para o sistema Linux. Embora não seja fácil encontrar informações sobre como configurá-lo com um banco de dados, o MongoDB aproveitou isso. Nesta postagem do blog, veremos o SELinux e como configurá-lo nos conjuntos de réplicas do MongoDB.

Para isso, usaremos 3 VMs CentOS 8 para nosso ambiente de teste e usaremos o MongoDB 4.4. Antes de prosseguirmos, vamos mergulhar um pouco mais fundo no SELinux.

Modo obrigatório, permissivo e desabilitado

Estes são os três modos que o SELinux pode executar a qualquer momento. Claro, todos eles têm sua própria função e propósito em termos de política de segurança. Vamos passar por isso um por um.

Quando em modo de imposição, qualquer política configurada será aplicada no sistema e cada tentativa de acesso não autorizado por usuários ou processos é negada pelo SELinux. Além disso, essas ações de acesso negado também serão registradas nos arquivos de log relacionados. Embora este seja o modo mais recomendado, a maioria dos sistemas Linux hoje em dia não tem este modo habilitado pelo administrador do sistema devido a vários motivos como a complexidade do próprio SELinux.

Para o modo permissivo, podemos dizer com segurança que o SELinux está em um estado semi-habilitado. Neste modo, nenhuma política será aplicada pelo SELinux, ao mesmo tempo em que nenhum acesso será negado. Apesar disso, qualquer violação de política ainda é registrada e registrada nos logs de auditoria. Normalmente, esse modo é usado para testar o SELinux antes de finalizá-lo e continuar a aplicá-lo.

Para o último modo que está desabilitado, nenhuma segurança aprimorada está sendo executada no sistema. Você sabe qual modo SELinux seu sistema roda agora? Basta executar o seguinte 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 nossos sistemas de teste, o SELinux foi habilitado e configurado como obrigatório para que pudéssemos prosseguir com o restante do guia. Caso o SELinux esteja desabilitado ou permissivo em seu sistema, você pode seguir os passos abaixo para habilitá-lo e mudar para forçando.

  1. Edite o arquivo /etc/selinux/config para alterar a diretiva para forçar

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

Você precisa ter certeza de que a diretiva acima está definida como obrigatória.

  1. Reinicialize o sistema para aplicar a configuração

$ reinicialização

Uma vez que o sistema esteja online, precisamos confirmar que o SELinux foi configurado corretamente e que a mudança ocorreu. Execute o seguinte comando para verificar, esta é outra maneira de verificar além do primeiro que mencionei anteriormente (sestatus).

$ getenforce

Aplicando

Depois de vermos a palavra “Aplicando”, podemos confirmar que está pronto. Como vamos usar um conjunto de réplicas, precisamos ter certeza de que o SELinux foi configurado em todos os nós do MongoDB. Acredito que esta seja a parte mais importante que devemos cobrir antes de prosseguir com a configuração do SELinux para MongoDB.

Configurações "ulimit" recomendadas 

Neste exemplo, assumimos que o MongoDB 4.4 foi instalado em 3 nós. A instalação é muito simples e fácil, para economizar nosso tempo não vamos mostrar os passos, mas aqui está o link para a documentação.

Em alguns casos, “ulimit” do sistema causará alguns problemas se os limites tiverem um valor padrão baixo. Para garantir que o MongoDB seja executado corretamente, é altamente recomendável definir o “ulimit” de acordo com a recomendação do MongoDB aqui. Embora cada implantação possa ter seus requisitos ou configurações exclusivas, é melhor seguir as seguintes configurações "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 alterar o valor “ulimit”, basta emitir o seguinte comando, por exemplo, alterando o valor para “-n” (arquivos abertos):

$ ulimit -n 64000

Depois que todos os limites forem alterados, a instância do mongod deve ser reiniciada para garantir que as novas alterações de limite ocorram:

$ sudo systemctl restart mongod

Configurando o SELinux

De acordo com a documentação do MongoDB, a política SELinux atual não permite que o processo do MongoDB acesse /sys/fs/cgroup, que é necessário para determinar a memória disponível em seu sistema. Portanto, para o nosso caso, no qual o SELinux está em modo de imposição, o seguinte ajuste deve ser feito.

Permitir acesso ao cgroup

O primeiro passo é garantir que nosso sistema tenha o pacote “checkpolicy” instalado:

$ 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!

Em seguida, precisamos criar um arquivo 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

Depois que o arquivo de política é criado, as últimas etapas são compilar e carregar o módulo de política personalizado executando estes três 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

O último comando deve demorar um pouco e, uma vez concluído, o processo do MongoDB deve poder acessar os arquivos corretos com o modo de imposição do SELinux.

Permitir acesso ao netstat para FTDC

/proc/net/netstat é necessário para Full Time Diagnostic Data Capture (FTDC). O FTDC em resumo é um mecanismo para facilitar a análise do servidor MongoDB. Os arquivos de dados no FTDC são compactados, não legíveis por humanos e herdam a mesma permissão de acesso a arquivos que os arquivos de dados do MongoDB. Devido a isso, apenas usuários com acesso aos arquivos de dados FTDC podem transmitir os dados.

Os passos para configurá-lo são quase idênticos ao anterior. É só que a política personalizada é 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

As últimas etapas são compilar e carregar a 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

Caminho do diretório MongoDB personalizado

Uma coisa importante a ser observada é que, se você instalou o MongoDB no diretório personalizado, também precisará personalizar a política do SELinux. As etapas são um pouco diferentes das anteriores, mas não são muito complexas.

Primeiro, precisamos atualizar a política do SELinux para permitir que o serviço mongod use o novo diretório, vale a pena notar que precisamos ter certeza de incluir o .* no final do diretório:

$ sudo semanage fcontext -a -t <type> </some/MongoDB/directory.*>
  • mongod_var_lib_t para diretório de dados

  • mongod_log_t para o diretório do arquivo de log

  • mongod_var_run_t para diretório de arquivos pid

Em seguida, atualize a política de usuário do SELinux para o novo diretório:

$ sudo chcon -Rv -u system_u -t <type> </some/MongoDB/directory>
  • mongod_var_lib_t para diretório de dados

  • mongod_log_t para diretório de log

  • mongod_var_run_t para diretório de arquivos pid

A última etapa é aplicar as políticas SELinux atualizadas ao diretório:

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

Como o MongoDB está usando o caminho padrão para dados e arquivos de log, podemos dar uma olhada nos seguintes exemplos de como aplicá-lo:

Para caminho de dados não padrão do MongoDB 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'

Porta MongoDB personalizada

Para algumas situações, algumas das instalações do MongoDB estão usando um número de porta diferente do padrão que é 27017. Neste caso em particular, precisamos configurar o SELinux também e o comando é bem simples :

$ 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

Implantando MongoDB SELinux habilitado com ClusterControl

Com o ClusterControl, você tem a opção de habilitar o SELinux durante a implantação do seu conjunto de réplicas do MongoDB. No entanto, você ainda precisa alterar o modo para imposição, pois o ClusterControl apenas o define como permissivo. Para habilitá-lo durante a implantação, você pode desmarcar “Desativar AppArmor/SELinux” conforme a captura de tela abaixo.

Depois disso, você pode continuar e adicionar os nós para seu conjunto de réplicas do MongoDB e iniciar a implantação. No ClusterControl, estamos usando a versão 4.2 para MongoDB.

Quando o cluster estiver pronto, precisamos alterar o SELinux para forçar para todos os nós e prossiga com a configuração consultando as etapas que passamos agora.

Conclusão

Existem 3 modos de SELinux disponíveis para qualquer sistema Linux. Para o modo de imposição do SELinux, existem algumas etapas que precisam ser seguidas para garantir que o MongoDB seja executado sem problemas. Também vale a pena notar que algumas das configurações “ulimit” também precisam ser alteradas para atender aos requisitos do sistema e às especificações.

Com o ClusterControl, o SELinux pode ser habilitado durante a implantação, mas você ainda precisa mudar para o modo de imposição e configurar a política depois que o conjunto de réplicas estiver pronto.

Esperamos que esta postagem do blog ajude você a configurar o SELinux para seus servidores MongoDB