MariaDB 슬레이브 서버는 마스터 서버에 연결하려면 127.0.0.1:3307에 연결해야 합니다. SELinux는 그렇지 않다고 말합니다. 무엇을 합니까?

MariaDB 슬레이브 서버는 마스터 서버에 연결하려면 127.0.0.1:3307에 연결해야 합니다. SELinux는 그렇지 않다고 말합니다. 무엇을 합니까?

CentOS 7에 MariaDB 서버가 있습니다. 이 서버는 슬레이브 역할을 하며 원격 마스터를 복제해야 합니다. 원격 마스터 서버는 SSH 터널을 통해 접속할 수 있습니다. SSH 터널 "입구"는 127.0.0.1:3307에 있습니다.

MariaDB 클라이언트 프로그램을 사용하여 이 엔드포인트에 연결할 수 있습니다.

그러나 MariaDB 서버는 연결할 수 없습니다. MySQL 오류 로그에서 다음을 찾을 수 있습니다.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

분명히 사람들은 MariaDB 서버에서 나가는 비표준 연결을 거부하는 SELinux를 즉시 생각합니다.

SELinux를 허용 모드(편집 /etc/selinux/config및 다시 시작)로 전환한 후 좋은 phociform 프로세스를 연결할 수 있었습니다.

/var/log/audit/audit.logSELinux 거부 이벤트(및 기타 이벤트)를 사용하는 로그를 확인해 보겠습니다 ausearch(auditd에 대한 자세한 내용은 "auditd에 대한 간략한 소개")

ausearch --comm mysqld

그러면 다음과 같은 항목이 제공됩니다.

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

(시스템 호출 42sys_connect)

아주 멋지다.

이제 다 읽어야 하는데수동(어쩌면 도움이 되지 않을 수도 있습니다.) 따라서 질문은 다음과 같습니다.

MariaDB를 127.0.0.1:3307에 연결하려면 어떤 명령을 실행해야 합니까? 왜냐면 내가 원하거든SELinux를 다시 활성화합니다..

답변1

SELinux 정책은 프로세스가 파일, 장치 또는 소켓과 같은 특정 개체에서 수행할 수 있는 모든 작업을 제어합니다. 비표준 포트를 사용하여 수신하거나 통신하도록 데몬이 구성된 경우 대상 정책은 해당 작업을 거부합니다. 레이블은 포트를 제어하는 ​​데 사용됩니다. MariaDB 태그를 찾으려면 를 사용하고 semanage잘 알려진 포트 번호를 사용하여 결과를 필터링합니다.grep

semanage port -l | grep 3306

그러면 다음과 같은 출력이 생성됩니다.

mysqld_port_t tcp 1186, 3306, 63132-63164

이 레이블의 규칙을 변경하려면 semanage아래와 같이 포트 3307을 다시 사용하십시오.

semanage port -a -t mysqld_port_t -p tcp 3307

위 명령을 실행한 후 규칙을 다시 확인하여 이제 3307이 허용되는지 확인합니다.

semanage port -l | grep 3307

포트 목록에 3307이 표시되어야 합니다.

mysqld_port_t tcp 3307, 1186, 3306, 63132-63164

답변2

패키지가 setroubleshoot-server설치된 경우(권장) 프로그램은 setroubleshootd다음에 의해 호출됩니다.버스감사 데몬 auditd(간접적으로라도) 및 지정된 SELinux AVC 레코드에서 다음을 처리합니다.

SELinux 알림 및 로깅 캐스케이드

실제로 는 setroubleshootd(한때 그랬던) "데몬"이 아니라모든 것이 조용해지면 활동 호출자가 다시 종료됩니다..

setroubleshootd이는 syslog에 기록되며 AVC 거부 메시지가 표시됩니다. 기본적으로 다르게 구성하지 /var/log/messages않는 한 이는 종료됩니다 rsyslog.

setroubleshootd또한 통보할 것입니다버스sealertGUI 위젯 등 SELinux 이벤트에 관심이 있는 고객입니다.

sealertAVC 레코드를 확인하는 데 사용합니다 . 매뉴얼 페이지에는 다음과 같이 나와 있습니다."가장 유용한 두 가지 명령줄 옵션은 경고 ID를 "찾는" -l과 로그 파일을 "분석"하는 -a입니다."

보세요 /var/log/messages, 사람들은 이제 다음과 같은 것을 보게 될 것입니다:

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

..그리고 매우 읽기 쉬운 정보로 구성된 몇 줄의 추가 정보는 sealert -l 90cd70e9-0bb2-4668-b165-d5be37e26b22.

이제 이것을 실행해 봅시다 sealert -l 90cd70e9-0bb2-4668-b165-d5be37e26b22. 이는 우리에게 좋은 조언을 제공합니다(이 레코드는 SELinux를 활성화하여 얻은 것이 아닙니다).

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

그래서,85.9 자신감("내가 돌아갑니다!")

"mysqld가 네트워크 포트 3307에 연결하도록 허용하려면 포트 유형을 수정해야 합니다. 실행 semanage port -a -t PORT_TYPE -p tcp 3307" 여기서 PORT_TYPE은 mysqld_port_t!

관련 정보