37 从命令行构建配置文件 #
AppArmor® 可让用户使用命令行界面而不是图形界面来管理和配置系统安全性。可以使用 AppArmor 命令行工具来跟踪 AppArmor 的状态,以及创建、删除或修改 AppArmor 配置文件。
37.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会让系统重新扫描- /etc/apparmor.d中的 AppArmor 配置文件,并将 AppArmor 置于运行状态。如果 AppArmor 已在运行,- start会发出警告但不执行任何操作。注意:已在运行的进程- 要对已在运行的进程应用 AppArmor 配置文件,需要将其重启动。 
- sudo systemctl stop apparmor
- 通过去除内核内存中的所有配置文件来停止正在运行的 AppArmor,可有效禁用所有访问控制,并将 AppArmor 置于停止状态。如果 AppArmor 已停止, - stop会尝试再次卸载配置文件,但不会有任何结果。
- sudo systemctl reload apparmor
- 让 AppArmor 模块重新扫描 - /etc/apparmor.d中的配置文件,但不取消限制正在运行的 进程。强制执行新创建的配置文件,并去除- /etc/apparmor.d目录中最近删除的配置文件。
37.2 构建 AppArmor 配置文件 #
AppArmor 模块配置文件定义以纯文本文件的形式存储在 /etc/apparmor.d 目录中。有关这些文件的详细语法说明,请参见第 34 章 “配置文件组件和语法”。
  
/etc/apparmor.d 目录中的所有文件都会解释为配置文件并加载为配置文件。要防止加载配置文件,对此目录中的文件进行重命名不是一种有效的方式。您必须去除此目录中的配置文件,以有效防止读取和评估这些配置文件;或者对配置文件调用 aa-disable,这会在 /etc/apparmor.d/disabled/ 中创建一个符号链接。
  
   您可以使用 vi 等文本编辑器来访问和更改这些配置文件。以下各节包含构建配置文件的详细步骤:
  
- 添加或创建 AppArmor 配置文件
- 有关详细信息,请参见 第 37.3 节 “添加或创建 AppArmor 配置文件” 
- 编辑 AppArmor 配置文件
- 有关详细信息,请参见 第 37.4 节 “编辑 AppArmor 配置文件” 
- 删除 AppArmor 配置文件
- 有关详细信息,请参见 第 37.6 节 “删除 AppArmor 配置文件” 
37.3 添加或创建 AppArmor 配置文件 #
要为应用程序添加或创建 AppArmor 配置文件,可以使用系统的或独立的配置文件构建方法,具体视您的需要而定。第 37.7 节 “构建配置文件的两种方式”中详细介绍了这两种方法。
37.4 编辑 AppArmor 配置文件 #
以下步骤说明编辑 AppArmor 配置文件的过程:
- 如果您当前不是以 - root身份登录的,请在终端窗口中输入- su。
- 出现提示时输入 - root口令。
- 使用 - cd /etc/apparmor.d/转到配置文件所在的目录。
- 输入 - ls以查看所有当前安装的配置文件。
- 在 vim 等文本编辑器中打开配置文件以进行编辑。 
- 完成必要的修改后保存配置文件。 
- 在终端窗口中输入 - systemctl reload apparmor重启动 AppArmor。
37.5 卸载未知的 AppArmor 配置文件 #
aa-remove-unknown 会卸装未存储在 /etc/apparmor.d 中的所有配置文件,例如自动生成的 LXD 配置文件。这可能会损害系统的安全性。使用 -n 参数列出所有已卸装的配置文件。
   
   要卸载不再位于 /etc/apparmor.d/ 中的所有 AppArmor 配置文件,请运行:
  
