SELinux基础准备
在Ubuntu上启用SELinux前,需先安装必要工具并确认状态。使用以下命令安装SELinux相关包:
sudo apt update && sudo apt install selinux-basics selinux-policy-default auditd setroubleshoot
编辑/etc/selinux/config文件,设置SELINUX=enforcing(强制模式,推荐用于生产环境)和SELINUXTYPE=targeted(针对特定服务提供保护,默认策略),保存后激活SELinux:
sudo selinux-activate && sudo reboot
重启后通过sestatus命令验证状态,确保显示Current mode: enforcing。
1. 为数据库配置正确的安全上下文
SELinux通过安全上下文(由用户、角色、类型组成)控制访问,不同数据库需分配对应的类型标签。常见数据库的上下文类型及设置方法如下:
- MySQL/MariaDB:数据目录(默认
/var/lib/mysql)需标记为mysqld_db_t,配置文件(/etc/mysql/)标记为mysqld_etc_t,日志文件(/var/log/mysql/)标记为mysqld_log_t。
递归修改数据目录上下文:若修改了默认路径(如sudo chcon -R -t mysqld_db_t /var/lib/mysql/data/mysql),需用semanage fcontext添加永久规则,再恢复上下文:sudo semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?" sudo restorecon -Rv /data/mysql - PostgreSQL:数据目录(默认
/var/lib/postgresql/)标记为/main postgresql_db_t,配置文件(/etc/postgresql/)标记为postgresql_etc_t。
递归修改数据目录:sudo chcon -R -t postgresql_db_t /var/lib/postgresql/14/main - MongoDB:数据目录(默认
/var/lib/mongodb)标记为mongod_db_t,日志文件(/var/log/mongodb/)标记为mongod_log_t。
递归修改数据目录:以上命令需替换为实际安装路径,确保进程能访问自身文件。sudo chcon -R -t mongod_db_t /var/lib/mongodb
2. 配置SELinux布尔值允许数据库与其他服务交互
若数据库需与Web服务(如Nginx/Apache)或其他进程通信,需调整SELinux布尔值(动态开关)。常见需求及命令:
- 允许Web服务(如Nginx)连接数据库:
若Nginx需通过网络访问MySQL/PostgreSQL,启用httpd_can_network_connect_db:sudo setsebool -P httpd_can_network_connect_db 1 - 允许数据库监听非默认端口:
若数据库使用非标准端口(如MySQL用3307),需将其添加到对应端口类型(mysqld_port_t),并允许进程访问:
此命令将端口3307标记为sudo semanage port -a -t mysqld_port_t -p tcp 3307 sudo setsebool -P mysqld_port_t 1mysqld_port_t类型,允许MySQL进程绑定并监听该端口。
3. 处理未授权访问的日志与自定义策略
当SELinux阻止数据库操作时,需通过日志分析原因并生成自定义策略:
- 查看SELinux拒绝日志:
使用ausearch命令过滤数据库相关拒绝事件(如MySQL):
日志会显示被拒绝的操作(如“read”、“write”)及涉及的上下文。sudo ausearch -m avc -ts recent -se mysql - 生成自定义策略模块:
若日志提示“avc: denied”,使用audit2allow生成自定义策略:
执行后会生成sudo ausearch -m avc -ts recent | audit2allow -M mydbpolicy.te(策略源码)和.pp(编译后策略)文件,安装策略:
此方法可解决特定场景下的访问问题,避免过度放宽策略。sudo semodule -i mydbpolicy.pp
4. 验证配置有效性
完成上述步骤后,需验证数据库是否能正常运行及访问:
- 重启数据库服务:
sudo systemctl restart mysql # 或postgresql、mongod - 测试本地访问:
登录数据库,执行简单查询(如MySQL的SELECT 1;),确认无权限错误。 - 测试跨服务访问:
若Web服务需连接数据库,通过Web应用尝试访问数据库,验证是否成功。 - 检查SELinux状态:
确保仍为Enforcing模式,避免因测试需要临时切换至Permissive模式导致安全漏洞。
通过以上步骤,Ubuntu上的SELinux可支持MySQL、PostgreSQL、MongoDB等多种数据库,通过安全上下文、布尔值调整及自定义策略,实现细粒度的访问控制,提升系统安全性。
以上就是关于“Ubuntu SELinux如何支持多种数据库”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm