第 11 章 阻止和允许使用fapolicyd的应用程序。

根据规则集设置并执行允许或拒绝应用程序执行的策略,有效地防止未知和潜在恶意软件的执行。

11.1. Fapolicyd简介

fapolicyd软件框架根据用户定义的策略来控制应用程序的执行。这是防止在系统上运行不受信任的、可能是恶意的应用程序的最有效方法之一。

fapolicyd 框架提供以下组件。

  • fapolicyd 服务
  • fapolicyd 命令行工具
  • fapolicyd YUM插件
  • fapolicyd 规则语言

管理员可以为任何应用程序定义允许拒绝执行规则,并可以根据路径、哈希、MIME类型或信任进行审计。

fapolicyd 框架引入了信任的概念。当一个应用程序被系统包管理器正确安装时,它就被信任了,因此它被注册在系统RPM数据库中。fapolicyd 守护进程使用 RPM 数据库作为受信任的二进制文件和脚本的列表。fapolicyd YUM 插件注册任何由 YUM 包管理器处理的系统更新。该插件会通知fapolicyd守护进程关于该数据库的变化。

使用rpm工具安装需要手动刷新数据库,而其他添加应用程序的方式则需要创建自定义规则并重新启动fapolicyd服务。

fapolicyd 服务配置位于 /etc/fapolicyd/ 目录中,结构如下。

  • fapolicyd.rules 文件包含了允许拒绝执行规则。
  • fapolicyd.conf文件包含守护进程的配置选项。这个文件主要用于性能调整的目的。

其它资源

  • 请参阅 fapolicyd(8),fapolicyd.rule(5)fapolicyd.conf(5)联机手册了解更多信息。

11.2. 部署fapolicyd

要在RHEL中部署fapolicyd框架。

流程

  1. 安装fapolicyd软件包。

    # yum install fapolicyd
  2. 启用并启动fapolicyd服务。

    # systemctl enable --now fapolicyd

