Smack

“干得好,你决定清理电梯了!” - 《黑暗之星》中的电梯

Smack 是简化的强制访问控制内核。 Smack 是强制访问控制的基于内核的实现,其主要设计目标包括简单性。

Smack 不是 Linux 上唯一可用的强制访问控制方案。 鼓励刚接触强制访问控制的人员将 Smack 与其他可用机制进行比较,以确定哪种机制最适合当前的问题。

Smack 由三个主要组件组成

  • 内核

  • 基本实用程序,这些实用程序很有用但不是必需的

  • 配置数据

Smack 的内核组件实现为 Linux 安全模块 (LSM) 模块。 它需要 netlabel,并且最好与支持扩展属性的文件系统一起使用,尽管并不严格要求 xattr 支持。 在“vanilla”发行版下运行 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 上。

访问

为了向后兼容而提供。 建议使用 access2 接口,应改为使用它。 此接口报告具有指定 Smack 标签的主题是否具有对具有指定 Smack 标签的对象的特定访问权限。 将固定格式的访问规则写入此文件。 下一次读取将指示是否允许该访问。 文本将是“1”表示访问,或“0”表示拒绝。

access2

此接口报告具有指定 Smack 标签的主题是否具有对具有指定 Smack 标签的对象的特定访问权限。 将长格式的访问规则写入此文件。 下一次读取将指示是否允许该访问。 文本将是“1”表示访问,或“0”表示拒绝。

环境

这包含应用于未标记网络数据包的 Smack 标签。

更改规则

此接口允许修改现有的访问控制规则。 写入时接受的格式为

"%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"
直接

这包含用于网络数据包中 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".

不支持“::”地址快捷方式。 如果 label 为“-DELETE”,则将删除匹配的条目。

加载

为了向后兼容而提供。 建议使用 load2 接口,应改为使用它。 此接口允许指定除系统定义的规则之外的访问控制规则。 写入时接受的格式为

"%24s%24s%5s"

其中第一个字符串是主体标签,第二个是对象标签,第三个是请求的访问权限。 访问字符串只能包含字符“rwxat-”,并指定允许哪种访问权限。 “-”是表示不允许的权限的占位符。 字符串“r-x--”将指定读取和执行访问权限。 标签的长度限制为 23 个字符。

加载 2

此接口允许指定除系统定义的规则之外的访问控制规则。 写入时接受的格式为

"%s %s %s"

其中第一个字符串是主体标签,第二个是对象标签,第三个是请求的访问权限。 访问字符串只能包含字符“rwxat-”,并指定允许哪种访问权限。 “-”是表示不允许的权限的占位符。 字符串“r-x--”将指定读取和执行访问权限。

加载自身

为了向后兼容而提供。 建议使用 load-self2 接口,应改为使用它。 此接口允许定义特定于进程的访问规则。 仅当允许访问时才查询这些规则,并且旨在对进程提供其他限制。 格式与 load 接口的格式相同。

加载自身 2

此接口允许定义特定于进程的访问规则。 仅当允许访问时才查询这些规则,并且旨在对进程提供其他限制。 格式与 load2 接口的格式相同。

日志记录

这包含 Smack 日志记录状态。

映射

这包含用于网络数据包中 Smack 映射标签表示的 CIPSO 级别。

网络标签

此接口允许将特定的 Internet 地址视为单标签主机。 数据包在没有 CIPSO 标头的情况下发送到单标签主机,但仅从具有对主机标签的 Smack 写入权限的进程发送。 从单标签主机接收的所有数据包都将获得指定的标签。 写入时接受的格式为

"%d.%d.%d.%d label" or "%d.%d.%d.%d/%d label".

如果指定的标签为“-CIPSO”,则该地址将被视为支持 CIPSO 标头的主机。

仅限 cap

这包含进程要使 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 覆盖。

撤销主体

在此处写入 Smack 标签会将具有该主体标签的所有访问规则的访问权限设置为“-”。

未受限