>sudoaa-remove-unknown
您可以输出已去除的配置文件列表:
>sudoaa-remove-unknown -n
37.6 删除 AppArmor 配置文件 #
以下步骤说明删除 AppArmor 配置文件的过程。
- 从内核中去除 AppArmor 定义: - >- sudo- apparmor_parser -R /etc/apparmor.d/PROFILE
- 去除定义文件: - >- sudo- rm /etc/apparmor.d/PROFILE- >- sudo- rm /var/lib/apparmor/cache/PROFILE
37.7 构建配置文件的两种方式 #
掌握第 34 章 “配置文件组件和语法”中介绍的 AppArmor 配置文件语法后,您无需借助工具也能创建配置文件,但需要的工作量比较大。要避免这种情况,请使用 AppArmor 工具来自动创建和优化配置文件。
可采用两种方法创建 AppArmor 配置文件。这两种方法都有可用的工具。
- 独立式配置文件构建
- 此方法适用于运行时间有限的小型应用程序,如邮件客户端等用户客户端应用程序。有关详细信息,请参见 第 37.7.1 节 “独立式配置文件构建”。 
- 系统性配置文件构建
- 此方法适用于一次性为许多程序构建配置文件,还适用于为运行时间长达数日、数周或在重引导后连续运行的应用程序(如 Web 服务器、邮件服务器等网络服务器应用程序)构建配置文件。有关详细信息,请参见 第 37.7.2 节 “系统性配置文件构建”。 
使用 AppArmor 工具有助于管理配置文件的自动开发过程:
- 确定符合您的要求的配置文件构建方式。 
- 执行一次静态分析。根据所选的配置文件构建方法运行 - aa-genprof或- aa-autodep。
- 启用动态学习。为所有构建了配置文件的程序启动学习模式。 
37.7.1 独立式配置文件构建 #
    独立式配置文件的生成和改进由一个称为 aa-genprof 的程序进行管理。此方式比较简单,因为全过程都由 aa-genprof 负责。但运行程序测试的整个过程中都必须运行 aa-genprof(在开发配置文件过程中不能重引导计算机),因此使用比较有限。
   
    要使用 aa-genprof 以独立方式构建配置文件,请参见第 37.7.3.8 节 “aa-genprof — 生成配置文件”。
   
37.7.2 系统性配置文件构建 #
    此方法之所以称为系统性配置文件构建,是因为它会一次性更新系统中所有的配置文件,而不像 aa-genprof 或独立式配置文件构建那样只针对一个或少数几个配置文件。采用系统性配置文件构建方法时,构建和改进配置文件的自动化程度会有所下降,但更灵活。此方法适用于为长时间运行且其行为会在重引导后持续的应用程序构建配置文件,或者一次性为许多程序构建配置文件。
   
