假设允许用户 uid=1000 和 guids=1000,33,277 在文件夹 中创建文件/files/
。有什么方法可以阻止该用户允许其他人读取该文件(至少不在组 1000、33 或 277 中)?
让创建的文件为/files/user1000.file
那么问题就可以具体了:
有没有办法避免这种结果ls /files/user1000.file -al
-rw-rw-r-- 1 1000 1000 6 May 15 17:21 user1000.file
并用这个代替:
-rw-rw---- 1 1000 1000 6 May 15 17:21 user1000.file
也许使用umask
?我知道有像 setgid 这样的东西drw-rws---
,所以我很乐观可能有办法。
不过,我想这取决于用户是否决定这么做chmod o+rw user1000.file
?
答案1
您的问题有两种可能的解决方案,它们所解决的场景略有不同。
第一个将使用umask
。这掩码是一个告诉内核哪些访问位的值清除在新创建的文件上(这主要影响open(2)
和creat(2)
系统调用 — 您仍然可以通过显式调用chmod(2)
新创建的文件来通过 umask 值设置访问位“禁止”)。因此,如果将 umask 设置为0
,则创建该文件的程序请求的所有访问位都会被设置。如果将其设置为04777
,则所有位都会被清除。
大多数时候,默认的 umask 值是022
,这意味着组和其他人的写入权限被清除。
因此,为了解决您的问题,您可以将 umask 值设置为027
,这将导致每个创建的文件都删除组的写访问权限,并清除其他文件的所有位:
$ umask
022
$ touch testfile.022
$ ls -l testfile.022
-rw-r--r-- 1 user user 0 May 15 18:56 testfile.022
$ umask 027
$ touch testfile.027
$ ls -l testfile.027
-rw-r----- 1 user user 0 May 15 18:57 testfile.027
要在您启动的每个 shell 中进行设置,请将适当的umask
调用放入 shell 的启动文件之一(~/.profile
或者~/.bashrc
是一个好的开始位置)。
另一种方法是在要清除这些位的目录上使用默认访问控制列表 (ACL)。与使用umask
.首先,它增加了更多的粒度,即在目录级别,其次,它适用于每个人(您不必更改全局值umask
):
$ umask
022
$ mkdir acldir
$ cd acldir
$ getfacl .
# file .
# owner: user
# group: user
user::rwx
group::r-x
other::r-x
$ ls -la
total 12
drwxr-xr-x 2 user user 6 May 15 19:11 .
drwxr-xr-x 83 user user 8192 May 15:19:08 ..
$ touch testfile.noacl
$ ls -l testfile.noacl
-rw-r--r-- 1 user user 0 May 15 19:14 testfile.noacl
$ setfacl -m 'user::rwx,group::r-x,other::---' .
$ setfacl -d -m 'user::rwx,group::r-x,other::---' .
# file: .
# owner: user
# group: user
user::rwx
group::r-x
other::---
default:user::rwx
default:group::r-x
default:other::---
$ touch testfile.acl
$ ls -l testfile.acl
-rw-r----- 1 user user 0 May 15 19:16 testfile.acl
正如您所看到的,使用默认 ACL 后,testfile.acl
即使 umask 值设置为 ,其他人的访问位也会被清除022
。
要更深入地了解 ACL,请查看访问控制列表(5)手册页。
编辑:如果你想阻止文件的所有者chown(2)
对文件进行显式操作,你就必须拿出重炮;我认为以符合标准的方式(就 POSIX 而言)是不可能的。有几个安全框架可能允许您拦截和过滤系统调用,但需要额外的配置。他们之中有一些是:
- SELinux(还没有使用过这个,但它相当普遍可用;默认情况下由 RedHat 使用,例如)
- RSBAC(重的配置负担得起,但您可以对特定用户可以做什么和不可以做什么进行非常细粒度的控制)
- AppArmor(我认为Ubuntu使用这个)
答案2
是的,您可以非常轻松地做到这一点。您只需要umask
在您的 ~/.profile
(或者/etc/profile
如果您想为所有用户更改它)中设置默认值:
umask 0007
这样,新文件将根据您的需要创建:
$ touch user1000.file
$ ls -l user1000.file
-rw-rw---- 1 terdon terdon 0 May 15 18:56 user1000.file
有关 的更多信息umask
,您可以阅读通常很棒的,拱门维基页面就此主题而言。