限制对设备节点的访问本质是守住硬件操作第一道门,核心是通过/dev文件权限(如brw-rw----)、udev规则屏蔽、selinux/apparmor进程级拦截及危险工具权限限制四层机制,确保仅授权用户和进程在必要时以合规方式访问块设备。

限制对设备节点的访问,本质是守住硬件操作的第一道门。关键不在于完全封死,而在于让只有该用的人、在该用的时候、以该用的方式去碰设备文件。
控制 /dev 下设备文件的基础权限
所有磁盘、USB、NVMe等块设备都以文件形式出现在/dev目录下(如/dev/sda、/dev/nvme0n1),它们的权限直接决定谁可以执行dd、mkfs、fdisk等危险操作。
- 用
ls -l /dev/sd*查看当前权限,典型输出brw-rw---- 1 root disk 8,0 sda表示:只有root用户和disk组成员能读写 - 普通用户默认不在disk组,因此无法格式化或清空磁盘——这是最基础也最有效的隔离
- 如需授权某运维人员管理磁盘,应执行
sudo usermod -aG disk username,而不是给设备文件设chmod 666 - 系统盘(如/dev/sda)必须保持
brw-rw----权限,确保其他用户无任何访问能力
用 udev 规则动态屏蔽非必要设备
内核自动创建的设备节点可能暴露调试接口或临时接入的USB存储,可通过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系)或 AppArmor(Debian/Ubuntu)可在内核层阻止进程打开块设备,哪怕它拥有对应文件权限。
- 确认启用:
sestatus(SELinux)或aa-status(AppArmor),状态必须为enforcing - 默认策略已禁止多数服务访问/dev/sd*;如需定制,例如禁止nginx访问任何块设备,可编写并加载策略模块
- 验证方式:在受限进程中运行
dd if=/dev/zero of=/dev/sdb bs=1M count=1,应被拒绝并记录到审计日志 - 切勿长期使用permissive模式,上线前务必设为enforcing
限制危险工具的可用性
即使设备文件权限收紧,若用户仍能调用fdisk、parted、sg_format等工具,就可能绕过部分限制间接影响磁盘结构。
- 对非运维人员,移除或限制工具执行权限:
sudo chmod 750 /usr/sbin/fdisk,仅保留root及特定组可执行 - 更稳妥做法是用sudoers精细授权,例如只允许ops组执行
/sbin/parted /dev/sdb print,但禁止write类操作 - 配合chown将工具二进制文件归属设为root:wheel,并确保普通用户不在wheel组中











