原文:Filesystem Permissions,BookStack 官方管理文档。BookStack 由 Dan Brown 创建并由社区共同开发;本译文依据 2026 年 10 月 5 日读取的页面整理,保留全部正文步骤,并将编辑补充单独标明。
BookStack 需要读取和写入文件:写日志、处理上传文件以及运行应用程序代码,都会用到文件系统。理想的权限配置应仅授予实际需要的访问能力,以降低潜在漏洞被利用时的影响。
BookStack 默认需要哪些权限
- 能够读取 BookStack 安装目录及其全部内容。
- 能够写入安装目录下的
storage/、bootstrap/cache和public/uploads,包括这些目录中的全部内容。
这类访问通常受 PHP 进程和/或 Web 服务器进程使用的用户与用户组控制。此外,应尽可能限制 .env 的读取权限,只允许 PHP/Web 服务器进程以及确实需要修改它的可信用户访问,因为该文件通常包含凭据和密钥。

一套权限配置示例
下面的方法允许日常登录用户更新 BookStack,同时为 Web 服务器提供运行所需权限。示例有三个前提,使用时必须根据自己的部署修改命令中的对应部分:
- 负责日常登录与升级的用户为
barry。 - BookStack 安装在
/var/www/bookstack。 - Web 服务器/PHP 用户为
www-data,这是 Ubuntu 系统中的默认名称。
以 # 开头的行是注释。下列命令保留原文的权限方案,仅翻译注释。
# 将 BookStack 的目录和文件设为 barry 所有,所属组设为 www-data
sudo chown -R barry:www-data /var/www/bookstack
# 所有目录和文件:所有者可读、可写、可执行;所属组和其他用户可读、可执行
sudo chmod -R 755 /var/www/bookstack
# 为下列目录及其内容赋予 www-data 组写权限
sudo chmod -R 775 /var/www/bookstack/storage /var/www/bookstack/bootstrap/cache /var/www/bookstack/public/uploads
# .env 仅允许所有者和所属组读取,仅允许所有者写入
sudo chmod 640 /var/www/bookstack/.env
编辑补充:-R 会递归修改整棵目录树。执行前应确认安装目录的真实路径、维护用户、PHP/Web 进程身份及当前权限,记录原有配置并保留可恢复的备份。这里的 755 和 775 也会给普通文件增加执行位,而且允许其他本地用户读取通常的程序文件;这是原文示例,不应解释为任何部署下唯一或最严格的权限模型。执行顺序还会暂时让 .env 落入较宽权限,因此含其他本地用户的环境应在维护窗口评估这一过程,单独保护敏感文件。不要把示例路径直接替换成根目录或某个过宽的父目录。
传统权限正确,仍无法写入:检查 SELinux
常见于 RHEL 系发行版的 SELinux,也可能影响文件系统访问。为了检查它是否阻止了访问,可以一边重现 BookStack 中会触发错误的操作,一边观察相关审计日志。例如执行:
sudo tail -f /var/log/audit/audit.log
按 Ctrl+C 停止跟踪日志。原文还提出,可以临时禁用 SELinux,观察问题是否随之消失,以辅助判断问题来源。若 SELinux 确实是原因,通常还需要为安装文件补充合适的类型标签。
编辑补充:临时禁用只属于原文列出的诊断手段,会降低强制访问控制保护;本文不把它作为修复方案,也不提供关闭 SELinux 的快捷命令。应优先结合拒绝记录确认具体路径和策略,再修正标签。不要把“关闭后能写入”当作权限已经配置正确的证据。
下面示例假定:
- 安装目录仍为
/var/www/bookstack。 - Web 服务器对只读内容使用
httpd_sys_content_t类型,对可读写内容使用httpd_sys_rw_content_t类型。
必须按实际环境调整这些值。以 # 开头的行仍为注释。
# 为整个 BookStack 安装目录登记只读内容类型
semanage fcontext -a -t httpd_sys_content_t '/var/www/bookstack(/.*)?'
# 为确实需要读写的目录登记可写内容类型
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/bookstack/storage(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/bookstack/bootstrap/cache(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/bookstack/public/uploads(/.*)?'
# 将登记的上下文应用到现有文件
restorecon -R /var/www/bookstack
编辑补充:以上命令需要相应管理权限,原文未加 sudo,并不代表普通账户一定能执行。semanage fcontext 登记持久化的文件上下文规则,restorecon 才将匹配规则应用到文件。若同一路径规则已经存在,应先检查现有记录,不能重复添加后忽略报错;应根据本机工具及策略选择修改已有规则。标签也不能代替常规用户/组权限,两者都必须满足要求。
完成后的核对
编辑建议依次核对:PHP/Web 进程能否读取程序;上述三个目录能否完成日志、缓存和上传所需的写入;.env 是否仅向预期账户开放;重现原先报错操作后,审计日志是否仍出现与该路径相关的拒绝。应区分“应用恢复正常”和“权限范围符合预期”,两项都要确认。
本次只对公开文档与命令进行了静态审查,没有登录服务器,没有执行 chown、chmod、semanage 或 restorecon,也未更改 SELinux。实际部署的发行版、安装方式、ACL、进程域与挂载策略可能不同。
来源与署名:BookStack:Filesystem Permissions。原站版权归 Dan Brown;网页构建时显示的版权年份可能变化,不用其推定文章发表日期。中文翻译及原创示意图:未完纪。












暂无评论内容