Smack¶
“对你来说很好,你决定清理电梯了!” - 《黑暗之星》中的电梯
Smack 是简化强制访问控制内核。Smack 是一个基于内核的强制访问控制实现,其主要设计目标包括简单性。
Smack 不是 Linux 唯一可用的强制访问控制方案。鼓励刚接触强制访问控制的用户将 Smack 与其他可用的机制进行比较,以确定哪种最适合当前的问题。
Smack 由三个主要组件组成
内核
基本实用程序,这些实用程序很有用但不是必需的
配置数据
Smack 的内核组件被实现为 Linux 安全模块 (LSM) 模块。它需要 netlabel,并且最好与支持扩展属性的文件系统一起使用,尽管并非严格要求 xattr 支持。在“普通”发行版下运行 Smack 内核是安全的。
Smack 内核使用 CIPSO IP 选项。一些网络配置不能容忍 IP 选项,并且可能会阻碍访问使用它们(如 Smack 所做的那样)的系统。
Smack 用于 Tizen 操作系统。请访问 http://wiki.tizen.org,了解有关 Smack 在 Tizen 中如何使用的信息。
Smack 用户空间的当前 git 存储库是
git://github.com/smack-team/smack.git
这应该在大多数现代发行版上进行构建和安装。smackutil 中包含五个命令
- chsmack
显示或设置 Smack 扩展属性值
- smackctl
加载 Smack 访问规则
- smackaccess
报告具有一个标签的进程是否可以访问具有另一个标签的对象
随着 smackfs/load2 和 smackfs/cipso2 接口的引入,这两个命令已过时。
- smackload
正确格式化要写入 smackfs/load 的数据
- smackcipso
正确格式化要写入 smackfs/cipso 的数据
为了保持 Smack 的意图,配置数据是最小化的,而不是严格要求的。最重要的配置步骤是挂载 smackfs 伪文件系统。如果安装了 smackutil,则启动脚本将处理此问题,但也可以手动完成。
将此行添加到 /etc/fstab
smackfs /sys/fs/smackfs smackfs defaults 0 0
/sys/fs/smackfs
目录由内核创建。
Smack 使用扩展属性 (xattrs) 将标签存储在文件系统对象上。这些属性存储在扩展属性安全命名空间中。进程必须具有 CAP_MAC_ADMIN
才能更改这些属性中的任何一个。
Smack 使用的扩展属性是
- SMACK64
用于做出访问控制决策。在几乎所有情况下,赋予新文件系统对象的标签将是创建它的进程的标签。
- SMACK64EXEC
执行设置了此属性的程序文件的进程的 Smack 标签将以此属性的值运行。
- SMACK64MMAP
不允许其 Smack 标签不允许使用此属性中包含的标签允许的所有访问的进程 mmap 文件。这是共享库的一个非常具体的用例。
- SMACK64TRANSMUTE
只能具有值“TRUE”。如果目录中存在此属性,则在目录中创建对象时,并且允许写入访问目录的 Smack 规则(更多如下)包含转换 (“t”) 模式,则该对象将获得目录的标签,而不是创建进程的标签。如果创建的对象是目录,则也会设置 SMACK64TRANSMUTE 属性。
- SMACK64IPIN
此属性仅在套接字的文件描述符上可用。在此属性中使用 Smack 标签,以对传递到此套接字的数据包进行访问控制决策。
- SMACK64IPOUT
此属性仅在套接字的文件描述符上可用。在此属性中使用 Smack 标签,以对来自此套接字的数据包进行访问控制决策。
有多种方法可以在文件上设置 Smack 标签
# attr -S -s SMACK64 -V "value" path
# chsmack -a value path
进程可以通过读取 /proc/self/attr/current
来查看它正在运行的 Smack 标签。具有 CAP_MAC_ADMIN
的进程可以通过写入此处来设置进程 Smack。
大多数 Smack 配置是通过写入 smackfs 文件系统中的文件来完成的。此伪文件系统挂载在 /sys/fs/smackfs
上。
- access
为了向后兼容而提供。首选 access2 接口,应改为使用它。此接口报告具有指定 Smack 标签的主题是否具有对具有指定 Smack 标签的对象的特定访问权限。将固定格式的访问规则写入此文件。下一次读取将指示是否允许访问。文本将为“1”(表示允许访问)或“0”(表示拒绝)。
- access2
此接口报告具有指定 Smack 标签的主题是否具有对具有指定 Smack 标签的对象的特定访问权限。将长格式的访问规则写入此文件。下一次读取将指示是否允许访问。文本将为“1”(表示允许访问)或“0”(表示拒绝)。
- ambient
这包含应用于未标记的网络数据包的 Smack 标签。
- change-rule
此接口允许修改现有的访问控制规则。写入时接受的格式为
"%s %s %s %s"
其中第一个字符串是主题标签,第二个是对象标签,第三个是要允许的访问权限,第四个是要拒绝的访问权限。访问字符串只能包含字符“rwxat-”。如果存在给定主题和对象的规则,则将通过启用第三个字符串中的权限并禁用第四个字符串中的权限来修改该规则。如果不存在此类规则,则将使用第三个字符串和第四个字符串中指定的访问权限创建该规则。
- cipso
为了向后兼容而提供。首选 cipso2 接口,应改为使用它。此接口允许将特定的 CIPSO 标头分配给 Smack 标签。写入时接受的格式为
"%24s%4d%4d"["%4d"]...
第一个字符串是固定的 Smack 标签。第一个数字是要使用的级别。第二个数字是类别数。以下数字是类别
"level-3-cats-5-19 3 2 5 19"
- cipso2
此接口允许将特定的 CIPSO 标头分配给 Smack 标签。写入时接受的格式为
"%s%4d%4d"["%4d"]...
第一个字符串是长的 Smack 标签。第一个数字是要使用的级别。第二个数字是类别数。以下数字是类别
"level-3-cats-5-19 3 2 5 19"
- direct
这包含网络数据包中用于 Smack 直接标签表示的 CIPSO 级别。
- doi
这包含在网络数据包中使用的 CIPSO 解释域。
- ipv6host
此接口允许将特定的 IPv6 Internet 地址视为单个标签主机。仅从具有对主机标签的 Smack 写入访问权限的进程将数据包发送到单个标签主机。从单个标签主机接收的所有数据包都将获得指定的标签。写入时接受的格式为
"%h:%h:%h:%h:%h:%h:%h:%h label" or "%h:%h:%h:%h:%h:%h:%h:%h/%d label".
不支持“::”地址快捷方式。如果标签为“-DELETE”,则将删除匹配的条目。
- load
为了向后兼容而提供。首选 load2 接口,应改为使用它。此接口允许除了系统定义的规则之外还指定访问控制规则。写入时接受的格式为
"%24s%24s%5s"
其中,第一个字符串是主体标签,第二个是客体标签,第三个是请求的访问权限。访问字符串只能包含字符“rwxat-”,并指定允许哪种类型的访问。“-”是表示不允许的权限的占位符。字符串“r-x--”将指定读取和执行权限。标签的长度限制为 23 个字符。
- load2
除了系统定义的规则外,此接口还允许指定访问控制规则。写入时接受的格式为
"%s %s %s"
其中,第一个字符串是主体标签,第二个是客体标签,第三个是请求的访问权限。访问字符串只能包含字符“rwxat-”,并指定允许哪种类型的访问。“-”是表示不允许的权限的占位符。字符串“r-x--”将指定读取和执行权限。
- load-self
为了向后兼容而提供。建议使用 load-self2 接口,应改用此接口。此接口允许定义特定于进程的访问规则。只有在允许访问的情况下才会参考这些规则,并且旨在为进程提供额外的限制。格式与 load 接口的格式相同。
- load-self2
此接口允许定义特定于进程的访问规则。只有在允许访问的情况下才会参考这些规则,并且旨在为进程提供额外的限制。格式与 load2 接口的格式相同。
- logging
包含 Smack 日志记录状态。
- mapped
包含网络数据包中用于 Smack 映射标签表示的 CIPSO 级别。
- netlabel
此接口允许将特定的 Internet 地址视为单标签主机。数据包会发送到没有 CIPSO 标头的单标签主机,但仅当进程具有对主机标签的 Smack 写入权限时才会发送。从单标签主机接收的所有数据包都将分配指定的标签。写入时接受的格式为
"%d.%d.%d.%d label" or "%d.%d.%d.%d/%d label".
如果指定的标签为“ -CIPSO”,则该地址将被视为支持 CIPSO 标头的主机。
- onlycap
包含进程必须具有的标签,才能使 CAP_MAC_ADMIN 和
CAP_MAC_OVERRIDE
生效。如果此文件为空,则这些功能对具有任何标签的进程都有效。可以通过将所需的标签(以空格分隔)写入文件来设置这些值,也可以通过向文件写入“ -”来清除这些值。- ptrace
用于定义当前的 ptrace 策略
- 0 - 默认
这是依赖于 Smack 访问规则的策略。对于
PTRACE_READ
,主体需要对客体具有读取权限。对于PTRACE_ATTACH
,则需要读写权限。- 1 - 精确
这是限制
PTRACE_ATTACH
的策略。只有当主体和客体的标签相等时才允许附加。PTRACE_READ
不受影响。可以使用CAP_SYS_PTRACE
覆盖。- 2 - 严苛
此策略的行为类似于上面的“精确”,但例外的是它不能用
CAP_SYS_PTRACE
覆盖。
- revoke-subject
在此处写入 Smack 标签会将具有该主体标签的所有访问规则的访问权限设置为“ -”。
- unconfined
如果内核配置了
CONFIG_SECURITY_SMACK_BRINGUP
,则具有CAP_MAC_ADMIN
的进程可以将标签写入此接口。此后,将记录涉及该标签的访问,并且如果不是这种情况,则允许访问。请注意,这是危险的,可能会破坏系统标签的正确性。永远不应在生产中使用它。- relabel-self
此接口包含进程可以通过写入
/proc/self/attr/current
来转换到的标签列表。通常,进程可以将其自己的标签更改为任何合法值,但前提是它具有CAP_MAC_ADMIN
。此接口允许没有CAP_MAC_ADMIN
的进程将其自身重新标记为预定义列表中的标签之一。没有CAP_MAC_ADMIN
的进程只能更改其标签一次。执行此操作后,此列表将被清除。可以通过将所需的标签(以空格分隔)写入文件来设置这些值,也可以通过向文件写入“ -”来清除这些值。
如果使用 smackload 实用程序,则可以在 /etc/smack/accesses
中添加访问规则。它们的格式为
subjectlabel objectlabel access
访问权限是字母 rwxatb 的组合,它们指定具有 subjectlabel 的主体对具有 objectlabel 的客体允许的访问类型。如果没有规则,则不允许访问。
在 http://schaufler-ca.com 上查找其他程序
简化强制访问控制内核(白皮书)¶
Casey Schaufler casey@schaufler-ca.com
强制访问控制¶
计算机系统采用多种方案来限制在使用机器的人员和服务之间共享信息的方式。其中一些方案允许程序或用户决定允许其他程序或用户访问哪些数据。这些方案被称为自主访问控制机制,因为访问控制是在用户的自由裁量权下指定的。其他方案不将关于用户或程序可以访问哪些内容的决策留给用户或程序。这些方案被称为强制访问控制机制,因为您无法选择可以访问数据的用户或程序。
Bell & LaPadula¶
从 20 世纪 80 年代中期到本世纪初,强制访问控制 (MAC) 与 Bell & LaPadula 安全模型密切相关,该模型是对美国国防部标记纸质文档的政策的数学描述。这种形式的 MAC 在华盛顿特区和斯堪的纳维亚的超级计算机中心很受欢迎,但经常被认为未能解决一般需求。
域类型强制¶
在本世纪初,域类型强制 (DTE) 开始流行。该方案将用户、程序和数据组织成相互隔离的域。该方案已作为流行的 Linux 发行版的一个组件广泛部署。维护此方案所需的管理开销以及提供安全域映射所需的对整个系统的详细理解导致该方案在大多数情况下被禁用或以有限的方式使用。
Smack¶
Smack 是一种强制访问控制机制,旨在提供有用的 MAC,同时避免其前辈的缺陷。Bell & LaPadula 的限制通过提供一种方案来解决,该方案可以根据系统及其目的的要求(而不是由神秘的政府政策施加的要求)来控制访问。通过根据已在使用的访问模式定义访问控制,可以避免域类型强制的复杂性。
Smack 术语¶
用于讨论 Smack 的术语对于那些处理过其他 MAC 系统的人来说很熟悉,并且对于新手来说应该不太难掌握。有四个术语以特定的方式使用,并且特别重要
- 主体
主体是计算机系统上的活动实体。在 Smack 上,主体是一个任务,而任务又是基本执行单元。
- 客体
客体是计算机系统上的被动实体。在 Smack 上,所有类型的文件、IPC 和任务都可以是客体。
- 访问
主体尝试将信息放入客体或从客体获取信息的任何尝试都是访问。
- 标签
识别主体或客体的强制访问控制特性的数据。
这些定义与安全社区中的传统用法一致。还有一些 Linux 中的术语可能会出现
- 能力
具有能力的任务有权违反系统安全策略的某个方面,如特定能力所识别的。具有一个或多个能力的任务是特权任务,而没有能力的任务是非特权任务。
- 特权
允许违反系统安全策略的任务被称为具有特权。在撰写本文时,任务可以通过具有能力或具有 root 的有效用户来获得特权。
Smack 基础知识¶
Smack 是 Linux 系统的扩展。它基于附加到每个主体和客体的标签,对主体可以访问哪些客体施加了额外的限制。
标签¶
Smack 标签是 ASCII 字符串。它们的长度可以达到 255 个字符,但建议将其保持在 23 个字符以内。使用特殊字符(即字母或数字以外的任何字符)的单字符标签保留供 Smack 开发团队使用。Smack 标签是非结构化的、区分大小写的,并且对它们执行的唯一操作是比较是否相等。Smack 标签不能包含不可打印的字符、“/”(斜杠)、“\”(反斜杠)、“'”(单引号)和“"”(双引号)字符。Smack 标签不能以“ -”开头。这保留用于特殊选项。
有一些预定义的标签
_ Pronounced "floor", a single underscore character.
^ Pronounced "hat", a single circumflex character.
* Pronounced "star", a single asterisk character.
? Pronounced "huh", a single question mark character.
@ Pronounced "web", a single at sign character.
Smack 系统上的每个任务都分配有一个标签。进程的 Smack 标签通常由系统初始化机制分配。
访问规则¶
Smack 使用 Linux 的传统访问模式。这些模式包括读取、执行、写入以及偶尔的追加。在某些情况下,访问模式可能不明显。这些包括
- 信号
信号是从主体任务到客体任务的写操作。
- 互联网域 IPC
数据包的传输被视为从源任务到目标任务的写操作。
Smack 根据附加到主体的标签和附加到其试图访问的客体的标签来限制访问。强制执行的规则按以下顺序:
任何标有“*”的任务请求的任何访问都被拒绝。
标有“^”的任务请求的读取或执行访问被允许。
对标有“_”的客体请求的读取或执行访问被允许。
对标有“*”的客体请求的任何访问都被允许。
任务对具有相同标签的客体请求的任何访问都被允许。
加载的规则集中明确定义的任何访问都被允许。
任何其他访问都被拒绝。
Smack 访问规则¶
通过 Smack 提供的隔离,访问分离变得简单。在许多有趣的情况下,需要主体对具有不同标签的客体进行有限的访问。一个例子是熟悉的敏感性间谍模型,在该模型中,从事高度机密项目的科学家将能够读取较低机密级别的文件,并且她编写的任何内容都将“天生”是高度机密的。为了适应此类方案,Smack 包含一种用于指定允许标签之间访问的规则的机制。
访问规则格式¶
访问规则的格式是
subject-label object-label access
其中 subject-label 是任务的 Smack 标签,object-label 是被访问事物的 Smack 标签,而 access 是指定允许的访问类型的字符串。访问规范会搜索描述访问模式的字母
a:表示应授予附加访问权限。r:表示应授予读取访问权限。w:表示应授予写入访问权限。x:表示应授予执行访问权限。t:表示该规则请求转变。b:表示应报告该规则以进行启动。
规范字母的大写值也是允许的。访问模式规范可以按任意顺序排列。可接受的规则示例包括
TopSecret Secret rx
Secret Unclass R
Manager Game x
User HR w
Snap Crackle rwxatb
New Old rRrRr
Closed Off -
不可接受的规则示例包括
Top Secret Secret rx
Ace Ace r
Odd spells waxbeans
标签中不允许有空格。由于主体始终可以访问具有相同标签的文件,因此为该情况指定规则毫无意义。访问规范中只允许使用有效字母 (rwxatbRWXATB) 和破折号 ('-') 字符。破折号是占位符,因此“a-r”与“ar”相同。单独的破折号用于指定不允许任何访问。
应用访问规则¶
Linux 开发人员很少定义新的事物类型,通常从其他系统导入方案和概念。大多数情况下,其他系统是 Unix 的变体。Unix 有许多令人喜爱的特性,但访问控制模型的一致性并不是其中之一。Smack 努力在保持底层机制精神的同时,尽可能统一地对待访问。
文件系统对象(包括文件、目录、命名管道、符号链接和设备)需要与模式位访问使用的访问权限非常匹配。要打开文件进行读取,需要在文件上具有读取访问权限。要搜索目录,需要执行访问权限。要使用写入访问权限创建文件,需要在包含目录上具有读取和写入访问权限。删除文件需要在文件和包含目录上具有读取和写入访问权限。用户可能能够看到文件存在,但由于具有对包含目录的读取访问权限而不是对不同标签文件的读取访问权限,因此无法看到其任何属性。这是文件名是目录中的数据而不是文件的一部分的产物。
如果一个目录被标记为转变 (SMACK64TRANSMUTE=TRUE),并且允许进程在该目录中创建对象的访问规则包括“t”访问权限,则分配给新对象的标签将是目录的标签,而不是创建进程的标签。这使得具有不同标签的两个进程更容易共享数据,而无需授予对其所有文件的访问权限。
IPC 对象、消息队列、信号量集和内存段存在于平面命名空间中,并且访问请求只需要匹配有问题的对象即可。
进程对象反映系统上的任务,用于访问它们的 Smack 标签与任务用于其自身访问尝试的 Smack 标签相同。通过 kill() 系统调用发送信号是从信令器到接收器的写操作。调试进程需要读取和写入。创建新任务是一个内部操作,会产生两个具有相同 Smack 标签的任务,并且不需要访问检查。
套接字是附加到进程的数据结构,并且从一个进程向另一个进程发送数据包需要发送方具有对接收方的写入访问权限。接收方不需要具有对发送方的读取访问权限。
设置访问规则¶
配置文件 /etc/smack/accesses 包含在系统启动时要设置的规则。这些内容被写入特殊文件 /sys/fs/smackfs/load2。可以随时添加规则,并且立即生效。对于任何一对主体和客体标签,只能有一个规则,最近指定的规则将覆盖任何较早的指定。
任务属性¶
可以从 /proc/<pid>/attr/current 中读取进程的 Smack 标签。进程可以从 /proc/self/attr/current 中读取其自己的 Smack 标签。特权进程可以通过写入 /proc/self/attr/current 来更改其自己的 Smack 标签,但不能更改另一个进程的标签。
文件属性¶
文件系统对象的 Smack 标签作为名为 SMACK64 的扩展属性存储在文件中。此属性位于安全命名空间中。只能由具有特权的进程更改。
特权¶
具有 CAP_MAC_OVERRIDE 或 CAP_MAC_ADMIN 的进程是特权的。CAP_MAC_OVERRIDE 允许进程访问否则将被拒绝的对象。CAP_MAC_ADMIN 允许进程更改 Smack 数据,包括规则和属性。
Smack 网络¶
如前所述,Smack 在网络协议传输上强制实施访问控制。Smack 进程发送的每个数据包都会用其 Smack 标签标记。这是通过将 CIPSO 标记添加到 IP 数据包的标头来完成的。每个接收到的数据包都应具有一个 CIPSO 标记,用于标识标签,如果缺少此类标记,则假定为网络环境标签。在交付数据包之前,会进行检查以确定具有数据包标签的主体是否具有对接收进程的写入访问权限,如果不是这种情况,则会丢弃该数据包。
CIPSO 配置¶
通常不需要指定 CIPSO 配置。系统使用的默认值可处理所有内部情况。Smack 将组成 CIPSO 标签值以匹配正在使用的 Smack 标签,而无需管理干预。进入系统的未标记数据包将被赋予环境标签。
在遇到来自非 Smack 但使用 CIPSO 的系统的报文时,Smack 需要配置。通常这将是一个 Trusted Solaris 系统,但还有其他一些部署较少的系统。CIPSO 提供 3 个重要值:一个解释域 (DOI)、一个级别和一个每个数据包的类别集。DOI 旨在标识一组使用兼容标签方案的系统,并且 Smack 系统上指定的 DOI 必须与远程系统的 DOI 匹配,否则数据包将被丢弃。默认情况下,DOI 为 3。该值可以从 /sys/fs/smackfs/doi 读取,并且可以通过写入 /sys/fs/smackfs/doi 来更改。
标签和类别集会映射到 /etc/smack/cipso 中定义的 Smack 标签。
Smack/CIPSO 映射的格式为
smack level [category [category]*]
Smack 不期望级别或类别集以任何特定方式相关,并且不会基于它们假设或分配访问权限。映射的一些示例
TopSecret 7
TS:A,B 7 1 2
SecBDE 5 2 4 6
RAFTERS 7 12 26
“:” 和 “,” 字符在 Smack 标签中是允许的,但没有任何特殊含义。
通过写入 /sys/fs/smackfs/cipso2 来定义 Smack 标签到 CIPSO 值的映射。
除了显式映射外,Smack 还支持直接 CIPSO 映射。一个 CIPSO 级别用于指示数据包中传递的类别集实际上是 Smack 标签的编码。默认情况下,使用的级别为 250。该值可以从 /sys/fs/smackfs/direct 读取,并且可以通过写入 /sys/fs/smackfs/direct 来更改。
套接字属性¶
有两个与套接字关联的属性。这些属性只能由特权任务设置,但任何任务都可以为其自己的套接字读取这些属性。
- SMACK64IPIN
任务对象的 Smack 标签。将强制实施策略的特权程序可以将其设置为星号标签。
- SMACK64IPOUT
与传出数据包一起传输的 Smack 标签。特权程序可以将其设置为与它希望与之通信的另一个任务的标签相匹配。
Smack Netlabel 异常¶
您会经常发现您标记的应用程序必须与外部未标记的世界进行对话。为此,有一个特殊文件 /sys/fs/smackfs/netlabel,您可以在其中添加一些异常,形式如下
@IP1 LABEL1 or
@IP2/MASK LABEL2
这意味着您的应用程序如果对 LABEL1 具有写入访问权限,则将对 @IP1 具有未标记的访问权限;如果对 LABEL2 具有写入访问权限,则将对子网 @IP2/MASK 具有访问权限。
/sys/fs/smackfs/netlabel 文件中的条目会像无类 IPv4 路由一样,按最长掩码优先匹配。
可以在那里使用特殊标签“@”和选项“-CIPSO”。
@ means Internet, any application with any label has access to it
-CIPSO means standard CIPSO networking
如果你不知道 CIPSO 是什么,并且不打算使用它,你可以直接这样做
echo 127.0.0.1 -CIPSO > /sys/fs/smackfs/netlabel
echo 0.0.0.0/0 @ > /sys/fs/smackfs/netlabel
如果你在你的 192.168.0.0/16 本地网络上使用 CIPSO,并且还需要未标记的互联网访问,你可以这样做
echo 127.0.0.1 -CIPSO > /sys/fs/smackfs/netlabel
echo 192.168.0.0/16 -CIPSO > /sys/fs/smackfs/netlabel
echo 0.0.0.0/0 @ > /sys/fs/smackfs/netlabel
为 Smack 编写应用程序¶
Smack 系统上会运行三种应用程序。应用程序如何与 Smack 交互将决定它必须做什么才能在 Smack 下正常工作。
Smack 无感知应用程序¶
到目前为止,绝大多数应用程序都没有理由关心 Smack 的独特属性。由于调用程序不会影响与该进程关联的 Smack 标签,因此唯一可能出现的问题是该进程是否具有执行该程序的访问权限。
Smack 相关应用程序¶
一些程序可以通过了解 Smack 来改进,但它们本身不做出任何安全决策。实用程序 ls(1) 就是这样一个程序的例子。
Smack 强制执行应用程序¶
这些是特殊的程序,它们不仅了解 Smack,还参与系统策略的执行。在大多数情况下,这些是设置用户会话的程序。还有一些网络服务会向以各种标签运行的进程提供信息。
文件系统接口¶
Smack 使用扩展属性维护文件系统对象上的标签。可以使用 getxattr(2) 获取文件、目录或其他文件系统对象的 Smack 标签
len = getxattr("/", "security.SMACK64", value, sizeof (value));
会将根目录的 Smack 标签放入 value 中。特权进程可以使用 setxattr(2) 设置文件系统对象的 Smack 标签
len = strlen("Rubble");
rc = setxattr("/foo", "security.SMACK64", "Rubble", len, 0);
如果程序具有相应的权限,则会将 /foo 的 Smack 标签设置为 “Rubble”。
套接字接口¶
可以使用 fgetxattr(2) 读取套接字属性。
特权进程可以使用 fsetxattr(2) 设置传出数据包的 Smack 标签
len = strlen("Rubble");
rc = fsetxattr(fd, "security.SMACK64IPOUT", "Rubble", len, 0);
如果程序具有相应的权限,则会将从套接字发出的数据包的 Smack 标签设置为 “Rubble”
rc = fsetxattr(fd, "security.SMACK64IPIN, "*", strlen("*"), 0);
如果程序具有相应的权限,则会将 “*” 设置为对象标签,用于检查传入的数据包。
管理¶
Smack 支持一些挂载选项
- smackfsdef=label
指定为缺少 Smack 标签扩展属性的文件提供的标签。
- smackfsroot=label
指定如果文件系统缺少 Smack 扩展属性则为其根目录分配的标签。
- smackfshat=label
指定一个标签,该标签必须具有对文件系统上所有标签的读取访问权限。尚未强制执行。
- smackfsfloor=label
指定一个标签,文件系统上设置的所有标签必须具有对其读取访问权限。尚未强制执行。
- smackfstransmute=label
行为与 smackfsroot 完全相同,只是它还在挂载的根目录上设置了 transmute 标志
这些挂载选项适用于所有文件系统类型。
Smack 审计¶
如果你想要对安全事件进行 Smack 审计,则需要在内核配置中设置 CONFIG_AUDIT。默认情况下,所有被拒绝的事件都将被审计。你可以通过向 /sys/fs/smackfs/logging 文件写入一个字符来更改此行为
0 : no logging
1 : log denied (default)
2 : log accepted
3 : log denied & accepted
事件记录为 ‘key=value’ 对,对于每个事件,你至少会获得主体、对象、请求的权限、操作、触发事件的内核函数,以及其他取决于审计事件类型的键值对。
启动模式¶
启动模式提供了日志记录功能,可以简化应用程序配置和系统启动。使用 CONFIG_SECURITY_SMACK_BRINGUP 配置内核以启用这些功能。启用启动模式后,由于标记为 “b” 访问模式的规则而成功的访问将被记录。当为进程引入新标签时,可以积极添加规则,并标记为 “b”。日志记录允许跟踪哪些规则实际用于该标签。
启动模式的另一个功能是 “unconfined” 选项。将标签写入 /sys/fs/smackfs/unconfined 会使具有该标签的主体能够访问任何对象,并且具有该标签的对象可以被所有主体访问。任何由于标签不受限制而被授予的访问权限都将被记录。此功能很危险,因为文件和目录可能会在如果强制执行策略则无法创建的位置创建。