MariaDB安全特性与加固措施
2021-05-223.6k 阅读
MariaDB安全特性
身份验证机制
MariaDB支持多种身份验证插件,每种插件都有其独特的工作方式和适用场景。
- mysql_native_password
这是MariaDB默认的身份验证插件。它使用基于密码哈希的机制进行身份验证。当用户尝试连接到MariaDB服务器时,客户端会将密码使用哈希算法进行加密,然后发送给服务器。服务器则将接收到的哈希值与存储在系统表
mysql.user
中的哈希密码进行比较。如果两者匹配,则认证成功。
示例代码:
-- 创建使用mysql_native_password插件的用户
CREATE USER 'testuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'testpassword';
- unix_socket 此插件利用Unix套接字进行身份验证。当使用该插件时,客户端尝试连接到本地MariaDB服务器时,系统会检查发起连接的操作系统用户与MariaDB用户是否匹配。如果匹配,则无需密码即可成功连接。这在本地开发和管理场景中非常方便,因为它减少了输入密码的步骤,同时利用操作系统的用户管理机制提高安全性。
示例代码:
-- 创建使用unix_socket插件的用户
CREATE USER 'localadmin'@'localhost' IDENTIFIED WITH unix_socket;
- ldap LDAP(轻量级目录访问协议)插件允许MariaDB使用外部LDAP服务器进行身份验证。这在企业环境中非常有用,因为企业通常已经有一个集中管理的LDAP目录来管理用户身份。MariaDB通过与LDAP服务器通信,验证用户提供的凭据是否与LDAP目录中的记录匹配。
要配置LDAP身份验证,首先需要安装并启用auth_ldap
插件:
INSTALL PLUGIN auth_ldap SONAME 'auth_ldap.so';
然后,配置LDAP相关参数,例如:
SET GLOBAL ldap_server_host='ldap.example.com';
SET GLOBAL ldap_server_port=389;
SET GLOBAL ldap_bind_dn='cn=admin,dc=example,dc=com';
SET GLOBAL ldap_bind_pw='adminpassword';
SET GLOBAL ldap_base_dn='dc=example,dc=com';
最后,创建使用LDAP身份验证的用户:
CREATE USER 'ldapuser'@'localhost' IDENTIFIED WITH auth_ldap;
访问控制
MariaDB通过用户权限系统来实现访问控制,确保只有授权的用户才能执行特定的数据库操作。
- 权限类型 MariaDB的权限分为不同的级别,包括全局权限、数据库权限、表权限和列权限。
- 全局权限:这些权限应用于整个MariaDB服务器,例如
ALL PRIVILEGES
权限允许用户执行所有操作,包括创建和删除数据库、管理用户等。 - 数据库权限:应用于特定的数据库,例如
CREATE
、SELECT
、INSERT
等权限,允许用户在指定数据库中执行相应操作。 - 表权限:针对特定表,例如
DELETE
、UPDATE
权限,决定用户对表中数据的操作能力。 - 列权限:最为精细的权限级别,允许用户对表中的特定列进行操作,比如
SELECT
特定列的数据。
- 权限管理命令
- GRANT:用于授予用户权限。
示例:授予用户
testuser
对数据库testdb
的SELECT
、INSERT
和UPDATE
权限:
GRANT SELECT, INSERT, UPDATE ON testdb.* TO 'testuser'@'localhost';
- REVOKE:用于撤销用户权限。
示例:撤销用户
testuser
对数据库testdb
的DELETE
权限:
REVOKE DELETE ON testdb.* FROM 'testuser'@'localhost';
数据加密
- 透明数据加密(TDE) MariaDB从10.1版本开始支持透明数据加密。TDE通过对数据库文件进行加密,确保数据在存储层面的安全性。即使数据库文件被窃取,没有解密密钥也无法读取其中的数据。
要启用TDE,首先需要配置加密密钥。可以使用OpenSSL等工具生成加密密钥文件:
openssl rand -base64 64 > /var/lib/mysql/keyfile
chown mysql:mysql /var/lib/mysql/keyfile
chmod 400 /var/lib/mysql/keyfile
然后,在MariaDB配置文件(通常是my.cnf
)中添加以下配置:
[mysqld]
plugin_load_add = file_key_management.so
file_key_management_filename = /var/lib/mysql/keyfile
file_key_management_encryption_algorithm = aes-256-cbc
innodb_encrypt_tables = ON
innodb_encryption_threads = 4
重启MariaDB服务后,新创建的表空间和重做日志文件将被加密。
- 传输层加密 MariaDB支持在客户端和服务器之间的传输层进行加密,通常使用SSL/TLS协议。这可以防止数据在网络传输过程中被窃取或篡改。
要启用传输层加密,首先需要生成SSL证书和密钥。可以使用OpenSSL生成:
openssl req -newkey rsa:2048 -days 365 -nodes -keyout server-key.pem -x509 -out server-cert.pem
然后,在MariaDB配置文件中添加以下配置:
[mysqld]
ssl-ca=/path/to/ca-cert.pem
ssl-cert=/path/to/server-cert.pem
ssl-key=/path/to/server-key.pem
在客户端连接时,指定使用SSL:
mysql -uusername -ppassword --ssl-ca=/path/to/ca-cert.pem --ssl-cert=/path/to/client-cert.pem --ssl-key=/path/to/client-key.pem
MariaDB加固措施
用户管理优化
- 最小化用户权限
在创建用户时,只授予其执行任务所需的最小权限。避免使用
ALL PRIVILEGES
,除非绝对必要。例如,如果一个用户只需要查询特定数据库中的数据,只授予其SELECT
权限。
-- 创建仅具有SELECT权限的用户
CREATE USER 'readonlyuser'@'localhost' IDENTIFIED BY 'readonlypassword';
GRANT SELECT ON specificdb.* TO'readonlyuser'@'localhost';
- 定期清理无用用户
定期检查并删除不再使用的用户。可以通过查询
mysql.user
表来识别未使用的用户,然后使用DROP USER
命令删除。
-- 查找长时间未登录的用户
SELECT user, host FROM mysql.user WHERE last_active < CURDATE() - INTERVAL 30 DAY;
-- 删除无用用户
DROP USER 'unuseduser'@'localhost';
密码策略强化
- 强密码要求 强制用户使用强密码,密码应包含大小写字母、数字和特殊字符,并且长度足够。可以通过在创建用户时要求复杂密码,以及定期提醒用户更改密码来实现。
-- 创建用户时设置强密码要求
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'P@ssw0rd!123';
- 密码过期策略
设置密码过期策略,强制用户定期更改密码。可以通过修改
mysql.user
表中的password_expired
字段或使用ALTER USER
命令来实现。
-- 设置用户密码在30天后过期
ALTER USER 'testuser'@'localhost' PASSWORD EXPIRE INTERVAL 30 DAY;
网络安全配置
- 限制数据库服务器的网络访问
通过防火墙配置,只允许授权的IP地址或IP段访问MariaDB服务器。例如,在Linux系统上使用
iptables
:
# 允许本地访问
iptables -A INPUT -i lo -p tcp --dport 3306 -j ACCEPT
# 允许特定IP段访问
iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT
# 拒绝其他所有访问
iptables -A INPUT -p tcp --dport 3306 -j DROP
- 禁用不必要的网络协议
MariaDB支持多种网络协议,如TCP/IP、Unix套接字等。如果不需要某些协议,可以在配置文件中禁用。例如,在
my.cnf
中禁用TCP/IP协议:
[mysqld]
skip-networking
数据库配置加固
- 配置文件安全
保护MariaDB的配置文件(如
my.cnf
),确保只有数据库管理员可以读取和修改。设置文件权限为600
,只有文件所有者(通常是mysql
用户)可以读写。
chown mysql:mysql /etc/my.cnf
chmod 600 /etc/my.cnf
- 限制日志信息暴露
避免在日志文件中记录过多敏感信息。可以通过配置日志级别来控制日志内容。例如,将错误日志级别设置为
ERROR
,只记录错误信息:
[mysqld]
log_error_verbosity = 1
审计与监控
- 启用审计日志 MariaDB从10.3版本开始支持审计插件。启用审计日志可以记录所有数据库操作,有助于发现潜在的安全问题。 首先,安装并启用审计插件:
INSTALL PLUGIN audit_log SONAME 'audit_log.so';
然后,在配置文件中配置审计日志参数,例如:
[mysqld]
plugin_load_add = audit_log.so
audit_log_format = JSON
audit_log_file = /var/log/mysql/audit.log
- 性能与安全监控
使用工具如
Monyog
、Zabbix
等对MariaDB进行性能和安全监控。这些工具可以实时监测数据库的运行状态,如连接数、查询性能等,同时检测异常活动,如大量失败的登录尝试。
通过上述安全特性和加固措施,可以显著提高MariaDB数据库的安全性,保护数据免受各种潜在威胁。在实际应用中,应根据具体的业务需求和安全要求,灵活配置和实施这些措施。
安全漏洞管理
- 及时更新MariaDB版本 MariaDB开发者会定期发布新版本,这些版本通常包含对已知安全漏洞的修复。密切关注MariaDB官方发布的安全公告,及时更新到最新的稳定版本。例如,在Ubuntu系统上,可以使用以下命令更新MariaDB:
sudo apt update
sudo apt upgrade mariadb-server
- 漏洞扫描与修复
使用专门的漏洞扫描工具,如
Nexpose
、OpenVAS
等,定期对MariaDB服务器进行扫描。这些工具可以检测出数据库系统中存在的已知安全漏洞。一旦发现漏洞,根据扫描报告中的建议及时进行修复。例如,如果扫描发现某个版本的MariaDB存在SQL注入漏洞,应立即更新到修复该漏洞的版本。
数据备份与恢复安全
- 加密备份数据
在进行数据备份时,对备份数据进行加密,确保备份数据的安全性。可以使用操作系统自带的加密工具,如
dm-crypt
,或者数据库本身提供的加密功能。例如,在使用mysqldump
进行备份时,可以通过管道将备份数据传递给加密工具,如openssl
:
mysqldump -uusername -ppassword --all-databases | openssl enc -aes-256-cbc -salt -out backup_encrypted.sql -k encryption_key
- 安全存储备份 将备份数据存储在安全的位置,限制对备份存储的访问。可以使用加密的存储设备,如加密的USB硬盘,或者将备份数据存储在具有访问控制的云存储服务中。同时,定期测试备份数据的恢复过程,确保在需要时能够成功恢复数据。
高可用性与安全
- 主从复制安全 在主从复制架构中,确保主从节点之间的数据传输安全。可以通过在主从节点之间启用SSL加密来实现。在主节点的配置文件中添加以下配置:
[mysqld]
server-id = 1
log-bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
ssl-ca=/path/to/ca-cert.pem
ssl-cert=/path/to/server-cert.pem
ssl-key=/path/to/server-key.pem
在从节点的配置文件中添加:
[mysqld]
server-id = 2
relay-log = /var/log/mysql/mysql-relay-bin.log
ssl-ca=/path/to/ca-cert.pem
ssl-cert=/path/to/client-cert.pem
ssl-key=/path/to/client-key.pem
然后,在从节点上配置主节点的连接信息,并启用SSL:
CHANGE MASTER TO
MASTER_HOST='master_host_ip',
MASTER_USER='replication_user',
MASTER_PASSWORD='replication_password',
MASTER_LOG_FILE='master_binlog_file',
MASTER_LOG_POS=master_binlog_position,
MASTER_SSL=1,
MASTER_SSL_CA='/path/to/ca-cert.pem',
MASTER_SSL_CERT='/path/to/client-cert.pem',
MASTER_SSL_KEY='/path/to/client-key.pem';
- 集群安全 在MariaDB集群环境中,确保集群节点之间的通信安全。可以通过配置集群使用加密的通信协议,如IPsec,来保护节点之间传输的数据。同时,对集群的管理接口进行严格的访问控制,只允许授权的管理员进行操作。
安全意识培训
- 数据库管理员培训 对数据库管理员进行定期的安全培训,使其了解最新的安全威胁和防范措施。培训内容可以包括安全漏洞分析、密码管理最佳实践、访问控制策略等。例如,组织数据库管理员参加专业的安全培训课程,或者邀请安全专家进行内部讲座。
- 普通用户培训 对使用数据库的普通用户进行基本的安全培训,告知他们如何保护自己的账号密码,避免进行不安全的数据库操作,如随意共享账号、在不安全的网络环境中连接数据库等。可以通过内部文档、培训视频等方式进行培训。
通过以上全面的安全特性介绍和加固措施实施,可以构建一个安全可靠的MariaDB数据库环境,有效保护数据资产的安全。在实际操作中,要持续关注安全动态,不断优化和完善安全策略。