我想限制某个用户(我们称之为记录器)只能读取部分(而非全部)日志文件(web、php 框架、radius 等)。我不确定如何以“最佳”方式做到这一点。
到目前为止,我已经为我的用户建立了一个 chrooted sftp 帐户,并将所需的日志文件夹绑定到他的主目录 (/home/logger) 中,例如:
/var/log/nginx /home/logger/logs/nginx 无 _netdev,bind,defaults 0 0
这里是 lgos 目录权限:
dr-xr--r-- 5 记录器 logger 4096 3 月 12 日 10:09 日志
但是我必须将该用户添加到某些组(www-data、freerad)。
记录器:记录器 www-data freerad sftp
我认为这不是正确的做法。此外,用户可以删除一些文件(www-data 组对来自 symfony 应用程序的日志具有 r+w 权限)。
理想情况下,我希望我的用户拥有尽可能少的权限(我相信这意味着 RO),但仍然能够查看他需要访问的所有日志。
您能否提示一下如何做这样的事情?
提前致谢。
编辑:根据 Arribah 的回答,我尝试使用 ACL,例如:
getfacl 半径/半径.log
# file: radius/radius.log
# owner: freerad
# group: freerad
user::r--
group::r--
group:logger:r--
mask::r--
other::---
记录器用户位于记录器组内:
群组记录器
记录器:记录器 sftp
我创建了一个 radius 目录(在 /home/logger 中):
drwxr-xr-x 2 root root 4096 火星 16 14:29 半径
然后我使用了一些符号链接:
lrwxrwxrwx 1 root root 30 三月 16 14:29 radius/radius.log -> /var/log/freeradius/radius.log
现在我尝试使用记录器通过 SFTP 登录到他的 chrooted homedir:
我可以看到文件、文件夹和文件夹名称,但是如果我尝试获取文件,则会遇到“文件未找到”错误,尝试获取该文件 radius/radius.log
我真的觉得自己在这个问题上很愚蠢。:/
答案1
如果您为用户提供对日志目录的读取权限,这并不能确保用户对该目录中的文件具有读取权限(或任何其他权限)。您需要分别为此用户提供对每个日志文件的读取权限。最有可能的是,这就是您需要将读者添加到指定组的原因,因为这些组对相关日志文件具有组权限。您可以通过运行来确保
ls -l
在日志文件夹中,检查每个文件属于哪个组。
在您的场景中,实现您所要求的最正确的方法是设置 ACL,这是完成这项工作的最强大的 unix 工具。
看一下“ACL:在 Linux 上使用访问控制列表”,这是一篇很长的博文,但它完美且简单地描述了所有的步骤,足以让人感受到。
如果您需要更快速的解决方案(我不推荐,除非您不在生产环境中),您可以将您的用户从每个组中移除,然后将“其他”权限设置为 r--,(或 xx4 作为您的 chmod 八进制表示)。
编辑:我忽略了你试图在 chrooted 环境中执行此操作的事实。在这种情况下,由于符号链接本身的性质,符号链接将无法与 ftp(或 sftp)一起使用。一个很好的解释是这里,尽管看起来我倾向于只链接大文章。
尽管如此,您可以使用来实现相同的行为mount --bind
,这将使日志目录在记录器用户的主目录中可用:
mount --bind /var/log /home/logger/logs/
这将为您提供一个logs
包含所有内容的目录/var/log
。从这一点开始,您可以允许该logger
组仅读取您想要的特定日志,而其他任何日志均不具有读取权限,这样他就无法读取例如/var/log/auth.log
等。不要忘记添加对相应父文件夹的访问权限,否则您的用户只能通过输入完整路径才能访问日志,这有时会令人沮丧。