# 宝塔锁定网站写入、只保留访问权限 4套方案(从简单到终极锁死) 核心目标:**游客正常浏览网页,网站无法新增/修改/删除任何源码、静态文件**,后台上传、缓存生成、日志写入按需放行白名单。
/data/wwwroot/yiyen.net 为网站在放路径 chattr -R +i /data/wwwroot/yiyen.net chattr -R -i /data/wwwroot/yiyen.net chattr -R -i /data/wwwroot/yiyen.net/data chattr -R -i /data/wwwroot/yiyen.net/runtime chattr -R -i /data/wwwroot/yiyen.net/static/upload chattr -R -i /data/wwwroot/yiyen.net/.well-known
## 方案一:宝塔官方「文件防篡改」(新手首选,图形化操作)
*省心,内核级拦截写入,不影响网页访问,支持白名单放行必须写入的目录。
1. 宝塔左侧【软件商店】→ 搜索 **文件防篡改**,安装官方插件
2. 打开防篡改 → 【防护设置】
- 防护目录:勾选你的网站根目录 `/www/wwwroot/你的域名`
- 开启总开关
3. **关键:添加白名单(必须写入的文件夹)**
点击「添加排除目录」,把下面路径填进去,否则网站上传、缓存、日志全报错:
```
/www/wwwroot/你的域名/upload
/www/wwwroot/你的域名/uploads
/www/wwwroot/你的域名/runtime
/www/wwwroot/你的域名/cache
/www/wwwroot/你的域名/temp
/www/wwwroot/你的域名/logs
```
4. 保存配置,立即生效
### 优缺点
✅ 优点:不用敲命令、可随时开关、支持批量站点、防篡改能力*强
❌ 缺点:需要手动梳理白名单,静态纯展示站可只排除`logs`日志目录
## 方案二:Linux基础权限收紧(纯权限管控,无插件)
原理:把网站运行用户`www`的**写入权限全部收回**,仅保留读/执行,网站能正常解析访问,但无法修改、新建文件。
### 操作步骤
1. 宝塔进入【文件】,定位网站根目录:`/www/wwwroot/你的域名`
2. 右上角【终端】,执行下面3条命令:
```bash
# 修正所有者为www(宝塔web运行用户)
chown -R www:www /www/wwwroot/你的域名
# 所有文件夹:555 → 仅读+执行,取消所有写入权限
find /www/wwwroot/你的域名 -type d -exec chmod 555 {} ;
# 所有文件:444 → 只读,完全不可写
find /www/wwwroot/你的域名 -type f -exec chmod 444 {} ;
```
3. **放行必须写入的目录**(上传/缓存/日志),单独给755权限:
```bash
chmod -R 755 /www/wwwroot/你的域名/upload
chmod -R 755 /www/wwwroot/你的域名/runtime
chmod -R 755 /www/wwwroot/你的域名/cache
chmod -R 755 /www/wwwroot/你的域名/logs
```
### 权限说明
- `555`目录:所有人**只能浏览、进入文件夹,不能新建/删除/改名**
- `444`文件:所有人**只能读取,不能编辑、覆盖、删除**
- 网站PHP/HTML正常读取解析,访问完全不受影响
### 恢复写入(后续要改源码/更新)
```bash
find /www/wwwroot/你的域名 -type d -exec chmod 755 {} ;
find /www/wwwroot/你的域名 -type f -exec chmod 644 {} ;
```
## 方案三:终极锁死:设置不可变属性 `chattr +i`(*强只读)
上面权限可以被root改回来,`i`不可变属性:**哪怕root管理员都不能修改、删除、重命名文件**,网页正常访问。
1. 进入网站目录终端,执行:
```bash
# 全局加不可变锁
chattr -R +i /www/wwwroot/你的域名
# 给需要写入的目录取消锁
chattr -R -i /www/wwwroot/你的域名/upload
chattr -R -i /www/wwwroot/你的域名/runtime
chattr -R -i /www/wwwroot/你的域名/cache
chattr -R -i /www/wwwroot/你的域名/logs
```
2. 验证锁状态:
```bash
lsattr /www/wwwroot/你的域名
```
看到文件前面有`----i-----`代表锁定成功。
### 解锁(要改代码时执行)
```bash
chattr -R -i /www/wwwroot/你的域名
```
> 适用:纯静态展示站、源码定型不再修改,彻底防挂马、防篡改。
## 方案四:Nginx/Apache层面拦截写入请求(补充防护)
在权限/防篡改之外,用web服务器拦截上传、PUT/DELETE请求,双重保险:
### Nginx配置(宝塔→网站→设置→配置文件)
在`server{}`内添加:
```nginx
# 禁止PUT/DELETE写入类HTTP方法
if ($request_method !~ ^(GET|POST|HEAD)$ ) {
return 403;
}
# 禁止上传目录执行PHP(防木马)
location ~* /(upload|uploads)/.*.php$ {
return 403;
}
```
保存,重载Nginx即可。
---
## 不同网站选型建议(直接照抄)
1. **静态HTML纯展示站(无后台、不上传图片)**
优先:**方案三 chattr +i**,仅排除`logs`日志目录,完全锁死
2. **有后台、需要上传图片/生成缓存(CMS/博客/企业站)**
优先:**方案一 宝塔文件防篡改**,配置好upload、runtime白名单
3. **临时锁定,后续还要改源码**
优先:**方案二 权限收紧555/444**,解锁简单
4. **高危站点,怕被上传木马篡改**
组合:**防篡改 + 权限555/444 + Nginx拦截写入方法**
## 关键避坑
1. 无论用哪种方案,**必须放行upload、runtime、cache、logs**,否则网站报错:写入失败、无法上传、页面空白
2. 不要全局设`777`,权限放开等于白锁
3. `chattr +i`锁死后,**宝塔文件管理器也删不掉文件**,改代码前务必先`chattr -i`解锁
4. 数据库写入不受以上操作影响:上面只锁**网站文件写入**,MySQL数据库读写完全正常,符合你“只锁网站写入、不影响访问”需求
## 快速验证是否生效
1. 前台正常打开网页、浏览页面 = 访问没问题
2. 后台尝试上传图片/修改模板,提示**写入失败/权限不足** = 锁定成功
3. 宝塔文件管理器尝试编辑php文件,保存报错 = 锁定成功