Linux Web 服务器目录权限加固实践

在 Web 安全体系中,服务器目录权限往往是最容易被忽视、却又最致命的一环。一个配置不当的目录权限,可能让攻击者直接读取配置文件、上传 WebShell,甚至完全接管服务器。本文结合实际运维经验,梳理 Linux Web 服务器目录权限加固的核心思路与落地操作。

为什么目录权限是 Web 安全的第一道防线

很多入侵事件的起点并不是什么高深的漏洞利用。攻击者通过一个文件上传点传入 WebShell,如果 Web 目录对 Web 用户可写,这个 Shell 就能直接执行;如果配置文件权限过宽,数据库密码、API 密钥就会被直接读取。目录权限加固的本质,是遵循最小权限原则——每个用户、每个进程只拥有完成其工作所必需的最小权限。

核心原则:所有权与权限的分离

在 Linux 中,目录权限涉及三个维度:所有者(owner)、所属组(group)和其他用户(others),每个维度又有读(r)、写(w)、执行(x)三种权限。Web 服务器场景下,通常涉及三个角色:

  • 文件所有者:通常是部署用户或 root,负责代码的更新和维护
  • Web 运行用户:如 www-datanginxapache,负责执行 PHP、Python 等应用
  • 其他用户:系统中其他普通用户

加固的核心思路是:代码文件归部署用户所有,Web 用户只读不写;需要写入的目录(如上传目录、缓存目录、日志目录)单独设置,且禁止执行脚本。

具体加固操作

1. 设置合理的文件与目录权限

推荐的基线配置如下:

# 目录权限设为 755,所有者可读写执行,其他用户只读执行
find /var/www/html -type d -exec chmod 755 {} \;

# 文件权限设为 644,所有者可读写,其他用户只读
find /var/www/html -type f -exec chmod 644 {} \;

# 敏感配置文件单独收紧为 600 或 640
chmod 640 /var/www/html/config/database.php
chmod 600 /var/www/html/.env

关键点在于:永远不要使用 777 权限。777 意味着任何用户都可以写入并执行文件,这是 WebShell 传播的温床。

2. 分离可写目录并禁止脚本执行

上传目录、缓存目录、session 目录是必须可写的,但绝不能允许执行 PHP 等脚本。以 Nginx 为例:

location ~* /uploads/.*\.(php|php5|phtml|jsp|asp)$ {
    deny all;
    return 403;
}

location ^~ /uploads/ {
    add_header X-Content-Type-Options nosniff;
}

Apache 环境下可以通过 .htaccess 或虚拟主机配置实现:

<Directory "/var/www/html/uploads">
    php_flag engine off
    Options -ExecCGI -Indexes
    AddType text/plain .php .phtml .php5
</Directory>

这样即使攻击者上传了 .php 文件,服务器也只会把它当作文本处理,不会执行。

3. 正确设置所有者和所属组

# 代码归部署用户和 Web 组共同管理
chown -R deploy:www-data /var/www/html

# 可写目录归 Web 用户所有
chown -R www-data:www-data /var/www/html/uploads
chown -R www-data:www-data /var/www/html/cache

将代码所有者设为 deploy,Web 用户 www-data 只读,这样即使 Web 应用被攻破,攻击者也无法修改核心代码文件。

4. 禁用危险函数与目录遍历

php.ini 中禁用高风险函数:

disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

同时关闭目录索引功能,防止攻击者直接浏览目录结构:

autoindex off;

5. 使用 open_basedir 限制 PHP 访问范围

open_basedir 可以将 PHP 的文件操作限制在指定目录内,防止跨站文件包含和任意文件读取:

open_basedir = /var/www/html:/tmp

与 XSS、SQL 注入防御的协同

目录权限加固不是孤立的安全措施,它与应用层防御形成纵深体系。

XSS 的常见方式和前端如何防御:反射型、存储型和 DOM 型 XSS 都依赖注入恶意脚本。前端可以通过对用户输入进行 HTML 实体编码、使用 CSP(内容安全策略)限制脚本来源、设置 HttpOnlySecure Cookie 标志来防御。但即使 XSS 成功,如果服务器目录权限严格,攻击者也无法通过 XSS 写入文件或读取敏感配置。

MySQL 防止 SQL 注入的几种写法:使用预处理语句(Prepared Statements)是最有效的方式,如 PHP PDO 的 prepare()execute();其次是对输入进行类型转换和参数化查询;避免拼接 SQL 字符串。同样,即使 SQL 注入成功,如果数据库配置文件权限为 600,攻击者也无法直接读取数据库凭证。

Linux 服务器安全加固清单

结合目录权限,以下是一份可落地的加固清单:

  1. 权限基线:目录 755,文件 644,敏感文件 600,禁止 777
  2. 所有权分离:代码归部署用户,Web 用户只读;可写目录单独设置
  3. 禁止脚本执行:上传目录、缓存目录关闭 PHP 解析
  4. 关闭目录索引autoindex offOptions -Indexes
  5. 限制 PHP 访问范围:配置 open_basedir
  6. 禁用危险函数disable_functions 中屏蔽执行类函数
  7. 及时更新:保持 Web 服务器、PHP、数据库版本最新
  8. 日志审计:开启访问日志和错误日志,定期检查异常请求
  9. 防火墙策略:仅开放 80、443 等必要端口,限制 SSH 访问来源
  10. 定期扫描:使用 find /var/www -perm -o+w 检查意外可写文件

总结

目录权限加固的核心不是记住一堆命令,而是建立“默认拒绝、最小授权”的思维习惯。代码只读、可写目录禁执行、敏感文件收紧权限,这三条原则能挡住绝大多数基于文件系统的攻击链。再配合 XSS 前端防御、SQL 注入参数化查询等应用层措施,才能构建真正有纵深的 Web 安全体系。安全没有一劳永逸,定期审计和持续改进才是长久之道。

未经允许不得转载:任鹏个人博客 » Linux Web 服务器目录权限加固实践

赞 (0) 打赏

评论 0

取消
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