跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 安全和强化指南 / 通过 AppArmor 限制特权 / 从命令行构建配置文件
适用范围 SUSE Linux Enterprise Server 15 SP3

33 从命令行构建配置文件

AppArmor® 可让用户使用命令行界面而不是图形界面来管理和配置系统安全性。可以使用 AppArmor 命令行工具来跟踪 AppArmor 的状态,以及创建、删除或修改 AppArmor

提示
提示:背景信息

在开始使用 AppArmor 命令行工具管理配置文件之前,请查看第 29 章 “使程序免疫第 30 章 “配置文件组件和语法中提供的 AppArmor 一般简介。

33.1 检查 AppArmor 状态

AppArmor 可能会处于以下三种状态中的任何一种:

已卸载

AppArmor 未在内核中激活。

正在运行

AppArmor 已在内核中激活,并在强制执行 AppArmor 程序策略。

已停止

AppArmor 已在内核中激活,但未强制执行策略。

通过检查 /sys/kernel/security/apparmor/profiles 来检测 AppArmor 的状态。如果 cat/sys/kernel/security/apparmor/profiles 报告了一列配置文件,则 AppArmor 正在运行。如果该文件为空且未返回任何消息,则表示 AppArmor 已停止。如果该文件不存在,则表示 AppArmor 已卸载。

使用 systemctl 来管理 AppArmor。您可以使用此工具执行以下操作:

sudo systemctl start apparmor

行为取决于 AppArmor 的状态。如果 AppArmor 未激活,start 会将其激活并启动,同时将其置于运行状态。如果 AppArmor 已停止,start 会导致重新扫描 AppArmor 配置文件(通常位于 /etc/apparmor.d 中)并将其置于运行状态。如果 AppArmor 已在运行,start 会发出警告,而不执行任何操作。

注意
注意:已在运行的进程

要对已在运行的进程应用 AppArmor 配置文件,需要将其重启动。

sudo systemctl stop apparmor

通过去除内核内存中的所有配置文件来停止正在运行的 AppArmor,这会有效禁用所有访问控制,并将 AppArmor 置于停止状态。如果 AppArmor 已停止,stop 会尝试再次卸载配置文件,但不会有任何结果。

sudo systemctl reload apparmor

导致 AppArmor 模块重新扫描 /etc/apparmor.d 中的配置文件,但不取消限制正在运行的 进程。强制执行新创建的配置文件,并去除 /etc/apparmor.d 目录中最近删除的配置文件。

33.2 构建 AppArmor 配置文件

AppArmor 模块配置文件定义以纯文本文件的形式储存在 /etc/apparmor.d 目录中。有关这些文件的详细语法说明,请参见第 30 章 “配置文件组件和语法

/etc/apparmor.d 目录中的所有文件被解释为配置文件并装载为配置文件。要防止装载配置文件,对此目录中的文件进行重命名不是一种有效的方式。您必须去除此目录中的配置文件,以有效防止读取和评估这些配置文件;或者对配置文件调用 aa-disable,这会在 /etc/apparmor.d/disabled/ 中创建一个符号链接。

您可以使用 vi 等文本编辑器来访问和更改这些配置文件。以下各节包含构建配置文件的详细步骤:

添加或创建 AppArmor 配置文件

有关详细信息,请参见 第 33.3 节 “添加或创建 AppArmor 配置文件”

编辑 AppArmor 配置文件

有关详细信息,请参见 第 33.4 节 “编辑 AppArmor 配置文件”

删除 AppArmor 配置文件

有关详细信息,请参见 第 33.6 节 “删除 AppArmor 配置文件”

33.3 添加或创建 AppArmor 配置文件

要为应用程序添加或创建 AppArmor 配置文件,可以使用系统的或独立的配置文件构建方法,视您的需要而定。第 33.7 节 “构建配置文件的两种方式”中详细介绍了这两种方法。

33.4 编辑 AppArmor 配置文件

以下步骤说明编辑 AppArmor 配置文件的过程:

  1. 如果您当前不是以 root 身份登录的,请在终端窗口中输入 su

  2. 出现提示时输入 root 口令。

  3. 使用 cd /etc/apparmor.d/ 转到配置文件目录。

  4. 输入 ls 以查看所有当前安装的配置文件。

  5. 在 vim 等文本编辑器中打开配置文件以进行编辑。

  6. 完成必要的修改后保存配置文件。

  7. 在终端窗口中输入 systemctl reload apparmor 以重启动 AppArmor

33.5 卸载未知的 AppArmor 配置文件

警告
警告:卸载所需配置文件的风险

aa-remove-unknown 会卸载未储存在 /etc/apparmor.d 中的所有配置文件,例如,自动生成的 LXD 配置文件。这可能会损害系统的安全性。使用 -n 参数可列出所有将会卸载的配置文件。

要卸载不再位于 /etc/apparmor.d/ 中的所有 AppArmor 配置文件,请运行:

tux > sudo aa-remove-unknown

您可以列显要去除的配置文件列表:

tux > sudo aa-remove-unknown -n

33.6 删除 AppArmor 配置文件

以下步骤说明删除 AppArmor 配置文件的过程。

  1. 从内核中去除 AppArmor 定义:

    tux > sudo apparmor_parser -R /etc/apparmor.d/PROFILE
  2. 去除定义文件:

    tux > sudo rm /etc/apparmor.d/PROFILE
        tux > sudo rm /var/lib/apparmor/cache/PROFILE

33.7 构建配置文件的两种方式

掌握第 30 章 “配置文件组件和语法中介绍的 AppArmor 配置文件语法后,您无需借助工具也能创建配置文件,但需要的工作量比较大。要避免这种情况,请使用 AppArmor 工具来自动创建和优化配置文件。

