3.5. 构建配置文件的两种方式

掌握第 3.1 节 “配置文件组件和语法” (↑Novell AppArmor 2.0 管理指南)中介绍的 Novell AppArmor 配置文件语法后,您可以不借助工具来创建配置文件。但需要的工作量比较大。要避免此麻烦,请使用 Novell AppArmor 工具来自动创建和改进配置文件。

初步创建 Novell AppArmor 配置文件的方法有两种,分别带有支持它们的工具。

构建独立的配置文件

此方法适用于运行时间有限的小型应用程序,如邮件客户程序等用户客户程序。有关详细信息,请参见 第 3.5.1 节 “构建独立的配置文件” (↑Novell AppArmor 2.0 管理指南)

构建系统的配置文件

此方式适用于一次性为大量程序构建配置文件,还适用于为运行时间长达数日、数周或在重引导后连续运行的应用程序构建配置文件,如万维网服务器、邮件服务器等网络服务器应用程序。有关详细信息,请参见 第 3.5.2 节 “构建系统的配置文件” (↑Novell AppArmor 2.0 管理指南)

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

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

  2. 执行一次静态分析。根据您选择的配置文件构建方式运行 genprof 或 autodep。

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

3.5.1. 构建独立的配置文件

独立式配置文件的生成和改进由一个称为 genprof 的程序进行管理。此方式比较简单,因为全过程都由 genprof 负责。但运行程序测试的整个过程中都必须运行 genprof(在开发配置文件过程中不能重引导计算机),因此使用比较有限。

要使用 genprof 以独立方式构建配置文件,请参见第 3.5.3.4 节 “genprof” (↑Novell AppArmor 2.0 管理指南)

3.5.2. 构建系统的配置文件

此方式被称为构建系统的配置文件的原因是它一次性更新系统中所有的配置文件,而不像 genprof 或构建独立的配置文件那样针对一个或少数几个配置文件。

构建系统的配置文件时,构建和改进配置文件的自动化程度稍低,但更具灵活性。此方式适用于重引导后继续其行为并且长时间运行的应用程序,还适用于一次性构建大量程序的配置文件。

