如何在 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.crt
和server.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 失败仅记录为 [警告] :^(
这是我第一次这样做。我很乐意进行改进:^)