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通过安全上下文(由用户、角色、类型组成)控制访问,不同数据库需分配对应的类型标签。常见数据库的上下文类型及设置方法如下:
/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
/var/lib/postgresql/<version>/main)标记为postgresql_db_t,配置文件(/etc/postgresql/)标记为postgresql_etc_t。sudo chcon -R -t postgresql_db_t /var/lib/postgresql/14/main
/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布尔值(动态开关)。常见需求及命令:
httpd_can_network_connect_db:sudo setsebool -P httpd_can_network_connect_db 1
mysqld_port_t),并允许进程访问:sudo semanage port -a -t mysqld_port_t -p tcp 3307
sudo setsebool -P mysqld_port_t 1
此命令将端口3307标记为mysqld_port_t类型,允许MySQL进程绑定并监听该端口。3. 处理未授权访问的日志与自定义策略
当SELinux阻止数据库操作时,需通过日志分析原因并生成自定义策略:
ausearch命令过滤数据库相关拒绝事件(如MySQL):sudo ausearch -m avc -ts recent -se mysql
日志会显示被拒绝的操作(如“read”、“write”)及涉及的上下文。audit2allow生成自定义策略:sudo ausearch -m avc -ts recent | audit2allow -M mydbpolicy
执行后会生成.te(策略源码)和.pp(编译后策略)文件,安装策略:sudo semodule -i mydbpolicy.pp
此方法可解决特定场景下的访问问题,避免过度放宽策略。4. 验证配置有效性
完成上述步骤后,需验证数据库是否能正常运行及访问:
sudo systemctl restart mysql # 或postgresql、mongod
SELECT 1;),确认无权限错误。Enforcing模式,避免因测试需要临时切换至Permissive模式导致安全漏洞。通过以上步骤,Ubuntu上的SELinux可支持MySQL、PostgreSQL、MongoDB等多种数据库,通过安全上下文、布尔值调整及自定义策略,实现细粒度的访问控制,提升系统安全性。