Cách khắc phục lỗi cập nhật MariaDB 10.0.29 SELinux

Tác giả sysadmin, T.M.Hai 24, 2022, 02:33:11 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Cách khắc phục lỗi cập nhật MariaDB 10.0.29 SELinux


Tôi đặt máy chủ này để tự động thực hiện 'cập nhật yum -y' 24 giờ một lần để giữ cho máy chủ tự động cập nhật. Sau lần cập nhật MariaDB gần đây nhất lên phiên bản 10.0.29-1.el7.centos trong CentOS 7.3, tôi nhận thấy rằng nó không thể khởi động sao lưu đúng cách, sau đây là cách khắc phục.

1. Xác định vấn đề

Sự cố được xác định thông qua giám sát, thông báo rằng một trang web trên máy chủ không phản hồi. Chắc chắn rằng tất cả các trang web đều trả về lỗi "Lỗi kết nối với cơ sở dữ liệu".

Trước tiên, tôi đã xem liệu MariaDB/MySQL có đang chạy hay không.

Mã nguồn [Chọn]
[root@server centos]# systemctl status mysql
â mysql.service - LSB: start and stop MySQL
   Loaded: loaded (/etc/rc.d/init.d/mysql; bad; vendor preset: disabled)
   Active: failed (Result: exit-code) since Sat 2017-01-14 10:17:09 UTC; 4s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 14010 ExecStop=/etc/rc.d/init.d/mysql stop (code=exited, status=0/SUCCESS)
  Process: 14016 ExecStart=/etc/rc.d/init.d/mysql start (code=exited, status=1/FAILURE)

Jan 14 10:17:08 server systemd[1]: Starting LSB: start and stop MySQL...
Jan 14 10:17:08 server mysql[14016]: Starting MySQL.170114 10:17:08 mysqld_safe Logging to '/var/lib/mysql/server.err'.
Jan 14 10:17:08 server mysql[14016]: 170114 10:17:08 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
Jan 14 10:17:08 server mysql[14016]: /usr/bin/mysqld_safe_helper: Cannot change uid/gid (errno: 1)
Jan 14 10:17:09 server mysql[14016]: ERROR!
Jan 14 10:17:09 server systemd[1]: mysql.service: control process exited, code=exited status=1
Jan 14 10:17:09 server systemd[1]: Failed to start LSB: start and stop MySQL.
Jan 14 10:17:09 server systemd[1]: Unit mysql.service entered failed state.
Jan 14 10:17:09 server systemd[1]: mysql.service failed.

Không, cơ sở dữ liệu thực sự đã chết. Chúng ta có thể thấy rằng lỗi dường như có liên quan đến việc mysqld_safe_helper đang cố thay đổi UID/GID theo dòng lỗi này:

Mã nguồn [Chọn]
/usr/bin/mysqld_safe_helper: Cannot change uid/gid (errno: 1)
Hãy thử và khởi động lại dịch vụ.

Mã nguồn [Chọn]
[root@server centos]# systemctl restart mysql -l
Jan 14 10:21:36 server systemd[1]: Starting LSB: start and stop MySQL...
Jan 14 10:21:36 server mysql[14399]: Starting MySQL.170114 10:21:36 mysqld_safe Logging to '/var/lib/mysql/server.err'.
Jan 14 10:21:36 server mysql[14399]: 170114 10:21:36 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
Jan 14 10:21:36 server mysql[14399]: /usr/bin/mysqld_safe_helper: Cannot change uid/gid (errno: 1)
Jan 14 10:21:37 server mysql[14399]: ERROR!
Jan 14 10:21:37 server systemd[1]: mysql.service: control process exited, code=exited status=1
Jan 14 10:21:37 server systemd[1]: Failed to start LSB: start and stop MySQL.
Jan 14 10:21:37 server systemd[1]: Unit mysql.service entered failed state.
Jan 14 10:21:37 server systemd[1]: mysql.service failed.

Không có sự giúp đỡ ở đó. Tôi đã cố gắng hoàn tác giao dịch yum để quay lại trạng thái hoạt động để có thể điều tra thêm sau này, tuy nhiên điều này cũng không thành công.

Thay vào đó, tôi đã thử chạy journalctl -xe theo đề xuất, kết quả này như sau:

Mã nguồn [Chọn]
[root@server mysql]# journalctl -xe
Jan 14 10:21:38 server setroubleshoot[14484]: SELinux is preventing /usr/bin/mysqld_safe_helper from using the setgid capability. For complete SELinux messages. run sealert -l 640a7d54-35ab-43b5-9267-db6f159e1449
Jan 14 10:21:38 server python[14484]: SELinux is preventing /usr/bin/mysqld_safe_helper from using the setgid capability.

                        *****  Plugin catchall (100. confidence) suggests   **************************

                        If you believe that mysqld_safe_helper should have the setgid capability 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_safe_hel' --raw | audit2allow -M my-mysqldsafehel
                        # semodule -i my-mysqldsafehel.pp

2. Khắc phục sự cố

Tuyệt, vậy đó là sự cố SELinux. Để có được thông tin đầy đủ, tôi chạy 'sealer -a /var/log/audit/audit.log' như hình bên dưới. Để biết thêm thông tin khắc phục sự cố cụ thể của SELinux, hãy xem bài đăng này.

