Flask+Flask-Login项目部署VPS遇SQLite只读错误如何安全配置权限
问题根本原因
SQLite写入数据时,除了需要修改.db数据库文件本身,还需要在数据库文件所在目录下自动创建临时事务文件(比如回滚日志.db-journal、预写日志.db-wal等),所以运行Web服务的www-data用户需要同时拥有数据库文件的读写权限、数据库目录的写入和进入权限。
你之前给目录设666无法运行,是因为Linux系统中目录的权限逻辑和普通文件不同:
- 目录的
r权限:允许列出目录内的文件列表 - 目录的
w权限:允许在目录内新增、删除、修改文件 - 目录的
x权限:允许进入目录,访问目录内的文件666权限的目录没有x执行位,www-data根本无法进入db目录,自然无法操作里面的数据库文件。
兼顾安全和可用性的权限配置方案
只需要给www-data用户最小必要权限即可,不需要开放777这类全局可写的高风险权限,执行以下命令配置:
# 1. 重置db目录及内部文件的所有者为Web服务运行用户www-data sudo chown -R www-data:www-data /var/www/mywebsite/db/ # 2. 给db目录设置权限:所有者读写执行、同组读执行、其他用户无任何权限 # 满足www-data进入目录、创建临时文件的需求,其他用户完全无法访问该目录 sudo chmod 750 /var/www/mywebsite/db/ # 3. 给数据库文件设置权限:所有者读写、同组读、其他用户无任何权限 # 仅允许www-data修改数据库文件 sudo chmod 640 /var/www/mywebsite/db/users.db # 4. 可选:如果站点上层目录归其他运维用户管理,需要确保www-data有进入站点目录的权限 sudo chmod o+x /var/www/mywebsite
如果有其他运维用户需要管理数据库,可以将这些用户加入www-data用户组,然后把目录权限调整为770、文件权限调整为660即可,仍然不会对外开放权限。
额外优化建议
建议将SQLite连接串改为绝对路径,避免相对路径因运行上下文不同导致的路径解析错误,修改config.txt中的配置:
[database] con = sqlite:////var/www/mywebsite/db/users.db
注意SQLite绝对路径需要写4个斜杠////作为前缀。
内容的提问来源于stack exchange,提问作者erixliechtenstein
相关产品推荐
相关产品推荐

