Eu tenho um servidor MariaDB no CentOS 7. O servidor deve desempenhar o papel de escravo e replicar o servidor mestre remoto. O servidor mestre remoto pode ser acessado por meio de um túnel SSH. A "entrada" do túnel SSH está em 127.0.0.1:3307.
Conectar-se a este endpoint usando o programa cliente MariaDB funciona.
No entanto, o servidor MariaDB não consegue se conectar. No log de erros do MySQL, encontra-se: Slave I/O: error connecting to master '[email protected]:3307' - retry-time: 60 maximum-retries: 86400 message: Can't connect to MySQL server on '127.0.0.1' (13 "Permission denied"), Internal MariaDB error code: 2003
.
Evidentemente, pensa-se imediatamente no SELinux colocando o kibosh em conexões fora do padrão de saída de um servidor MariaDB.
Depois de colocar o SELinux no modo permissivo (editar /etc/selinux/config
e reiniciar), o bom processo fociforme consegue se conectar.
Vamos examinar /var/log/audit/audit.log
quais logs de eventos de negação do SELinux (entre outros) usando ausearch
(mais informações sobre auditd em " uma breve introdução ao auditd ")
ausearch --comm mysqld
Isso fornece entradas como:
time->Wed Mar 21 18:52:53 2018
type=PROCTITLE msg=audit(1521654773.504:120): proctitle="/usr/sbin/mysqld"
type=SYSCALL msg=audit(1521654773.504:120): arch=c000003e syscall=42 success=no exit=-115 a0=41 a1=7fd1f4028ad0 a2=10 a3=72 items=0 ppid=1 pid=1342 auid=4294967295 uid=27 gid=27 euid=27 suid=27 fsuid=27 egid=27 sgid=27 fsgid=27 tty=(none) ses=4294967295 comm="mysqld" exe="/usr/sbin/mysqld" subj=system_u:system_r:mysqld_t:s0 key=(null)
type=AVC msg=audit(1521654773.504:120): avc: denied { name_connect } for pid=1342 comm="mysqld" dest=3307 scontext=system_u:system_r:mysqld_t:s0 tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket
( syscall 42 é sys_connect
)
Muito legal.
Agora, ainda tenho que ler o Manual (e talvez nem ajude), então a pergunta:
Que comando devo executar para permitir que o MariaDB se conecte a 127.0.0.1:3307? Porque eu quero reativar o SELinux .
As políticas do SELinux controlam todas as ações que um processo pode executar em um determinado objeto - como arquivos, dispositivos ou soquetes. Se um daemon foi configurado para escutar ou se comunicar usando uma porta não padrão, a política de destino nega essa ação, como deveria. Os rótulos são usados para controlar as portas. Para encontrar o rótulo do MariaDB, use
semanage
, e filtre os resultadosgrep
usando seu número de porta conhecido.Isso produz a seguinte saída.
Para alterar a regra desse rótulo, use
semanage
novamente da seguinte maneira para a porta 3307.Depois de executar o comando acima, verifique a regra novamente para ver se 3307 agora é permitido.
Isso deve mostrar 3307 na lista de portas.
Se o pacote
setroubleshoot-server
foi instalado (recomendado), o programasetroubleshootd
será invocado via dbus do daemon de auditoriaauditd
(embora indiretamente) e receberá registros SELinux AVC para processar:Observe que
setroubleshootd
não é realmente um "daemon" (costumava ser), mas um programa invocado na atividade que sai novamente se tudo estiver quieto .setroubleshootd
registrará no syslog e você verá as informações de negação do AVC. Por padrão, isso terminará, a/var/log/messages
menos quersyslog
tenha sido configurado de forma diferente.setroubleshootd
também notificará clientes dbus interessados em eventos SELinux comosealert
ou widgets GUI.Use
sealert
para examinar os registros AVC. A página do manual diz: "As duas opções de linha de comando mais úteis são -l para "procurar" um ID de alerta e -a para "analisar" um arquivo de log."Olhando para
/var/log/messages
, veremos agora coisas como:..e linhas adicionais de informações muito legíveis que acabam sendo uma boa parte da saída de
sealert -l 90cd70e9-0bb2-4668-b165-d5be37e26b22
.Então vamos executar
sealert -l 90cd70e9-0bb2-4668-b165-d5be37e26b22
-- isso nos dá um bom conselho (não que esse registro tenha sido obtido enquanto o SELinux estava ativado):Portanto, com 85,9 de confiança ("Voltarei!")
"Se você deseja permitir que o mysqld se conecte à porta de rede 3307, então você precisa modificar o tipo de porta. Faça
semanage port -a -t PORT_TYPE -p tcp 3307
" onde PORT_TYPE émysqld_port_t
!