我管理多个 RHEL 6.9 系统。在每个系统上,一个特定的目录,称为/应用程序目录,是我们项目的脚本、可执行文件、配置文件和日志的存储位置的顶层。此顶层目录下的树又宽又深。/应用程序目录归用户所有用户1并拥有以下团体成员资格组1. 人类用户总是运行为用户1, 和用户1的主要群体是组1。
有些系统用于制造团队成员在交付给客户之前测试我们生产的硬件小部件,有些系统用于开发用于测试硬件小部件的软件。
所有人类用户都以以下身份登录 GNOME 桌面用户1然后通过打开终端并从命令行启动应用程序来运行我们的主要(GUI)应用程序。
制造系统需要保持原始状态。然而,由于各种原因,开发人员会更改脚本或配置文件来测试制造业系统并忘记恢复更改。一个经典问题。
然后,当生产团队成员使用该系统时,它要么根本无法工作,要么给出错误的通过结果(这是最糟糕的情况,因为它导致我们交付有故障的硬件小部件),要么给出错误的失败结果(由于没有交付实际上适合交付的硬件小部件而导致收入损失)。
因此,我需要找到一种方法来锁定(即使其可读但不可写)目录结构中的脚本和配置文件,以便除了少数明确定义的例外情况外,它们不能除非由具有特殊权限的领导者更改,否则无法更改。标准 Linux 权限是不够的,因为根据本文第一段所述,它们允许任何人类用户(始终以用户1) 随意更改任何文件。
在我们的生命周期中的这个阶段,遗憾的是我们无法灵活地对目录结构、用户、群组等进行太多的改变。
我认为 SELinux 会提供一个解决方案。
实际情况要复杂得多,但作为示例,请考虑以下目录结构:
/app_dir/bin/
/app_dir/bin/widget_tester
/app/dir/bin/<other executables>
/app_dir/config/
/app_dir/config/widget_info.txt
/app_dir/config/test_tolerances.txt
/app_dir/config/<other configuration files>
/app_dir/scripts/
/app_dir/scripts/script_1.py
/app_dir/scripts/script_2.sh
/app_dir/scripts/<other scripts>
/app_dir/logs/
/app_dir/logs/<log files>
/app_dir/bin/以及其下的所有内容,都应无一例外地被锁定。
/app_dir/配置/以及其下的所有内容都应被锁定,但以下情况除外小部件信息.txt。制造团队成员需要能够提供有关即将测试的硬件小部件的信息。
/app_dir/脚本/以及其下的所有内容都应被锁定,但以下情况除外脚本1.py。
/app_dir/日志/以及其下的所有内容都应该可以被我们的可执行文件和脚本写入,但对于人类来说(即用户1),它应该是可读的。
SELinux 是完成这项工作的合适工具吗?如果是,类型/类型强制是可以使用的机制吗?如果两者都不是,我还能在哪里集中精力学习?
更新 1
请注意,我所描述的让所有人类运行的设置用户1在我加入该项目之前,实际上已经好几年了。我知道它有缺点(但实际上它有正当的理由,我不需要在这里详述)。这是现实世界中的制造业务。重组我们的设置是完全地从商业角度来看是不可行的。不是得到管理层的允许。
我指出这一点是为了强调我并不是要求对我们当前的设置提出批评。我试图从比我更了解 SELinux 的社区专家那里找出我花精力学习 SELinux 是否是正确的选择。我还要求指点我可能不知道的其他 Linux 机制,这些机制可能会解决这个问题。(也就是说,虽然我目前的重点是 SELinux,但我并不想将讨论限制在 SELinux 上。)
答案1
使用“chattr”命令为选定的文件/文件夹赋予“不可变”属性。除非 root 删除该属性,否则任何人都无法修改这些文件,甚至文件所有者或 root 用户也无法修改。
答案2
这些都是简单的权限问题,SeLinux 在这种情况下不会提供帮助:
ACL:是文件系统的一个附加的、更灵活的权限机制。
您在这里要做的只是为每个用户/组授予他们对文件所需的权限:
1-首先,检查您的文件系统是否支持 ACL(例如 xfs、ext2、ext3、ext4):
2- 设置所有权/应用程序目录/*到领先用户,因此只有主角才能完全控制它:
chown -R lead:lead /app_dir/
或者
如果你想继续使用 user1 & group1 因为应用程序应该这样启动,那么添加领先用户将 group1 设为次要组:
usermod -G group1 leaduser
3- 通过设置来设置例外情况高级生命支持系统在目录/文件上。
例如:/app_dir/bin/
setfacl -Rm g:devgroup:rx /app_dir/bin/
setfacl -Rm g:manufactgroup:rx /app_dir/bin/
PS:R 代表递归。
3-检查ACL是否正确应用:
getfacl /app_dir/bin/