首页 / 帮助文档 / centos服务器数据库环境安全配置方法

centos服务器数据库环境安全配置方法

CentOS服务器上的数据库环境默认安装后往往存在多个高危暴露面,包括监听地址绑定不当、默认账号无密码或弱密码、远程访问权限过大、日志记录缺失以及文件权限过宽。这些问题不依赖任何外部工具就能被扫描和利用,因此安全配置必须从安装后的第一步开始处理,而不是等业务上线后再补救。

先确认数据库是否只监听内网或本地地址

以MySQL或MariaDB为例,安装完成后检查配置文件/etc/my.cnf或/etc/mysql/mariadb.conf.d/50-server.cnf中的bind-address参数。很多默认模板会设置为0.0.0.0或注释掉该行,导致数据库对所有网卡开放。执行以下命令查看实际监听情况:

netstat -tlnp | grep 3306

如果显示0.0.0.0:3306,说明任何能访问服务器的IP都可以尝试连接数据库端口。正确做法是将其改为127.0.0.1,仅允许本机应用通过socket或本地回环连接。若应用与数据库不在同一台机器,则绑定到内网网卡IP,例如192.168.10.5,并配合防火墙限制来源IP。

[mysqld]
bind-address = 127.0.0.1

修改后重启数据库服务,并再次用netstat确认监听地址已收窄。对于PostgreSQL,配置文件postgresql.conf中的listen_addresses默认是localhost,但部分第三方仓库或一键脚本会改为'*',同样需要检查并收紧。

删除匿名用户、禁用远程root登录并清理测试库

MySQL和MariaDB在初始安装后可能存在匿名用户、无密码的root账号以及test数据库。执行以下命令查看用户表:

SELECT user, host, plugin FROM mysql.user;

如果看到user列为空或host为%的条目,需要立即处理。删除匿名用户:

DELETE FROM mysql.user WHERE user='';
FLUSH PRIVILEGES;

对于root账号,确保其host字段只包含localhost或127.0.0.1,不要出现%或远程IP。若必须远程管理,应创建独立的管理账号并限制来源IP,而不是开放root远程登录。同时移除test数据库:

DROP DATABASE IF EXISTS test;

PostgreSQL默认只允许本地peer认证,但某些安装方式会生成postgres用户无密码的本地trust认证。检查pg_hba.conf,将本地连接方法从trust改为peer或scram-sha-256,避免系统任意本地用户直接以postgres身份登录。

强制使用强密码策略并定期轮换

数据库账号密码不能使用默认值或简单组合。MySQL 8.0及以上版本可以通过validate_password组件强制密码复杂度。安装组件并设置策略:

INSTALL COMPONENT 'file://component_validate_password';
SET GLOBAL validate_password.policy = STRONG;
SET GLOBAL validate_password.length = 12;

对于已有的弱密码账号,执行ALTER USER强制修改。生产环境中建议每个应用使用独立账号,并且密码长度不低于16位,包含大小写字母、数字和特殊字符。避免在配置文件、代码仓库或文档中明文保存密码,可使用环境变量或密钥管理服务注入。

PostgreSQL可以通过password_encryption参数设置密码存储方式,建议使用scram-sha-256而不是md5。同时定期审计pg_shadow表中的账号状态,锁定或删除不再使用的账号。

限制远程访问来源IP和连接数

即使数据库账号密码强度足够,也不应让数据库端口对全网开放。CentOS自带的firewalld可以直接限制3306或5432端口的来源地址。例如只允许192.168.1.0/24网段访问MySQL:

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept'
firewall-cmd --reload

同时可以在数据库内部通过账号的host字段限制来源。创建应用账号时指定具体IP或网段:

CREATE USER 'appuser'@'192.168.1.50' IDENTIFIED BY '强密码';
GRANT SELECT, INSERT, UPDATE ON appdb.* TO 'appuser'@'192.168.1.50';

不要使用'%'作为host,这会允许任意来源连接。对于需要动态IP的场景,可以通过VPN或跳板机中转,而不是直接开放数据库端口。

启用SSL/TLS加密数据库连接

数据库传输默认是明文,即使在内网也存在被嗅探的风险。MySQL和PostgreSQL都支持SSL连接。MySQL 8.0默认自动生成自签名证书并启用SSL,但需要确认客户端连接时使用了SSL参数。在服务端检查:

SHOW VARIABLES LIKE 'have_ssl';
SHOW VARIABLES LIKE 'ssl_ca';

如果have_ssl为YES,说明SSL可用。创建用户时可以强制要求SSL:

ALTER USER 'appuser'@'192.168.1.50' REQUIRE SSL;

对于PostgreSQL,需要在postgresql.conf中配置ssl=on,并指定证书文件路径。生成自签名证书或使用内部CA签发证书后,在pg_hba.conf中使用hostssl而不是host来强制加密连接。

最小化数据库账号权限

