我的任务是为我们的网络项目托管设置一个新服务器。我是一名开发人员,所以我的系统管理水平相当低。
我提出了一个稍微简单的解决方案,每个项目都有自己的 UNIX 用户,并且 webroot 将位于用户的$HOME
.
结构很简单:
/home/<user>/web
/home/<user>/web/log
- 日志文件。/home/<user>/web/www
— 网络文档根目录。/home/<user>/web/www/public
——只是一种实践,提出了各种 Web 应用程序框架来将文档根与公共根分开。
现在,我想以这样的方式设置权限:
/home/<user>/web
— 既不能删除,也不能添加新文件/目录。chown root:root
在这里有帮助。/home/<user>/web/log
— 对用户只读,我也可以通过简单的chown root:root
./home/<user>/web/www
— 这不应该被删除/编辑,但内容可以自由修改(除了public
)。创建、删除、编辑文件和目录。/home/<user>/web/www/public
— 不应该删除/编辑,但内容可以自由修改。
对于其他安全和隔离相关的功能,我选择使用消防监狱。
到目前为止我已经尝试过chattr +a
- 它允许我添加新内容,编辑内容,但我无法删除它们。
在写问题时,类似的问题部分显示防止子目录被删除/强制执行目录结构,它有效,我现在希望使用它。
但是还有其他更透明的方法来设置这些目录吗?
答案1
删除目录需要其父目录的写权限。目录的权限和所有权是无关的。所以如果要防止删除/home/theuser/web
,保证用户没有写权限是必要且充分的/home/theuser
。
请注意,当您写“ahelpshere chown root:root
”时,那就是在父目录上为了防止其被删除,和在目录本身上以防止添加或删除文件(但不修改现有文件)。
另请注意,要/home/theuser/web/log
以有用的方式使其成为只读,仅确保用户没有写入权限(并且不拥有该目录)是不够的。如果允许用户写入/home/theuser/web
(或/home/theuser
或/home
) /
,那么他们可以重命名/home/theuser/web/log
(或/home/theuser/web
等)并创建一个log
他们拥有的新目录。
对于/home/theuser/web/www
和/home/theuser/web/www/public
,您可以将www
和www/public
设为 root 拥有,但授予用户写入权限,并在 上设置粘滞位www
。当目录具有粘滞位时,需要删除其中的文件(包括直接子目录 - 目录是一种文件类型):用户只能删除他们拥有的文件。这样,public
只能由其所有者(root)删除,但用户可以自由操作其他任何内容。
chown root:root web/www web/www/public
chmod u=rwx,go= web/www web/www/public
chmod +t web/www
setfacl -m u:theuser:rwx web/www web/www/public
请注意,它可以是任何非用户所有权,不一定是 root。
1在合理的假设下,即所有必要的遍历权限、没有相关的 SELinux 规则等。