SELinux:我可以禁用某些文件的复制吗?

SELinux:我可以禁用某些文件的复制吗?

如果这太基础并且您想向我扔一个 RTFM,请原谅。我想阻止用户复制某些文件,同时授予他们对相同文件的读取权限。我以为这是不可能的,直到我遇到SELinux Wiki 中的示例:

 allow firefox_t user_home_t : file { read write };

所以我在想,是否可以为有问题的文件提供 0700 模式,并使用 SELinux 仅向用户通常用来读取文件的应用程序授予读取访问权限?

再次,如果这太基本了,我很抱歉,只是我的日程很紧,我想尽快以一种或另一种方式(如果可能或不可能)给我的老板一个答案,我我对 SELinux 一无所知,所以我担心自己阅读以确定它是否可能会花费我太多时间。请注意,我并不反对阅读本身如果相关文档存在,我们将不胜感激。

所以基本上,我的问题是,有没有办法在 SELinux 中做到这一点,或者我是在浪费时间追求这样的替代方案吗?

PS 我知道授予读取访问权限可以允许真正想要复制文件的用户从他们将用来读取文件的应用程序中复制和粘贴它们;我只是在寻找第一道防线。


编辑

为了更好地解释我的用例:

  • 相关文件是文本和二进制文件的混合体。
  • 它们需要由专有商业软件读取:它们是电子仿真软件的仿真模型。
  • 这些模型本身是专有的,我们不希望使用它们进行模拟的用户将它们泄露出去以供未经授权的使用。
  • 软件只需要读取模型并从这些文件中运行一些脚本;它不会将其内容写入任何地方。
  • 简而言之,我只希望模拟软件能够读取和执行这些文件,同时阻止用户进行读取访问。

答案1

我认为重要的是要注意,这cat不是我上面评论中的问题,而是 shell 重定向。您是否试图限制二进制文件或文本文件的复制?如果它是二进制文件,那么我相信您可以使用 rbash 解决一些问题(请参阅http://blog.bodhizazen.net/linux/how-to-restrict-access-with-rbash/)。

但是,如果是文本文件,我不确定如何阻止某人从本地终端复制。

我不确定任何通用的 SELinux 解决方案在这里会有帮助。您的读取文件的应用程序是否需要在任何地方写入数据?如果不是,并且这些文件只需要由您的应用程序读取,您可以只为您的应用程序的类型提供对您希望其读取的类型的文件的只读访问权限,而不是在任何地方对其进行写入。

我认为有关您的用例所需的确切权限的更多信息可能会有所帮助,对于模糊的答案感到抱歉。


更新 - 更具体的答案

我认为你可以在没有 SELinux 的情况下实现你想要的,因为这就是处理的事情(例如普通用户通过命令在 /etc/shadow 中更改密码passwd):

  • 为您的商业软件创建一个单独的用户和/或组(可能已经完成)
  • 授予所述用户和/或组的文件只读访问权限
  • 确保普通用户无权访问这些文件
  • 使您的可执行文件 setuid 或 getgid (取决于您是否使用组或用户)例如chmod g+schmod u+s
  • 当用户运行应用程序时,他们现在将拥有与应用程序用户或组相同的权限,从而允许对所需应用程序中的那些特定文件进行读取访问。

UPDATE2 - 多个用户和组 如果您有多个应用程序和组,您可能可以使用sudo.许多人都知道它可以让您以 root 身份运行命令,但它的用处远远超出了这个示例。我不确定这是否是理想的设置,但这是实现您正在尝试的操作的一种方法。

您仍然可以使所有应用程序文件归该应用程序所有,但随后您可以为每组文件创建单独的组。您的/etc/sudoers文件或其中的文件/etc/sudoers.d/可能如下所示:

User_Alias    FILEGROUP1 = user1, user2
User_Alias    FILEGROUP2 = user3, user4
Cmnd_Alias    MYEDITOR = /usr/local/bin/myeditor, /usr/local/bin/mycompiler

FILEGROUP1    ALL=(:fileset1) NOPASSWD: MYEDITOR 
FILEGROUP2    ALL=(:fileset2) NOPASSWD: MYEDITOR 

需要访问该组拥有的文件并且user1需要访问该组拥有的文件。您还可以使用组而不是用户。user2fileset1user3user4fileset2

用户可以通过编辑器执行sudo -g fileset1 /usr/local/bin/myeditor或类似操作来访问他们的文件。

sudo -g它可能有助于为用户的必要命令创建一些包装脚本,特别是因为它听起来可能是一个图形应用程序。

更多细节:

http://www.garron.me/linux/visudo-command-sudoers-file-sudo-default-editor.html

https://serverfault.com/questions/166254/change-primary-group-with-sudo-ug

http://linux.die.net/man/8/sudo

答案2

你只能以螃蟹方式实现这一目标。问题是没有“copy()”系统调用。复制文件是通过读取源并写入/创建目标来完成的。

因此,您唯一的机会是将这些文件的访问限制为不允许制作副本的应用程序。这可能是一个困难的评估,因为“不复制”通常不是应用程序的设计目标。 Firefox 显然不适合这样做。

但您可以使用两级解决方案:

  1. 限制Firefox对某个目录(树)的写访问;考虑到/tmp,这可能会变得邪恶。因此,您可能必须使用 $TMP 指向其配置目录中的某个位置来启动 Firefox。
  2. 阻止所有其他应用程序(用户可以访问的)读取此目录。 (从我的 AppArmor 角度来看)这归结为禁止登录进程访问这些目录(对于所有用户)并授予对 Firefox 的访问权限。

更通用但间接的方法:检查创建了哪些文件并将它们与禁止的文件进行比较。如果应用程序同时打开两个文件,这相当容易,但这可能是一个不安全的假设。此外,当然,通过 strace 运行所有内容并不会让系统变得更快。我不知道 FAM/fileschanged 如何在整个文件系统上扩展。这种扩展问题(如果存在)可以通过限制所有应用程序(文件管理器除外)在单个目录(当然还有它们的配置目录)中写入访问权限来“解决”,以便只有该目录(和 /tmp)需要FAM扫描。您可以记录每个进程对所有受保护文件的读取访问,以加快这些检查的速度。 FAM 无法做到这一点,但 AppArmor 审核可以(所以我猜 SELinux 也可以做到)。

一个非常好的解决方案是使用可写目录的 FUSE 模块(以避免竞争条件)来进行检查。

相关内容