按照如下操作构建一组应用程序的 Novell AppArmor 配置文件:

  1. 为构成应用程序的各个程序创建配置文件。.  尽管此方法是系统化的,Novell AppArmor 仍只监视带有配置文件及其子配置文件的程序。因此,要使 Novell AppArmor 将某程序考虑在内,您至少应通过 autodep 为此程序创建一个大概的配置文件。要创建此大概的配置文件,请参见第 3.5.3.1 节 “autodep” (↑Novell AppArmor 2.0 管理指南)

  2. 使相关的配置文件进入学习或提示模式。.  在以 root 用户身份登录的情况下在终端窗口中输入 complain /etc/apparmor.d/*,为所有已构建配置文件的程序启动学习或提示模式。

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

    有关使用学习模式和提示模式的具体说明,请参见第 3.5.3.2 节 “提示或学习模式” (↑Novell AppArmor 2.0 管理指南)

  3. 演习应用程序。.  运行应用程序并行使其功能。演习程序的多少功能由您决定,但您必须让程序访问代表其访问要求的每个文件。genprof 不监督程序的执行,因此此步骤可以持续数天或数周时间,而且可以跨越完全的系统重引导。

  4. 分析日志。.  构建系统的配置文件时,请不要让 genprof 运行 logprof(构建独立的配置文件时的操作方式),而是直接运行 logprof。logprof 的通用形式为:

    logprof [ -d /path/to/profiles ] [ -f /path/to/logfile ]

    有关使用 logprof 的详细信息,请参见第 3.5.3.5 节 “logprof” (↑Novell AppArmor 2.0 管理指南)

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

  6. 编辑配置文件。.  您可能想要检查生成的配置文件。您可以使用 vim 打开并编辑 /etc/apparmor.d/ 中的配置文件。要获取帮助以最大限度发挥 vim 的功能,请参见第 3.5.3.8 节 “apparmor.vim” (↑Novell AppArmor 2.0 管理指南)

  7. 返回到“强制”模式。.  此时系统重新强制执行配置文件的规则,而不仅仅记录信息。此操作可以手动完成,方法是从配置文件中删除 flags=(complain),也可以自动完成,方法是使用“强制”命令,它的工作方式与“提示”命令完全相同,但将配置文件设置为强制模式。

    要确保所有配置文件都已脱离提示模式并已进入强制模式,请输入 enforce /etc/apparmor.d/*

  8. 重新扫描所有配置文件。.  要让 Novell AppArmor 重新扫描所有配置文件并更改内核中的强制模式,请输入 /etc/init.d/apparmor restart

3.5.3. 构建配置文件的工具汇总

apparmor-utils RPM 包提供所有用于构建 Novell AppArmor 配置文件的实用程序,其中大多保存在 /usr/sbin 中。以下章节介绍每一种工具。

3.5.3.1. autodep

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

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

生成的大概配置文件会被写入 /etc/apparmor.d 目录,使用的是用于命名程序绝对路径后面的配置文件的 Novell AppArmor 配置文件命名约定,用句点 (.) 替换路径中的正斜线 (/)。autodep 的通用形式为在以 root 用户身份登录的情况下在终端窗口中输入以下命令:

autodep [ -d /path/to/profiles ] [program1 program2...]

如果不输入程序名称,则计算机会提示您输入它(它们)。/path/to/profiles 会取代默认位置 /etc/apparmor.d

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

目录

如果您要构建配置文件的所有程序在同一目录内,而且此目录中没有其它程序,使用 autodep /path/to/your/programs/* 命令就可以为此目录中的所有程序创建标称的配置文件。

ps 命令

您可以运行应用程序并使用标准的 Linux ps 命令找到所有运行中的进程。然后,您必须手动找到这些程序的位置并对每个程序运行 autodep 程序。如果程序在您的路径中,则 autodep 会为您找到它们。如果程序不在您的路径中,则标准的 Linux 命令 locate 有助于您查找它们。如果 locate 不起作用(未在 SUSE Linux 上默认安装),请使用 find . -name '*foo*' -print

3.5.3.2. 提示或学习模式

提示和学习模式工具会检测 Novell AppArmor 配置文件规则中的冲突,例如构建了配置文件的程序访问配置文件不允许的其它文件。冲突是允许的,但也会被记录。要改进配置文件,请打开提示模式,对程序运行一套测试以生成反映程序访问需求的日志事件,然后使用 Novell AppArmor 工具对日志进行后处理,以将日志事件转化为改进的配置文件。

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

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

    complain [program1 program2 ...]
  • 如果程序不在您的路径中,请指定整个路径,如下所示:

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

    complain /path/to/profiles/ program1
         
  • 指定 program1 的配置文件,如下所示:

    complain /etc/apparmor.d/sbin.program1

上述命令会激活所列配置文件/程序的提示模式。此命令可以列出程序或配置文件。如果程序名不包含整个路径,则“提示”命令会搜索程序的 $PATH。因此,举例来说,complain /usr/sbin/* 会查找与 /usr/sbin 中所有程序相关联的配置文件,然后使它们进入提示模式,complain /etc/apparmor.d/* 会使 /etc/apparmor.d 中的所有配置文件进入提示模式。

3.5.3.3. 强制模式

强制模式工具会检测 Novell AppArmor 配置文件规则中的冲突,例如构建了配置文件的程序访问其它配置文件不允许的文件。冲突会被记录,并且被允许。默认情况下强制模式会被打开。若要 Novell AppArmor 配置文件控制已构建配置文件的程序的访问权限,请打开提示模式。强制模式和提示模式相互切换。

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

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

    enforce [program1 program2 ...]
  • 如果程序不在您的路径中,请指定整个路径,如下所示:

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

    enforce /path/to/profiles/ program1
  • 指定 program1 的配置文件,如下所示:

    enforce /etc/apparmor.d/sbin.program1

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

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

参数可以是一个程序列表或一个配置文件列表。如果程序名不包含整个路径,则强制命令会搜索程序的 $PATH。举例来说,enforce /usr/sbin/* 会查找与 /usr/sbin 中所有程序相关联的配置文件,然后使它们进入强制模式。enforce /etc/apparmor.d/* 会使 /etc/apparmor.d 中的所有配置文件进入强制模式。

3.5.3.4. genprof

genprof(或“生成配置文件”)是 Novell AppArmor 用于生成配置文件的实用程序。它可以在指定程序上运行 autodep 以创建大概配置文件(如果此程序尚不存在配置文件),可以将它设置为提示模式,可以将它重装载到 Novell AppArmor,可以标注系统日志,还可以提示用户执行程序或行使其功能。其语法如下所示:

genprof [ -d /path/to/profiles ]  program

假如您要为 Apache 万维网服务器程序 httpd2-prefork 创建一个配置文件,请在根 shell 中执行以下操作:

  1. 输入 rcapache2 stop

  2. 接下来输入 genprof httpd2-prefork

    此时 genprof 执行如下操作:

    • 根据 shell 的路径变量解析 httpd2-prefork 的完整路径。您也可以指定完整路径。在 SUSE Linux 上,完整路径为 /usr/sbin/httpd2-prefork

    • 检查 httpd2-prefork 是否已存在配置文件。如果已有,则会被更新。如果没有,则会使用第 3.5.3 节 “构建配置文件的工具汇总” (↑Novell AppArmor 2.0 管理指南)中说明的 autodep 程序创建一个配置文件。

      [Note]注意

      有一个将程序的完整路径与配置文件的文件名联系起来的命名约定,这样各种 Novell AppArmor 配置文件构建工具可以对它们进行一致的操作。此约定为将正斜线 (/) 替换为句点 (.),这样 /usr/sbin/httpd2-prefork 的配置文件将以 /etc/apparmor.d/usr.sbin.httpd2-prefork 保存。

    • 将此程序的配置文件设置为学习或提示模式,这样可以记录配置文件冲突并允许程序继续操作。日志事件如下所示:

      Oct  9 15:40:31 AppArmor: PERMITTING r access to /etc/apache2/httpd.conf (httpd2-prefork(6068) profile /usr/sbin/httpd2-prefork active /usr/sbin/httpd2-prefork)
    • 用日志事件的起始标记器标记要考虑的系统日志。例如:

      Sep 13 17:48:52 h2o root: GenProf: e2ff78636296f16d0b5301209a04430d
  3. 工具发出提示时,请在另一个终端窗口中运行应用程序,然后执行尽可能多的应用程序功能,这样学习模式可以记录程序正常工作时需要访问的文件和目录。例如,在新的终端窗口中输入 rcapache2 start

  4. 选择以下选项,执行程序的功能后可以使用这些选项:

    • S 在启动 genprof 并重新装载配置文件后针对从标记位置开始的系统日志运行 logprof。

      如果日志中存在系统事件,Novell AppArmor 会分析学习模式日志文件。这会生成一连串问题,您必须回答这些问题以指导 genprof 生成安全配置文件。

    • F 退出工具并返回到主菜单。

  5. 回答两类问题:

    这两种情况都会生成一连串问题,您必须回答这些问题,以将资源添加到配置文件或将程序添加到配置文件。下面两个图显示了两种情况下的示例。后续步骤将说明回答这些问题时的选项。

    例 3.1. 学习模式例外:控制对特定资源的访问

    Reading log entries from /var/log/messages.更新 /etc/apparmor.d 中的 apparmor 配置文件。
    
    Profile:/usr/sbin/xinetd 
    Execute:/usr/sbin/vsftpd
    
    [(I)nherit] / (P)rofile / (U)nconfined / (D)eny / Abo(r)t / (F)inish) 

    处理执行权限非常复杂。您必须确定将三种执行权限中的哪一种授予给程序:

    继承 (ix)

    子程序继承父程序的配置文件,以与父程序相同的访问控制运行。当被限制的程序需要调用其它被限制的程序时此模式非常实用,无须获得目标程序配置文件的权限或失去当前配置文件的权限。此模式通常用在子程序为助手应用程序的情况下,例如使用寻呼机等小程序的 /usr/bin/mail 客户程序,或者使用 Acrobat 来显示 PDF 文件的 Mozilla 万维网浏览器。

    配置文件 (px)

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

    不限制 (ux)

    子程序在完全没有限制的情况下运行,没有任何 Novell AppArmor 配置文件被应用到执行的资源。

    例 3.2. 学习模式例外:定义条目的执行权限

    Adding /bin/ps ix to profile.
    
    Profile:  /usr/sbin/xinetd
    Path:     /etc/hosts.allow
    New Mode: r
    
     [1 - /etc/hosts.allow]
    
    [(A)llow] / (D)eny / (N)ew / (G)lob / Glob w/(E)xt / Abo(r)t / (F)inish
    

    上面的菜单显示了 Novell AppArmor 提示的您正在构建配置文件的应用程序所访问的目录路径条目。它可能也会要求您定义条目的执行权限。

    Novell AppArmor 提供一个或多个路径名或 include。通过单击选项编号,从以下选项中选择一个或多个,然后继续下一步。

    [Note]注意

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

    #include

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

    通配形式

    按照下一步的介绍通过单击通配进行访问。有关通配语法的更多信息,请参见第 3.6 节 “路径名和通配” (↑Novell AppArmor 2.0 管理指南)

    实际路径名

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

  6. 选择一个路径名或 include 后,您可以单击允许拒绝,从而将它以条目的形式处理到 Novell AppArmor 配置文件中。如果您对显示的目录路径不满意,您也可以使用通配或进行编辑

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

    按 Enter 键

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

    允许

    允许访问指定的目录路径条目。Novell AppArmor 建议文件访问权限。有关详细信息,请参见第 3.7 节 “文件访问权限模式” (↑Novell AppArmor 2.0 管理指南)

    拒绝

    阻止程序访问指定目录路径条目的权限。Novell AppArmor 随后将移到下个事件上。

    新建

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

    通配

    单击它可修改目录路径(通过使用通配符),以将建议的条目路径下的所有文件包含在内。双击它可将访问权限授予显示的目录下的所有文件和子目录。

    有关通配语法的详细信息,请参见第 3.6 节 “路径名和通配” (↑Novell AppArmor 2.0 管理指南)

    保留扩展名的通配

    单击此选项在保留文件扩展名的情况下修改原来的目录路径。例如,/etc/apache2/file.ext 将变成 /etc/apache2/*.ext,文件名被通配符(星号)替换。这样程序就可以访问建议目录下以 .ext 为扩展名的所有文件。双击它可将访问权限授予显示的目录下的所有文件(带特定扩展名)和子目录。

    编辑

    允许您编辑选中的行。编辑后的新行显示在列表底部。

    中止

    中止 logprof,取消到目前为止输入的所有规则更改,保留所有配置文件不作修改。

    完成

    关闭 logprof,保留到目前为止输入的所有规则更改,修改所有配置文件。

  7. 要使用 vim 查看并编辑配置文件,请在终端窗口中输入 vim /etc/apparmor.d/profilename。在 vim 中编辑 Novell AppArmor 配置文件时若要启用语法颜色标记,请使用 :syntax on 命令,然后使用 :set syntax=apparmor 命令。有关 vim 和语法颜色标记的详细信息,请参见第 3.5.3.8 节 “apparmor.vim” (↑Novell AppArmor 2.0 管理指南)

3.5.3.5. logprof

logprof 是一个交互式工具,用于检查在系统日志条目中找到的学习或提示模式输出,然后在 Novell AppArmor 安全配置文件中生成新的条目。

运行 logprof 时,它首先扫描在学习或提示模式下生成的日志文件,如果存在现有配置文件集未涵盖的新安全事件,它会给出修改配置文件的建议。学习或提示模式会跟踪程序行为并将其输入系统日志。logprof 使用此信息来观察程序行为。

如果某个限制的程序分叉或执行另一个程序,logprof 会注意到这种情况并询问用户在启动子进程时使用哪种执行模式。以下执行模式为用于启动子进程的选项:ixpxux。如果子进程具有单独的配置文件,则默认选择为 px。如果不存在单独的配置文件,则默认为 ix。带有单独配置文件的子进程上会运行 autodep 并被装载到 Novell AppArmor 中,如果它正在运行。

退出 logprof 时,配置文件将被所作更改更新。如果 AppArmor 模块正在运行,更新后的配置文件将被重新装载,如果空的提示配置文件中仍在运行生成了安全事件的进程,这些进程会被设置为在其正确的配置文件下运行。

要运行 logprof,请在以 root 用户身份登录的情况下在终端窗口中输入 logprof。以下选项也可用于 logprof:

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

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

logprof -f /path/to/logfile/

如果日志文件不位于默认目录 /var/log/messages 下,指定日志文件所处位置的完整路径。

logprof -m "string marker in logfile"

标记 logprof 要在系统日志中查看的起始点。logprof 将忽略系统日志中的所有事件,直到发现指定的标记。如果标记包含空格,则必须括上引号以正常工作。例如:logprof -m e2ff78636296f16d0b5301209a04430d

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

默认情况下,logprof 查看 /etc/apparmor.d/ 中的配置文件并扫描 /var/log/messages 中的日志,因此在很多情况下,以 root 用户身份运行 logprof 就足以创建配置文件。

但是,您有时可能需要搜索存档的日志文件,例如程序的执行时间段超出了日志旋转窗口(日志文件已存档,新的日志文件已开始时)。在这种情况下,您可以输入 zcat -f `ls -1tr /var/log/messages*` | logprof -f -

3.5.3.6. logprof 示例 1

以下示例说明 logprof 如何寻址访问 /etc/group 文件的 httpd2-prefork。示例中使用 [] 来表示默认选项。

在本示例中,对 /etc/group 的访问是 httpd2-prefork 访问名称服务的一部分。相应的响应是 1,会导入预定义的 Novell 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 键

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

允许

允许访问指定的目录路径条目。Novell AppArmor 建议文件访问权限。有关更多信息,请参见第 3.7 节 “文件访问权限模式” (↑Novell AppArmor 2.0 管理指南)

拒绝

阻止程序访问指定目录路径条目的权限。Novell AppArmor 随后将移到下个事件上。

新建

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

通配

单击它可修改目录路径(通过使用通配符),以将建议的条目路径下的所有文件包含在内。双击它可将访问权限授予显示的目录下的所有文件和子目录。

有关通配语法的详细信息,请参见第 3.6 节 “路径名和通配” (↑Novell AppArmor 2.0 管理指南)

保留扩展名的通配

单击此选项在保留文件扩展名的情况下修改原来的目录路径。例如,/etc/apache2/file.ext 将变成 /etc/apache2/*.ext,文件名被通配符(星号)替换。这样程序就可以访问建议目录下以 .ext 为扩展名的所有文件。双击它可将访问权限授予显示的目录下的所有文件(带特定扩展名)和子目录。

编辑

允许您编辑选中的行。编辑后的新行显示在列表底部。

中止

中止 logprof,取消到目前为止输入的所有规则更改,保留所有配置文件不作修改。

完成

关闭 logprof,保留到目前为止输入的所有规则更改,修改所有配置文件。

3.5.3.7. 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 上的 vsftpd 在 /srv/ftp 中为 FTP 文件提供服务。这是因为 httpd2-prefork 使用的是 chroot,对于 chroot jail 内部的代码部分,Novell AppArmor 看到的是对 chroot 环境而言的文件访问,而非全局绝对路径。

第二个要注意的项目是您可能想要授予 FTP 读取目录中所有 JPEG 文件的权限,因此您可以使用保留扩展名的通配并使用建议的路径 /*.jpg。这样做会瓦解之前用于授予单独 .jpg 文件访问权限的所有规则,此后有关访问 .jpg 文件的所有问题都将得到回答。

最后,您可能想要将更多的通用权限授予 FTP 文件。如果在最后一个条目中选择通配,logprof 会将建议的路径 /y2k.jpg 替换为 /*。如果您想将更多的权限授予整个目录树,您可以使用新建路径选项并输入 /**.jpg(这会将权限授予整个目录树中所有的 .jpg 文件)或 /**(这会将权限授予目录树中的所有文件)。

上面处理的是读权限。写权限与此类似,不同的是您在使用写权限的常规表达式时最好更加保守。

处理执行权限较为复杂。您必须确定授予三种执行权限中的哪一种:

继承 (ix)

子程序继承父程序的配置文件,以与父程序相同的访问控制运行。当被限制的程序需要调用其它被限制的程序时此模式非常实用,无须获得目标程序配置文件的权限或失去当前配置文件的权限。此模式通常用在子程序为助手应用程序的情况下,例如使用寻呼机等小程序的 /usr/bin/mail 客户程序,或者使用 Acrobat 来显示 PDF 文件的 Mozilla 万维网浏览器。

配置文件 (px)

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

不限制 (ux)

子程序在完全没有限制的情况下运行,没有任何 Novell AppArmor 配置文件被应用到执行的资源。

下例中正在构建 /usr/bin/mail 邮件客户程序的配置文件,logprof 已发现 /usr/bin/mail 以助手应用程序的形式执行 /usr/bin/less 以“分页”长邮件消息。结果会显示以下提示:

/usr/bin/nail -> /usr/bin/less
(I)nherit / (P)rofile / (U)nconstrained / (D)eny
[Tip]提示

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

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

[Tip]提示

在 tar ball 或 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/mail/less 时,本文中的 less 程序要比不受 Novell AppArmor 保护时安全得多。

在其它情况下,您可能想要使用配置文件选项。这对 logprof 有两种影响:

  • 写入配置文件的规则是 px,它会强制转换到子程序自己的配置文件。

  • logprof 为子程序构造一个配置文件,然后开始以构建父配置文件的相同方法构建此配置文件,方法是将子进程的事件归结到子程序的配置文件并询问 logprof 用户上述问题。

最后,您可能想要通过指定无限制以授予子进程非常高的权限。这会将 ux 写入父配置文件,这样在运行子程序时不会施加任何 Novell AppArmor 配置文件。这意味着运行时不受保护,只可在万不得已的情况下使用。

3.5.3.8. apparmor.vim

vim 文本编辑器的语法颜色标记文件会用颜色突出显示 Novell AppArmor 配置文件的各种功能。使用 vim 和 vim 的 Novell AppArmor 语法模式,您可以看到通过颜色突出显示的配置文件语义指示。要使用 vim 来查看和编辑配置文件,请在终端窗口中输入 vim。

在 vim 中编辑 Novell AppArmor 配置文件时若要启用语法颜色标记,请使用 :syntax on 命令,然后使用 :set syntax=apparmor 命令。或者,您也可以在 ~/.vimrc 文件中放置以下几行:

syntax on
set modeline
set modelines=5

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

蓝色

导入其它 Novell AppArmor 规则的 #include,和以 # 开头的注释

白色

普通读权限的行

棕色

功能语句和“提示”标记

黄色

授予写权限的行

绿色

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

红色

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

红色背景

语法错误,没有正确装载到 AppArmor 模块

[Note]注意

.vimrc 文件中使用这些行时会有安全风险,因为这会造成 vim 信任您正在编辑的文件中出现的语法模式。这会使攻击者能够向您发送用 vim 开启的不安全文件。

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

3.5.3.9. 无限制

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

您必须以 root 用户身份运行 unconfined,以从 proc 文件系统中提取进程可执行链接。此程序易受以下竞态条件的影响:

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

  • 尽管不带限制运行,在装载 Novell AppArmor 配置文件之前启动的某可执行文件没有出现在输出中。

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

[Note]注意

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

有关 Novell AppArmor 科学和安全的更多信息,请参见以下文献:

SubDomain:Parsimonious Server Security,作者: Crispin Cowan、Steve Beattie、Greg Kroah-Hartman、Calton Pu、Perry Wagle 和 Virgil Gligor

介绍 Novell AppArmor 的初步设计和实施。在 2000 年 12 月在路易斯安娜州新奥尔良召开的 USENIX LISA 会议期间出版。

此文件目前已过时,说明的语法和功能不同于当前的 Novell AppArmor 产品。只可将此文件用于科研,而不能用作技术文档。

Defcon Capture the Flag:Defending Vulnerable Code from Intense Attack 作者:Crispin Cowan、Seth Arnold、Steve Beattie、Chris Wright 和 John Viega

是很好的战略和战术上的 Novell AppArmor 使用指导,可以帮助您在很短的时间内解决严重的安全问题。2003 年 4 月在华盛顿召开 DARPA Information Survivability Conference and Expo (DISCEX III) 会议期间出版