O servidor escravo MariaDB deve conectar-se a 127.0.0.1:3307 para alcançar o mestre. O SELinux diz que não. Fazer o que?

1

Eu tenho um servidor MariaDB no CentOS 7. O servidor deve reproduzir o escravo e replicar o servidor mestre remoto. O servidor mestre remoto pode ser alcançado por meio de um túnel SSH. A entrada "túnel" do SSH está em 127.0.0.1:3307.

Conectando-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, imediatamente se pensa 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 reinicializar), o bom processo phociform consegue se conectar.

Examinemos /var/log/audit/audit.log que registra os eventos de negação do SELinux (entre outros) usando ausearch (mais informações em auditd em " uma breve introdução ao auditd ")

ausearch --comm mysqld

Isso dá 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, eu ainda tenho que ler O Manual (e talvez nem ajude), então a pergunta:

Qual comando eu executo para deixar MariaDB se conectar a 127.0.0.1:3307? Porque eu quero reativar o SELinux .

    
por David Tonhofer 21.03.2018 / 19:34

2 respostas

1

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 tiver sido configurado para ouvir ou comunicar usando uma porta não padrão, a política de destino negará essa ação, como deveria. Etiquetas são usadas para controlar portas. Para encontrar o rótulo para MariaDB, use semanage e filtre os resultados com grep usando seu número de porta conhecido.

semanage port -l | grep 3306

Isso produz a seguinte saída.

mysqld_port_t tcp 1186, 3306, 63132-63164

Para alterar a regra deste rótulo, use semanage novamente da seguinte forma para a porta 3307.

semanage port -a -t mysqld_port_t -p tcp 3307

Depois de executar o comando acima, verifique a regra novamente para ver que 3307 agora é permitido.

semanage port -l | grep 3307

Isso deve mostrar 3307 na lista de portas.

mysqld_port_t tcp 3307, 1186, 3306, 63132-63164
    
por 22.03.2018 / 14:45
0

Se o pacote setroubleshoot-server tiver sido instalado (recomendado), o programa setroubleshootd será invocado via dbus do daemon de auditoria auditd (embora indiretamente) e receberá registros do SELinux AVC para processar:

Observequesetroubleshootdnãoé,naverdade,um"daemon" (costumava ser), mas um programa de atividades ativas que era sai novamente se tudo estiver quieto .

setroubleshootd registrará no syslog, e você verá informações de negação do AVC. Por padrão, isso terminará em /var/log/messages , a menos que rsyslog tenha sido configurado de forma diferente.

setroubleshootd também notificará clientes dbus interessados em eventos SELinux como sealert ou widgets GUI.

Use sealert para examinar registros AVC. A página man diz: "As duas opções de linha de comando mais úteis são -l para" procurar "uma ID de alerta e -a para" analisar "um arquivo de log."

Olhando para /var/log/messages , um deles verá coisas como:

setroubleshoot: SELinux is preventing mysqld from
name_connect access on the tcp_socket port 3307. For complete SELinux
messages run: sealert -l 90cd70e9-0bb2-4668-b165-d5be37e26b22

.. 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á bons conselhos (não que esse registro tenha sido obtido enquanto o SELinux estava ativado):

SELinux is preventing mysqld from name_connect access on the tcp_socket port 3307.

*****  Plugin connect_ports (85.9 confidence) suggests   *********************

If you want to allow mysqld to connect to network port 3307
Then you need to modify the port type.
Do
# semanage port -a -t PORT_TYPE -p tcp 3307
    where PORT_TYPE is one of the following: dns_port_t, dnssec_port_t,
    kerberos_port_t, mysqld_port_t, ocsp_port_t, tram_port_t.

*****  Plugin catchall_boolean (7.33 confidence) suggests   ******************

If you want to allow nis to enabled
Then you must tell SELinux about this by enabling the 'nis_enabled' boolean.
You can read 'None' man page for more details.
Do
setsebool -P nis_enabled 1

*****  Plugin catchall_boolean (7.33 confidence) suggests   ******************

If you want to allow mysql to connect any
Then you must tell SELinux about this by enabling the 'mysql_connect_any' boolean.
You can read 'None' man page for more details.
Do
setsebool -P mysql_connect_any 1

*****  Plugin catchall (1.35 confidence) suggests   **************************

If you believe that mysqld should be allowed name_connect access on the
port 3307 tcp_socket by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'mysqld' --raw | audit2allow -M my-mysqld
# semodule -i my-mysqld.pp


Additional Information:
Source Context                system_u:system_r:mysqld_t:s0
Target Context                system_u:object_r:unreserved_port_t:s0
Target Objects                port 3307 [ tcp_socket ]
Source                        mysqld
Source Path                   mysqld
Port                          3307
Host                          foobar.example.com
Source RPM Packages
Target RPM Packages
Policy RPM                    selinux-policy-3.13.1-166.el7_4.9.noarch
Selinux Enabled               True
Policy Type                   targeted
Enforcing Mode                Enforcing
Host Name                     foobar.example.com
Platform                      Linux foobar.example.com
                              3.10.0-693.21.1.el7.x86_64 #1 SMP Wed Mar 7
                              19:03:37 UTC 2018 x86_64 x86_64
Alert Count                   36
First Seen                    2018-03-22 16:04:59 CET
Last Seen                     2018-03-22 16:39:59 CET
Local ID                      90cd70e9-0bb2-4668-b165-d5be37e26b22

Raw Audit Messages
type=AVC msg=audit(1521733199.870:201): avc:  denied  { name_connect }
for  pid=1352 comm="mysqld" dest=3307
scontext=system_u:system_r:mysqld_t:s0
tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket


Hash: mysqld,mysqld_t,unreserved_port_t,tcp_socket,name_connect

Então, com 85.9 de confiança ("Eu vou ser baaack!")

"Se você quiser permitir que o mysqld se conecte à porta de rede 3307, então você precisa modificar o tipo de porta. Do semanage port -a -t PORT_TYPE -p tcp 3307 " onde PORT_TYPE é mysqld_port_t !

    
por 22.03.2018 / 16:53

Tags