应用账号不应拥有全局权限或管理权限。按业务需求精确授权到库、表甚至列级别。例如一个只读报表账号,只授予SELECT权限:

GRANT SELECT ON reportdb.sales TO 'reportuser'@'192.168.1.60';

避免使用GRANT ALL ON *.*。定期审查mysql.db、mysql.tables_priv和mysql.columns_priv表,找出权限过大的账号。对于PostgreSQL,使用\du命令查看角色权限,避免将SUPERUSER或CREATEDB权限授予普通应用账号。

同时要限制FILE、PROCESS、SUPER等危险权限。这些权限允许读取服务器文件、查看所有进程或执行管理操作,一旦账号泄露后果严重。默认情况下只给root或管理账号保留这些权限。

开启数据库审计日志和慢查询日志

安全配置不仅是事前防护,事后追溯同样重要。MySQL可以开启general_log记录所有SQL语句,但生产环境全量开启会带来性能损耗。更实际的做法是开启慢查询日志和错误日志,并对关键表启用触发器或使用审计插件记录敏感操作。

SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 2;
SET GLOBAL log_queries_not_using_indexes = ON;

PostgreSQL可以在postgresql.conf中设置log_statement = 'mod'记录所有修改数据的语句,或者使用log_statement = 'all'进行全量记录。同时设置log_connections和log_disconnections记录连接行为,便于发现异常登录。

日志文件本身也需要保护,确保只有数据库运行用户和root可以读取,避免日志中的敏感信息泄露。

加固数据库文件系统权限

数据库数据目录、配置文件和日志目录的权限经常被忽视。MySQL数据目录默认位于/var/lib/mysql,配置文件在/etc/my.cnf。检查权限:

ls -ld /var/lib/mysql /etc/my.cnf /var/log/mysql

数据目录应仅允许mysql用户访问,权限设置为700或750。配置文件不应全局可写,权限设置为640或600。如果发现其他系统用户可以读取数据文件,需要立即用chmod和chown修正。

PostgreSQL数据目录通常位于/var/lib/pgsql/data,同样需要限制为postgres用户独占访问。特别注意pg_hba.conf和postgresql.conf包含认证和网络配置,泄露后可能帮助攻击者了解内部结构。

定期更新数据库版本和应用安全补丁

CentOS默认仓库中的数据库版本可能较旧,存在已知漏洞。使用官方仓库或受信任的第三方仓库安装较新版本,并定期执行yum update或dnf update。MySQL和MariaDB的每个小版本更新都包含安全修复,PostgreSQL同样会发布安全更新。更新前在测试环境验证兼容性,更新后检查配置是否被覆盖。

对于无法立即升级的环境,至少应关注CVE公告,评估漏洞影响范围,并通过限制网络访问、禁用受影响功能等方式临时缓解风险。

禁用不必要的数据库功能和插件

数据库默认会启用一些用不到的功能,例如MySQL的LOAD DATA LOCAL INFILE允许客户端读取本地文件,可能被用于数据泄露。在配置文件中禁用:

[mysqld]
local-infile = 0

PostgreSQL默认允许COPY ... FROM PROGRAM执行系统命令,如果应用不需要该功能,应限制相关账号权限或通过修改pg_hba.conf和角色属性阻止执行。同时检查是否安装了不必要的扩展,如dblink、file_fdw等,这些扩展可能扩大攻击面。

配置连接超时和资源限制

防止暴力破解和资源耗尽,需要设置合理的连接超时和最大连接数。MySQL的wait_timeout和interactive_timeout默认值较长,可以适当缩短:

SET GLOBAL wait_timeout = 300;
SET GLOBAL interactive_timeout = 300;

同时设置max_connections为实际需要的值,避免攻击者通过大量连接耗尽内存。PostgreSQL可以设置statement_timeout和idle_in_transaction_session_timeout,防止长时间占用连接和事务。

这些参数需要根据业务负载调整,但默认值往往过于宽松,不适合直接用于生产环境。

使用独立系统账号运行数据库服务

数据库进程不应以root身份运行。MySQL和PostgreSQL在通过官方包安装时通常会创建专用系统用户,但某些手动编译或容器部署可能使用root启动。检查进程:

ps aux | grep mysqld
ps aux | grep postgres

如果发现以root运行,需要立即停止服务,修改数据目录属主为专用用户,并以该用户重新启动。专用系统账号的shell应设置为/sbin/nologin,禁止直接登录系统。

备份安全与恢复验证

数据库备份文件包含完整数据,一旦泄露等同于数据库泄露。备份文件应加密存储,使用gpg或openssl对备份进行加密后再传输或归档。备份存放位置与生产服务器分离,并限制访问权限。定期进行恢复演练,确认备份可用且恢复过程不会引入安全配置回退。

以上措施需要根据实际数据库类型和业务场景调整优先级,但核心原则一致:减少暴露面、最小化权限、强制加密、记录审计、及时更新。CentOS服务器上的数据库安全配置不是一次性工作,而是需要持续检查和加固的过程。