核心原则
在设置权限前,请务必理解 Linux 的基本权限模型:

- 所有者:文件/文件夹的创建者。
- 所属组:文件/文件夹所属的用户组。
- 其他用户:除了所有者和所属组之外的所有用户。
- 权限类型:
r(读)、w(写)、x(执行)。
对于 DedeCMS,我们遵循一个核心原则:Web 服务器(如 Nginx/Apache)只需要“读”和“执行”权限,而不应该拥有“写”权限,除非是特定需要动态写入的目录。
第一步:确定 Web 服务运行用户
在开始设置前,你必须知道你的 Web 服务器是以哪个 Linux 用户身份运行的。
- Nginx: 最常见的用户是
nginx。 - Apache: 最常见的用户是
apache或www-data。
你可以通过以下命令来确认:
# 对于 Nginx ps aux | grep nginx # 对于 Apache ps aux | grep httpd
输出结果中会包含用户名,nginx: 1234 0.0% /usr/sbin/nginx -g ...。

第二步:设置目录和文件权限
假设你的 DedeCMS 安装在 /var/www/html/dede 目录下,Web 服务器运行用户是 nginx。
设置网站根目录权限
将网站根目录的所有者设置为你的登录用户(root 或 deploy),并将所属组设置为 Web 服务器用户(nginx)。
# 将目录所有者设置为你的用户 (root) sudo chown -R root:nginx /var/www/html/dede
-R: 递归操作,会修改目录下所有文件和子目录。root: 所有者是你自己,方便你管理。nginx: 所属组是 Web 服务器,这样 Web 进程可以读取文件。
设置目录权限
目录需要 r-x (读和执行) 权限,这样 Web 服务器才能进入目录并读取列表。
# 给目录设置 755 权限 (rwxr-xr-x)
sudo find /var/www/html/dede -type d -exec chmod 755 {} \;
设置文件权限
普通文件(如 .php, .html, .css, .js, .jpg 等)只需要 r-- (读) 权限。

