在 Web 安全体系中,服务器目录权限往往是最容易被忽视、却又最致命的一环。一个配置不当的目录权限,可能让攻击者直接读取配置文件、上传 WebShell,甚至完全接管服务器。本文结合实际运维经验,梳理 Linux Web 服务器目录权限加固的核心思路与落地操作。
为什么目录权限是 Web 安全的第一道防线
很多入侵事件的起点并不是什么高深的漏洞利用。攻击者通过一个文件上传点传入 WebShell,如果 Web 目录对 Web 用户可写,这个 Shell 就能直接执行;如果配置文件权限过宽,数据库密码、API 密钥就会被直接读取。目录权限加固的本质,是遵循最小权限原则——每个用户、每个进程只拥有完成其工作所必需的最小权限。
核心原则:所有权与权限的分离
在 Linux 中,目录权限涉及三个维度:所有者(owner)、所属组(group)和其他用户(others),每个维度又有读(r)、写(w)、执行(x)三种权限。Web 服务器场景下,通常涉及三个角色:
- 文件所有者:通常是部署用户或 root,负责代码的更新和维护
- Web 运行用户:如
www-data、nginx、apache,负责执行 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(内容安全策略)限制脚本来源、设置 HttpOnly 和 Secure Cookie 标志来防御。但即使 XSS 成功,如果服务器目录权限严格,攻击者也无法通过 XSS 写入文件或读取敏感配置。
MySQL 防止 SQL 注入的几种写法:使用预处理语句(Prepared Statements)是最有效的方式,如 PHP PDO 的 prepare() 和 execute();其次是对输入进行类型转换和参数化查询;避免拼接 SQL 字符串。同样,即使 SQL 注入成功,如果数据库配置文件权限为 600,攻击者也无法直接读取数据库凭证。
Linux 服务器安全加固清单
结合目录权限,以下是一份可落地的加固清单:
- 权限基线:目录 755,文件 644,敏感文件 600,禁止 777
- 所有权分离:代码归部署用户,Web 用户只读;可写目录单独设置
- 禁止脚本执行:上传目录、缓存目录关闭 PHP 解析
- 关闭目录索引:
autoindex off或Options -Indexes - 限制 PHP 访问范围:配置
open_basedir - 禁用危险函数:
disable_functions中屏蔽执行类函数 - 及时更新:保持 Web 服务器、PHP、数据库版本最新
- 日志审计:开启访问日志和错误日志,定期检查异常请求
- 防火墙策略:仅开放 80、443 等必要端口,限制 SSH 访问来源
- 定期扫描:使用
find /var/www -perm -o+w检查意外可写文件
总结
目录权限加固的核心不是记住一堆命令,而是建立“默认拒绝、最小授权”的思维习惯。代码只读、可写目录禁执行、敏感文件收紧权限,这三条原则能挡住绝大多数基于文件系统的攻击链。再配合 XSS 前端防御、SQL 注入参数化查询等应用层措施,才能构建真正有纵深的 Web 安全体系。安全没有一劳永逸,定期审计和持续改进才是长久之道。
未经允许不得转载:任鹏个人博客 » Linux Web 服务器目录权限加固实践


朋友圈点赞图在线生成源码