Debian 作为服务器操作系统,其安全基线本身并不完全适配数据库的高负载与高敏感场景。很多部署事故并非源于系统被直接攻破,而是因为默认配置、文件权限、内核参数与数据库运行需求之间存在冲突,导致数据损坏、性能骤降或权限漏洞被利用。下面直接围绕 Debian 与主流数据库(MySQL/PostgreSQL/Redis/MongoDB 等)适配时的具体问题,给出可落地的加固与优化方法。

数据库专用账户与文件权限隔离

数据库进程绝不能以 root 运行。Debian 安装 MySQL 或 PostgreSQL 时通常会自动创建低权限系统账户,但 Redis 和 MongoDB 通过源码或第三方仓库安装时不会自动处理。以 Redis 为例,建议创建独立系统用户并限制其 shell 与目录:

useradd --system --home /var/lib/redis --shell /usr/sbin/nologin redis
mkdir -p /var/lib/redis /var/log/redis
chown -R redis:redis /var/lib/redis /var/log/redis
chmod 750 /var/lib/redis

数据库数据目录的权限应设置为 750 或 700,禁止其他系统用户读取。对于 MySQL,检查 /var/lib/mysql 的所有者是否为 mysql:mysql,权限是否为 750。如果发现权限为 755,应立即执行 chmod 750 /var/lib/mysql。同时,配置文件如 /etc/mysql/mysql.conf.d/mysqld.cnf、/etc/postgresql/*/main/pg_hba.conf 应仅允许数据库运行账户和 root 读取,防止普通用户通过配置文件泄露连接信息。

绑定监听地址与本地通信优化

数据库默认监听 0.0.0.0 或 127.0.0.1 取决于发行版打包方式。Debian 的 MySQL 默认绑定 127.0.0.1,但 PostgreSQL 默认只监听 localhost,Redis 默认绑定 127.0.0.1。如果业务需要远程访问,不要直接改为 0.0.0.0,应优先使用内网 IP 或 Unix Socket。对于必须跨网段访问的场景,建议在数据库前部署专用的跳转网关或使用 SSH 隧道,而不是把数据库端口暴露到公网。修改 MySQL 监听地址:

[mysqld]
bind-address = 10.0.0.5

对于 PostgreSQL,修改 postgresql.conf 中的 listen_addresses = '10.0.0.5',并同步调整 pg_hba.conf 的访问规则。Redis 若需远程访问,除修改 bind 外,必须设置 requirepass 或使用 ACL,否则任何能访问该端口的机器都可直接读写数据。

数据库网络访问控制与防火墙策略

Debian 自带的 nftables 或 iptables 应作为数据库的第一道网络防线。不要依赖数据库自身的 IP 白名单作为唯一防护。以 nftables 为例,仅允许来自应用服务器网段的连接:

nft add table inet db_filter
nft add chain inet db_filter input { type filter hook input priority 0 \; policy drop \; }
nft add rule inet db_filter input ip saddr 10.0.0.0/24 tcp dport 3306 accept
nft add rule inet db_filter input ip saddr 127.0.0.1 tcp dport 3306 accept

如果使用 iptables,规则类似:

iptables -A INPUT -s 10.0.0.0/24 -p tcp --dport 3306 -j ACCEPT
iptables -A INPUT -s 127.0.0.1 -p tcp --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP

对于 MongoDB 默认端口 27017、Redis 6379、PostgreSQL 5432,同样需要显式放行来源网段,其余全部丢弃。注意不要只添加 ACCEPT 规则而忽略默认 DROP 策略,否则防火墙形同虚设。

认证与密码策略强化

Debian 仓库中的 MySQL/MariaDB 默认启用 unix_socket 认证,这本身是安全的,但很多运维为了方便改为 mysql_native_password 并设置弱密码。对于必须使用密码认证的场景,应强制启用密码复杂度插件。MariaDB 可安装 cracklib_password_check:

INSTALL SONAME 'cracklib_password_check';
SET GLOBAL cracklib_password_check_dictionary = '/usr/share/dict/words';

PostgreSQL 的 pg_hba.conf 应优先使用 scram-sha-256 而不是 md5。修改后需要重新加载配置。Redis 6.0 以上版本应使用 ACL 而不是简单的 requirepass。创建受限用户示例:

ACL SETUSER appuser on >strongpassword ~cache:* +get +set +del

该用户只能访问 cache: 前缀的键,且仅允许 get、set、del 命令,即使密码泄露也无法执行 flushall 或读取其他业务数据。

数据库日志审计与异常检测

Debian 默认的 rsyslog 不会记录数据库的详细操作日志。对于 MySQL,应开启 general_log 或更细粒度的 audit 插件。但 general_log 对性能影响较大,建议仅在排查期间开启。更实际的做法是开启 slow_query_log 和 error_log,并定期分析。PostgreSQL 可在 postgresql.conf 中设置:

log_connections = on
log_disconnections = on
log_statement = 'ddl'
log_duration = off
log_line_prefix = '%m [%p] %q%u@%d '

这样能记录所有连接、断开和 DDL 操作,便于事后追溯。Redis 可配置 slowlog 并设置阈值,例如 slowlog-log-slower-than 10000 表示记录超过 10 毫秒的命令。MongoDB 的 mongod 日志应开启 --quiet 以外的详细级别,并定期检查 failed authentication 记录。

内核参数与资源限制适配

数据库在高并发下容易触发 Debian 默认的内核限制。例如,PostgreSQL 和 MongoDB 对共享内存、文件描述符、最大进程数有较高要求。直接修改 /etc/sysctl.conf:

kernel.shmmax = 8589934592
kernel.shmall = 2097152
kernel.sem = 250 32000 100 128
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535

对于 Redis,必须关闭透明大页,否则 fork 子进程时延迟飙升。Debian 下执行:

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

并将其写入 /etc/rc.local 或 systemd 服务中持久化。同时提高文件描述符限制,在 /etc/security/limits.conf 中添加:

mysql soft nofile 65535
mysql hard nofile 65535
postgres soft nofile 65535
postgres hard nofile 65535
redis soft nofile 65535
redis hard nofile 65535

修改后需重启数据库进程或重新登录会话生效。

数据加密与备份安全

Debian 的 LUKS 磁盘加密可以保护数据库静态数据,但会带来性能损耗。对于敏感业务,建议只对数据目录所在分区加密,系统分区保持明文。使用 cryptsetup 创建加密卷并挂载到 /var/lib/mysql 或 /var/lib/postgresql。备份文件同样需要加密,使用 openssl 或 age 对备份压缩包加密后再传输。MySQL 备份示例:

mysqldump --single-transaction --routines --triggers dbname | gzip | age -r age1xxx > backup.sql.gz.age

PostgreSQL 使用 pg_dump 配合 age 加密。备份文件不要与数据库存放在同一台服务器上,至少保留一份离线副本。对于 Redis,RDB 和 AOF 文件应定期备份并加密,且备份目录权限设置为 700。

最小化安装与定期更新

Debian 服务器上不要安装与数据库无关的软件包。使用 apt 安装数据库时,避免安装推荐包:

apt install --no-install-recommends mariadb-server

定期执行 apt update && apt upgrade,但升级数据库前应在测试环境验证兼容性。对于 PostgreSQL,大版本升级需要 pg_upgradecluster 而不是直接替换二进制。对于 Redis,升级前检查配置兼容性,尤其是 ACL 和持久化参数。Debian 的 unattended-upgrades 可以自动安装安全更新,但应排除数据库包,避免自动升级导致服务中断。

容器化数据库的特殊注意

如果数据库运行在 Docker 或 Podman 中,Debian 宿主机的安全配置依然重要。容器内的数据库不应使用默认的 bridge 网络,而应创建专用网络并限制容器间通信。数据卷应挂载到宿主机受保护的目录,权限与上述一致。容器本身应以非 root 用户运行,例如 MySQL 官方镜像支持 --user 参数。同时,宿主机的 AppArmor 或 SELinux 策略应针对容器数据库进程进行限制,防止容器逃逸后直接访问宿主机文件。

总结

Debian 服务器适配数据库运行环境的核心不是安装更多安全软件,而是把系统默认配置调整到与数据库需求匹配的状态。文件权限、网络监听、认证方式、内核参数、备份加密这五个方面是最容易出问题的地方。只要把这几个环节逐一落实,数据库在 Debian 上的安全性和稳定性就能达到生产级标准。安全是一个持续过程,每次配置变更后都应重新评估风险,而不是一次性加固后就高枕无忧。