真正有效的权限锁定是分层隔离+执行阻断,核心在于区分路径用途并精准控制:web根目录禁执行、动态内容存根外、临时目录限权、关键配置文件用chattr+i锁定(前提是不被web进程写入)、web进程以最小权限运行并禁用危险函数,同时配合监控告警。

不能靠简单锁定 Web 应用运行路径来防恶意持久化。chattr +i 或 chmod 000 这类“一刀切”锁法,会直接导致应用崩溃——因为 Web 进程(如 www-data)需要持续写日志、存会话、处理上传、生成缓存。锁死路径等于拒绝合法行为,反而暴露设计缺陷。
真正有效的权限锁定,是分层隔离+执行阻断
核心思路不是“不让写”,而是“写了也不能跑、不能读、不能逃”。关键在区分路径用途,并施加精准控制:
-
Web 根目录(如 /var/www/html)只放静态资源和入口文件:移除所有可执行位(
chmod -x /var/www/html),禁止任何脚本解析(Nginx 中用location ~ \.(php|py|pl|sh)$ { return 403; }) -
动态内容必须分离存储:上传文件、用户数据、缓存全部存到 Web 根外(如
/var/www/app-data/uploads/),前端仅通过带鉴权的路由(如/api/download?id=abc123)间接访问 -
运行时临时目录严格限权:如 session 目录设为
750,属主为 web 用户,属组为专用管理组,禁止其他用户进入
针对持久化常见落点做定向加固
攻击者常在以下位置埋点,需针对性封堵:
-
Web 可写目录内新建 .php/.jsp 文件:禁用该目录下所有脚本引擎解析(Apache 加
php_flag engine off;Tomcat 禁用 JSP 编译器或删掉org.apache.jasper.servlet.JspServlet映射) -
配置文件被篡改(如 config.php、web.xml):用
chattr +i锁定这些文件——前提是它们由运维手动更新,不被 Web 进程写入 -
日志目录被利用写 shell(如 Apache error_log 注入):关闭日志中执行代码的可能(禁用 PHP 的
log_errors = On配合error_log写入非 Web 可达路径)
用最小权限原则约束 Web 进程本身
进程权限比文件权限更根本:
- 确保 Web 服务以低权限用户运行(如
www-data),且该用户不在sudo组、无 shell 登录权限(/usr/sbin/nologin) - 用 systemd 的
RestrictAddressFamilies=AF_UNIX AF_INET、NoNewPrivileges=yes、ProtectSystem=strict限制其系统调用能力 - 禁用危险函数(PHP 中禁用
system、exec、proc_open等),并在 php.ini 中设disable_functions
监控与响应要跟上权限策略
权限设置只是基础,必须配合实时感知:
- 对 Web 可写目录启用 inotify 监控,发现新 .php/.jsp/.sh 文件立即告警并自动隔离
- 定期扫描 Web 根下是否存在非白名单扩展名文件(如
find /var/www/html -name "*.php" ! -name "index.php" -o -name "shell.*") - 检查进程树,识别非预期子进程(如 Web 进程下突然出现
nc、bash、python -c)
不复杂但容易忽略:权限锁定不是贴封条,而是建关卡。每一道关卡都得清楚自己拦什么、放什么、谁来守——否则要么形同虚设,要么自断手脚。











