等保测评命令——mariadb

各位大佬,想看那种网络设备/操作系统/数据库/中间件的测评命令清单,可在留言区留言!

依据 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 PLUGINSDBF或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 --versionMariaBackup安装
逻辑备份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
未强制SSLSHOW VARIABLES LIKE 'require_secure_transport';值为OFF设置为ON,强制SSL传输
local_infile=ONSHOW VARIABLES LIKE 'local_infile';值为ON设置为OFF,防止文件读取
使用mysql_old_passwordSELECT 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_socketSELECT plugin FROM mysql.user WHERE user='root' AND host='localhost';非unix_socketroot@localhost改用unix_socket认证

MariaDB与MySQL对比

对比项MariaDBMySQL 8.0MySQL 5.7
默认认证插件caching_sha2_passwordcaching_sha2_passwordmysql_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, SpiderInnoDB为主InnoDB为主
集群方案Galera(内置)Group ReplicationGroup 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.5MariaDB 10.6 LTSMariaDB 10.11 LTSMariaDB 11.0
认证默认caching_sha2_passwordcaching_sha2_passwordcaching_sha2_passworded25519(新默认)
审计插件Server Audit 1.4Server Audit 1.4Server Audit 2.0Server Audit 2.0
Binlog加密支持改进性能默认启用选项默认启用选项
表空间加密支持性能优化默认加密选项默认加密选项
角色管理支持支持增强增强
密码策略simple_password_checksimple_password_checkcracklib集成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

汪汪虚拟空间的头像汪汪虚拟空间

相关推荐

添加微信
添加微信
Ai学习群
返回顶部