可采用两种方法创建 AppArmor 配置文件。这两种方法都有可用的工具。

独立式配置文件构建

此方法适用于运行时间有限的小型应用程序,如邮件客户端等用户客户端应用程序。有关更多信息,请参考第 33.7.1 节 “独立式配置文件构建”

系统性配置文件构建

此方法适用于一次性为许多程序构建配置文件,还适用于为运行时间长达数日、数周或在重引导后连续运行的应用程序(如 Web 服务器、邮件服务器等网络服务器应用程序)构建配置文件。有关更多信息,请参考第 33.7.2 节 “系统性配置文件构建”

使用 AppArmor 工具可使自动开发配置文件的过程变得更易于管理。

  1. 确定符合您的要求的配置文件构建方式。

  2. 执行一次静态分析。根据所选的配置文件构建方法运行 aa-genprofaa-autodep

  3. 启用动态学习。为所有构建了配置文件的程序启动学习模式。

33.7.1 独立式配置文件构建

独立式配置文件的生成和改进由名为 aa-genprof 的程序来管理。此方法很简单,因为 aa-genprof 会负责处理所有事宜,但在程序测试运行的整个过程中都需要运行 aa-genprof(在开发配置文件过程中不能重引导计算机),因此适合的场景比较有限。

要使用 aa-genprof 以独立式方法构建配置文件,请参见第 33.7.3.8 节 “aa-genprof — 生成配置文件”

33.7.2 系统性配置文件构建

此方法之所以称为系统性配置文件构建,是因为它会一次性更新系统中所有的配置文件,而不像 aa-genprof 或独立式配置文件构建那样只针对一个或少数几个配置文件。采用系统性配置文件构建方法时,构建和改进配置文件的自动化程度会有所下降,但更灵活。此方法适用于为长时间运行且其行为会在重引导后持续的应用程序构建配置文件,或者一次性为许多程序构建配置文件。

