1. 基础概念
在正式介绍先介绍一下本文的基础概念,如表1所示:
表1 资源访问控制基础概念
概念名 |
描述 |
UID/GID | User Identity/Group Identity,用来标明在系统中的唯一身份。对于UID/GID应该知道:
|
POSIX权限 | 可以在资源上设置访问权限的机制,可与进程UID、(S)GID结合使用。 |
Setuid/setgid | 针对可执行文件,可以以可执行文件所有者或组的UID或GID 运行。某些程序,例如 passwd,需要以特权用户身份运行才能正常工作,但普通用户无读写/etc/shadow文件的权限,此时通过设置setuid/setgid便可让普通用户以该特权用户身份运行passwd,实际QNX也是这么做的,如下:
$ which -l passwd -rwsrwxr-x 1 root root 21544 Mar 20 23:34 /usr/bin/passwd 注意当owner和group没有相应的x权限时,为“S”。 |
Sticky Bit | 简称 SBIT 特殊权限,可意为粘着位、粘滞位、防删除位等。SBIT可影响可执行文件和目录处理的访问权限:
# ll -d /tmp_test 与setuid/setgid类似,如果没有执行权限,即为“T”。 |
与Linux类似,QNX也可以修改目录或文件的权限、所有者,如表2所示。
表2 修改权限命令
To: |
Use: |
为文件或目录指定权限 |
chmod |
为文件或目录改变owner和group(可选) |
chown |
为文件或目录改变group |
chgrp |
2. umask限制
与Linux类似,QNX使用umask来给所有新建的文件和目录赋予初始权限。
文件/目录的初始权限 = 文件/目录的最大默认权限 - umask权限
目录最大默认权限是 666,即 rw-rw-rw-,当umask设为022,即"-----w--w-"。把两个字母权限相减,得到 (-rw-rw-rw-) - (-----w--w-) = (-rw-r--r--),则表示创建目录是初始权限是644,即创建文件时只有owner拥有w权限,同组其他用户或Other用户都没有。注意这里的减法其本质是“掩盖”,即掩盖最大默认权限和umask权限中公共部分。通过把公共部分遮盖,剩余部分保留,最终剩下的才是赋予文件或目录的初始权限。
站在网络安全的角度,我们应基于最小权限,设置合理的umask。如图1所示,可通过更改/etc/profile中的umask设置。
图1 umask设置
例如如果想删除其他用户的读写权限,可将umask设为006,即:
umask 006
3. 限制chown权限
默认情况下,与资源具有相同UID的客户端可将资源上的UID和GID更改为系统上的任意其他UID和GID,很明显这不是一个明智的选择,特别是对于挂载点上的公开文件。为了避免这种情况,我们应该在挂载属性中设置IOFUNC_PC_CHOWN_RESTRICTED 标志。
例如,以下代码设置 IOFUNC_PC_CHOWN_RESTRICTED:
iofunc_mount_t mattr;
iofunc_mount_init(&mattr, sizeof(mattr));
mattr.conf |= IOFUNC_PC_CHOWN_RESTRICTED;
io_attr.mount = &mattr;
4. POSIX权限设置
POSIX 权限是可以在资源上设置访问权限的机制。例如,POSIX 中文件的所有者可以为他们自己、组和访问该文件的other分配读取、写入和执行权限。POSIX 权限与进程 UID 和 GID 值(包括补充 GID(称为 SGID 或组))结合使用,以实现对特定UID/GID的访问控制。
可以在目录上的 ls -l 命令的输出中查看 POSIX 权限,如图2所示。
图2 POSIX权限示例
图3解释了上面输出中与 POSIX 权限相关的一些字段(主要是第 1、3 和 4 列)。
图3 POSIX权限字段
同样地站在网络安全的角度,我们应基于最小权限设置关键文件的POSIX权限,特别是涉及登录密码、密钥、个人隐私、关键系统配置等文件。
5. ACL设置
可以将ACL,即访问控制列表,理解为动态POSIX。它提供一种更细粒度的补充访问控制,可以授予文件、目录和其他临时系统对象(如资源管理器路径),如授予第三方服务和应用程序访问系统资源的权限。这也是为什么我们需要设置ACL的原因。我们想象一下如果没有ACL,使用chmod设置文件权限,加入希望某人对文件具有特殊访问权限,可使用的途径有:
-
将该人添加到所属组
-
创建一个包含该人和文件所有者的补充组
-
放宽“other”的权限
实际跟踪每个组中的用户可能会变得复杂,并且允许“other”额外的权限可能会使系统不太安全。ACL 扩展了文件权限,可以更好地控制谁可以访问什么。这在运行时使用 setfacl 实用程序或使用 acl_set_file() 或 acl_set_fd() 以编程方式控制。 例如:
# ls -l ntp.conf
-rw-r--r-- 1 root root 0 Feb 06 15:14 ntp.conf
# setfacl -m user:99:rw- ntp.conf
# ls -l
total 0
-rw-rw-r--+ 1 root root 0 Feb 06 15:14 ntp.conf
请注意,此输出在权限末尾添加了 Extra 位(“+”),以指示存在额外的访问控制信息。Extra 位是单个字符,指定是否将备用访问方法应用于文件。当此字符为空格时,没有备用访问方法。要检查信息,请使用 getfacl。例如:
# getfacl ntp.conf
# file: ntp.conf
# owner: root
# group: root
user::rw-
user:99:rw-
group::r--
mask::rw-
other::r--
一般来说只有 root 或文件的所有者可以更改其 ACL。
需要注意的是,ACL 支持通常是短暂的,也就是说当系统重新启动时,必须将 ACL 重新应用于使用它们的各种资源。目前,只有 Power-Safe 文件系统允许在主机上的文件系统构建时预先创建 ACL。Power-Safe文件系统也是唯一在磁盘上保留 ACL 的文件系统。
6.小结
与Linux系统类似,QNX提供了比较全面且复杂的权限控制策略,实际应用中我们需要基于TARA充分识别需要保护的资产和潜在的攻击面,并为其设置合理的权限。
原文始发于微信公众号(汽车信息安全):青骥原创 l 谈谈QNX安全之文件权限
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论