How to Secure Your MediaWiki Site: Permission Advice
思想理念
- 只把对外要用到的 PHP 入口文件放在 web 根目录,其他一切(配置文件、源码、开发文件、构建工具配置、测试文件、文档等)都应移到 web 根之外,然后用 .htaccess 或 webserver 配置限制访问。
- 业务逻辑(源码)、静态资源分开放置
- webserver 仅可读源码,不可写入,不可执行
- websever 可拥有静态资源
- 上传目录要禁止代码运行
- 要阻止对编译产生的 .dot 文件的访问
- root:root 755 比 root:www-data 750 更开放,后者有时更好,因为对 o 做了限制
- 任何人、程序、浏览器,访问内容时,都属于某个用户组
- www-data 既是一个用户名,也是一个用户组名
- others 指属主、属主之外的任意用户
- mediawiki.conf sites.conf sites-le-ssl.conf 分开更有逻辑性,不用合并
- 对源码的各类配置只能是第二道防线,第一道防线应该从 apache 或 nginx 入手
- 把源码放在 /var/www 本身就是大隐患,会暴露技术栈。源码另存,仅把入口文件放在 /var/www 或 var/www/html,则入口只是 /,更安全
- Apache 尝试访问某个文件时,该文件的每一个上级路径都要有 x 权限
- Apache 通过 symbollink 也能访问文件,symbollink 权限由指向的源文件决定
- .htaccess 本身就是针对当前目录生效的配置,所以 <Directory> 块只能放在 sth.conf
- 改文件前先备份一个
知识清单
+FollowSymLinks → 允许 Apache 跟随文件系统里的符号链接
-Indexes → 禁止列目录(防止别人看到文件清单)。不会阻止访问目录下的具体文件
AllowOverride All → 开放 .htaccess 管理权限
php_admin_flag engine off → 禁止执行 PHP(防止上传漏洞)
目录的列目录 list 权限是由 r 控制的。
源码解读
文件保护
根限配置
其他
数据库
# /etc/mysql/mariadb.conf.d/50-server.cnf
skip-networking
# 或者
bind-address = 127.0.0.1
使生效
a2enconf mediawiki-hardening && apachectl configtest && systemctl reload apache2
php update.php
Emacs
杜绝 ~ # 文件泄密。
(setq make-backup-files nil) ;; 禁止生成 xxx~
(setq auto-save-default nil) ;; 禁止生成 #xxx#
tar
sudo tar czf xx -C /var/www mediawiki
。
大写 C 代表切换进目录。
小写 c 代表 create。
小写 z 代表 gzip。
小写 f 代表 file。
整条命令意思是进入 /var/www 目录,对 mediawiki 文件夹执行打包操作,形成 xx 文件。
ln
ln -sfn 存在 不存在
小写 s 代表 symbolic,软链,俗称快捷方式
小写 f 代表 force,目标位置有同名文件则先删除再链接
小写 n 代表 no dereference,不跟随符号链接。如果目标路径已经是一个符号链接,那么 -n 会把它当作普通文件来覆盖,而不会去跟随这个符号链接的指向。 👉 没有 -n 时,假如目标是个符号链接,可能会去覆盖它指向的文件,比较危险。
&&
&&:只有当前一个命令返回 0(成功) 时,才会执行后一个命令。
||:只有当前一个命令返回 非 0(失败) 时,才会执行后一个命令。
&:是把命令放到后台执行,并不是条件执行。
go-w
chmod -R go-w /var/www/mediawiki
令该目录无写入权限。