按如下方式为一组应用程序构建 AppArmor 配置文件:

  1. 为构成应用程序的各个程序创建配置文件。

    尽管此方法是系统性的,但 AppArmor 只监视具有配置文件及其子配置文件的程序。要让 AppArmor 将某个程序考虑在内,您至少应通过 aa-autodep 为此程序创建一个大概的配置文件。要创建此大概的配置文件,请参见第 33.7.3.1 节 “aa-autodep — 创建大概的配置文件”

  2. 使相关的配置文件进入学习或提示模式。

    在终端窗口中输入以下命令

    tux > sudo aa-complain /etc/apparmor.d/*

    (以 root 身份登录后),为所有构建了配置文件的程序激活学习或控诉模式。也可以通过第 32.4.2 节 “更改单个配置文件的模式”中所述的“YaST 配置文件模式”模块使用此功能。

    处于学习模式时,访问请求不会被阻止,即使配置文件指示应阻止时也是如此。这样您就可以完整运行若干测试(如步骤 3所示)并了解程序正常运行时的访问需要。通过此信息,您可以确定配置文件的防护程度。

    有关使用学习模式和提示模式的具体说明,请参见第 33.7.3.2 节 “aa-complain — 进入控诉或学习模式”

  3. 演习应用程序。

    运行应用程序并行使其功能。演习程序的多少功能由您决定,但您必须让程序访问代表其访问要求的每个文件。由于执行不受 aa-genprof 的监督,因此此步骤可以持续数天或数周时间,而且在所有系统重引导后仍会持续。

  4. 分析日志。

    进行系统性配置文件构建时,请直接运行 aa-logprof,而不要让 aa-genprof 来运行它(进行独立式配置文件构建时会如此操作)。aa-logprof 的一般格式如下:

    tux > sudo aa-logprof [ -d /path/to/profiles ] [ -f /path/to/logfile ]

    有关使用 aa-logprof 的详细信息,请参见第 33.7.3.9 节 “aa-logprof — 扫描系统日志”

  5. 重复步骤 3步骤 4

    这样会生成最佳的配置文件。此重复操作方式会捕捉可经过训练并重新载入策略引擎的较小数据集。后续重复操作将生成较少的消息,而且运行速度较快。

  6. 编辑配置文件。

    您应该查看已生成的配置文件。可以使用文本编辑器打开和编辑 /etc/apparmor.d/ 中的配置文件。

  7. 返回到强制模式。

    此时系统会重新强制执行配置文件的规则,而不仅仅是记录信息。此操作可以通过从配置文件中去除 flags=(complain) 文本手动完成,也可以使用 aa-enforce 命令自动完成,该命令的工作方式与 aa-complain 命令完全相同,只不过会将配置文件设置为强制模式。也可以通过第 32.4.2 节 “更改单个配置文件的模式”中所述的“YaST 配置文件模式”模块使用此功能。

    要确保所有配置文件都已解除控诉模式并已置于强制模式,请输入 aa-enforce /etc/apparmor.d/*

  8. 重新扫描所有配置文件。

    要让 AppArmor 重新扫描所有配置文件并在内核中更改该强制模式,请输入 systemctl reload apparmor

33.7.3 构建配置文件的工具汇总

apparmor-utils RPM 软件包提供了用于构建 AppArmor 配置文件的所有实用程序(储存在 /usr/sbin 中)。每个工具都有不同的用途。

33.7.3.1 aa-autodep — 创建大概的配置文件

此工具可为所选的程序或应用程序创建大概的配置文件。您可以为二进制可执行文件和已解释的脚本程序生成大概的配置文件。生成的配置文件之所以称为大概的配置文件,是因为它不一定包含 AppArmor 正确限制程序所需的所有配置文件项。最小的 aa-autodep 大概配置文件至少具备基础的 include 指令,它包含大多数程序都需要的基本配置文件项。对于某些类型的程序,aa-autodep 会生成内容更丰富的配置文件。配置文件的生成方式是在命令行上列出的可执行文件上以递归方式调用 ldd(1)

要生成大概的配置文件,请使用 aa-autodep 程序。程序参数可以是程序的简单名称(aa-autodep 通过搜索外壳的路径变量找到此名称),也可以是完全限定的路径。程序本身可以是任意类型(ELF 二进制文件、外壳脚本、Perl 脚本,等等)。aa-autodep 会生成一个大概的配置文件,后续的动态配置文件构建过程会对其进行改进。

生成的大概配置文件将写入到 /etc/apparmor.d 目录,并使用 AppArmor 配置文件命名约定,即在程序绝对路径后面命名配置文件,同时将路径中的正斜线 (/) 字符替换为句点 (.) 字符。aa-autodep 的一般语法是在终端窗口中输入以下命令:

tux > sudo aa-autodep [ -d /PATH/TO/PROFILES ] [PROGRAM1 PROGRAM2...]

如果不输入程序名称,则计算机会提示您输入它(它们)。如果您将配置文件保存在非默认位置,/path/to/profiles 会覆盖 /etc/apparmor.d 的默认位置。

开始构建配置文件前,您必须为作为应用程序一部分的各个主可执行服务创建配置文件(它们启动后不会从属于其它已具备配置文件的程序)。此类程序的查找取决于相关的应用程序。以下是查找此类程序的一些策略:

目录

如果需要构建配置文件的所有程序都位于同一个目录内,而且此目录中没有其他程序,只需使用 aa-autodep /path/to/your/programs/* 命令就可以为此目录中的所有程序创建基本配置文件。

pstree -p

您可以运行应用程序并使用标准的 Linux pstree 命令找到所有运行中的进程。然后手动搜寻这些程序的位置,并针对每个程序运行 aa-autodep。如果程序在您的路径中,则 aa-autodep 会为您找到它们。如果程序不在您的路径中,则标准的 Linux 命令 find 可能有助于您查找程序。执行 find / -name ' MY_APPLICATION' -print 以确定应用程序的路径(MY_APPLICATION 为示例应用程序)。如果情况适合,您可以使用通配符。

33.7.3.2 aa-complain — 进入控诉或学习模式

控诉和学习模式工具 (aa-complain) 会检测对 AppArmor 配置文件规则的违规,例如构建了配置文件的程序访问配置文件不允许的其他文件。冲突是允许的,但也会被记录。要改进配置文件,请开启控诉模式,对程序运行一套测试以生成反映程序访问需求的日志事件,然后使用 AppArmor 工具对日志进行后处理,以将日志事件转换为改进的配置文件。

手动激活控诉模式(使用命令行)会在配置文件的顶部添加一个标志,因此 /bin/foo 将变成 /bin/foo flags=(complain)。要使用控诉模式,请打开一个终端窗口,然后以 root 身份输入以下命令:

  • 如果示例程序 (PROGRAM1) 在您的路径中,请使用:

    tux > sudo aa-complain [PROGRAM1 PROGRAM2 ...]
  • 如果程序不在您的路径中,请指定整个路径,如下所示:

    tux > sudo aa-complain /sbin/PROGRAM1
  • 如果配置文件不在 /etc/apparmor.d 中,请输入以下命令以取代默认位置:

    tux > sudo aa-complain /path/to/profiles/PROGRAM1
  • 按如下所示指定 /sbin/program1 的配置文件:

    tux > sudo aa-complain /etc/apparmor.d/sbin.PROGRAM1

上述每条命令都会激活所列配置文件或程序的控诉模式。如果程序名不包含其整个路径,则 aa-complain 命令会搜索该程序的 $PATH。例如,aa-complain /usr/sbin/* 会查找与 /usr/sbin 中的所有程序关联的配置文件,并将其置于控诉模式。aa-complain /etc/apparmor.d/* 会将 /etc/apparmor.d 中的所有配置文件都置于控诉模式。

提示
提示:使用 YaST 切换配置文件模式

YaST 提供了一个用于切换控诉模式和强制模式的图形前端。有关信息,请参见 第 32.4.2 节 “更改单个配置文件的模式”

33.7.3.3 aa-decode — 解码 AppArmor 日志文件中的十六进制编码字符串

aa-decode 将解码 AppArmor 日志输出中的十六进制编码字符串。它还可以处理有关标准输入的审计日志,转换任何十六进制编码的 AppArmor 日志项,并在标准输出中显示这些项。

33.7.3.4 aa-disable — 禁用 AppArmor 安全配置文件

使用 aa-disable 可以禁用一个或多个 AppArmor 配置文件的强制模式。此命令将从内核中卸载配置文件,并防止在 AppArmor 启动时装载该配置文件。使用 aa-enforceaa-complain 实用程序可更改此行为。

33.7.3.5 aa-easyprof — 轻松生成配置文件

aa-easyprof 提供了便于使用的界面来生成 AppArmor 配置文件。aa-easyprof 支持使用模板和配置文件组来快速构建应用程序的配置文件。尽管 aa-easyprof 有助于生成配置文件,但其实用程序依赖于所用模板、配置文件组和抽象的质量。此外,此工具在创建配置文件方面的限制比手动或使用 aa-genprofaa-logprof 创建配置文件要少一些。

有关详细信息,请参见 aa-easyprof (8) 的手册页。

33.7.3.6 aa-enforce — 进入强制模式

强制模式会检测对 AppArmor 配置文件规则的违规,例如构建了配置文件的程序访问配置文件不允许的文件。违规会被记录下来,并且不会允许此类事件。默认会启用强制模式。如要仅记录违规但仍允许此类事件,请使用控诉模式。

手动激活强制模式(使用命令行)会去除配置文件顶部的 complain 标志,使 /bin/foo flags=(complain) 变成 /bin/foo。要使用强制模式,请打开一个终端窗口,然后输入以下命令。

  • 如果示例程序 (PROGRAM1) 在您的路径中,请使用:

    tux > sudo aa-enforce [PROGRAM1 PROGRAM2 ...]
  • 如果程序不在您的路径中,请指定整个路径,如下所示:

    tux > sudo aa-enforce /sbin/PROGRAM1
  • 如果配置文件不在 /etc/apparmor.d 中,请输入以下命令以取代默认位置:

    tux > sudo aa-enforce -d /path/to/profiles/     program1
  • 按如下所示指定 /sbin/program1 的配置文件:

    tux > sudo aa-enforce /etc/apparmor.d/sbin.PROGRAM1

上述命令会激活所列配置文件和程序的强制模式。

如果不输入程序或配置文件的名称,则计算机会提示您输入名称。/path/to/profiles 会取代默认位置 /etc/apparmor.d

参数可以是一个程序列表或一个配置文件列表。如果程序名不包含其整个路径,则 aa-enforce 命令会搜索程序的 $PATH

提示
提示:使用 YaST 切换配置文件模式

YaST 提供了一个用于切换控诉模式和强制模式的图形前端。有关信息,请参见 第 32.4.2 节 “更改单个配置文件的模式”

33.7.3.7 aa-exec — 使用指定的配置文件限制程序

使用 aa-exec 可以启动指定的配置文件和/或配置文件名称空间所限制的程序。如果同时指定了配置文件和名称空间,程序将由新名称空间中的配置文件限制。如果仅指定了配置文件名称空间,将使用当前限制的配置文件名称。如果配置文件和名称空间均未指定,将使用标准的配置文件附件运行命令 — 如同未使用 aa-exec 命令一样。

有关该命令的选项的详细信息,请参见该命令的手册页 man 8 aa-exec

33.7.3.8 aa-genprof — 生成配置文件

aa-genprof 是用于生成 AppArmor 配置文件的实用程序。它可以对指定的程序运行 aa-autodep 以创建大概配置文件(如果此程序尚不存在配置文件)、将其设置为控诉模式、将其重新装载到 AppArmor、标记日志、提示用户执行程序以及运用其功能。其语法如下所示:

tux > sudo aa-genprof [ -d /path/to/profiles ]  PROGRAM

要为 Apache Web 服务器程序 httpd2-prefork 创建配置文件,请以 root 身份执行以下操作:

  1. 输入 systemctl stop apache2

  2. 接下来,输入 aa-genprof httpd2-prefork

    现在,aa-genprof 会执行以下操作:

    1. 使用外壳的路径变量解析 httpd2-prefork 的完整路径。您也可以指定完整路径。在 SUSE Linux Enterprise Server 上,默认的完整路径为 /usr/sbin/httpd2-prefork

    2. 检查 httpd2-prefork 是否已存在配置文件。如果已有,则会被更新。如果不存在,则会使用第 33.7.3 节 “构建配置文件的工具汇总”中所述的 aa-autodep 创建一个配置文件。

    3. 将此程序的配置文件置于学习或控诉模式,这样会记录配置文件违规,但允许此类违规以便继续操作。日志事件如下所示(请参见 /var/log/audit/audit.log):

      type=APPARMOR_ALLOWED msg=audit(1189682639.184:20816): \
      apparmor="DENIED" operation="file_mmap" parent=2692 \
      profile="/usr/sbin/httpd2-prefork//HANDLING_UNTRUSTED_INPUT" \
      name="/var/log/apache2/access_log-20140116" pid=28730 comm="httpd2-prefork" \
      requested_mask="::r" denied_mask="::r" fsuid=30 ouid=0

      如果您未运行审计守护程序,AppArmor 事件将直接记录到 systemd 日记(请参见第 17 章 “journalctl:查询 systemd 日志):

      Sep 13 13:20:30 K23 kernel: audit(1189682430.672:20810): \
      apparmor="DENIED" operation="file_mmap" parent=2692 \
      profile="/usr/sbin/httpd2-prefork//HANDLING_UNTRUSTED_INPUT" \
      name="/var/log/apache2/access_log-20140116" pid=28730 comm="httpd2-prefork" \
      requested_mask="::r" denied_mask="::r" fsuid=30 ouid=0

      您也可以使用 dmesg 命令来查看这些事件:

      audit(1189682430.672:20810): apparmor="DENIED" \
      operation="file_mmap" parent=2692 \
      profile="/usr/sbin/httpd2-prefork//HANDLING_UNTRUSTED_INPUT" \
      name="/var/log/apache2/access_log-20140116" pid=28730 comm="httpd2-prefork" \
      requested_mask="::r" denied_mask="::r" fsuid=30 ouid=0
    4. 使用日志事件的起始标记来标记要考虑的日志。例如:

      Sep 13 17:48:52 figwit root: GenProf: e2ff78636296f16d0b5301209a04430d
  3. 看到工具的提示时,在另一个终端窗口中运行应用程序,并执行尽可能多的应用程序功能。如此,学习模式便可以记录程序在正常运行时需要访问的文件和目录。例如,在新终端窗口中输入 systemctl start apache2

  4. 执行程序功能后,在 aa-genprof 终端窗口中选择以下可用选项:

    • S 会在 aa-genprof 启动并重新装载配置文件后从标记位置开始对系统日志运行 aa-genprof。如果日志中存在系统事件,AppArmor 会分析学习模式日志文件。这会生成一系列问题,您必须回答这些问题以引导 aa-genprof 生成安全配置文件。

    • F 会退出工具。

    注意
    注意

    如果出现添加帽子的请求,请进入第 34 章 “使用 ChangeHat 构建 Web 应用程序的配置文件

  5. 回答两类问题:

    这两种类别都会生成一系列问题,您必须回答这些问题,以将资源或程序添加到配置文件。例 33.1 “学习模式例外:控制对特定资源的访问”例 33.2 “学习模式例外:定义项的权限”提供了每种类别的示例。后续步骤将说明回答这些问题时的选项。

    • 处理执行权限非常复杂。您必须决定如何继续处理此项,指定向此项授予哪种执行权限类型:

      例 33.1︰ 学习模式例外:控制对特定资源的访问
      Reading log entries from /var/log/audit/audit.log.
      Updating AppArmor profiles in /etc/apparmor.d.
      
      Profile:  /usr/sbin/cupsd
      Program:  cupsd
      Execute:  /usr/lib/cups/daemon/cups-lpd
      Severity: unknown
      
      (I)nherit / (P)rofile / (C)hild / (N)ame / (U)nconfined / (X)ix / (D)eny / Abo(r)t / (F)inish
      继承 (ix)

      子程序继承父程序的配置文件,以与父程序相同的访问控制运行。当被限制的程序需要调用其它被限制的程序时此模式非常实用,无须获得目标程序配置文件的权限或失去当前配置文件的权限。当子程序是助手应用程序(例如,使用 less 作为分页器的 /usr/bin/mail 客户端)时,通常使用此模式。

      配置文件 (px/px)

      子程序以自己的配置文件运行,此配置文件必须载入内核。如果不存在配置文件,则尝试执行子程序时会因访问被拒而失败。这最适合父程序在调用全局服务的情形,如进行 DNS 查找或通过系统的 MTA 发送邮件时。

      选择含清洁执行的配置文件 (Px) 选项可以整理在传递给子进程时可能会修改执行行为的环境变量的环境。

      子项 (cx/cx)

      设置目标为子配置文件的转换。它与 px/Px 转换类似,只不过是转换为子配置文件。

      选择含清洁执行的配置文件 (Cx) 选项可以整理在传递给子进程时可能会修改执行行为的环境变量的环境。

      未受限 (ux/ux)

      对执行的资源不应用任何 AppArmor 配置文件,子项在完全没有限制的情况下运行。

      选择含清洁执行的未受限 (Ux) 选项可以整理在传递给子进程时可能会修改执行行为的环境变量的环境。请注意,运行无限制的配置文件会造成安全漏洞,攻击者可能会利用此漏洞来避开 AppArmor。请仅在万不得已的情况下才这样做。

      mmap (m)

      此权限与 PROT_EXEC 标志结合表示基于配置文件运行的程序可以使用 mmap 系统调用来访问资源。这意味着可以执行其中映射的数据。如果在配置文件构建过程运行期间要求此权限,系统会提示您包含此权限。

      拒绝

      在配置文件中添加一条拒绝规则,以永久阻止程序访问指定的目录路径项。AppArmor 随后会继续处理下一个事件。

      中止

      中止 aa-logprof,到目前为止输入的所有规则更改将会丢失,所有配置文件都将保持不变。

      完成

      关闭 aa-logprof,同时保存到目前为止输入的所有规则更改并修改所有配置文件。

    • 例 33.2 “学习模式例外:定义项的权限”演示了 AppArmor 建议允许使用通配模式 /var/run/nscd/* 进行读取,然后使用一个抽象来涵盖常用的 Apache 相关访问规则。

      例 33.2︰ 学习模式例外:定义项的权限
      Profile:  /usr/sbin/httpd2-prefork
      Path:     /var/run/nscd/dbSz9CTr
      Mode:     r
      Severity: 3
      
        1 - /var/run/nscd/dbSz9CTr
       [2 - /var/run/nscd/*]
      
      (A)llow / [(D)eny] / (G)lob / Glob w/(E)xt / (N)ew / Abo(r)t / (F)inish / (O)pts
      Adding /var/run/nscd/* r to profile.
      
      Profile:  /usr/sbin/httpd2-prefork
      Path:     /proc/11769/attr/current
      Mode:     w
      Severity: 9
      
       [1 - #include <abstractions/apache2-common>]
        2 - /proc/11769/attr/current
        3 - /proc/*/attr/current
      
      (A)llow / [(D)eny] / (G)lob / Glob w/(E)xt / (N)ew / Abo(r)t / (F)inish / (O)pts
      Adding #include <abstractions/apache2-common> to profile.

      AppArmor 提供了一个或多个路径或 include。通过输入选项编号选择所需的选项,然后继续执行下一步。

      注意
      注意

      AppArmor 菜单中并不会始终显示所有这些选项。

      #include

      AppArmor 配置文件的此部分代表一个 include 文件,它会获取程序的访问权限。通过使用 include,您可以向程序赋予访问其它程序也需要的目录路径和文件的权限。使用 include 可减小配置文件的大小。选择建议的 include 是不错的做法。

      通配形式

      按下一步所述选择通配即可访问该部分。有关通配语法的更多信息,请参见第 30.6 节 “配置文件名称、标志、路径和通配”

      实际路径

      这是程序要正常运行需要访问的实际路径。

      选择路径或 include 后,通过选择允许拒绝来处理它,将它以项的形式加入到 AppArmor 配置文件中。如果您对显示的目录路径项不满意,也可以使用通配对其进行处理。

      以下选项用于处理学习模式项和构建配置文件:

      选择 Enter

      允许访问选定的目录路径。

      允许

      允许访问指定的目录路径项。AppArmor 会给出文件访问权限建议。有关更多信息,请参考第 30.7 节 “文件权限访问模式”

      拒绝

      阻止程序访问指定目录路径项的权限。AppArmor 随后会继续处理下一个事件。

      新建

      提示您输入针对此事件的自己的规则,允许指定正则表达式。如果该表达式实际上不满足最初提示问题的事件,AppArmor 会要求您确认并允许您重新输入表达式。

      通配

      选择特定的路径,或使用通配符创建与更多路径集匹配的一般规则。要选择提供的任何路径,请输入该路径前面列显的编号,然后决定如何继续处理所选项。

      有关通配语法的详细信息,请参见第 30.6 节 “配置文件名称、标志、路径和通配”

      保留扩展名的通配

      此选项会修改原始目录路径,不过会保留文件扩展名。例如,/etc/apache2/file.ext 将变成 /etc/apache2/*.ext,文件名被通配符(星号)替换。这样程序就可以访问建议目录下以 .ext 为扩展名的所有文件。

      中止

      中止 aa-logprof,到目前为止输入的所有规则更改将会丢失,所有配置文件都将保持不变。

      完成

      关闭 aa-logprof,同时保存到目前为止输入的所有规则更改并修改所有配置文件。

  6. 要使用 vi 查看并编辑配置文件,请在终端窗口中输入 vi /etc/apparmor.d/ PROFILENAME。在 vim 中编辑 AppArmor 配置文件时,如要启用语法高亮显示,请使用 :syntax on 命令,然后使用 :set syntax=apparmor 命令。有关 vim 和语法高亮显示的详细信息,请参见第 33.7.3.14 节 “apparmor.vim”

  7. 重启动 AppArmor,然后使用 systemctl reload apparmor 命令重新装载配置文件集,包括新建的配置文件。

与用于构建 AppArmor 配置文件的图形前端一样,YaST 添加配置文件向导 aa-genprof 也支持使用 /usr/share/apparmor/extra-profiles 下的本地配置文件储存库。

要使用本地储存库中的配置文件,请按如下所示继续操作:

  1. 按上文所述启动 aa-genprof

    如果 aa-genprof 找到了非活动的本地配置文件,则终端窗口中会显示以下几行:

    Profile: /usr/bin/opera
    
     [1 - Inactive local profile for /usr/bin/opera]
    
    [(V)iew Profile] / (U)se Profile / (C)reate New Profile / Abo(r)t / (F)inish
  2. 要使用此配置文件,请按 U使用配置文件)并执行上文所述的配置文件生成过程。

    要在激活配置文件之前对其进行检查,请按 V查看配置文件)。

    要忽略现有的配置文件,请按 C创建新配置文件),并执行上文所述的配置文件生成过程从头开始创建配置文件。

  3. 完成后,按 F完成)退出 aa-genprof 并保存更改。

33.7.3.9 aa-logprof — 扫描系统日志

aa-logprof 是一个交互式工具,用于查看 /var/log/audit/audit.log 内的日志项中的控诉和强制模式事件,或直接查看 systemd 日记中的此类事件(请参见第 17 章 “journalctl:查询 systemd 日志),以及在 AppArmor 安全配置文件中生成新的项。

运行 aa-logprof 后,它会开始扫描在控诉和强制模式下生成的日志文件,如果存在现有配置文件集未涵盖的新安全事件,它会给出修改配置文件的建议。aa-logprof 使用此信息来观察程序行为。

如果某个受限制的程序派生并执行另一个程序,aa-logprof 会注意到这种情况,并会询问用户在启动子进程时应使用哪种执行模式。执行模式 ixpxPxuxUxcxCx 以及命名的配置文件均为用于启动子进程的选项。如果子进程具有单独的配置文件,则默认选择为 Px。如果不存在单独的配置文件,则默认为 ix。系统会对有单独配置文件的子进程运行 aa-autodep 并将其装载到 AppArmor 中(如果它正在运行)。

aa-logprof 退出时,将保存所做的更改以更新配置文件。如果 AppArmor 处于活动状态,将重新装载更新的配置文件;如有任何生成安全事件的进程仍在 null-XXXX 配置文件(在控诉模式下临时创建的独有配置文件)中运行,这些进程将设置为基于其适当配置文件运行。

要运行 aa-logprof,请以 root 身份登录并在终端窗口中输入 aa-logprof。以下选项可用于 aa-logprof

aa-logprof -d/path/to/profile/directory/

如果配置文件不位于标准目录 /etc/apparmor.d/ 下,指定配置文件所处位置的完整路径。

aa-logprof -f/path/to/logfile/

如果日志文件不在默认目录或 /var/log/audit/audit.log 中,请指定日志文件所在位置的完整路径。

aa-logprof -m "string marker in logfile"

标记 aa-logprof 要在系统日志中查看的起点。aa-logprof 会忽略系统日志中位于指定标记前面的所有事件。如果标记包含空格,必须将标记括在引号中才能正常工作。例如:

root # aa-logprof -m "17:04:21"

root # aa-logprof -m e2ff78636296f16d0b5301209a04430d

aa-logprof 将扫描日志,询问您如何处理记录的每个事件。每个问题都会显示一个带有编号的 AppArmor 规则列表,按列表中项目的编号可以添加相应规则。

默认情况下,aa-logprof 会在 /etc/apparmor.d/ 中查找配置文件。以 root 身份运行 aa-logprof 往往便足以更新配置文件。不过,您有时可能需要搜索存档的日志文件,例如当程序的执行时间段超过日志轮换期时(日志文件已存档,新的日志文件已开始时)。在这种情况下,您可以输入 zcat -f `ls -1tr /path/to/logfile*` | aa-logprof -f -。

33.7.3.10 aa-logprof 示例 1

下面的示例说明 aa-logprof 如何处理访问 /etc/group 文件的 httpd2-prefork。[] 表示默认选项。

在本示例中,对 /etc/group 的访问是 httpd2-prefork 访问名称服务的一部分。相应的响应是 1,它包括预定义的 AppArmor 规则集。选择 1 #include,名称服务软件包会解析与 DNS 查找相关的所有问题,同时使配置文件更不容易损坏,这样对 DNS 配置和关联名称服务配置文件软件包的更改可一次完成,而无需修改许多配置文件。

Profile:  /usr/sbin/httpd2-prefork
Path:     /etc/group
New Mode: r

[1 - #include <abstractions/nameservice>]
 2 - /etc/group
[(A)llow] / (D)eny / (N)ew / (G)lob / Glob w/(E)xt / Abo(r)t / (F)inish

请选择以下响应之一:

选择 Enter

触发默认操作,在本示例中为允许访问指定的目录路径项。

允许

允许访问指定的目录路径项。AppArmor 会给出文件访问权限建议。有关更多信息,请参见第 30.7 节 “文件权限访问模式”

拒绝

永久阻止程序访问指定的目录路径项。AppArmor 随后会继续处理下一个事件。

新建

提示您输入您自己对此事件的规则,允许您指定任意形式的常规表达式。如果输入的表达式实际上不满足最初提示问题的事件,AppArmor 会要求您确认并允许您重新输入表达式。

通配

选择特定的路径,或使用通配符创建与更多路径集匹配的一般规则。要选择提供的任何路径,请输入路径前面列显的编号,然后决定如何继续处理所选项。

有关通配语法的详细信息,请参见第 30.6 节 “配置文件名称、标志、路径和通配”

保留扩展名的通配

此选项会修改原始目录路径,不过会保留文件扩展名。例如,/etc/apache2/file.ext 将变成 /etc/apache2/*.ext,文件名被通配符(星号)替换。这样程序就可以访问建议目录下以 .ext 为扩展名的所有文件。

中止

中止 aa-logprof,到目前为止输入的所有规则更改将会丢失,所有配置文件都将保持不变。

完成

关闭 aa-logprof,同时保存到目前为止输入的所有规则更改并修改所有配置文件。

33.7.3.11 aa-logprof 示例 2

例如,在为 vsftpd 构建配置文件时,会看到以下问题:

Profile:  /usr/sbin/vsftpd
Path:     /y2k.jpg

New Mode: r

[1 - /y2k.jpg]

(A)llow / [(D)eny] / (N)ew / (G)lob / Glob w/(E)xt / Abo(r)t / (F)inish

此问题中出现了几个要注意的项目。首先,我们注意到 vsftpd 正在询问树顶的路径项,即便默认情况下 SUSE Linux Enterprise Server 上的 vsftpd 是从 /srv/ftp 提供 FTP 文件。这是因为 vsftpd 使用的是 chroot,对于 chroot jail 内部的代码部分,AppArmor 看到的是对 chroot 环境(而非全局绝对路径)的文件访问。

第二个要注意的事项是,您应该授予对该目录中所有 JPEG 文件的 FTP 读取权限,以便可以使用保留扩展名的通配并使用建议的路径 /*.jpg。这样做会破坏前面授予对单个 .jpg 文件的访问权限的所有规则,并会阻止此后有关访问 .jpg 文件的所有问题。

最后,您应该授予对 FTP 文件的更广泛的访问权限。如果在最后一项中选择通配aa-logprof 会将建议的路径 /y2k.jpg 替换为 /*。此外,您应该授予对整个目录树的更多访问权限,在这种情况下,可以使用新建路径选项并输入 /**.jpg(这会授予对整个目录树中所有 .jpg 文件的访问权限)或 /**(这会授予对目录树中所有文件的访问权限)。

这些项会处理读取访问权限。写权限与此类似,不同的是您在使用写权限的常规表达式时最好更加保守。处理执行权限较为复杂。例 33.1 “学习模式例外:控制对特定资源的访问”中提供了相应示例。

下面的示例将构建 /usr/bin/mail 邮件客户端的配置文件,aa-logprof 已发现 /usr/bin/mail/usr/bin/less 作为助手应用程序执行,用于将长邮件分页。结果会显示以下提示:

/usr/bin/nail -> /usr/bin/less
(I)nherit / (P)rofile / (C)hild / (N)ame / (U)nconfined / (X)ix / (D)eny
注意
注意

/usr/bin/mail 的实际可执行文件为 /usr/bin/nail,这不是印刷错误。

/usr/bin/less 程序可以简单地在长度大于一个屏幕的文本之间滚动,这其实就是 /usr/bin/mail 使用它的原因。 但 less 实际上是一个功能强大的大型程序,使用了许多其他助手应用程序,如 tarrpm

提示
提示

对 tar 文件或 RPM 文件运行 less,它即会显示这些容器的库存。

您不希望阅读邮件时自动运行 rpm(这会直接导致 Microsoft* Outlook 样式的病毒攻击,因为 RPM 具有安装和修改系统程序的能力),因此这种情况下的最佳选择为使用继承。这会使在本文中执行的 less 程序运行于 /usr/bin/mail 的配置文件之下。这会产生两种结果:

  • 您需要将 /usr/bin/less 的所有基本文件权限添加到 /usr/bin/mail 的配置文件中。

  • 您可以避免将 tarrpm 等助手应用程序添加到 /usr/bin/ 配置文件,这样,当 /usr/bin/mail 在此环境中运行 /usr/bin/mail/less 时,less 程序要比不受 AppArmor 保护时安全得多。另一个选择是使用 Cx 执行模式。有关执行模式的详细信息,请参见第 30.12 节 “执行模式”

在其它情况下,您可能想要使用配置文件选项。这会对 aa-logprof 产生以下影响:

  • 写入配置文件的规则使用 px/Px,这会强制转换到子项自己的配置文件。

  • aa-logprof 会为子项构造一个配置文件,然后通过将子进程的事件指派到子项的配置文件并向 aa-logprof 用户提出问题,开始以构建父配置文件的相同方式构建此配置文件。如果您将子项作为独立程序运行,也会应用该配置文件。

如果某个受限制的程序派生并执行另一个程序,aa-logprof 会注意到这种情况,并会询问用户在启动子进程时应使用哪种执行模式。执行模式“继承”、“配置文件”、“未受限”、“子项”、“命名配置文件”,或用于拒绝执行的选项将会显示。

如果子进程具有单独的配置文件,则默认选择为“配置文件”。如果不存在配置文件,则默认选择为“继承”。第 30.7 节 “文件权限访问模式”中介绍了继承选项 (ix)。

该配置文件选项指示子程序应在其自己的配置文件中运行。一个从属问题会询问是否要清理子程序从父项继承的环境。如果您选择清理环境,AppArmor 配置文件中将会添加执行修饰符 Px。如果您选择不清理,配置文件中将会添加 px,这样就不会进行环境清理。如果您选择配置文件执行模式,默认的执行模式为 Px

不建议使用未受限执行模式,仅当没有任何其他选项能够可靠地生成程序的配置文件时,才应使用该模式。选择未受限模式会打开一个警告对话框,要求您确认该选择。如果您确认并选择,另一个对话框将会打开,询问是否要清理环境。要在配置文件中使用执行模式 Ux,请选择。要在配置文件中改用执行模式 ux,请选择。默认选择的值为 Ux(表示未受限执行模式)。

重要
重要:未受限运行

选择 ux 或 Ux 会造成很大的风险,它不会对子程序的最终执行行为强制执行策略(从安全角度而言)。

33.7.3.12 aa-unconfined — 识别不受保护的进程

aa-unconfined 命令会检查系统上的开放网络端口,将其与系统上装载的配置文件集进行比较,并报告不具备 AppArmor 配置文件的网络服务。它需要未被 AppArmor 配置文件限制的 root 特权。

要从 /proc 文件系统中检索进程可执行链接,就必须以 root 身份运行 aa-unconfined。此程序易受以下竞态条件的影响:

  • 未链接的可执行文件被误处理

  • 进程在 netstat(8) 之间终止,而且进一步的检查被误处理

注意
注意

此程序仅列出使用 TCP 和 UDP 的进程。简而言之,此程序不适用于取证,仅在实验室中辅助构建所有可访问网络的进程的配置文件。

33.7.3.13 aa-notify

aa-notify 是一个便利的实用程序,它可在桌面环境中显示 AppArmor 通知。如果您不想检查 AppArmor 日志文件,而仅希望桌面告知您违反策略的事件,此实用程序会非常便捷。要启用 AppArmor 桌面通知,请运行 aa-notify

tux > sudo aa-notify -p -u USERNAME --display DISPLAY_NUMBER

其中,USERNAME 是您登录时使用的用户名,DISPLAY_NUMBER 是您当前使用的 X Window 显示编号,例如 :0。该进程在后台运行,每当发生拒绝事件时,就会显示通知。

提示
提示

活动的 X Window 显示编号保存在 $DISPLAY 变量中,因此,您可以使用 --display $DISPLAY 来避免查找当前显示编号。

aa-notify GNOME 中的消息
图 33.1︰ aa-notify GNOME 中的消息

您还可以使用 -s DAYS 选项配置 aa-notify,以显示指定的过去几天的通知摘要。有关 aa-notify 的详细信息,请参见其手册页 man 8 aa-notify

33.7.3.14 apparmor.vim

vim 文本编辑器的语法高亮显示文件会用颜色高亮显示 AppArmor 配置文件的各种功能。利用 vim 和 vim 的 AppArmor 语法模式,您可以看到用颜色高亮显示的配置文件的语义含意。要使用 vim 来查看和编辑配置文件,请在终端窗口中输入 vim。

在 vim 中编辑 AppArmor 配置文件时,如要启用语法颜色标记,请使用 :syntax on 命令,然后使用 :set syntax=apparmor 命令。为确保 vim 将编辑的文件类型正确识别为 AppArmor 配置文件,请将

# vim:ft=apparmor

添加到配置文件的末尾。

提示
提示

vim/etc/apparmor.d/ 中的文件自动启用了 AppArmor 高亮显示。

启用此功能时,vim 会对配置文件的行上色:

蓝色

评论

白色

普通读权限的行

棕色

功能语句和“提示”标记

黄色

授予写权限的行

环保

授予执行权限的行(ix 或 px)

红色

授予无限制权限的行 (ux)

红色背景

不会正确装载到 AppArmor 模块的语法错误

要获取有关语法突出显示的更多 vim 帮助,请使用 apparmor.vimvim 手册页以及 vim 编辑器内部的 :help 语法。AppArmor 语法储存在 /usr/share/vim/current/syntax/apparmor.vim 中。

33.8 重要的文件名和目录

下面的列表包含 AppArmor 框架使用的最重要的文件和目录。如果您打算手动管理配置文件以及对其查错,请确保您了解这些文件和目录:

/sys/kernel/security/apparmor/profiles

表示当前装载的配置文件集的虚拟化文件。

/etc/apparmor/

AppArmor 配置文件的位置。

/usr/share/apparmor/extra-profiles

AppArmor 随附但默认未启用的本地配置文件储存库。

/etc/apparmor.d/

配置文件的位置,采用将路径中的 / 替换为 .(不替换根目录 /)的约定命名,这样可以更方便地管理配置文件。例如,程序 /usr/sbin/smbd 的配置文件命名为 usr.sbin.smbd

/etc/apparmor.d/abstractions/

抽象的位置。

/etc/apparmor.d/program-chunks/

程序块的位置。

/proc/*/attr/current

检查此文件可以查看进程的限制状态以及用于限制该进程的配置文件。ps auxZ 命令可自动检索这些信息。