核心是切断非授权进程直接操作块设备的能力,通过设备文件权限(如brw-rw----)、disk组隔离、udev规则屏蔽、selinux/apparmor进程级控制及危险工具权限限制实现多层防护。

限制对磁盘设备的底层访问,核心是切断非授权进程直接操作块设备(如 /dev/sda)的能力,而非仅控制挂载后目录的读写。Linux 通过设备文件权限、组管理、内核策略和访问控制多层实现,关键在于“不给路径,就无从下手”。
一、设备文件权限与用户组隔离
所有磁盘设备在 /dev/ 下以块设备文件形式存在(如 /dev/sda, /dev/nvme0n1),其默认权限决定谁能执行 dd、fdisk、mkfs 等底层操作:
- 查看当前权限:
ls -l /dev/sd*或ls -l /dev/nvme*;典型输出如brw-rw---- 1 root disk 8,0 ... sda,表示只有 root 用户和disk组成员可读写 - 普通用户默认不在
disk组,因此无法直接格式化或清空磁盘——这是第一道硬隔离 - 如需临时授权某用户管理磁盘,应将其加入
disk组:sudo usermod -aG disk username,而非粗暴设chmod 666 /dev/sda - 禁止将敏感设备(如系统盘)开放给非运维人员:确保
/dev/sda类设备权限为brw-rw----(即组可读写,其他用户无任何权限)
二、禁用非必要设备节点与 udev 规则加固
内核自动创建的设备节点可能暴露调试接口或冗余设备。可通过 udev 规则主动屏蔽:
- 新建规则文件:
sudo nano /etc/udev/rules.d/99-block-restrict.rules - 添加示例规则,隐藏特定设备(如 USB 存储)供普通用户发现:
KERNEL=="sd[b-z]", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", MODE="0000" - 或限制只允许特定 UUID 的磁盘生成设备节点:
ENV{ID_FS_UUID}!="1234-5678", GOTO="my_block_end" - 重载规则:
sudo udevadm control --reload-rules && sudo udevadm trigger
三、使用 SELinux 或 AppArmor 实施进程级访问控制
传统文件权限只能拦住“人”,拦不住被入侵的进程。SELinux(RHEL/CentOS)或 AppArmor(Ubuntu/Debian)可阻止进程打开块设备文件,即使它拥有对应权限:
- 确认启用:
sestatus(SELinux)或aa-status(AppArmor) - 默认策略已禁止多数服务访问
/dev/sd*;若需自定义,例如禁止 nginx 进程访问任何块设备,可添加策略模块 - 临时验证是否生效:尝试在受限进程中执行
dd if=/dev/zero of=/dev/sdb bs=1M count=1,应被拒绝并记录到/var/log/audit/audit.log或/var/log/syslog - 切勿长期运行在 permissive 模式;上线前务必设为 enforcing
四、移除或限制危险工具的执行权限
即使设备文件权限收紧,若用户能调用 fdisk、parted、sg3_utils 等工具,仍可能间接影响磁盘结构:
- 对非管理员用户,可限制工具所在路径的执行权:
sudo chmod 750 /sbin/fdisk /sbin/parted,再确保其父目录/sbin不对普通用户开放搜索(x)权限 - 更稳妥方式是使用
sudoers精确授权:username ALL=(root) /sbin/fdisk /dev/sdb1,禁止任意设备操作 - 审计系统中是否安装了高危工具:
dpkg -l | grep -E "(fdisk|parted|sg3-utils)"(Debian/Ubuntu)或rpm -qa | grep -E "(util-linux|parted|sg3_utils)"(RHEL/CentOS)











