前言
网站搭建成功后,我逐渐意识到管理用户权限的重要性。特别是 Linux,作为一个多用户系统,为不同用户设置不同权限就更有必要。下面,简单讨论一下我在搭建网站时遇到的问题。
基础知识回顾
读、写和执行权限
这里简单回顾读(R)、写(W)、执行(X)权限。这里简单罗列两张表,想了解更多建议检索关键字。
目录权限 | 对应数数值 | 说明 |
---|---|---|
读 | 4 | 有无权限代表能否获取目录下包含哪些文件 |
写 | 2 | 有无权限代表能否对目录下的文件进行删除或添加操作 |
执行 | 1 | 有无权限代表能否进入目录 |
文件权限 | 对应数数值 | 说明 |
---|---|---|
读 | 4 | 有无权限代表能否读取文件的内容 |
写 | 2 | 有无权限代表能否修改文件的内容 |
执行 | 1 | 有无权限代表能否将文件视作可执行文件 |
说明一下,上述权限可以叠加,例如可读可写相当于 4 + 2 = 6,可读可执行相当于 4 + 1 = 5。
修改权限和所有者的方法
Linux 的文件和目录可以保存文件的权限和所有者信息。
权限用三位数表示,依次指代所有者、用户组、其他用户的权限。例如,想要让某个文件拥有者可读可写、用户组可读、其他用户可读,那么权限就是 640,使用 chmod 为文件或者目录赋权:
chmod {0-7}{0-7}{0-7} {文件或者目录}
使用 chown 变更文件或目录的所有人(组):
chown {用户}:{用户组} {文件或者目录}
网站根目录下文件权限管理
之前我们将服务器程序的运行用户设置为 www,这样服务器程序具备 www 的相关权限。要想让服务器返回某个文件,就必须保证服务器能够访问它。首先执行如下命令将网站根目录 wwwroot 包括里面的文件和目录的所有人设置为 www:
chown -R www:www wwwroot
下面分几种情况测试文件 wwwroot/pages/test.html
能否访问:
情况 | wwwroot | pages | test.html | 服务器能否访问 | 服务器能否修改 |
---|---|---|---|---|---|
S1 | 100 | 100 | 400 | √ | × |
S2 | 100 | 100 | 200 | x | √ |
S3 | 100 | 100 | 600 | √ | √ |
S4 | 600 | 777 | 777 | × | × |
S4 | 777 | 600 | 777 | × | × |
从上表可知 S1 是服务器返回 test.html 的必要权限,S2 是服务器编辑 test.html 的必要权限。
如何防止 Sqlite 数据库被下载
Typecho 安装程序在指定 Sqlite 数据库文件地址时,默认在 typecho 博客程序目录下的 /usr 内放置。为防止被下载,安装程序将数据库命名为 {随机字符串}.db
。在默认情况下,如果我们知道数据库文件名,便可以通过浏览器下载整个数据库。
解决这个问题有很多思路,从服务器程序上来考虑,我们可以这样做,例如:
- 拒绝客户端访问后缀名为
.db
的文件 - 将
.db
文件放置在网站根目录外
我们也可以从权限的角度解决这个问题,例如:
- 关闭服务器相关目录的读取权限,从而加大获取数据库名称的难度。
- 将服务器和 php-fpm 运行用户分别设置为两个,数据库读写权限只给到 php-fpm 的运行用户。
当然这里不推荐使用权限来解决这个问题,只是作为一个例子抛砖引玉罢了。