# 给文件设置 644 权限 (rw-r--r--)
sudo find /var/www/html/dede -type f -exec chmod 644 {} \;
设置特殊目录权限(最关键的一步)
DedeCMS 在运行时,需要向一些目录写入数据,
/data/: 存放缓存、配置文件、 session 等。/uploads/: 上传文件目录。/templets/: 模板文件(如果开启了模板在线编辑)。/special/: 专题目录。/a/: 文章默认目录。
这些目录必须允许 Web 服务器用户(nginx)写入,我们只修改这些目录的权限,而不是整个网站。
只修改目录权限(推荐)
将这些目录的所有者改为 Web 服务器用户。
# 将需要写入的目录所有者改为 nginx sudo chown -R nginx:nginx /var/www/html/dede/data sudo chown -R nginx:nginx /var/www/html/dede/uploads sudo chown -R nginx:nginx /var/www/html/dede/templets sudo chown -R nginx:nginx /var/www/html/dede/special sudo chown -R nginx:nginx /var/www/html/dede/a
- 这样,Web 服务器进程就可以完全控制这些目录,而其他文件保持
root:nginx的所有者,安全性更高。
使用 setgid(更安全,但设置稍复杂)
这是一种更高级的做法,可以避免更改所有者。
- 将这些目录的所属组设为
nginx。 - 给这些目录设置
setgid位,当一个新文件/目录被创建时,它会继承父目录的组,而不是创建者的组。 - 确保组
nginx对这些目录有rwx权限。
# 1. 将目录组设为 nginx
sudo chown -R root:nginx /var/www/html/dede/data
sudo chown -R root:nginx /var/www/html/dede/uploads
# ... 其他需要写入的目录
# 2. 设置 setgid 位和组写权限
sudo find /var/www/html/dede/data /var/www/html/dede/uploads /var/www/html/dede/templets -type d -exec chmod 2775 {} \;
# 2775 解释:
# 2: setgid 位
# 7: 所有者 (root) 有 rwx
# 7: 所属组 (nginx) 有 rwx
# 5: 其他用户有 r-x
这种方法的好处是,即使你(root)在这些目录下创建文件,文件的所有者是你,但所属组是 nginx,Web 服务器依然可以修改它。
第三步:处理 config.cache.inc.php 和 safe 目录
这两个文件/目录是 DedeCMS 的核心安全配置。
-
/data/safe/目录: 这个目录用于存放安全过滤规则,Web 服务器需要读取它,但通常不需要写入,保持root:nginx和755权限即可。 -
/data/config.cache.inc.php文件: 这是数据库连接配置文件,极其敏感,它不应该被 Web 服务器可写。-
最佳实践:保持
root:root所有者,权限设置为640,这样只有 root 用户可以读写,nginx 用户只能读。sudo chown root:root /var/www/html/dede/data/config.cache.inc.php sudo chmod 640 /var/www/html/dede/data/config.cache.inc.php
-
DedeCMS 需要写入怎么办? DedeCMS 在安装或更新配置时,需要修改这个文件,如果设置了
640,它会写入失败,这时,你可以: a. 临时修改权限:在执行安装或更新操作时,临时将其权限改为660,操作完成后立即改回640。 b. 使用chattr锁定文件:防止被意外修改(但安装时也需要解锁)。# 锁定文件 sudo chattr +i /var/www/html/dede/data/config.cache.inc.php # 解锁文件 sudo chattr -i /var/www/html/dede/data/config.cache.inc.php
-
第四步:设置文件所有者和权限的自动化脚本(推荐)
手动操作容易出错,你可以创建一个脚本来一键完成所有设置。
创建一个名为 set_dede_permissions.sh 的文件:
#!/bin/bash
# --- 配置 ---
WEB_ROOT="/var/www/html/dede" # 你的 DedeCMS 安装目录
WEB_USER="nginx" # 你的 Web 服务器用户
# --- 配置结束 ---
echo "开始设置 DedeCMS 权限..."
# 1. 设置根目录所有者
echo "设置根目录所有者为 root,所属组为 $WEB_USER..."
sudo chown -R root:$WEB_USER $WEB_ROOT
# 2. 设置所有目录为 755
echo "设置所有目录权限为 755..."
sudo find $WEB_ROOT -type d -exec chmod 755 {} \;
# 3. 设置所有文件为 644
echo "设置所有文件权限为 644..."
sudo find $WEB_ROOT -type f -exec chmod 644 {} \;
# 4. 设置需要写入的目录
echo "设置需要写入的目录所有者为 $WEB_USER..."
sudo chown -R $WEB_USER:$WEB_USER $WEB_ROOT/data
sudo chown -R $WEB_USER:$WEB_USER $WEB_ROOT/uploads
sudo chown -R $WEB_USER:$WEB_USER $WEB_ROOT/templets
sudo chown -R $WEB_USER:$WEB_USER $WEB_ROOT/special
sudo chown -R $WEB_USER:$WEB_USER $WEB_ROOT/a
# 5. 设置核心配置文件权限
echo "设置核心配置文件权限..."
sudo chown root:root $WEB_ROOT/data/config.cache.inc.php
sudo chmod 640 $WEB_ROOT/data/config.cache.inc.php
echo "权限设置完成!"
使用方法:
- 将上述代码保存为
set_dede_permissions.sh。 - 赋予执行权限:
chmod +x set_dede_permissions.sh - 执行脚本:
sudo ./set_dede_permissions.sh
总结与最佳实践
- 最小权限原则:只给 Web 服务器它所需要的最小权限。
- 所有者分离:普通文件由管理员(如
root)拥有,需要写入的目录由 Web 服务器用户(如nginx)拥有。 - 核心文件保护:
config.cache.inc.php等敏感文件应严格限制访问权限,只允许管理员读写。 - 定期检查:在安装新插件或进行手动操作后,最好运行一次权限检查脚本,确保权限没有被意外修改。
- SELinux/AppArmor:如果你的系统开启了 SELinux 或 AppArmor,它们可能会覆盖标准的文件权限,你可能需要为 Web 服务器设置正确的安全上下文,这是更高级的安全配置,如果遇到权限问题,可以先临时关闭 SELinux (
setenforce 0) 来排查是否是它导致的问题。
遵循以上步骤,你的 DedeCMS 在 Linux 环境下的权限设置就会非常安全和规范。
