问题:如何创建一个不能写入系统上任何文件的用户帐户?
换句话说,如何在 CentOS/RHEL 7 中创建只读用户帐户?
Linux 不提供帐户的角色级别分类。
访问权限在 I 节点级别进行控制,这意味着对每个单独的文件或者目录分别具有权限。
如果我们可以稍微重申一下这个问题,至少有两种技术可以提供所需的操作。
不要考虑用户帐户,而是考虑文件和目录。
这允许我们使用一些替代方法来实现大致相同的结果。
下面的每一项都显示了一个替代实现,它提供了略有不同的保护,这在某些用例中可能很有用。
使用访问控制列表 (ACL) 来覆盖权限。
一些文件系统处理程序支持访问控制列表 (ACL),这些列表是比所有者/组/其他部门允许的更细粒度的权限。
单个文件或者目录可以使用 ACL 来选择一组特定的用户,不一定在同一组中,并只为这些用户提供所需的文件访问权限。
例如,我们希望授予 userA、userB 和 userC 对目录 /secret-files/ 及以下目录的只读访问权限。
我们可以这样做:
# setfacl -Rd -m u:userA:rx -m u:userB:rx -m u:userC:rx /secret-files # setfacl -R -m u:userA:rx -m u:userB:rx -m u:userC:rx /secret-files
第一行设置了一个默认 ACL,它将应用于将来在 /secret-files 下创建的任何新文件或者目录。
第二个文件将 ACL 应用于 /secret-files 树及以下的任何现有内容。
有关此功能的更多详细信息,请查看 aclman 页面。
# man acl
写入某些文件时收到通知。
如果目标是确定给定用户写入的所有文件,则 auditctl 工具可能很有用。
可以在特定用户完成时触发的 write 系统调用上设置监视。
例如一个设置:
# auditctl -a always,exit -S write -F auid=1000
每当用户 ID 1000 写入任何文件时都会触发审计跟踪条目。
审计跟踪子系统在可以表达的条件方面表现力很强。
在 audit.rules 手册页上查找更多文档。
# man audit.rules
创建一个非特权的匿名帐户
Linux 中的每个文件或者目录都有三组读/写/执行权限,文件所有者、与原始所有者在同一组中的其他用户以及所有其他用户各一组。
可以使用唯一的用户 ID 和组 ID 创建一个新帐户,并将此新帐户用作只读帐户。
由于该帐户在其主目录之外不拥有任何文件,因此唯一的访问权限将是“其他”权限,通常会忽略允许写访问权限。
# useradd -c 'Mostly R/O Account' roaccount
roaccount 将分配一个唯一的用户 ID 和组 ID,这会强制其主目录之外的任何文件由“其他”访问权限控制。
O/S 已经有一个最低权限的账户没有人,但是这个账户被系统特殊对待。
建议为 R/O 使用单独的帐户。
该方案的缺陷在于它依赖于服务器和存储上的每个文件和每个目录来正确设置其“其他”权限。
这可以手动完成,也可以通过将创建过程的 umask 设置为至少 0002(阻止设置“其他”写入权限)来完成。