在我的实验室中,一群人在一个工作站上工作,他们通过 NFS 共享多个驱动器。他们运行驻留在其中一个 NFS 驱动器中的共享软件,并在数据所在的 NFS 驱动器上运行该软件。
当前的设置使所有这些都使用相同的用户帐户,让我们one
在所有主机上调用它。实验室成员登录为joe@myhost
拥有一个具有自己的自定义设置的桌面,但对于属于one
、 组的科学数据的任何实际工作users
,他们必须成为one
。
请注意,环境的某些每用户定制是通过将one
帐户定义为特定于主机来实现的,因此将其主目录设置为本地即one@myhost:/home/one
(由于历史原因,它们都是 UID 502 和 GID 100)。因此,每个用户的帐户都可以在共享程序的one
公共指向旁边设置特定的环境变量。PATH
目前实验室中正在进行一场辩论,我建议在 Unix 中更好的做法是为不同的用户拥有单独的帐户,并通过使用组来复制单个用户的当前功能。
我列出了单一账户的以下缺点
- 难以管理多个软件版本,
- 几乎毫无意义的审计/日志记录,
- 每个人都可以删除其他人的文件和程序,
- 当一名成员离开实验室时,最好更改密码
现在,这个网络位于防火墙后面,它只是科学数据,对入侵者来说毫无意义,也没有经济价值。另外,在快节奏的科学实验室中,一切都比生产力重要,包括安全性。由于数据经常备份,因此删除数据或程序的能力也不是主要问题。
因为one
帐户方法非常方便,并且是多年前建立的(2001 年?),所以我很难说服任何人为每个用户使用一个帐户。也许我使用了错误的论点,或者也许我上面刚刚描述的场景是这样的,该one
方法是一个实用的中间立场,而我的推理不灵活。
无论哪种情况,如果您能帮助我找出我是否错了,或者如果我是对的,请建议我如何论证我的观点,我将不胜感激。
答案1
嗯,我可以想到两个反对单独账户想法的观点。
第一,经典的 UNIX 组与常见的共享文件树相比,有一个很大的缺陷,那就是每个用户和他们运行的每个脚本都需要有一个 umask 来保持文件和目录组可写,并且您需要将组粘性位应用于所有目录。实际上,这很困难,因为很多脚本都指定了限制性 umask,并且因为如果您将rsync -a
自己拥有的目录中的cp -a
文件tar -x
放入公共树中,则很容易忘记添加组粘性位并将组更改为共享一。您最终得到的是 Joe 拥有的文件子树,而 Joe 正在度假或出去吃午饭,有人需要修改这些文件,您必须去找系统管理员来修复它。恕我直言,Unix 权限设计简单高效,但在现实世界中并不是很实用。
第二,如果这个公共文件树包含二进制文件,并且每个人都将这些路径添加到他们的 $PATH 中,那么您根本没有安全性。您的任何一个用户都可以劫持整个组,因此他们最好都真正相互信任。此外,您正在使用 NFS,因此如果用户可以接管其工作站的 root 权限,他们就可以像他们喜欢的任何用户一样访问中央文件。
至于撤销用户帐户的想法,您可以通过从本地工作站中删除它们来实现这一点,本地工作站one
是存储密码的地方(对吗?),因为使用 NFS,文件服务器不知道他们输入了什么密码,只能知道他们的工作站内核说“嗨,我的 UID 502,代表我做这些事情”。
因此,在你的组织中推动这个问题之前,你应该考虑一下你是否能够真正完成你想要的事情。
如果您希望程序版本不那么混乱,也许让用户要求您安装由管理员拥有的它们。当管理员控制 $PATH 中的所有内容时,安全性会更好。
如果您想要单独的帐户以便可以看到谁正在更改文件,您可能必须编写一个守护程序来使用 INotify 监视共享树(我建议用 Perl 编写)并g+rwx
在每次“打开”后强制执行这些位事件,并在每个“写入”事件后设置 UID。
希望有帮助...