Mã nguồn [Chọn]
[root@server mysql]# sealert -a /var/log/audit/audit.log
SELinux is preventing /usr/bin/mysqld_safe_helper from using the setuid capability.

*****  Plugin catchall (100. confidence) suggests   **************************

If you believe that mysqld_safe_helper should have the setuid capability 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_safe_hel' --raw | audit2allow -M my-mysqldsafehel
# semodule -i my-mysqldsafehel.pp


Additional Information:
Source Context                system_u:system_r:mysqld_safe_t:s0
Target Context                system_u:system_r:mysqld_safe_t:s0
Target Objects                Unknown [ capability ]
Source                        mysqld_safe_hel
Source Path                   /usr/bin/mysqld_safe_helper
Port                         
Host                         
Source RPM Packages           MariaDB-server-10.0.29-1.el7.centos.x86_64
Target RPM Packages
Policy RPM                    selinux-policy-3.13.1-102.el7_3.7.noarch
Selinux Enabled               True
Policy Type                   targeted
Enforcing Mode                Enforcing
Host Name                     server
Platform                      Linux server
                              3.10.0-514.2.2.el7.x86_64 #1 SMP Tue Dec 6
                              23:06:41 UTC 2016 x86_64 x86_64
Alert Count                   3
First Seen                    2017-01-14 10:23:22 UTC
Last Seen                     2017-01-14 10:23:22 UTC
Local ID                      f3462d4b-ed6b-4e94-9495-7ab0970c0af0

Raw Audit Messages
type=AVC msg=audit(1484389402.769:6203): avc:  denied  { setuid } for  pid=14718 comm="mysqld_safe_hel" capability=7  scontext=system_u:system_r:mysqld_safe_t:s0 tcontext=system_u:system_r:mysqld_safe_t:s0 tclass=capability


type=SYSCALL msg=audit(1484389402.769:6203): arch=x86_64 syscall=setuid success=no exit=EPERM a0=3e4 a1=3e4 a2=7f2c90e772e0 a3=7f2c90e772e0 items=0 ppid=14640 pid=14718 auid=4294967295 uid=0 gid=994 euid=0 suid=0 fsuid=0 egid=994 sgid=994 fsgid=994 tty=(none) ses=4294967295 comm=mysqld_safe_hel exe=/usr/bin/mysqld_safe_helper subj=system_u:system_r:mysqld_safe_t:s0 key=(null)

Hash: mysqld_safe_hel,mysqld_safe_t,mysqld_safe_t,capability,setuid
   
Hiện tại, tôi đã thực hiện như được đề xuất và chạy các lệnh được đề xuất như hình bên dưới để tạo chính sách cục bộ.

Mã nguồn [Chọn]
ausearch -c 'mysqld_safe_hel' --raw | audit2allow -M my-mysqldsafehel
semodule -i my-mysqldsafehel.pp

Sau khi làm điều này và cố gắng khởi động lại dịch vụ 'mysql', tôi nhận được một thông báo SELinux khác được ghi lại, lần này là 'setgid' như được hiển thị bên dưới.

Mã nguồn [Chọn]
SELinux is preventing /usr/bin/mysqld_safe_helper from using the setgid capability.
Sau đó, tôi chỉ cần chạy lại các lệnh được đề xuất. Sau đó, có thể khởi động MariaDB như hình bên dưới.

Mã nguồn [Chọn]
[root@server ~]# systemctl restart mysql
[root@server ~]# systemctl status mysql.service -l
â mysql.service - LSB: start and stop MySQL
   Loaded: loaded (/etc/rc.d/init.d/mysql; bad; vendor preset: disabled)
   Active: active (running) since Sat 2017-01-14 10:24:03 UTC; 29min ago

Tất nhiên, chúng tôi cũng có thể tạm thời vô hiệu hóa SELinux bằng 'setenforce 0', nhưng cá nhân tôi muốn giữ tính bảo mật của nó và giải quyết vấn đề trong tầm tay.

Tôi đã báo cáo lỗi ở đây ngay trước khi viết bài đăng này, mặc dù đó có thể là sự cố của MySQL chứ không phải sự cố cụ thể của MariaDB.

Cập nhật ngày 11 tháng 3 năm 2017: Vé lỗi ban đầu đã bị đóng tuy nhiên lỗi vẫn còn tồn tại sau khi cập nhật. Điều này đã được báo cáo một lần nữa ở đây.

Cập nhật ngày 3 tháng 5 năm 2017: Lỗi hiện đã được sửa, như đã lưu ý trong nhật ký thay đổi có liên quan đến vé MDEV-12231.

Biết cách làm việc với SELinux giúp giải quyết vấn đề nhanh chóng, vì lý do tại sao nó xảy ra thì tôi không chắc lắm, hy vọng báo cáo lỗi có thể làm sáng tỏ. Có vẻ như chính sách SELinux hiện tại không cho phép /usr/bin/mysqld_safe_helper sử dụng setuid hoặc setgid, những thứ phải được yêu cầu trong quá trình nâng cấp. Cũng có thể điều này từng hoạt động tốt, nhưng có thể là một chính sách SElinux mới đã làm hỏng mọi thứ chứ không phải bất kỳ vấn đề cụ thể nào của MariaDB hoặc MySQL.