Na era em que vivemos agora, qualquer coisa com um ambiente menos seguro é facilmente alvo de um ataque e se torna uma recompensa para os invasores. Em comparação com os últimos 20 anos, os hackers hoje em dia estão mais avançados não apenas com as habilidades, mas também com as ferramentas que estão usando. Não é surpresa por que algumas empresas gigantes estão sendo hackeadas e seus dados valiosos vazam.
Somente no ano de 2021, já são mais de 10 incidentes relacionados a violações de dados. O incidente mais recente foi relatado pela BOSE, uma conhecida fabricante de áudio que ocorreu em maio. A BOSE descobriu que algumas das informações pessoais de seus atuais e ex-funcionários foram acessadas pelos invasores. As informações pessoais expostas no ataque incluem nomes, CPFs, informações de compensação e outras informações relacionadas ao RH.
Qual você acha que é o objetivo desse tipo de ataque e o que motiva o hacker a fazê-lo? É obviamente tudo sobre o dinheiro. Como os dados roubados também são vendidos com frequência, atacando grandes empresas, os hackers podem ganhar dinheiro. Não apenas os dados importantes podem ser vendidos para os concorrentes do negócio, mas os hackers também podem pedir um grande resgate ao mesmo tempo.
Então, como podemos relacionar isso com bancos de dados? Como o banco de dados é um dos grandes ativos da empresa, é recomendável cuidar dele com segurança reforçada para que nossos valiosos dados estejam protegidos na maior parte do tempo. No meu último post no blog, já passamos por uma introdução sobre o SELinux, como habilitá-lo, que tipo de modo o SELinux possui e como configurá-lo para o MongoDB. Hoje, vamos dar uma olhada em como configurar o SELinux para sistemas baseados em MySQL.
Os 5 principais benefícios do SELinux
Antes de prosseguir, talvez alguns de vocês estejam se perguntando se o SELinux oferece algum benefício positivo, já que é um pouco trabalhoso habilitá-lo. Aqui estão os 5 principais benefícios do SELinux que você não quer perder e deve considerar:
-
Reforçar a confidencialidade e a integridade dos dados ao mesmo tempo que protege os processos
-
A capacidade de confinar serviços e daemons para serem mais previsíveis
-
Reduzindo o risco de ataques de escalonamento de privilégios
-
A política é aplicada em todo o sistema, não definida a critério do usuário e definida administrativamente
-
Fornecendo um controle de acesso refinado
Antes de começarmos a configurar o SELinux para nossas instâncias MySQL, por que não ver como habilitar o SELinux com ClusterControl para todas as implantações baseadas em MySQL. Mesmo que a etapa seja a mesma para todos os sistemas de gerenciamento de banco de dados, achamos uma boa ideia incluir algumas capturas de tela para sua referência.
Etapas para habilitar o SELinux para replicação do MySQL
Nesta seção, vamos implantar o MySQL Replication com ClusterControl 1.8.2. As etapas são as mesmas para MariaDB, Galera Cluster ou MySQL:supondo que todos os nós estejam prontos e o SSH sem senha esteja configurado, vamos iniciar a implantação. Para habilitar o SELinux para nossa configuração, precisamos desmarcar “Desativar AppArmor/SELinux”, o que significa que o SELinux será definido como “permissivo” para todos os nós.
A seguir, escolheremos Percona como fornecedor (você também pode escolher MariaDB , Oracle ou MySQL 8 também), então especifique a senha “root”. Você pode usar um local padrão ou seus outros diretórios dependendo de sua configuração.
Depois que todos os hosts forem adicionados, podemos iniciar a implantação e deixá-la terminar antes que possamos começar com a configuração do SELinux.
Etapas para habilitar o SELinux para replicação MariaDB
Nesta seção, vamos implantar MariaDB Replication com ClusterControl 1.8.2.
Vamos escolher o MariaDB como fornecedor e a versão 10.5, bem como especificar o senha “raiz”. Você pode usar um local padrão ou seus outros diretórios dependendo de sua configuração.
Depois que todos os hosts forem adicionados, podemos iniciar a implantação e deixá-la terminar antes que possamos prosseguir com a configuração do SELinux.
Etapas para habilitar o SELinux para o Galera Cluster
Nesta seção, vamos implantar Galera Cluster com ClusterControl 1.8.2. Mais uma vez, desmarque “Desativar AppArmor/SELinux”, o que significa que o SELinux será definido como “permissivo” para todos os nós:
A seguir, escolheremos Percona como fornecedor e MySQL 8, bem como especifique a senha “root”. Você pode usar um local padrão ou seus outros diretórios dependendo de sua configuração. Depois que todos os hosts forem adicionados, podemos iniciar a implantação e deixá-la terminar.
Como de costume, podemos monitorar o status da implantação na seção "Atividade" da interface do usuário.
Como configurar o SELinux para MySQL
Considerando que todos os nossos clusters são baseados em MySQL, os passos para configurar o SELinux também são os mesmos. Antes de começarmos com a configuração e como este é um ambiente recém-configurado, sugerimos que você desabilite o modo de recuperação automática para cluster e nó conforme a captura de tela abaixo. Ao fazer isso, podemos evitar que o cluster seja executado em um failover enquanto estamos fazendo o teste ou reiniciando o serviço:
Primeiro, vamos ver qual é o contexto para “mysql”. Vá em frente e execute o seguinte comando para visualizar o contexto:
$ ps -eZ | grep mysqld_t
E o exemplo da saída é o seguinte:
system_u:system_r:mysqld_t:s0 845 ? 00:00:01 mysqld
A definição para a saída acima é:
-
system_u - Usuário
-
system_r - Função
-
mysqld_t - Tipo
-
s0 845 - Nível de sensibilidade
Se você verificar o status do SELinux, poderá ver que o status é “permissivo”, que ainda não está totalmente habilitado. Precisamos mudar o modo para “enforcing” e para isso temos que editar o arquivo de configuração do SELinux para torná-lo permanente.
$ vi /etc/selinux/config
SELINUX=enforcing
Prossiga para reinicializar o sistema após as alterações. Como estamos mudando o modo de “permissivo” para “aplicativo”, precisamos rotular o sistema de arquivos novamente. Normalmente, você pode optar por renomear todo o sistema de arquivos ou apenas para um aplicativo. A razão pela qual a reetiquetagem é necessária devido ao fato de que o modo de “imposição” precisa do rótulo ou função correta para ser executado corretamente. Em alguns casos, esses rótulos são alterados durante o modo “permissivo” ou “desativado”.
Para este exemplo, vamos renomear apenas um aplicativo (MySQL) usando o seguinte comando:
$ fixfiles -R mysqld restore
Para um sistema que tem sido usado por algum tempo, é uma boa idéia renomear todo o sistema de arquivos. O comando a seguir fará o trabalho sem reinicializar e esse processo pode demorar um pouco dependendo do seu sistema:
$ fixfiles -f -F relabel
Como muitos outros bancos de dados, o MySQL também exige ler e escrever muitos arquivos. Sem um contexto SELinux correto para esses arquivos, o acesso será inquestionavelmente negado. Para configurar a política do SELinux, é necessário "semanage". “semanage” também permite qualquer configuração sem a necessidade de recompilar as fontes de política. Para a maioria dos sistemas Linux, esta ferramenta já vem instalada por padrão. Quanto ao nosso caso, já está instalado com a seguinte versão:
$ rpm -qa |grep semanage
python3-libsemanage-2.9-3.el8.x86_64
libsemanage-2.9-3.el8.x86_64
Para o sistema que não o possui instalado, o seguinte comando o ajudará a instalá-lo:
$ yum install -y policycoreutils-python-utils
Agora, vamos ver quais são os contextos do arquivo MySQL:
$ semanage fcontext -l | grep -i mysql
Como você pode notar, existem vários arquivos que são conectados ao MySQL quando o comando acima é executado. Se você se lembra no início, estamos usando um "Diretório de dados do servidor" padrão. Caso sua instalação esteja usando um local de diretório de dados diferente, você precisa atualizar o contexto para “mysql_db_t” que se refere ao arquivo /var/lib/mysql/
O primeiro passo é alterar o contexto do SELinux usando qualquer uma destas opções:
$ 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
E por último, reinicie o serviço:
$ systemctl restart mysql
Em algumas configurações, provavelmente um local de log diferente é necessário para qualquer finalidade. Para esta situação, “mysqld_log_t” também precisa ser atualizado. “mysqld_log_t” é um contexto para o local padrão /var/log/mysqld.log e os passos abaixo podem ser executados para atualizá-lo:
$ semanage fcontext -a -t mysqld_log_t "/your/custom/error.log"
$ restorecon -Rv /path/to/my/custom/error.log
$ systemctl restart mysql
Haverá uma situação quando a porta padrão for configurada usando uma porta diferente de 3306. Por exemplo, se você estiver usando a porta 3303 para MySQL, você precisa definir o contexto SELinux com o seguinte comando :
$ semanage port -a -t mysqld_port_t -p tcp 3303
E para verificar se a porta foi atualizada, você pode usar o seguinte comando:
$ semanage port -l | grep mysqld
Usando audit2allow para gerar política
Outra forma de configurar a política é usando “audit2allow” que já incluiu durante a instalação da “semanage” agora há pouco. O que essa ferramenta faz é extrair os eventos de log do audit.log e usar essas informações para criar uma política. Às vezes, o MySQL pode precisar de uma política não padrão, então esta é a melhor maneira de conseguir isso.
Primeiro, vamos definir o modo como permissivo para o domínio MySQL e verificar as alterações:
$ semanage permissive -a mysqld_t
$ semodule -l | grep permissive
permissive_mysqld_t
permissivedomains
A próxima etapa é gerar a política usando o comando abaixo:
$ grep mysqld /var/log/audit/audit.log | audit2allow -M {yourpolicyname}
$ grep mysqld /var/log/audit/audit.log | audit2allow -M mysql_new
Você deve ver a saída como a seguinte (vai diferir dependendo do nome da política que você definiu):
******************** IMPORTANTE ******************** **
Para ativar este pacote de políticas, execute:
semodule -i mysql_new.pp
Como dito, precisamos executar “semodule -i mysql_new.pp” para ativar a política. Vá em frente e execute-o:
$ semodule -i mysql_new.pp
A etapa final é colocar o domínio do MySQL de volta ao modo de “imposição”:
$ semanage permissive -d mysqld_t
libsemanage.semanage_direct_remove_key:Removendo o último módulo permissive_mysqld_t (nenhum outro módulo permissive_mysqld_t existe com outra prioridade).
O que você deve fazer se o SELinux não estiver funcionando?
Muitas vezes, a configuração do SELinux requer muitos testes. Uma das melhores maneiras de testar a configuração é alterando o modo para “permissivo”. Se você quiser configurá-lo apenas para o domínio MySQL, basta usar o seguinte comando. Esta é uma boa prática para evitar configurar todo o sistema para “permissivo”:
$ semanage permissive -a mysqld_t
Depois que tudo estiver pronto, você pode alterar o modo de volta para “enforcing”:
$ semanage permissive -d mysqld_t
Além disso, /var/log/audit/audit.log fornece todos os logs relacionados ao SELinux. Este log irá ajudá-lo muito a identificar a causa raiz e o motivo. Tudo o que você precisa fazer é filtrar “negado” usando “grep”.
$ more /var/log/audit/audit.log |grep "denied"
Agora terminamos de configurar a política SELinux para o sistema baseado em MySQL. Uma coisa que vale a pena mencionar é que a mesma configuração precisa ser feita em todos os nós do seu cluster, talvez seja necessário repetir o mesmo processo para eles.