linux权限管理核心是ugo模型,即以所有者(user)、所属组(group)、其他用户(other)为行,读(r)、写(w)、执行(x)为列构成3×3静态访问矩阵,固化文件访问控制;其本质是裁剪而非加权,other权限默认应禁止,配合capability、selinux和网络策略构建多层最小权限体系。

服务器最小权限管理不是靠堆配置凑效果,而是从 Linux 权限控制的底层模型出发,把“谁、能对什么、做什么”这三件事用访问矩阵的方式固化下来。核心不在加权,而在裁剪——裁掉所有不参与业务路径的权限分支。
UGO 模型是访问矩阵的原始载体
Linux 文件系统权限本质是一个 3×3 的简化访问矩阵:行是主体(User/Group/Other),列是操作(r/w/x),单元格值是允许或禁止。它不描述动态行为,只固化静态归属与基础能力。
- User 列控制文件创建者本人的操作边界,比如私钥文件必须设为 600,确保只有属主可读写
- Group 列是批量授权通道,如将监控工具用户加入 adm 组,自然获得读取 /var/log 的权限,无需额外 chmod
- Other 列默认应为空,生产环境禁止开放 o+r/o+x,尤其不能出现在配置目录或脚本中
Capability 机制补全进程级细粒度矩阵
UGO 只管文件,不管进程能调用哪些内核功能。Capability 把 root 的超能力拆成 40 多个原子项,每个进程启动时加载一个子集,构成第二层运行时访问矩阵。
- CapabilityBoundingSet=CAP_NET_BIND_SERVICE 表示该服务只能绑定低端口,其他如 CAP_SYS_ADMIN、CAP_DAC_OVERRIDE 一律剔除
- NoNewPrivileges=true 锁死 fork/exec 后的权限提升路径,即使程序调用 setuid 二进制也无效
- 避免使用 Capabilities=(授予权限),坚持用 CapabilityBoundingSet=(削减权限)
SELinux 类型强制构建跨域访问矩阵
当 UGO 和 Capability 都收紧后,攻击者仍可能通过共享内存、UNIX socket 或 procfs 跨越服务边界。SELinux 引入第三维:类型(type)——每个进程运行在专属域(如 httpd_t),每个文件标记为特定类型(如 httpd_config_t),策略规定哪些域可以对哪些类型执行哪些操作。
- 确认服务运行在受限域:ps -eZ | grep nginx 应显示 system_u:system_r:httpd_t:s0,而非 unconfined_t
- 禁用非必要跨域布尔值:setsebool -P httpd_can_network_connect_db off,比全局开 httpd_can_network_connect 更安全
- 调试阶段可用 semanage permissive -a httpd_t,但上线前必须移除,否则等于关掉类型墙
网络连接策略是外部访问的最终矩阵
端口开放不等于服务可被任意访问。真正的最小权限需基于连接上下文建模:源 IP、目标端口、连接状态、源端口范围、协议类型,缺一不可。
- 拒绝默认放行思维:iptables -A INPUT -p tcp --dport 22 -j ACCEPT 是高危配置,必须叠加 -s 10.0.1.0/24 和 --sport 32768:65535
- 只接受已建立连接:nft add rule inet filter input ct state established,related accept
- 管理端口额外过滤 ICMP 重定向和多播包:-p icmp --icmp-type redirect -j DROP、-m pkttype --pkt-type multicast -j DROP