验证步骤

  1. 验证fapolicyd服务是否正确运行。

    # systemctl status fapolicyd
    ● fapolicyd.service - File Access Policy Daemon
       Loaded: loaded (/usr/lib/systemd/system/fapolicyd.service; enabled; vendor p>
       Active: active (running) since Tue 2019-10-15 18:02:35 CEST; 55s ago
      Process: 8818 ExecStart=/usr/sbin/fapolicyd (code=exited, status=0/SUCCESS)
     Main PID: 8819 (fapolicyd)
        Tasks: 4 (limit: 11500)
       Memory: 78.2M
       CGroup: /system.slice/fapolicyd.service
               └─8819 /usr/sbin/fapolicyd
    
    Oct 15 18:02:35 localhost.localdomain systemd[1]: Starting File Access Policy D>
    Oct 15 18:02:35 localhost.localdomain fapolicyd[8819]: Initialization of the da>
    Oct 15 18:02:35 localhost.localdomain fapolicyd[8819]: Reading RPMDB into memory
    Oct 15 18:02:35 localhost.localdomain systemd[1]: Started File Access Policy Da>
    Oct 15 18:02:36 localhost.localdomain fapolicyd[8819]: Creating database
  2. 以无root权限的用户登录,检查fapolicyd是否正常工作,例如。

    $ cp /bin/ls /tmp
    $ /tmp/ls
    bash: /tmp/ls: Operation not permitted

11.3. 使用额外的信任来源将文件标记为受信任的文件。

您可以使用此过程为fapolicyd使用额外的信任源。在RHEL 8.3之前,fapolicyd只信任RPM数据库中的文件。fapolicyd 框架现在也支持使用 /etc/fapolicyd/fapolicyd.trust 纯文本文件作为信任源。你可以直接用文本编辑器或通过fapolicydCLI命令修改fapolicyd.trust

注意

倾向于使用fapolicyd.trust将文件标记为受信任,而不是编写自定义的fapolicyd规则。

先决条件

  • fapolicyd 框架部署在您的系统上。

流程

  1. 将你的自定义二进制文件复制到所需的目录中,例如。

    $ cp /bin/ls /tmp
    $ /tmp/ls
    bash: /tmp/ls: Operation not permitted
  2. 将您的自定义二进制标记为可信。

    # fapolicyd-cli --file add /tmp/ls

    注意,前面的命令在/etc/fapolicyd/fapolicyd.trust中添加相应的行。

  3. 重新启动fapolicyd

    # systemctl restart fapolicyd

验证步骤

  1. 检查你的自定义二进制现在可以执行,例如。

    $ /tmp/ls
    ls

其它资源

  • 更多信息请参见fapolicyd.trust(5)man 页面。

11.4. 为fapolicyd添加自定义允许和拒绝规则。

fapolicyd 包中的默认规则集不影响系统功能。对于自定义的场景,例如将二进制文件和脚本存储在非标准目录中,或者在没有yumrpm安装程序的情况下添加应用程序,你必须修改现有的或添加新的规则。下面的步骤演示了添加一个新的规则以允许自定义二进制。

先决条件

  • fapolicyd 框架部署在您的系统上。

流程

  1. 将你的自定义二进制文件复制到所需的目录中,例如。

    $ cp /bin/ls /tmp
    $ /tmp/ls
    bash: /tmp/ls: Operation not permitted
  2. 停止fapolicyd服务。

    # systemctl stop fapolicyd
  3. 使用调试模式来确定相应的规则。因为fapolicyd --debug命令的输出是冗长的,你只能通过按下 Ctrl+C或杀死相应的进程,将错误输出重定向到一个文件。

    # fapolicyd --debug 2> fapolicy.output &
    [1] 51341

    另外,你也可以在另一个终端中运行fapolicyd调试模式。

  4. 重复未被允许的命令。

    $ /tmp/ls
    bash: /tmp/ls: Operation not permitted
  5. 在前台恢复调试模式并按下 Ctrl+C:

    # fg
    fapolicyd --debug
    ^Cshutting down...
    Inter-thread max queue depth 1
    Allowed accesses: 2
    Denied accesses: 1
    [...]

    或者,杀死fapolicyd调试模式的进程。

    # kill 51341
  6. 找到一个拒绝执行你的申请的规则。

    # cat fapolicy.output
    [...]
    rule:9 dec=deny_audit perm=execute auid=1000 pid=51362 exe=/usr/bin/bash : file=/tmp/ls ftype=application/x-executable
    [...]
  7. /etc/fapolicyd/fapolicyd.rules 文件中拒绝执行自定义二进制文件的规则添加一个新的 allow 规则。上一条命令的输出表明,该规则是本例中的规则号9

    allow perm=execute exe=/usr/bin/bash trust=1 : path=/tmp/ls ftype=application/x-executable trust=0

    另外,你也可以在/etc/fapolicyd/fapolicyd.rule文件中添加以下规则,允许执行/tmp目录下的所有二进制文件。

    allow perm=execute exe=/usr/bin/bash trust=1 : dir=/tmp/ all trust=0
  8. 为了防止您的自定义二进制的内容发生变化,请使用SHA-256校验和定义所需的规则。

    $ sha256sum /tmp/ls
    780b75c90b2d41ea41679fcb358c892b1251b68d1927c80fbc0d9d148b25e836  ls

    将该规则改为以下定义:

    allow perm=execute exe=/usr/bin/bash trust=1 : sha256hash=780b75c90b2d41ea41679fcb358c892b1251b68d1927c80fbc0d9d148b25e836
  9. 启动fapolicyd服务。

    # systemctl start fapolicyd

验证步骤

  1. 检查你的自定义二进制现在可以执行,例如。

    $ /tmp/ls
    ls

其它资源

  • 更多信息请参见fapolicyd.trust(5)man 页面。

11.6. 其它资源

  • 更多信息请参见使用man -k fapolicyd 命令列出的 fapolicyd 相关 man 页面。
  • FOSDEM 2020 fapolicyd 演示提供了几个添加自定义 fapolicyd 规则的例子。

为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。