假设

假设

如何在 RHEL 7 或 CentOS 7 上通过 TLS 安装和使用 Galera 和 MariaDB >= 版本 10.1,并在不使用 SCL(软件集合)的情况下保持 SELinux 在强制模式下启用?

答案1

假设

  • 你是不是使用 RHEL 7 SCL(软件集合)或 rh-mariadb101{,-galera}
  • 您有 RHEL 7 / CentOS 7 服务器EPEL已安装
  • SELinux 是必需的、正在运行并强制执行
  • Firewalld 正在运行并默认阻止
  • 您的 3 个主机 IP 是 1.2.3.4、1.2.3.5 和 1.2.3.6

防火墙配置

Galera 和 MariaDB 正常运行所需的端口是 TCP 端口 4444、4567 和 4568 以及 UDP 端口 4567。MariaDB 需要 TCP 端口 3306。在此配置中,我们假设允许主机 1.2.3.4、1.2.3.5 和 1.2.3.6成为集群的一部分,以及未来的主机 IP 1.2.3.7。此配置还假设允许任何主机连接到端口 3306。登录并su -登录到 root。运行以下命令。

# firewall-cmd --zone=public --add-port=3306/tcp
# firewall-cmd --zone=public --add-port=3306/tcp --permanent
# firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="1.2.3.4/30" port port=4444 protocol=tcp accept'
# firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="1.2.3.4/30" port port=4444 protocol=tcp accept' --permanent
# firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="1.2.3.4/30" port port=4567 protocol=tcp accept'
# firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="1.2.3.4/30" port port=4567 protocol=tcp accept' --permanent
# firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="1.2.3.4/30" port port=4568 protocol=tcp accept'
# firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="1.2.3.4/30" port port=4568 protocol=tcp accept' --permanent
# firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="1.2.3.4/30" port port=4567 protocol=udp accept'
# firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="1.2.3.4/30" port port=4567 protocol=udp accept' --permanent

SELinux 政策准备

登录并su -root。运行或执行以下步骤。仅非默认数据位置需要最后一行。请注意,如果您在/home或systemd中设置数据位置,/usr将禁止 MariaDB 写入,并且 MariaDB 将失败。要解决此问题,请ProtectSystem=false在单元文件中进行设置/lib/systemd/system/mariadb.service。然后跑systemctl daemon-reload

# mkdir selinux && cd selinux
# cat > galera.te << XYZZY
module galera 1.0;

require {
        type unconfined_t;
        type initrc_tmp_t;
        type rsync_exec_t;
        type init_t;
        type mysqld_t;
        class process setpgid;
        class file { execute execute_no_trans getattr open read };
        class service enable;
}

#============= mysqld_t ==============
allow mysqld_t initrc_tmp_t:file open;
allow mysqld_t rsync_exec_t:file { execute execute_no_trans getattr open read };
allow mysqld_t self:process setpgid;

#============= unconfined_t ==============
allow unconfined_t init_t:service enable;
XYZZY

# checkmodule -M -m galera.te -o galera.mod
# semodule_package -m galera.mod -o galera.pp
# semodule -i galera.pp
# semanage port -m -t mysqld_port_t -p tcp 4567
# semanage port -m -t mysqld_port_t -p udp 4567
# semanage port -m -t mysqld_port_t -p tcp 4444
# semanage port -m -t mysqld_port_t -p tcp 4568
# semanage fcontext -a -t mysqld_db_t "/alternate/path/to/data/mysql(/.*)?"

MariaDB 存储库添加、包安装、配置

下载https://yum.mariadb.org/RPM-GPG-KEY-MariaDB。确保为您提供此密钥的网络服务器是值得信赖的;新存储库的安全性取决于此。

# cp RPM-GPG-KEY-MariaDB /etc/pki/rpm-gpg/ ; chmod ugo+r /etc/pki/rpm-gpg/RPM-GPG-KEY-MariaDB
# cat > /etc/yum.repos.d/mariadb.repo << XYZZY
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/rhel7-amd64
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-MariaDB
gpgcheck = 1
enabled = 1
XYZZY
# chmod ugo+r /etc/yum.repos.d/mariadb.repo
# yum install MariaDB-server galera

安装软件包后,您必须在创建集群之前按照正常过程配置 MariaDB。仅当您希望使用与默认值不同的数据位置时,才需要下面的第一行。

# mysql_install_db --user=mysql --group=mysql --ldata=/alternate/path/to/data/mysql
# systemctl start mariadb
# mysql_secure_installation
# systemctl stop mariadb
# galera_new_cluster

检查 MariaDB + Galera 是否正在运行。如果是这样,您可以配置接下来的两台主机。像以前一样安装 SELinux 规则和软件包,但立即将以下行添加到 /etc/my.cnf.d/server.cnf 中的 [galera] 部分。假设原始 galera 服务器的 IP 为 1.2.3.4,其对等服务器的 IP 为 1.2.3.5 和 1.2.3.6。将缓存大小设置为适合您的系统的大小。

[galera]
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_provider_options="gcache.size=1024M; gcache.page_size=1024M"
wsrep_cluster_address=gcomm://1.2.3.4,1.2.3.5,1.2.3.6
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2

# systemctl start mariadb

此时,日志应表明数据已从第一台服务器复制到当前服务器。在其余服务器上重复这些步骤。

现在停止原始服务器上的 MariaDB 并将 galera 配置添加到/etc/my.cnf.d/server.cnf.在原始服务器上重新启动 MariaDB。验证数据在对等点之间同步。

启用 TLS

此可选部分假设您已经生成了 X.509v3 证书和相应的私钥。证书和密钥都应以未加密的 PEM 格式存储。对于此示例,文件名分别假定为server.crtserver.key

# cp server.crt /etc/pki/tls/certs/ ; chmod ugo+r /etc/pki/tls/certs/server.crt ; cp server.key /etc/pki/tls/private/server.key ; chmod 640 /etc/pki/tls/private/server.key ; chgrp mysql /etc/pki/tls/private/server.key

将以下行添加到/etc/my.cnf.d/server.cnf[mysqld]部分中: ssl_cert=/etc/pki/tls/certs/server.crt ssl_key=/etc/pki/tls/private/server.key

/etc/systemd/system/mariadb.service.d/TLS.conf使用以下内容创建:

[service]
Environment=”MYSQLD_OPTS=--ssl”

Systemd 与 systemd 一样,因此systemctl daemon-reload再次运行以读取新配置。

为了让 MariaDB 接受 TLS 连接,需要重新启动服务器。请注意,TLS 可用,但在此配置阶段不是必需的。

检查日志以验证 MariaDB 是否在启用 TLS 的情况下加载:journalctl _SYSTEMD_UNIT=mariadb.service。启动 TLS 失败仅记录为 [警告] :^(

这是我第一次这样做。我很乐意进行改进:^)

相关内容