跳转到内容跳转到页面导航:上一页 [访问键 p]/下一页 [访问键 n]
适用于 openSUSE Leap 15.6

33 从命令行构建配置 编辑源文件

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

Tip
提示:背景信息

在开始使用 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 的状态。如果未激活,start 会激活并启动它,将其置于运行状态。如果已停止,start 会导致重新扫描在 /etc/apparmor.d 中找到的 AppArmor 配置,并将 AppArmor 置于运行状态。如果 AppArmor 已经正在运行,start 会报告警告且不采取任何操作。

Note
注意:已运行的进程

需要重新启动已运行的进程才能将 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 配置 编辑源文件

Warning
警告:卸载所需配置的危险

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

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

> sudo aa-remove-unknown

您可以打印将被删除的配置列表

> sudo aa-remove-unknown -n

33.6 删除 AppArmor 配置 编辑源文件

以下步骤描述了删除 AppArmor 配置的过程。

  1. 从内核中删除 AppArmor 定义

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

    > sudo rm /etc/apparmor.d/PROFILE
        > 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. 将相关配置置于学习或抱怨模式。

    通过输入以下命令激活所有分析程序的学习或抱怨模式

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

    在以 root 身份登录的终端窗口中。此功能也可通过 YaST 配置模式模块使用,如 第 32.4.2 节,“更改单个配置的模式” 中所述。

    处于学习模式时,即使配置规定应该阻止访问请求,也不会阻止访问请求。这使您可以运行几个测试(如 步骤 3 所示),并了解程序的访问需求,以便它能够正常运行。有了这些信息,您可以决定配置的安全性如何。

    有关使用学习或抱怨模式的更详细说明,请参阅 第 33.7.3.2 节,“aa-complain—进入抱怨或学习模式”

  3. 运行您的应用程序。

    运行您的应用程序并测试其功能。需要对程序进行多少测试取决于您,但程序需要访问代表其访问需求的文件。由于执行不受 aa-genprof 的监督,因此此步骤可能持续数天或数周,甚至跨越完整的系统重启。

  4. 分析日志。

    在系统性分析中,直接运行 aa-logprof,而不是让 aa-genprof 运行它(如在独立分析中所做的那样)。aa-logprof 的一般形式是

    > 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 命令相同,只是它将配置文件设置为强制模式。此功能也可通过 YaST 配置文件模式模块使用,具体说明请参阅 第 32.4.2 节,“更改单个配置文件的模式”

    要确保所有配置文件都退出抱怨模式并进入强制模式,请输入 aa-enforce /etc/apparmor.d/*

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

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

33.7.3 分析工具摘要 编辑源文件

所有 AppArmor 分析实用程序都由 apparmor-utils RPM 包提供,并存储在 /usr/sbin 中。每个工具都有不同的用途。

33.7.3.1 aa-autodep—创建近似配置文件 编辑源文件

这为所选程序或应用程序创建了一个近似配置文件。您可以为二进制可执行文件和解释型脚本程序生成近似配置文件。生成的配置文件称为““近似””,因为它不一定包含程序正确受 AppArmor 限制所需的所有配置文件条目。最小的 aa-autodep 近似配置文件至少包含一个基本包含指令,其中包含大多数程序所需的基本配置文件条目。对于某些类型的程序,aa-autodep 生成更扩展的配置文件。配置文件是通过递归调用命令行上列出的可执行文件上的 ldd(1) 生成的。

要生成近似配置文件,请使用 aa-autodep 程序。程序参数可以是程序的简单名称,aa-autodep 通过搜索您的 shell 的路径变量找到该名称,也可以是完全限定的路径。程序本身可以是任何类型(ELF 二进制文件、shell 脚本、Perl 脚本等)。aa-autodep 生成一个近似配置文件,以通过后续的动态分析进行改进。

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

> 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) 在您的路径中,请使用

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

    > sudo aa-complain /sbin/PROGRAM1
  • 如果配置文件不在 /etc/apparmor.d 中,请使用以下内容覆盖默认位置

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

    > 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 中的所有配置文件置于抱怨模式。

Tip
提示:使用 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 配置文件规则的违规行为,例如配置文件程序访问配置文件不允许的文件。记录违规行为,但不允许。默认情况下,强制模式处于启用状态。要记录违规行为,但仍然允许它们,请使用抱怨模式。

手动激活强制模式(使用命令行)会删除配置文件的顶部上的抱怨标志,因此 /bin/foo flags=(complain) 变为 /bin/foo。要使用强制模式,请打开一个终端窗口并输入以下行之一。

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

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

    > sudo aa-enforce /sbin/PROGRAM1
  • 如果配置文件不在 /etc/apparmor.d 中,请使用以下内容覆盖默认位置

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

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

上述每个命令都会为列出的配置文件和程序激活强制模式。

如果您未输入程序或配置文件名称,系统将提示您输入一个。 /path/to/profiles 覆盖默认位置 /etc/apparmor.d

参数可以是程序列表或配置文件列表。如果程序名称不包含其完整路径,aa-enforce 会在 $PATH 中搜索该程序。

Tip
提示:使用 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-genprofAppArmor 的概要文件生成工具。它在指定程序上运行 aa-autodep,创建近似的概要文件(如果尚未为其存在概要文件),将其设置为抱怨模式,将其重新加载到 AppArmor,标记日志,并提示用户执行程序并执行其功能。其语法如下

> 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. 使用 shell 的路径变量解析 httpd2-prefork 的完整路径。您也可以指定完整路径。在 openSUSE Leap 上,默认完整路径是 /usr/sbin/httpd2-prefork

    2. 检查是否存在 httpd2-prefork 的现有概要文件。如果存在,则更新它。如果不存在,则使用 aa-autodep(如 第 33.7.3 节,“概要文件工具摘要” 中所述)创建它。

    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 日志(请参阅 “参考”手册,第 11 章“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 退出该工具。

    Note
    注意

    如果出现添加帽子的请求,请转到 第 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 发送邮件,则此方法最有用。

      选择 使用干净的 exec 的概要文件 (Px) 选项,以清除环境变量,这些环境变量可能会修改传递给子进程时的执行行为。

      子进程 (cx/cx)

      设置到子概要文件的转换。它类似于 px/Px 转换,只是到子概要文件。

      选择 使用干净的 exec 的子进程 (Cx) 选项,以清除环境变量,这些环境变量可能会修改传递给子进程时的执行行为。

      未限制 (ux/ux)

      子进程在没有任何 AppArmor 概要文件应用于执行的资源的情况下运行。

      选择 使用干净的 exec 的未限制 (Ux) 选项,以清除环境变量,这些环境变量可能会修改传递给子进程时的执行行为。运行未限制的概要文件会引入安全漏洞,该漏洞可能被用来绕过 AppArmor。将其作为最后的手段使用。

      mmap (m)

      此权限表示在概要文件下运行的程序可以使用带有 PROT_EXEC 标志的 mmap 系统调用访问该资源。这意味着映射到其中的数据可以被执行。如果在分析运行时请求此权限,系统会提示您包含此权限。

      拒绝

      deny 规则添加到概要文件中,并永久阻止程序访问指定的目录路径条目。AppArmor 然后继续到下一个事件。

      中止

      中止 aa-logprof,丢失到目前为止输入的所有规则更改,并使所有概要文件保持未修改状态。

      完成

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

    • 示例 33.2,“学习模式异常:定义条目的权限” 显示 AppArmor 建议允许 globbing 模式 /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 提供一个或多个路径或包含项。通过输入选项编号,选择所需的选项,然后继续下一步。

      Note
      注意

      并非总是会在 AppArmor 菜单中显示所有这些选项。

      #include

      这是 AppArmor 概要文件的部分,它引用一个包含文件,该文件获取程序访问权限。通过使用包含项,您可以授予程序访问其他程序也需要的目录路径或文件的权限。使用包含项可以减小概要文件的大小。建议在建议时选择包含项。

      Globbed 版本

      通过选择 Glob(如下一步所述)来访问此版本。有关 globbing 语法的更多信息,请参阅 第 30.6 节,“概要文件名称、标志、路径和 globbing”

      实际路径

      这是程序需要访问才能正常运行的文字路径。

      选择路径或包含项后,通过选择 允许拒绝 将其处理为 AppArmor 概要文件中的条目。如果您对显示的目录路径条目不满意,也可以对其进行 Glob 处理。

      以下选项可用于处理学习模式条目并构建概要文件

      选择 Enter

      允许访问所选目录路径。

      允许

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

      拒绝

      阻止程序访问指定的目录路径条目。AppArmor 然后继续到下一个事件。

      新建

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

      Glob

      选择特定路径或使用通配符创建匹配更广泛路径集的通用规则。要选择提供的任何路径,请输入该路径前面的数字,然后决定如何处理所选项目。

      有关 globbing 语法的更多信息,请参阅 第 30.6 节,“概要文件名称、标志、路径和 globbing”

      Glob w/ext

      这将修改原始目录路径,同时保留文件名扩展名。例如,/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. 使用 systemctl reload apparmor 命令重新启动 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 日志(请参阅 “参考”手册,第 11 章“journalctl:查询 systemd 日志”)中找到的抱怨和强制模式事件,并生成 AppArmor 安全概要文件中的新条目。

当您运行 aa-logprof 时,它开始扫描在抱怨和强制模式下生成的日志文件,如果存在未被现有概要文件集覆盖的新安全事件,它会提供修改概要文件的建议。aa-logprof 使用此信息来观察程序行为。

如果受限制的程序分叉并执行另一个程序,aa-logprof 会看到这一点,并询问用户在启动子进程时应使用哪种执行模式。执行模式 ixpxPxuxUxcxCx 和命名概要文件是启动子进程的选项。如果子进程有单独的概要文件,则默认选择 Px。如果不存在,则概要文件默认为 ix。具有单独概要文件的子进程会运行 aa-autodep,并在 AppArmor 运行时将其加载到 AppArmor 中。

aa-logprof 退出时,概要文件将使用更改进行更新。如果 AppArmor 处于活动状态,则重新加载更新的概要文件,如果仍然有生成安全事件的进程在 null-XXXX 概要文件(在抱怨模式下临时创建的唯一概要文件)中运行,则这些进程将设置为在其正确的概要文件中运行。

要运行 aa-logprof,请输入 aa-logprof 到以 root 用户身份登录的终端窗口中。以下选项可用于 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 忽略系统日志中指定标记之前的所有事件。如果标记包含空格,则必须用引号括起来才能正确工作。例如

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

或者

# 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 处理 httpd2-prefork 访问文件 /etc/group 的示例。 [] 表示默认选项。

在此示例中,访问 /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 会要求确认并让您重新输入表达式。

Glob

选择特定的路径或使用通配符创建匹配更广泛路径集的通用规则。要选择提供的任何路径,请输入路径前面打印的编号,然后决定如何处理所选项目。

有关 globbing 语法的更多信息,请参阅 第 30.6 节,“概要文件名称、标志、路径和 globbing”

Glob w/ext

这将修改原始目录路径,同时保留文件名扩展名。例如,/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 正在请求树顶部的路径条目,即使在 openSUSE Leap 上,vsftpd 默认情况下从 /srv/ftp 提供 FTP 文件。这是因为 vsftpd 使用 chroot,并且对于代码中 chroot 监狱内的部分,AppArmor 会看到有关 chroot 环境的文件访问,而不是全局绝对路径。

另一个有趣的条目是,您应该授予 FTP 对目录中所有 JPEG 文件的读取访问权限,因此您可以使用 Glob w/Ext 并使用建议的路径 /*.jpg。这样做会将所有先前授予访问单个 .jpg 文件的规则合并,并防止将来出现与访问 .jpg 文件相关的任何问题。

最后,您应该授予对 FTP 文件的更常规访问权限。如果您选择最后一个条目的 Globaa-logprof 会将建议的路径 /y2k.jpg 替换为 /*。或者,您应该授予对整个目录树的更多访问权限,在这种情况下,您可以使用 New 路径选项并输入 /**.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
Note
注意

实际上,/usr/bin/mail 的可执行文件是 /usr/bin/nail,这并非笔误。

程序 /usr/bin/less 似乎是一个用于滚动超过一个屏幕长度的文本的简单程序,而这正是 /usr/bin/mail 使用它的原因。但是,less 实际上是一个大型且功能强大的程序,它使用许多其他辅助应用程序,例如 tarrpm

Tip
提示

在 tar 文件或 RPM 文件上运行 less 会显示这些容器的清单。

您不希望在读取邮件消息时自动运行 rpm(这会导致类似于 Microsoft* Outlook 风格的病毒攻击,因为 RPM 具有安装和修改系统程序的能力),因此,在这种情况下,最佳选择是使用 Inherit。这将导致从该上下文中执行的 less 程序在 /usr/bin/mail 的配置文件下运行。这有两个后果

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

  • 您可以避免将辅助应用程序(例如 tarrpm)添加到 /usr/bin/mail 配置文件中,以便当 /usr/bin/mail 在这种上下文中运行 /usr/bin/less 时,less 程序比没有 AppArmor 保护时危险少得多。另一种选择是使用 Cx 执行模式。有关执行模式的更多信息,请参阅 第 30.12 节,“执行模式”

在其他情况下,您可能希望使用 Profile 选项。这会对 aa-logprof 产生以下影响

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

  • aa-logprof 为子进程构建配置文件并开始构建它,就像构建父配置文件一样,通过将事件分配给子进程的配置文件并询问 aa-logprof 用户问题。如果您将子进程作为独立程序运行,则应用配置文件。

如果受限制的程序派生并执行另一个程序,aa-logprof 会看到这一点,并询问用户应使用哪种执行模式来启动子进程。将呈现继承、配置文件、未限制、子进程、命名配置文件或拒绝执行的选项。

如果子进程存在单独的配置文件,则默认选择为配置文件。如果不存在配置文件,则默认值为继承。继承选项,或 ix,在 第 30.7 节,“文件权限访问模式” 中描述。

配置文件选项表示子程序应在其自己的配置文件中运行。第二个问题询问是否要清理子程序从父程序继承的环境。如果您选择清理环境,这会将执行修饰符 Px 放入您的 AppArmor 配置文件中。如果您选择不清理,则将 px 放入配置文件中,并且不会进行环境清理。如果您选择配置文件执行模式,则默认值为 Px

不建议使用未限制的执行模式,并且应仅在没有其他可靠地为程序生成配置文件的选项时使用。选择未限制会打开一个警告对话框,要求确认该选择。如果您确定并选择 Yes,第二个对话框会询问是否要清理环境。要在您的配置文件中使用执行模式 Ux,请选择 Yes。要使用执行模式 ux 代替,请选择 No。未限制执行模式的默认值为 Ux

Important
重要:运行未限制

选择 ux 或 Ux 是危险的,并且不提供对由此产生的子程序执行行为的策略执行(从安全角度来看)。

33.7.3.12 aa-unconfined—识别未受保护的进程 编辑源文件

命令 aa-unconfined 检查系统上的开放网络端口,将其与系统上加载的配置文件集进行比较,并报告没有 AppArmor 配置文件的网络服务。它需要 root 权限,并且不能受 AppArmor 配置文件的限制。

aa-unconfined 必须以 root 身份运行才能从 /proc 文件系统检索进程可执行链接。该程序容易受到以下竞态条件的影响

  • 处理了取消链接的可执行文件

  • netstat(8) 和进一步检查之间死亡的进程被处理

Note
注意

该程序列出了使用 TCP 和 UDP 的进程。简而言之,该程序不适合取证用途,而是作为辅助工具,用于在实验室中分析所有可访问网络的进程。

33.7.3.13 aa-notify 编辑源文件

aa-notify 是一个方便的实用程序,可在您的桌面环境中显示 AppArmor 通知。如果您不想检查 AppArmor 日志文件,而是让桌面通知您有关违反策略的事件,这将非常方便。要启用 AppArmor 桌面通知,请运行 aa-notify

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

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

Tip
提示

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

aa-notify Message in GNOME
图 33.1:aa-notify Message in GNOME

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

33.7.3.14 apparmor.vim 编辑源文件

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

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

# vim:ft=apparmor

到配置文件的末尾。

Tip
提示

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

启用此功能后,vim 会为您对配置文件的行进行着色

蓝色

注释

白色

普通的读取访问行

棕色

能力声明和 complain 标志

黄色

授予写入访问权限的行

绿色

授予执行权限的行(无论是 ix 还是 px)

红色

授予未限制访问权限的行 (ux)

红色背景

无法正确加载到 AppArmor 模块中的语法错误

使用 apparmor.vimvim 手册页以及 vim 编辑器中的 :help syntax 以获取有关语法高亮的更多 vim 帮助。 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 命令可以自动检索此信息。