如果内核配置了 CONFIG_SECURITY_SMACK_BRINGUP,则具有 CAP_MAC_ADMIN 的进程可以将标签写入此接口。 此后,将记录涉及该标签的访问,并且如果不是,则允许该访问。 请注意,这很危险,可能会破坏系统的正确标记。 永远不应在生产中使用它。

重新标记自身

此接口包含进程可以转换到的标签列表,方法是写入 /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

从 1980 年代中期到本世纪初,强制访问控制 (MAC) 与 Bell & LaPadula 安全模型密切相关,Bell & LaPadula 安全模型是对美国国防部标记纸质文档策略的数学描述。 这种形式的 MAC 在首都环线和斯堪的纳维亚的超级计算机中心享有追随者,但通常被认为未能满足一般需求。

域类型强制

在本世纪之交,域类型强制 (DTE) 开始流行。 该方案将用户、程序和数据组织到彼此隔离的域中。 该方案已作为流行的 Linux 发行版的组件得到广泛部署。 维护此方案所需的管理开销以及提供安全域映射所需的对整个系统的详细了解导致该方案在大多数情况下被禁用或以有限的方式使用。

Smack

Smack 是一种强制访问控制机制,旨在提供有用的 MAC,同时避免其前身的缺陷。 Bell & LaPadula 的限制通过提供一种方案来解决,该方案可以根据系统及其用途的要求来控制访问,而不是那些由神秘政府政策强加的方案。 域类型强制的复杂性通过根据已使用的访问模式定义访问控制来避免。

Smack 术语

那些处理过其他 MAC 系统的人会对用于讨论 Smack 的术语很熟悉,并且对于没有经验的人来说也不难掌握。 有四个术语以特定方式使用,并且尤其重要

主体

主体是计算机系统上的一个活动实体。 在 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 的传统访问模式。 这些模式是读取、执行、写入,偶尔还有追加。 在少数情况下,访问模式可能不明显。 这些包括

信号

信号是从主体任务到对象任务的写入操作。

Internet 域 IPC

数据包的传输被认为是源任务到目标任务的写入操作。

Smack 根据附加到主体的标签和附加到它尝试访问的对象的标签来限制访问。 强制执行的规则按顺序为

  1. 拒绝标签为“*”的任务请求的任何访问。

  2. 允许标签为“^”的任务请求的读取或执行访问。

  3. 允许在标签为“_”的对象上请求的读取或执行访问。

  4. 允许在标签为“*”的对象上请求的任何访问。

  5. 允许任务在具有相同标签的对象上请求的任何访问。

  6. 允许在加载的规则集中显式定义的任何请求的访问。

  7. 拒绝任何其他访问。

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 标签中使用,但没有特殊含义。

Smack 标签到 CIPSO 值的映射是通过写入 /sys/fs/smackfs/cipso2 来定义的。

除了显式映射之外,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 标签放入值中。特权进程可以使用 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 标签“*”设置为对象标签,以便对照该标签检查传入的数据包。

管理

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”对的形式记录,对于每个事件,您至少将获得 subject、object、请求的权限、操作、触发事件的内核函数,以及其他对,具体取决于审计的事件类型。

启动模式

启动模式提供了日志记录功能,可以使应用程序配置和系统启动更加容易。使用 CONFIG_SECURITY_SMACK_BRINGUP 配置内核以启用这些功能。启用启动模式后,由于标有“b”访问模式的规则而成功的访问将被记录。当为进程引入新标签时,可以积极添加标有“b”的规则。日志记录允许跟踪哪些规则实际用于该标签。

启动模式的另一个功能是“unconfined”选项。将标签写入 /sys/fs/smackfs/unconfined 会使具有该标签的主题能够访问任何对象,并使具有该标签的对象可供所有主题访问。由于标签不受限制而授予的任何访问权限都会被记录。此功能是危险的,因为可能会在如果正在强制执行策略的情况下无法创建文件和目录的地方创建文件和目录。