按如下方式为一组应用程序构建 AppArmor 配置文件:
- 为构成应用程序的各个程序创建配置文件。 - 尽管此方法是系统性的,但 AppArmor 只监控具有配置文件及其子配置文件的程序。要让 AppArmor 将某个程序考虑在内,至少应通过 - aa-autodep为此程序创建一个草拟配置文件。要创建此草拟配置文件,请参见第 37.7.3.1 节 “aa-autodep — 创建草拟配置文件”。
- 使相关的配置文件进入学习或提示模式。 - 在终端窗口中输入以下命令 - >- sudoaa-complain /etc/apparmor.d/*- (以 - root身份登录后),为所有构建了配置文件的程序激活学习或控诉模式。也可以通过第 36.4.2 节 “更改单个配置文件的模式”中所述的“YaST 配置文件模式”模块使用此功能。- 处于学习模式时,访问请求不会被阻止,即使配置文件指示应阻止时也是如此。这样您就可以完整运行若干测试(如步骤 3所示)并了解程序正常运行时的访问需要。通过此信息,您可以确定配置文件的防护程度。 - 有关使用学习模式和提示模式的具体说明,请参见第 37.7.3.2 节 “aa-complain — 进入控诉或学习模式”。 
- 演习应用程序。 - 运行应用程序并行使其功能。演习程序的多少功能由您决定,但您必须让程序访问代表其访问要求的每个文件。由于执行不受 - aa-genprof的监督,因此此步骤可以持续数天或数周时间,而且在所有系统重引导后仍会持续。
- 分析日志。 - 进行系统性配置文件构建时,请直接运行 - aa-logprof,而不要让- aa-genprof来运行它(进行独立式配置文件构建时会如此操作)。- aa-logprof的一般格式如下:- >- sudoaa-logprof [ -d /path/to/profiles ] [ -f /path/to/logfile ]- 有关使用 - aa-logprof的详细信息,请参见第 37.7.3.9 节 “aa-logprof — 扫描系统日志”。
- 这样会生成最佳的配置文件。此重复操作方式会捕捉可经过训练并重新载入策略引擎的较小数据集。后续重复操作将生成较少的消息,而且运行速度较快。 
- 编辑配置文件。 - 您应该查看已生成的配置文件。可以使用文本编辑器打开和编辑 - /etc/apparmor.d/中的配置文件。
- 返回到强制模式。 - 此时系统会重新强制执行配置文件的规则,而不仅仅是记录信息。此操作可以通过从配置文件中去除 - flags=(complain)文本手动完成,也可以使用- aa-enforce命令自动完成,该命令的工作方式与- aa-complain命令完全相同,只不过会将配置文件设置为强制模式。也可以通过第 36.4.2 节 “更改单个配置文件的模式”中所述的“YaST 配置文件模式”模块使用此功能。- 要确保所有配置文件都已解除控诉模式并已置于强制模式,请输入 - aa-enforce /etc/apparmor.d/*。
- 重新扫描所有配置文件。 - 要让 AppArmor 重新扫描所有配置文件并在内核中更改该强制模式,请输入 - systemctl reload apparmor。
37.7.3 构建配置文件的工具汇总 #
apparmor-utils RPM 软件包提供了用于构建 AppArmor 配置文件的所有实用程序,这些实用程序存储在 /usr/sbin 中。每个工具都有不同的用途。
   
37.7.3.1 aa-autodep — 创建草拟配置文件 #
     此工具可为所选的程序或应用程序创建草拟配置文件。您可以为二进制可执行文件和已解释的脚本程序生成草拟配置文件。生成的配置文件之所以称为“草拟配置文件”,是因为它不一定包含程序在 AppArmor 严格限制下所需的所有配置项。最小的 aa-autodep 草拟配置文件至少具备基础的 include 指令,它包含大多数程序都需要的基本配置文件项。对于某些类型的程序,aa-autodep 会生成更扩展的配置文件。配置文件的生成方式是在命令行上列出的可执行文件上以递归方式调用 ldd(1)。
    
     要生成草拟配置文件,请使用 aa-autodep 程序。程序参数可以是程序的简单名称(aa-autodep 通过搜索外壳的路径变量找到此名称),也可以是完全限定的路径。程序本身可为任何类型(ELF 二级制文件、shell 脚本、Perl 脚本等)。aa-autodep 会生成草拟配置文件,并通过后续的动态配置文件构建改进此配置文件。
    
     生成的草拟配置文件将按照以下 AppArmor 配置文件命名约定写入到 /etc/apparmor.d 目录:以程序的绝对路径作为配置文件名,将路径中的斜杠 (/) 替换为句点 (.)。aa-autodep 的一般语法是在终端窗口中输入以下命令:
    
>sudoaa-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 是示例应用程序)。如果情况适合,您可以使用通配符。
37.7.3.2 aa-complain — 进入控诉或学习模式 #
     控诉和学习模式工具 (aa-complain) 会检测违背 AppArmor 配置文件规则的情况,例如构建了配置文件的程序访问了配置文件不允许的文件。冲突是允许的,但也会被记录。要改进配置文件,请开启控诉模式,对程序运行一套测试以生成反映程序访问需求的日志事件,然后使用 AppArmor 工具对日志进行后处理,以将日志事件转换为改进的配置文件。
    
     手动激活控诉模式(使用命令行)会在配置文件的顶部添加一个标志,因此 /bin/foo 将变成 /bin/foo flags=(complain)。要使用控诉模式,请打开一个终端窗口,然后以 root 身份输入以下命令:
    
- 如果示例程序 (PROGRAM1) 在您的路径中,请使用: - >- sudoaa-complain [PROGRAM1 PROGRAM2 ...]
- 如果程序不在您的路径中,请指定整个路径,如下所示: - >- sudoaa-complain /sbin/PROGRAM1
- 如果配置文件不在 - /etc/apparmor.d中,请输入以下命令以覆盖默认位置:- >- sudoaa-complain /path/to/profiles/PROGRAM1
- 指定 /sbin/program1 的配置文件,如下所示: - >- sudoaa-complain /etc/apparmor.d/sbin.PROGRAM1
     上述每条命令都会激活所列配置文件或程序的控诉模式。如果程序名不包含其整个路径,则 aa-complain 会搜索程序的 $PATH。例如,aa-complain /usr/sbin/* 会查找与 /usr/sbin 中的所有程序关联的配置文件,并将其置于控诉模式。aa-complain /etc/apparmor.d/* 会将 /etc/apparmor.d 中的所有配置文件置于控诉模式。
    
37.7.3.3 aa-decode — 解码 AppArmor 日志文件中的十六进制编码字符串 #
aa-decode 解码 AppArmor 日志输出中的十六进制编码字符串。它还可以处理有关标准输入的审计日志,转换任何十六进制编码的 AppArmor 日志项,并在标准输出中显示这些项。
    
37.7.3.4 aa-disable — 禁用 AppArmor 安全配置文件 #
     使用 aa-disable 可以禁用一个或多个 AppArmor 配置文件的强制模式。此命令将从内核中卸载配置文件,并防止在 AppArmor 启动时加载该配置文件。可以使用 aa-enforce 或 aa-complain 实用程序更改此行为。
    
37.7.3.5 aa-easyprof — 轻松生成配置文件 #
aa-easyprof 提供了易用的界面来生成 AppArmor 配置文件。aa-easyprof 支持使用模板和配置文件组来快速构建应用程序的配置文件。尽管 aa-easyprof 有助于生成配置文件,但其实用程序依赖于所用模板、配置文件组和抽象的质量。此外,此工具在创建配置文件方面的限制比手动或使用 aa-genprof 和 aa-logprof 创建配置文件要少一些。
    
     有关详细信息,请参见 aa-easyprof (8) 的手册页。
    
37.7.3.6 aa-enforce — 进入强制模式 #
强制模式会检测违背 AppArmor 配置文件规则的情况,例如构建了配置文件的程序访问了配置文件不允许的文件。违规会被记录下来,并且不会允许此类事件。默认会启用强制模式。如要记录违规但仍允许此类事件,请使用控诉模式。
     手动激活强制模式(使用命令行)会去除配置文件顶部的 complain 标志,使 /bin/foo
     flags=(complain) 变成 /bin/foo。要使用强制模式,请打开一个终端窗口,然后输入以下命令。
    
- 如果示例程序 (PROGRAM1) 在您的路径中,请使用: - >- sudoaa-enforce [PROGRAM1 PROGRAM2 ...]
- 如果程序不在您的路径中,请指定整个路径,如下所示: - >- sudoaa-enforce /sbin/PROGRAM1
- 如果配置文件不在 /etc/apparmor.d 中,请输入以下命令以覆盖默认位置: - >- sudoaa-enforce -d /path/to/profiles/ program1
- 指定 /sbin/program1 的配置文件,如下所示: - >- sudoaa-enforce /etc/apparmor.d/sbin.PROGRAM1
上述命令会激活所列配置文件和程序的强制模式。
     如果不输入程序或配置文件的名称,系统会提示您输入。/path/to/profiles 会覆盖 /etc/apparmor.d 的默认位置。
    
     参数可以是一个程序列表或一个配置文件列表。如果程序名不包含其整个路径,则 aa-enforce 会搜索程序的 $PATH。
    
37.7.3.7 aa-exec — 使用指定的配置文件限制程序 #
     使用 aa-exec 可以启动指定的配置文件和/或配置文件名称空间所限制的程序。如果同时指定了配置文件和名称空间,程序将受到新名称空间中的配置文件限制。如果指定了配置文件名称空间,将使用当前限制的配置文件名称。如果配置文件和名称空间均未指定,将使用标准的配置文件附件运行命令 — 如同未使用 aa-exec 命令一样。
    
     有关该命令的选项的详细信息,请参见该命令的手册页 man 8 aa-exec。
    
37.7.3.8 aa-genprof — 生成配置文件 #
aa-genprof 是用于生成 AppArmor 配置文件的实用程序。它可以对指定的程序运行 aa-autodep 以创建草拟配置文件(如果此程序尚不存在配置文件)、将其设置为控诉模式、将其重新加载到 AppArmor、标记日志、提示用户执行程序以及运用其功能。其语法如下所示:
    
>sudoaa-genprof [ -d /path/to/profiles ] PROGRAM
     要为 Apache Web 服务器程序 httpd2-prefork 创建配置文件,请以 root 身份执行以下操作:
    
- 输入 - systemctl stop apache2。
- 接下来输入 - aa-genprof httpd2-prefork。- 现在, - aa-genprof会执行以下操作:- 使用外壳的路径变量解析 httpd2-prefork 的完整路径。您也可以指定完整路径。在 SUSE Linux Enterprise Server 上,默认的完整路径为 - /usr/sbin/httpd2-prefork。
- 检查 httpd2-prefork 是否已存在配置文件。如果已有,则会被更新。如果不存在,则会使用第 37.7.3 节 “构建配置文件的工具汇总”中所述的 - aa-autodep创建一个配置文件。
- 将此程序的配置文件置于学习或控诉模式,这样会记录配置文件违规,但允许此类违规以便继续操作。日志事件如下所示(请参见 - /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日记(请参见第 21 章 “- 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 
- 使用日志事件的起始标记来标记要考虑的日志。例如: - Sep 13 17:48:52 figwit root: GenProf: e2ff78636296f16d0b5301209a04430d 
 
- 看到工具的提示时,在另一个终端窗口中运行应用程序,并执行尽可能多的应用程序功能。如此,学习模式便可以记录程序在正常运行时需要访问的文件和目录。例如,在新的终端窗口中输入 - systemctl start apache2。
- 执行程序功能后,在 - aa-genprof终端窗口中选择以下可用选项:- S 会在 - aa-genprof启动并重新加载配置文件后从标记位置开始对系统日志运行- aa-genprof。如果日志中存在系统事件,AppArmor 会分析学习模式日志文件。这会生成一连串问题,您必须回答这些问题以指导- aa-genprof生成安全配置文件。
- F 会退出工具。 
 
- 回答两类问题: - 构建配置文件的程序访问了配置文件中没有的资源(请参见例 37.1 “学习模式例外:控制对特定资源的访问”)。 
- 构建配置文件的程序执行了一个程序,而安全域转换尚未定义(请参见例 37.2 “学习模式例外:定义项的权限”)。 
 - 这两种类别都会生成一系列问题,您必须回答这些问题,以将资源或程序添加到配置文件。例 37.1 “学习模式例外:控制对特定资源的访问”和例 37.2 “学习模式例外:定义项的权限”提供了每种类别的示例。后续步骤将说明回答这些问题时的选项。 - 处理执行权限非常复杂。您必须决定如何继续处理此项,指定向此项授予哪种执行权限类型: 例 37.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 系统调用来访问资源。这意味着可以执行其中映射的数据。如果在配置文件构建过程运行期间要求此权限,系统会提示您包含此权限。
- 拒绝
- 在配置文件中添加一条 - deny规则,以永久阻止程序访问指定的目录路径项。AppArmor 随后会继续处理下一个事件。
- 中止
- 中止 - aa-logprof,到目前为止输入的所有规则更改将会丢失,所有配置文件都将保持不变。
- 完成
- 关闭 - aa-logprof,同时保存到目前为止输入的所有规则更改并修改所有配置文件。
 
- 例 37.2 “学习模式例外:定义项的权限”演示了 AppArmor 建议允许使用通配模式 - /var/run/nscd/*进行读取,然后使用一个抽象来涵盖常用的 Apache 相关访问规则。例 37.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 是不错的做法。 
- 通配形式
- 按下一步所述选择即可访问该部分。有关通配语法的更多信息,请参见第 34.6 节 “配置文件名称、标志、路径和通配”。 
- 实际路径
- 这是程序要正常运行需要访问的实际路径。 
 - 选择路径或 include 后,通过选择或,将它以项的形式加入到 AppArmor 配置文件中。如果您对显示的目录路径项不满意,也可以使用对其进行处理。 - 以下选项用于处理学习模式项和构建配置文件: - 选择 Enter
- 允许访问选定的目录路径。 
- 允许
- 允许访问指定的目录路径项。AppArmor 会给出文件访问权限建议。有关详细信息,请参见 第 34.7 节 “文件权限访问模式”。 
- 拒绝
- 阻止程序访问指定目录路径项的权限。AppArmor 随后会继续处理下一个事件。 
- 新建
- 提示您输入针对此事件的自己的规则,允许指定正则表达式。如果该表达式实际上不满足最初提示问题的事件,AppArmor 会要求您确认并允许您重新输入表达式。 
- 通配
- 选择特定的路径,或使用通配符创建与更多路径集匹配的一般规则。要选择提供的任何路径,请输入该路径前面列显的编号,然后决定如何继续处理所选项。 - 有关通配语法的详细信息,请参见第 34.6 节 “配置文件名称、标志、路径和通配”。 
- 保留扩展名的通配
- 此选项会修改原始目录路径,不过会保留文件扩展名。例如, - /etc/apache2/file.ext将变成- /etc/apache2/*.ext,其中添加了通配符(星号)来代替文件名。这样程序就可以访问建议目录下以- .ext为扩展名的所有文件。
- 中止
- 中止 - aa-logprof,到目前为止输入的所有规则更改将会丢失,所有配置文件都将保持不变。
- 完成
- 关闭 - aa-logprof,同时保存到目前为止输入的所有规则更改并修改所有配置文件。
 
 
- 要使用 - vi查看和编辑您的配置文件,请在终端窗口中输入- vi /etc/apparmor.d/PROFILENAME。要在 vim 中编辑 AppArmor 配置文件时启用语法高亮显示,请依次使用命令- :syntax on和- :set syntax=apparmor。有关 vim 和语法高亮显示的详细信息,请参见第 37.7.3.14 节 “apparmor.vim”。
- 重启动 AppArmor,然后使用 - systemctl reload apparmor命令重新加载配置文件集,包括新建的配置文件。
     与用于构建 AppArmor 配置文件的图形前端一样,YaST 添加配置文件向导 aa-genprof 也支持使用 /usr/share/apparmor/extra-profiles 下的本地配置文件储存库。
    
要使用本地储存库中的配置文件,请按如下所示继续操作:
- 如上所述启动 - 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 
- 要使用此配置文件,请按 U()并执行上文所述的配置文件生成过程。 - 要在激活配置文件之前对其进行检查,请按 V()。 - 要忽略现有的配置文件,请按 C(),并执行上文所述的配置文件生成过程从头开始创建配置文件。 
- 完成后,按 F()退出 - aa-genprof并保存更改。
37.7.3.9 aa-logprof — 扫描系统日志 #
aa-logprof 是一个交互式工具,用于查看 /var/log/audit/audit.log 内各日志项中的控诉和强制模式事件,或直接查看 systemd 日记中的此类事件(请参见第 21 章 “journalctl:查询 systemd 日记”),以及在 AppArmor 安全配置文件中生成新的项。
    
     运行 aa-logprof 后,它便开始扫描在控诉和强制模式下生成的日志文件,如果存在现有配置文件集未涵盖的新安全事件,它会给出修改配置文件的建议。aa-logprof 使用此信息来观察程序行为。
    
     如果某个受限制的程序派生并执行另一个程序,aa-logprof 会注意到这种情况,并会询问用户在启动子进程时应使用哪种执行模式。执行模式 ix、px、Px、ux、Ux、cx、Cx 及指定的配置文件均为用于启动子进程的选项。如果子进程具有单独的配置文件,则默认选择为 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将忽略系统日志中的所有事件,直到发现指定的标记。如果标记包含空格,必须将标记括在引号中才能正常工作。例如:- #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 -。
    
37.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 会给出文件访问权限建议。有关更多信息,请参见第 34.7 节 “文件权限访问模式”。 
- 拒绝
- 永久阻止程序访问指定的目录路径项。AppArmor 随后会继续处理下一个事件。 
- 新建
- 提示您输入您自己对此事件的规则,允许您指定任意形式的常规表达式。如果输入的表达式不满足最初提示问题的事件,AppArmor 会要求您确认并允许您重新输入表达式。 
- 通配
- 选择特定的路径,或使用通配符创建与更多路径集匹配的一般规则。要选择提供的任何路径,请输入路径前面列显的编号,然后决定如何继续处理所选项。 - 有关通配语法的详细信息,请参见第 34.6 节 “配置文件名称、标志、路径和通配”。 
- 保留扩展名的通配
- 此选项会修改原始目录路径,不过会保留文件扩展名。例如, - /etc/apache2/file.ext将变成- /etc/apache2/*.ext,其中添加了通配符(星号)来代替文件名。这样程序就可以访问建议目录下以- .ext为扩展名的所有文件。
- 中止
- 中止 - aa-logprof,到目前为止输入的所有规则更改将会丢失,所有配置文件都将保持不变。
- 完成
- 关闭 - aa-logprof,同时保存到目前为止输入的所有规则更改并修改所有配置文件。
37.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 文件的访问权限)或 /**(授予对目录树中所有文件的访问权限)。
    
这些项会处理读取访问权限。写权限与此类似,不同的是您在使用写权限的常规表达式时最好更加保守。处理执行权限较为复杂。例 37.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 实际上是一个功能强大的大型程序,使用了许多其他助手应用程序,例如 tar 和 rpm。
    
      对 tar 文件或 RPM 文件运行 less,它即会显示这些容器的库存。
     
     您不希望阅读邮件时自动运行 rpm(这会直接导致 Microsoft* Outlook 样式的病毒攻击,因为 RPM 具有安装和修改系统程序的能力),因此这种情况下的最佳选择是使用。这会使在本文中执行的 less 程序运行于 /usr/bin/mail 的配置文件之下。这会产生两种结果:
    
- 您需要将 - /usr/bin/less的所有基本文件访问权限添加到- /usr/bin/mail的配置文件中。
- 您可以避免将助手应用程序(例如 - tar和- rpm)添加到- /usr/bin/mail配置文件中,这样,当- /usr/bin/mail在此环境中运行- /usr/bin/less时,less 程序的危害性就远低于不受 AppArmor 保护时的情况。另一个选择是使用 Cx 执行模式。有关执行模式的详细信息,请参见第 34.12 节 “执行模式”。
     在其他情况下,您可能想要使用选项。这会对 aa-logprof 产生以下影响:
    
- 写入配置文件的规则使用 px/Px,这会强制转换到子项自己的配置文件。 
- aa-logprof会为子项构造一个配置文件,然后通过将子进程的事件分配到子项的配置文件并向- aa-logprof用户提出问题,开始以构建父配置文件的相同方式构建此配置文件。如果您将子项作为独立程序运行,就会应用该配置文件。
     如果某个受限制的程序派生并执行另一个程序,aa-logprof 会注意到这种情况,并会询问用户在启动子进程时应使用哪种执行模式。执行模式“继承”、“配置文件”、“未受限”、“子项”、“指定的配置文件”,或用于拒绝执行的选项将会显示。
    
     如果子进程具有单独的配置文件,则默认选择为“配置文件”。如果不存在配置文件,则默认选择为“继承”。第 34.7 节 “文件权限访问模式”中介绍了继承选项 (ix)。
    
     该配置文件选项指示子程序应在其自己的配置文件中运行。一个从属问题会询问是否要清理子程序从父项继承的环境。如果您选择清理环境,AppArmor 配置文件中将会添加执行修饰符 Px。如果您选择不清理,配置文件中将会添加 px,这样就不会进行环境清理。如果您选择配置文件执行模式,默认的执行模式为 Px。
    
     不建议使用未受限执行模式,应在没有任何其他选项能够可靠地生成程序的配置文件时,才使用该模式。选择未受限模式会打开一个警告对话框,要求您确认该选择。如果您确认并选择,另一个对话框将会打开,询问是否要清理环境。要在配置文件中使用执行模式 Ux,请选择。要在配置文件中改用执行模式 ux,请选择。默认选择的值为 Ux(表示未受限执行模式)。
    
      选择 ux or Ux 会造成很大的风险,它不会对子程序的最终执行行为强制执行策略(从安全角度而言)。
     
37.7.3.12 aa-unconfined — 识别不受保护的进程 #
aa-unconfined 命令会检查系统上的开放网络端口,将其与系统上加载的配置文件集进行比较,并报告不具备 AppArmor 配置文件的网络服务。它需要未被 AppArmor 配置文件限制的 root 特权。
    
     要从 /proc 文件系统中检索进程可执行链接,就必须以 root 身份运行 aa-unconfined。此程序易受以下竞态条件的影响:
    
- 未链接的可执行文件被误处理 
- 进程在 - netstat(8)之间终止,而且进一步的检查被误处理
此程序会列出使用 TCP 和 UDP 的进程。简而言之,此程序不适用于取证,仅可用于在实验室中辅助构建所有可访问网络的进程的配置文件。
37.7.3.13 aa-notify #
aa-notify 是一个便利的实用程序,它可在桌面环境中显示 AppArmor 通知。如果您不想检查 AppArmor 日志文件,而仅希望桌面告知您违反策略的事件,此实用程序会非常便捷。要启用 AppArmor 桌面通知,请运行 aa-notify:
    
>sudoaa-notify -p -u USERNAME --display DISPLAY_NUMBER
     其中,USERNAME 是您登录时使用的用户名,DISPLAY_NUMBER 是您当前使用的 X Window 显示编号,例如 :0。该进程在后台运行,每当发生拒绝事件时,就会显示通知。
    
      活动的 X Window 显示编号保存在 $DISPLAY 变量中,因此,您可以使用 --display $DISPLAY 来避免查找当前显示编号。
     
aa-notify Message in GNOME #
     您还可以使用 -s DAYS 选项配置 aa-notify,以显示指定的过去几天的通知摘要。有关 aa-notify 的详细信息,请参见其手册页 man 8 aa-notify。
    
37.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.vim 和 vim 手册页,以及在 vim 编辑器内使用 :help
     syntax。AppArmor 语法存储在 /usr/share/vim/current/syntax/apparmor.vim. 中
    
37.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命令会自动检索此信息。
