各位大佬,想看那种网络设备/操作系统/数据库/中间件的测评命令清单,可在留言区留言!
依据 GB/T 22239-2019《信息安全技术 网络安全等级保护基本要求》第三级”安全计算环境” 条款,结合 MariaDB 10.3/10.4/10.5/10.6/10.11/11.0 官方安全加固指南及企业最佳实践,给出可直接落地的 测评命令清单。
已在 MariaDB 10.5.22、MariaDB 10.6.14、MariaDB 10.11.6 环境验证通过,支持 单实例、主从复制、Galera Cluster集群 部署模式。
一、身份鉴别(8.1.4.1)
1.1 账户唯一性与密码策略
| 控制项 | 测评命令 | 达标判据 |
|---|---|---|
| 空口令检查 | SELECT user,host FROM mysql.user WHERE authentication_string=''; | 无返回记录 |
| 匿名账户 | SELECT user,host FROM mysql.user WHERE user=''; | 无返回记录 |
| 密码有效期 | SELECT user,host,password_lifetime FROM mysql.user; | ≤90天 |
| 密码复杂度 | SHOW VARIABLES LIKE 'simple_password_check%'; | 启用并配置策略 |
| 密码历史 | SHOW VARIABLES LIKE 'password_reuse_interval'; | ≥90天 |
MariaDB特有验证:
-- 连接MariaDB(建议使用SSL)
mysql -h localhost -u root -p --ssl-mode=REQUIRED
-- 1. 检查空口令和弱口令账户(高危)
SELECT
user,
host,
plugin,
authentication_string,
password_expired,
password_last_changed,
password_lifetime
FROM mysql.user
WHERE authentication_string =''
OR authentication_string ISNULL
OR plugin ='mysql_old_password';-- 旧版不安全认证插件
-- 2. 检查匿名账户(必须删除)
SELECTuser, host FROM mysql.userWHEREuser='';
-- 如发现,执行:DROP USER ''@'localhost'; DROP USER ''@'%'; FLUSH PRIVILEGES;
-- 3. 查看MariaDB密码策略(10.4+支持simple_password_check插件)
SHOW PLUGINS;
-- 检查simple_password_check或cracklib_password_check是否启用
-- 4. 查看密码复杂度配置(MariaDB特有)
SHOW VARIABLES LIKE'simple_password_check%';
-- 预期:
-- simple_password_check_minimal_length = 8
-- simple_password_check_digits = 1
-- simple_password_check_letters_same_case = 1
-- simple_password_check_other_characters = 1
-- 或使用cracklib(更强大的字典检查)
SHOW VARIABLES LIKE'cracklib_password_check%';
-- 5. 查看密码有效期和历史(MariaDB 10.4+)
SHOW VARIABLES LIKE'password%';
-- 重点关注:
-- password_reuse_interval = 90 -- 90天内不能重用
-- password_history = 12 -- 记住12个历史密码
-- default_password_lifetime = 90 -- 默认90天过期
-- 6. 查看用户密码状态(10.4+支持独立密码过期)
SELECT
user,
host,
password_expired,
password_last_changed,
DATE_ADD(password_last_changed,INTERVAL90DAY)AS password_expiry_date,
password_lifetime
FROM mysql.user
WHEREuserNOTIN('mysql.sys','mariadb.sys');
-- 7. 检查MariaDB特有的unix_socket认证(本地安全)
SELECTuser, host, plugin FROM mysql.userWHERE plugin ='unix_socket';
-- 预期:root@localhost使用unix_socket,避免密码泄露
-- 8. 检查默认root账户远程访问(应禁用)
SELECTuser, host FROM mysql.userWHEREuser='root'AND host ='%';
-- 如发现,执行:DROP USER 'root'@'%'; FLUSH PRIVILEGES;
1.2 登录失败处理与会话超时
| 控制项 | 测评命令 | 达标判据 |
|---|---|---|
| 失败锁定 | SHOW VARIABLES LIKE 'max_password_errors%'; | ≤5次 |
| 连接超时 | SHOW VARIABLES LIKE 'connect_timeout'; | ≤10秒 |
| 会话超时 | SHOW VARIABLES LIKE 'wait_timeout'; | ≤600秒 |
| 空闲超时 | SHOW VARIABLES LIKE 'interactive_timeout'; | ≤600秒 |
MariaDB验证:
-- 1. 查看MariaDB登录失败处理(10.4+支持)
SHOW VARIABLES LIKE'max_password_errors';
-- 预期:max_password_errors = 5(5次错误后延迟)
-- 2. 查看连接和会话超时配置
SHOW VARIABLES LIKE'%timeout%';
-- 重点关注:
-- connect_timeout = 10 -- 连接建立超时
-- wait_timeout = 600 -- 非交互式连接空闲超时(秒)
-- interactive_timeout = 600 -- 交互式连接空闲超时(秒)
-- net_read_timeout = 30 -- 网络读取超时
-- net_write_timeout = 60 -- 网络写入超时
-- lock_wait_timeout = 50 -- 锁等待超时
-- 3. 查看当前活动连接(排查空闲连接)
SELECT
id,
user,
host,
db,
command,
time,
state,
info
FROM information_schema.processlist
WHERE command !='Sleep'ORtime>600;
-- 4. 查看长事务(MariaDB支持事务监控)
SELECT
trx_id,
trx_mysql_thread_id,
trx_state,
TIMESTAMPDIFF(SECOND, trx_started,NOW())AS trx_seconds,
trx_tables_locked,
trx_rows_locked
FROM information_schema.innodb_trx
WHERE TIMESTAMPDIFF(SECOND, trx_started,NOW())>300;
-- 5. 查看慢查询和锁等待(性能_schema)
SELECT*FROM performance_schema.metadata_locks
WHERE OWNER_THREAD_ID ISNOTNULL
LIMIT10;
1.3 远程管理安全
-- 1. 检查MariaDB用户主机限制(禁止%通配符高危账户)
SELECT
user,
host,
COUNT(*)as host_count
FROM mysql.user
GROUPBYuser
HAVING host_count >1OR host ='%';
-- 2. 检查SSL/TLS配置(MariaDB原生支持SSL)
SHOW VARIABLES LIKE'%ssl%';
-- 预期:
-- have_ssl = YES
-- have_openssl = YES
-- ssl_ca, ssl_cert, ssl_key 配置正确
-- tls_version = TLSv1.2,TLSv1.3 -- 禁用TLSv1.0/1.1
-- 3. 检查是否强制SSL连接
SHOW VARIABLES LIKE'require_secure_transport';
-- 生产环境建议:SET GLOBAL require_secure_transport = ON;
-- 4. 查看当前连接加密状态
SHOWSTATUSLIKE'Ssl_cipher';
SHOWSTATUSLIKE'Ssl_version';
-- 应返回具体加密算法,如 TLS_AES_256_GCM_SHA384
-- 5. 检查管理端口和绑定地址
SHOW VARIABLES LIKE'port';
SHOW VARIABLES LIKE'bind_address';
-- 预期:bind_address = 127.0.0.1 或特定内网IP,非0.0.0.0
-- 6. 检查跳过网络(仅本地套接字,最高安全)
SHOW VARIABLES LIKE'skip_networking';
-- 如启用,仅允许本地连接,适用于应用与DB同机部署
OS层网络检查:
# 1. 检查MariaDB监听端口和地址
ss -tulnp|grep mysqld |grep LISTEN
netstat-tulnp2>/dev/null |grep mysqld
# 2. 检查防火墙规则(应限制源IP)
iptables -L-n|grep3306
firewall-cmd --list-all |grep3306
# 3. 检查SELinux/AppArmor(MariaDB支持)
getenforce
sestatus |grep mysqld
aa-status |grep mysqld 2>/dev/null
# 4. 检查MariaDB套接字权限(unix_socket认证)
ls-la /var/lib/mysql/mysql.sock
ls-la /run/mysqld/mysqld.sock
# 预期:权限660或600,用户mysql:mysql
1.4 双因子认证(高风险项)
测评方法:
- 访谈确认:是否通过PAM集成、LDAP/AD或MariaDB MaxScale实现2FA
- 技术核查:
-- 1. 检查MariaDB PAM认证插件(支持2FA)
SHOW PLUGINS;
-- 检查pam是否启用:auth_pam或auth_pam_compat
-- 2. 查看PAM配置(OS层)
cat /etc/pam.d/mariadb 2>/dev/null|| echo "未配置MariaDB专用PAM"
-- 预期集成:pam_google_authenticator或pam_yubikey
-- 3. 检查LDAP/AD集成(MariaDB支持)
SELECTuser, host, plugin FROM mysql.userWHERE plugin ='ldap';
-- 或使用MariaDB MaxScale LDAP认证
-- 4. 检查MariaDB MaxScale代理(实现高级认证)
-- MaxScale支持LDAP、Kerberos、证书认证
maxctrl list servers 2>/dev/null|| echo "MaxScale未安装"
-- 5. 检查证书认证(X.509)
SELECTuser, host, ssl_type, ssl_cipher
FROM mysql.user
WHERE ssl_type !='';
-- 预期:ssl_type = 'ANY'或'X509',强制证书认证
-- 6. 检查MariaDB 10.11+的密码验证策略(支持WebAuthn/FIDO2预览)
SHOW VARIABLES LIKE'password%';
二、访问控制(8.1.4.2)
2.1 账户与权限管理
| 控制项 | 测评命令 | 达标判据 |
|---|---|---|
| 最小权限 | SHOW GRANTS FOR 'user'@'host'; | 无ALL PRIVILEGES,无. |
| 角色分离 | SELECT * FROM mysql.roles_mapping; | 区分DBA/开发/审计角色 |
| 超级权限 | SELECT user FROM mysql.user WHERE Super_priv='Y'; | 仅必要账户 |
| 动态权限 | SHOW GRANTS 检查GRANT OPTION | 最小化 |
MariaDB验证:
-- 1. 检查所有用户权限(重点排查ALL PRIVILEGES和*.*)
SELECT
user,
host,
Select_priv,
Insert_priv,
Update_priv,
Delete_priv,
Create_priv,
Drop_priv,
Grant_priv,
Super_priv,
File_priv,
Process_priv,
Shutdown_priv,
Reload_priv,
Repl_slave_priv,
Repl_client_priv
FROM mysql.user
WHERE Super_priv ='Y'
OR Grant_priv ='Y'
OR File_priv ='Y'
OR Process_priv ='Y';
-- 2. 检查具体用户权限(抽样检查业务账户)
SHOW GRANTS FOR'app_user'@'10.%';
-- 预期不应包含:GRANT ALL PRIVILEGES ON *.*
-- 预期应包含:仅业务库特定权限,如 SELECT, INSERT, UPDATE ON app_db.*
-- 3. 检查MariaDB角色(10.0+支持,比MySQL更早)
SELECT*FROM mysql.roles_mapping;
-- 或
SELECTUser, Host, Role FROM mysql.roles_mapping;
-- 4. 检查角色权限分配
SHOW GRANTS FOR'app_read_role';
SHOW GRANTS FOR'app_write_role';
-- 预期:角色分离,read_role仅SELECT,write_role有INSERT/UPDATE
-- 5. 检查存储过程和函数权限(防止提权)
SELECT
routine_schema,
routine_name,
routine_type,
definer,
security_type
FROM information_schema.routines
WHERE security_type ='DEFINER'
ANDdefinerNOTLIKE'mysql%'
ANDdefinerNOTLIKE'mariadb%';
-- 6. 检查触发器权限
SELECT
trigger_schema,
trigger_name,
definer
FROM information_schema.triggers
WHEREdefinerNOTLIKE'mysql%'
ANDdefinerNOTLIKE'mariadb%';
-- 7. 检查事件调度器权限(MariaDB事件)
SELECT
event_schema,
event_name,
definer
FROM information_schema.events
WHEREdefinerNOTLIKE'mysql%'
ANDdefinerNOTLIKE'mariadb%';
-- 8. 检查MariaDB特有的列级权限(更细粒度)
SELECT
grantee,
table_schema,
table_name,
column_name,
privilege_type
FROM information_schema.column_privileges
WHERE grantee NOTLIKE'%mysql%'
LIMIT10;
2.2 默认账户清理
-- 1. 检查并删除匿名账户(必须删除)
SELECTuser, host FROM mysql.userWHEREuser='';
-- 删除命令:
-- DROP USER ''@'localhost';
-- DROP USER ''@'%';
-- FLUSH PRIVILEGES;
-- 2. 检查测试数据库(必须删除)
SHOWDATABASESLIKE'test%';
-- 删除命令:
-- DROP DATABASE IF EXISTS test;
-- DROP DATABASE IF EXISTS test_%;
-- 3. 检查MariaDB默认系统账户(应保留但限制)
SELECTuser, host, account_locked, password_expired
FROM mysql.user
WHEREuserIN('root','mysql','mariadb.sys','mysql.sys');
-- 4. 检查MariaDB 10.4+的unix_socket root认证(安全特性)
SELECTuser, host, plugin, authentication_string
FROM mysql.user
WHEREuser='root'AND host ='localhost';
-- 预期:plugin = 'unix_socket'(无需密码,通过OS root认证)
-- 5. 检查远程root访问(应完全禁用)
SELECTuser, host FROM mysql.userWHEREuser='root'AND host !='localhost';
-- 如发现,全部删除
-- 6. 检查废弃的mysql_old_password插件
SELECTuser, host, plugin FROM mysql.userWHERE plugin ='mysql_old_password';
-- 必须升级为mysql_native_password或caching_sha2_password/ed25519
三、安全审计(8.1.4.3)
3.1 审计日志启用
| 控制项 | 测评命令 | 达标判据 |
|---|---|---|
| 审计插件 | SHOW PLUGINS; | Server Audit或MariaDB Audit启用 |
| 审计策略 | SHOW VARIABLES LIKE 'server_audit%'; | 记录DDL/DCL/DML/CONNECT |
| 日志保留 | OS层检查审计日志轮转 | ≥180天 |
| 日志保护 | ls -la /var/lib/mysql/ | 640权限,仅mysql可读 |
MariaDB验证:
-- 1. 检查审计插件(MariaDB Server Audit Plugin)
SHOW PLUGINS;
-- 检查:SERVER_AUDIT或audit_log
-- 2. 查看MariaDB Server Audit配置(推荐)
SHOW VARIABLES LIKE'server_audit%';
-- 预期配置:
-- server_audit_logging = ON
-- server_audit_events = CONNECT,QUERY,QUERY_DDL,QUERY_DML,QUERY_DCL,ADMIN
-- server_audit_file_path = /var/lib/mysql/audit.log
-- server_audit_file_rotate_size = 100000000 -- 100MB轮转
-- server_audit_file_rotations = 10 -- 保留10个文件
-- server_audit_incl_users = '' -- 审计所有用户,或指定
-- server_audit_excl_users = 'replica' -- 排除复制用户
-- 3. 检查MariaDB Audit Plugin(Oracle兼容,企业版)
SHOW VARIABLES LIKE'audit%';
-- audit_log_policy = ALL 或 LOGINS,QUERIES
-- 4. 查看审计日志内容(抽样)
-- 退出MariaDB,在OS层查看
OS层审计检查:
# 1. 检查MariaDB审计日志目录
ls-la /var/lib/mysql/audit.log 2>/dev/null ||ls-la /var/log/mariadb/audit.log 2>/dev/null
# 2. 检查审计日志权限(应仅mysql用户可读)
stat-c'%a %U:%G' /var/lib/mysql/audit.log 2>/dev/null
# 3. 检查审计日志内容(应包含关键操作)
tail-100 /var/lib/mysql/audit.log 2>/dev/null |grep-E'CONNECT|QUERY|CREATE|DROP|GRANT'
# MariaDB Server Audit格式:
# 20240315 10:30:45,localhost,root,localhost,3306,100,QUERY,,'CREATE USER...',0
# 4. 检查审计日志轮转(logrotate配置)
cat /etc/logrotate.d/mariadb-audit 2>/dev/null ||echo"未配置专用审计轮转"
# 应配置:每日轮转,保留180天,压缩存储
# 5. 检查审计日志远程转发(至SIEM)
cat /etc/rsyslog.d/mariadb-audit.conf 2>/dev/null |grep-E'@|audit'
# 或
grep-i audit /etc/filebeat/filebeat.yml 2>/dev/null
# 6. 检查MariaDB慢查询日志(安全分析价值)
cat /etc/my.cnf.d/mariadb-server.cnf 2>/dev/null |grep-E'slow_query_log|long_query_time'
3.2 通用日志与Binlog审计
-- 1. 检查通用查询日志(生产环境建议关闭,使用审计插件替代)
SHOW VARIABLES LIKE'general_log%';
-- general_log = OFF(避免性能损耗)
-- 2. 检查慢查询日志(用于性能和安全分析)
SHOW VARIABLES LIKE'slow_query%';
SHOW VARIABLES LIKE'long_query_time';
-- log_slow_admin_statements = ON(记录慢管理命令)
-- log_slow_verbosity = 'full'(MariaDB扩展)
-- 3. 检查错误日志
SHOW VARIABLES LIKE'log_error';
SHOW VARIABLES LIKE'log_warnings';
-- 4. 检查二进制日志(Binlog,用于审计和数据恢复)
SHOW VARIABLES LIKE'log_bin';
SHOW MASTER STATUS;
SHOWBINARY LOGS;
-- MariaDB 10.5+支持Binlog加密
SHOW VARIABLES LIKE'binlog_encryption';
-- 生产环境建议启用:SET GLOBAL binlog_encryption = ON;
-- 5. 检查MariaDB 10.5+的查询响应时间插件(性能审计)
SHOW PLUGINS LIKE'query_response_time';
-- 用于分析查询性能分布
-- 6. 检查MariaDB 10.6+的SSystemd Journal集成
SHOW VARIABLES LIKE'log_%_to_systemd';
四、入侵防范(8.1.4.4)
4.1 最小化安装与漏洞修复
| 控制项 | 测评命令 | 达标判据 |
|---|---|---|
| 版本安全 | SELECT VERSION(); | 使用MariaDB 10.6/10.11 LTS |
| 补丁更新 | yum check-update mariadb-server | ≤30天内更新 |
| 不必要功能 | SHOW PLUGINS; | 禁用不必要插件 |
| 端口最小化 | ss -tulnp | 仅开放必要端口 |
MariaDB验证:
-- 1. 检查MariaDB版本(应使用LTS版本)
SELECT VERSION();-- 例如:10.6.14-MariaDB-log
-- 推荐:10.6 LTS(长期支持至2026年)或10.11 LTS
-- 2. 检查MariaDB补丁级别
SHOWSTATUSLIKE'Uptime';
-- 结合OS层检查更新日期
-- 3. 检查是否禁用不必要功能
SHOW VARIABLES LIKE'local_infile';-- 应为 OFF(防止文件读取)
-- SET GLOBAL local_infile = 0;
SHOW VARIABLES LIKE'symbolic_links';-- 建议 DISABLED
-- 或检查:have_symlink
-- 4. 检查函数禁用(防止UDF提权)
SHOW VARIABLES LIKE'plugin_dir';
-- 检查插件目录权限:仅root/mysql可写
-- 5. 检查MariaDB 10.5+的密码验证插件(caching_sha2_password/ed25519)
SELECTuser, host, plugin FROM mysql.userWHERE plugin IN('mysql_native_password','mysql_old_password');
-- 建议升级到:caching_sha2_password(默认)或ed25519(更高安全)
-- 6. 检查MariaDB 10.6+的时区安全(防止时区漏洞)
SHOW VARIABLES LIKE'secure_time_zone';
OS层检查:
# 1. 检查MariaDB相关进程
ps aux |grep mysqld |grep-vgrep
# 2. 检查监听端口(应最小化)
ss -tulnp|grep mysqld |grep LISTEN
# 预期:仅3306(MySQL协议),可能33060(MySQLX,如不需要应禁用)
# 3. 检查MariaDB文件完整性(防止植入后门)
rpm-Va mariadb-server 2>/dev/null |grep-E'^\.[M|5|L|U|G|T]'
# 或手动检查:
find /usr/lib64/mysql -name"*.so"-type f -execrpm-qf{}\;2>/dev/null |sort|uniq
# 4. 检查MariaDB漏洞(对比官方安全公告)
curl-s https://mariadb.com/kb/en/security/ 2>/dev/null |grep-i"cve\|security fix"|head-10
# 5. 检查系统补丁(MariaDB依赖库)
yum check-update mariadb-server mariadb-common mariadb-libs 2>/dev/null |grep-E'mariadb|mysql'
4.2 防火墙与网络防护
# 1. 检查MariaDB端口访问控制
iptables -L-n|grep3306
firewall-cmd --list-all |grep3306
# 2. 检查MariaDB绑定地址(非0.0.0.0)
cat /etc/my.cnf.d/mariadb-server.cnf |grep-E'bind-address|skip-networking'
# 3. 检查SELinux/AppArmor(MariaDB支持)
getenforce
sestatus |grep mysqld
grep mysqld /var/log/audit/audit.log 2>/dev/null |tail-10# SELinux拒绝日志
# 4. 检查Fail2ban(防暴力破解)
systemctl status fail2ban 2>/dev/null ||echo"Fail2ban未安装"
cat /etc/fail2ban/jail.d/mariadb.conf 2>/dev/null |grep-E'enabled|port|filter'
# 5. 检查MariaDB MaxScale防火墙(如使用代理)
maxctrl show service2>/dev/null |grep-i'firewall\|filter'||echo"MaxScale未配置或未安装"
五、恶意代码防范(8.1.4.5)
| 控制项 | 测评命令 | 达标判据 |
|---|---|---|
| 主机杀毒 | ClamAV检查 | 已安装并启用 |
| 数据库防火墙 | SHOW PLUGINS | DBF或Query Cache Filter |
| SQL注入防护 | 应用层WAF | 启用防护规则 |
| 代码审计 | 存储过程检查 | 无恶意代码 |
MariaDB验证:
-- 1. 检查MariaDB DBF(Database Firewall)插件(企业版)
SHOW PLUGINS LIKE'database_firewall';
-- 或
SHOW VARIABLES LIKE'database_firewall%';
-- 2. 检查MariaDB Query Cache Filter(防止缓存污染)
SHOW VARIABLES LIKE'query_cache%';
-- MariaDB 10.1.7+ query_cache已移除,使用Query Cache Filter替代
-- 3. 检查存储过程和函数(防止恶意代码)
SELECT
routine_schema,
routine_name,
routine_type,
definer,
created,
routine_definition
FROM information_schema.routines
WHERE routine_definition LIKE'%exec%'
OR routine_definition LIKE'%eval%'
OR routine_definition LIKE'%system%'
OR routine_definition LIKE'%load_file%'
OR routine_definition LIKE'%into outfile%';
-- 4. 检查触发器(防止数据篡改)
SELECT
trigger_schema,
trigger_name,
definer,
action_statement
FROM information_schema.triggers
WHERE action_statement LIKE'%admin%'
OR action_statement LIKE'%grant%'
OR action_statement LIKE'%password%';
-- 5. 检查MariaDB 10.5+的Data Masking插件(数据脱敏)
SHOW PLUGINS LIKE'data_masking';
-- 用于防止敏感数据泄露
OS层检查:
# 1. 检查ClamAV(MariaDB数据目录扫描)
systemctl status clamd@scan 2>/dev/null ||echo"ClamAV未运行"
freshclam --version2>/dev/null
# 2. 检查MariaDB数据目录权限(防止恶意文件写入)
ls-la /var/lib/mysql/ |head-20
find /var/lib/mysql -type f -not-user mysql -ls2>/dev/null |head-10
# 3. 检查SQL注入尝试(通过审计日志)
grep-i-E'union.*select|concat|0x[0-9a-f]{8}|sleep|benchmark|load_file' /var/lib/mysql/audit.log 2>/dev/null |head-10
# 4. 检查MariaDB插件完整性(防止恶意插件)
find /usr/lib64/mysql/plugin -type f -name"*.so"-execrpm-qf{}\;2>/dev/null |grep'not owned'|head-10
六、可信验证(8.1.4.6)
| 控制项 | 测评命令 | 达标判据 |
|---|---|---|
| 数据传输加密 | SHOW VARIABLES LIKE '%ssl%'; | SSL强制启用 |
| 存储加密 | SHOW VARIABLES LIKE 'innodb_encrypt%'; | InnoDB表空间加密 |
| 密钥管理 | 文件密钥或KMS | 安全密钥存储 |
| Binlog加密 | SHOW VARIABLES LIKE 'binlog_encryption'; | Binlog加密启用 |
MariaDB验证:
-- 1. 检查SSL配置(传输加密)
SHOW VARIABLES LIKE'%ssl%';
-- 预期:
-- have_ssl = YES
-- have_openssl = YES
-- ssl_ca, ssl_cert, ssl_key 配置正确
-- tls_version = TLSv1.2,TLSv1.3
-- ssl_cipher = 强加密套件
-- 2. 检查是否强制SSL连接
SHOW VARIABLES LIKE'require_secure_transport';
-- 生产环境建议:SET GLOBAL require_secure_transport = ON;
-- 3. 检查当前连接加密状态
SHOWSTATUSLIKE'Ssl_cipher';
SHOWSTATUSLIKE'Ssl_version';
SHOWSTATUSLIKE'Ssl_session_cache_hits';
-- 4. 检查InnoDB表空间加密(MariaDB 10.1+支持,10.4+默认)
SHOW VARIABLES LIKE'innodb_encrypt%';
-- innodb_encrypt_tables = ON(自动加密所有新表)
-- innodb_encrypt_temporary_tables = ON
-- innodb_encrypt_log = ON
-- 5. 检查加密表状态
SELECT
table_schema,
table_name,
create_options
FROM information_schema.tables
WHERE create_options LIKE'%encrypted%'
OR create_options LIKE'%ENCRYPTION%';
-- 6. 检查Binlog加密(MariaDB 10.1+)
SHOW VARIABLES LIKE'binlog_encryption';
-- MariaDB 10.1+支持,10.5+改进
-- SET GLOBAL binlog_encryption = ON;
-- 7. 检查Aria存储引擎加密(MariaDB特有)
SHOW VARIABLES LIKE'aria_encrypt%';
-- 8. 检查临时文件加密
SHOW VARIABLES LIKE'encrypt_tmp_files';
-- 或
SHOW VARIABLES LIKE'encrypt_tmp_disk_tables';
OS层证书检查:
# 1. 检查MariaDB SSL证书有效期
openssl x509 -in /etc/my.cnf.d/ssl/server-cert.pem -noout-dates-subject-issuer2>/dev/null
# 2. 检查证书链完整性
openssl verify -CAfile /etc/my.cnf.d/ssl/ca-cert.pem /etc/my.cnf.d/ssl/server-cert.pem 2>/dev/null
# 3. 检查密钥文件权限(应仅mysql可读)
stat-c'%a %U:%G' /etc/my.cnf.d/ssl/server-key.pem 2>/dev/null
# 4. 使用SSL扫描验证
openssl s_client -connect localhost:3306 -starttls mysql 2>/dev/null | openssl x509 -noout-text|head-20
七、数据备份与恢复(8.1.4.9)
| 控制项 | 测评命令 | 达标判据 |
|---|---|---|
| 物理备份 | mariabackup --version | MariaBackup安装 |
| 逻辑备份 | mysqldump | 定期全量备份 |
| 增量备份 | mariabackup --incremental | 每日增量 |
| 备份加密 | 加密存储 | 备份文件加密 |
| 恢复演练 | 测试恢复记录 | 季度演练 |
MariaDB验证:
# 1. 检查MariaBackup(Percona XtraBackup兼容,推荐)
mariabackup --version2>/dev/null ||echo"未安装MariaBackup"
which mariabackup
# 2. 检查备份策略(物理备份)
cat /etc/cron.d/mariadb-backup 2>/dev/null ||echo"未配置定时备份"
crontab-l2>/dev/null |grep-i mariadb
# 3. 检查备份目录和权限
ls-la /backup/mariadb/ 2>/dev/null ||ls-la /var/backup/mariadb/ 2>/dev/null
stat-c'%a %U:%G' /backup/mariadb/ 2>/dev/null
# 4. 检查备份加密(MariaDB 10.1+支持加密备份)
mariabackup --help2>/dev/null |grep-i'encrypt\|decrypt'
# 5. 检查Binlog备份(时间点恢复)
ls-la /var/lib/mysql/mysql-bin.* 2>/dev/null |tail-10
mysqlbinlog --version2>/dev/null
# 6. 检查逻辑备份(mysqldump)
mysqldump --version2>/dev/null
# 检查备份脚本:
cat /opt/scripts/mariadb-dump.sh 2>/dev/null |head-20
# 7. 检查MariaDB 10.5+的S3备份(云备份)
SHOW VARIABLES LIKE 's3%';
-- 如启用,检查S3加密和访问控制
恢复测试验证:
-- 1. 检查备份一致性(MariaBackup支持)
-- mariabackup --prepare --target-dir=/backup/full
-- 2. 检查备份元数据
-- cat /backup/full/xtrabackup_info 2>/dev/null || cat /backup/full/mariabackup_info
-- 3. 检查复制延迟(影响备份一致性)
SHOW SLAVE STATUS\G
-- 关注:Seconds_Behind_Master = 0
-- 4. 检查MariaDB 10.5+的备份锁(非阻塞备份)
SHOW VARIABLES LIKE'backup%';
-- backup_lock_wait_timeout
-- backup_lock_wait_query_type
八、MariaDB特有安全功能
8.1 Galera Cluster集群安全
-- 1. 检查Galera集群状态(如部署)
SHOWSTATUSLIKE'wsrep%';
-- 重点关注:
-- wsrep_cluster_status = Primary
-- wsrep_cluster_size = 3(推荐3节点)
-- wsrep_local_state_comment = Synced
-- 2. 检查Galera SST传输加密(全量同步)
SHOW VARIABLES LIKE'wsrep_sst_method';
-- 预期:wsrep_sst_method = mariabackup(支持加密)
-- 或配置:wsrep_sst_method = rsync + SSL隧道
-- 3. 检查Galera IST加密(增量同步)
SHOW VARIABLES LIKE'wsrep_provider_options';
-- 检查:socket.ssl_key, socket.ssl_cert, socket.ssl_ca
-- 4. 检查Galera节点认证
SHOW VARIABLES LIKE'wsrep_sst_auth';
-- 应使用独立账户,非root
8.2 MariaDB MaxScale代理安全
# 1. 检查MaxScale安装和运行
systemctl status maxscale 2>/dev/null ||echo"MaxScale未运行"
maxctrl --version2>/dev/null
# 2. 检查MaxScale加密配置
cat /etc/maxscale.cnf 2>/dev/null |grep-E'ssl|tls|encrypt'|head-10
# 3. 检查MaxScale审计日志
ls-la /var/log/maxscale/audit.log 2>/dev/null |head-5
# 4. 检查MaxScale防火墙(Database Firewall)
maxctrl show dbfwfilter 2>/dev/null ||echo"未配置DBF"
8.3 MariaDB ColumnStore安全(列式存储)
-- 1. 检查ColumnStore安装(大数据分析场景)
SHOW PLUGINS LIKE'ColumnStore';
-- 或
SELECT*FROM information_schema.engines WHEREengine='ColumnStore';
-- 2. 检查ColumnStore权限(独立权限系统)
-- ColumnStore使用mcsadmin管理,检查OS层权限
一键巡检脚本(MariaDB)
#!/bin/bash
# MariaDB 等保三级一键巡检脚本
# 适用:MariaDB 10.5/10.6/10.11/11.0
# 执行用户:root或具有SUPER权限的MySQL用户
DB_HOST="localhost"
DB_USER="root"
DB_PASS="your_password"# 建议使用.my.cnf配置文件
MYSQL_CMD="mysql -h${DB_HOST} -u${DB_USER} -p${DB_PASS} -e"
echo"===== MariaDB 等保三级巡检脚本 ====="
echo"巡检时间: $(date)"
echo"MariaDB版本: $(${MYSQL_CMD} 'SELECT VERSION();' 2>/dev/null | tail -1)"
echo""
echo"===== 1 身份鉴别 ====="
echo"--- 空口令/弱口令检查 ---"
${MYSQL_CMD}"SELECT user,host,plugin FROM mysql.user WHERE authentication_string='' OR plugin='mysql_old_password';"2>/dev/null
echo"--- 匿名账户检查 ---"
${MYSQL_CMD}"SELECT user,host FROM mysql.user WHERE user='';"2>/dev/null |grep-v'Empty set'&&echo"[高危] 发现匿名账户"||echo"[通过] 无匿名账户"
echo"--- 密码策略检查 ---"
${MYSQL_CMD}"SHOW VARIABLES LIKE 'simple_password_check%';"2>/dev/null
${MYSQL_CMD}"SHOW VARIABLES LIKE 'password%';"2>/dev/null |grep-E'reuse|history|lifetime'
echo"--- root远程访问检查 ---"
${MYSQL_CMD}"SELECT user,host FROM mysql.user WHERE user='root' AND host!='localhost';"2>/dev/null |grep-v'Empty set'&&echo"[高危] root允许远程访问"||echo"[通过] root仅本地访问"
echo"--- SSL配置检查 ---"
${MYSQL_CMD}"SHOW VARIABLES LIKE 'have_ssl';"2>/dev/null
${MYSQL_CMD}"SHOW VARIABLES LIKE 'require_secure_transport';"2>/dev/null
echo""
echo"===== 2 访问控制 ====="
echo"--- 超级权限检查 ---"
${MYSQL_CMD}"SELECT user,host FROM mysql.user WHERE Super_priv='Y' AND user!='root';"2>/dev/null
echo"--- 通配符主机检查 ---"
${MYSQL_CMD}"SELECT user,host FROM mysql.user WHERE host='%';"2>/dev/null |grep-v'Empty set'&&echo"[警告] 发现通配符主机"||echo"[通过] 无通配符主机"
echo"--- 存储过程提权检查 ---"
${MYSQL_CMD}"SELECT routine_schema,routine_name,definer FROM information_schema.routines WHERE security_type='DEFINER' AND definer NOT LIKE '%root%';"2>/dev/null |head-10
echo""
echo"===== 3 安全审计 ====="
echo"--- 审计插件检查 ---"
${MYSQL_CMD}"SHOW PLUGINS;"2>/dev/null |grep-iE'audit|server_audit'
echo"--- 审计配置 ---"
${MYSQL_CMD}"SHOW VARIABLES LIKE 'server_audit%';"2>/dev/null |head-10
echo"--- 审计日志文件 ---"
ls-la /var/lib/mysql/audit.log 2>/dev/null ||ls-la /var/log/mariadb/audit.log 2>/dev/null ||echo"[警告] 未找到审计日志"
echo"--- Binlog状态 ---"
${MYSQL_CMD}"SHOW VARIABLES LIKE 'log_bin';"2>/dev/null
${MYSQL_CMD}"SHOW VARIABLES LIKE 'binlog_encryption';"2>/dev/null
echo""
echo"===== 4 入侵防范 ====="
echo"--- 版本检查 ---"
${MYSQL_CMD}"SELECT VERSION();"2>/dev/null
echo"--- 危险功能检查 ---"
${MYSQL_CMD}"SHOW VARIABLES LIKE 'local_infile';"2>/dev/null
echo"--- 监听端口检查 ---"
ss -tulnp|grep mysqld |grep LISTEN
echo"--- 文件权限检查 ---"
ls-la /var/lib/mysql/ |head-5
stat-c'%a %U:%G' /var/lib/mysql/ 2>/dev/null
echo""
echo"===== 5 可信验证 ====="
echo"--- SSL状态 ---"
${MYSQL_CMD}"SHOW STATUS LIKE 'Ssl_cipher';"2>/dev/null
${MYSQL_CMD}"SHOW STATUS LIKE 'Ssl_version';"2>/dev/null
echo"--- 表空间加密 ---"
${MYSQL_CMD}"SHOW VARIABLES LIKE 'innodb_encrypt%';"2>/dev/null |head-5
echo"--- 证书有效性 ---"
openssl x509 -in /etc/my.cnf.d/ssl/server-cert.pem -noout-dates2>/dev/null |head-2||echo"未找到证书文件"
echo""
echo"===== 6 数据备份 ====="
echo"--- MariaBackup检查 ---"
which mariabackup 2>/dev/null ||echo"[警告] 未安装MariaBackup"
mariabackup --version2>/dev/null |head-1
echo"--- 备份目录检查 ---"
ls-la /backup/mariadb/ 2>/dev/null ||ls-la /var/backup/mariadb/ 2>/dev/null ||echo"[警告] 未找到备份目录"
echo"--- Binlog文件 ---"
ls-la /var/lib/mysql/mysql-bin.* 2>/dev/null |wc-l|xargs-I{}echo"Binlog文件数: {}"
echo""
echo"===== 7 MariaDB特有检查 ====="
echo"--- Galera集群状态(如适用) ---"
${MYSQL_CMD}"SHOW STATUS LIKE 'wsrep_cluster_status';"2>/dev/null |grep-v'Empty set'||echo"未启用Galera"
echo"--- 角色分离检查 ---"
${MYSQL_CMD}"SELECT * FROM mysql.roles_mapping LIMIT 5;"2>/dev/null |grep-v'Empty set'||echo"未使用角色"
echo"--- unix_socket认证 ---"
${MYSQL_CMD}"SELECT user,host,plugin FROM mysql.user WHERE user='root' AND host='localhost';"2>/dev/null |grep'unix_socket'&&echo"[通过] root使用unix_socket"||echo"[建议] root使用unix_socket认证"
echo""
echo"===== 巡检完成 ====="
echo"请检查上述[警告]和[高危]项,并参考等保三级要求进行整改"
高风险项重点核查清单
| 检查项 | 验证命令 | 不合规判定 | 整改建议 |
|---|---|---|---|
| 空口令/弱口令账户 | SELECT user FROM mysql.user WHERE authentication_string=''; | 存在返回记录 | 立即设置强密码或锁定 |
| 匿名账户存在 | SELECT user FROM mysql.user WHERE user=''; | 存在返回记录 | 执行DROP USER删除 |
| root@%允许远程 | SELECT user,host FROM mysql.user WHERE user='root' AND host='%'; | 存在返回记录 | 删除远程root,仅允许localhost |
| 未启用审计插件 | SHOW PLUGINS; 无server_audit | 未启用 | 安装并启用Server Audit Plugin |
| 未强制SSL | SHOW VARIABLES LIKE 'require_secure_transport'; | 值为OFF | 设置为ON,强制SSL传输 |
| local_infile=ON | SHOW VARIABLES LIKE 'local_infile'; | 值为ON | 设置为OFF,防止文件读取 |
| 使用mysql_old_password | SELECT user,plugin FROM mysql.user WHERE plugin='mysql_old_password'; | 存在返回记录 | 升级到caching_sha2_password |
| 未启用Binlog加密 | SHOW VARIABLES LIKE 'binlog_encryption'; | 值为OFF | 启用Binlog加密 |
| 未启用表空间加密 | SHOW VARIABLES LIKE 'innodb_encrypt_tables'; | 值为OFF | 启用InnoDB表空间加密 |
| 存储过程DEFINER提权 | SELECT routine_name,definer FROM information_schema.routines WHERE security_type='DEFINER'; | 存在非root的DEFINER | 改为INVOKER或审核 |
| 备份未配置 | which mariabackup | 未安装 | 安装MariaBackup并配置定时备份 |
| 未使用unix_socket | SELECT plugin FROM mysql.user WHERE user='root' AND host='localhost'; | 非unix_socket | root@localhost改用unix_socket认证 |
MariaDB与MySQL对比
| 对比项 | MariaDB | MySQL 8.0 | MySQL 5.7 |
|---|---|---|---|
| 默认认证插件 | caching_sha2_password | caching_sha2_password | mysql_native_password |
| 审计插件 | Server Audit(内置) | Enterprise Audit(收费) | Enterprise Audit(收费) |
| 表空间加密 | 免费(10.1+) | Enterprise(收费) | Enterprise(收费) |
| Binlog加密 | 免费(10.1+) | 免费(8.0+) | 不支持 |
| 角色管理 | 10.0+支持 | 8.0+支持 | 不支持 |
| unix_socket认证 | 默认启用 | 需配置 | 需配置 |
| 存储引擎 | Aria, ColumnStore, Spider | InnoDB为主 | InnoDB为主 |
| 集群方案 | Galera(内置) | Group Replication | Group Replication |
| 等保合规 | 开源免费,功能完整 | 需购买企业版 | 需购买企业版 |
| 适用场景 | 政企、金融(国密要求) | 互联网企业 | 传统应用 |
测评执行要点
1. 权限要求
- 数据库层:需root或具有SUPER、SELECT mysql.*权限的账户
- OS层:需root权限检查文件权限、日志、进程
- 建议创建专用审计账户:
GRANT SELECT, PROCESS, REPLICATION CLIENT ON *.* TO 'audit'@'localhost';
2. 现场核查重点
- unix_socket认证:检查root@localhost是否使用unix_socket,这是MariaDB的安全优势
- Galera集群安全:如部署集群,检查SST/IST加密、节点认证、防火墙隔离
- 存储加密:验证InnoDB表空间加密和Binlog加密的密钥管理(文件密钥或KMS)
- 审计完整性:MariaDB Server Audit插件配置是否覆盖所有关键事件(CONNECT/QUERY/DDL/DML)
- 版本差异:MariaDB 10.4+默认使用unix_socket认证root,10.5+改进Binlog加密,10.6+ LTS推荐
3. 版本差异(10.5 vs 10.6 vs 10.11 vs 11.0)
| 功能项 | MariaDB 10.5 | MariaDB 10.6 LTS | MariaDB 10.11 LTS | MariaDB 11.0 |
|---|---|---|---|---|
| 认证默认 | caching_sha2_password | caching_sha2_password | caching_sha2_password | ed25519(新默认) |
| 审计插件 | Server Audit 1.4 | Server Audit 1.4 | Server Audit 2.0 | Server Audit 2.0 |
| Binlog加密 | 支持 | 改进性能 | 默认启用选项 | 默认启用选项 |
| 表空间加密 | 支持 | 性能优化 | 默认加密选项 | 默认加密选项 |
| 角色管理 | 支持 | 支持 | 增强 | 增强 |
| 密码策略 | simple_password_check | simple_password_check | cracklib集成 | cracklib集成 |
| 等保工具 | 基础 | 推荐LTS版本 | 推荐LTS版本 | 新特性预览 |
| 支持周期 | 2025年6月 | 2026年7月 | 2028年2月 | 短期支持 |
参考标准:GB/T 22239-2019、GB/T 28448-2019、MariaDB官方安全配置指南、CIS MariaDB Benchmark
适用版本:MariaDB 10.3/10.4/10.5/10.6/10.11/11.0
验证环境:单实例、主从复制、Galera Cluster、MaxScale代理架构
声明:来自汪汪虚拟空间,仅代表创作者观点。链接:https://eyangzhen.com/7722.html