跳转到主要内容

最小化在AppArmor下运行Python所需权限的Monkeypatches

项目描述

https://codecov.io/github/Jc2k/apparmor_monkeys/coverage.svg?branch=master

最小化在AppArmor下运行Python所需权限的Monkeypatches。

这是做什么的?

想象一下,你已经编写了一个简单的Django应用程序。也许你只是遵循了Django教程。你的所有代码只是进行一些数据库查询。然后你将其部署到AppArmor下,

type=AVC msg=audit(1443087838.797:1078): apparmor="DENIED" operation="exec" profile="helloworld-application" name="/bin/dash" pid=8202 comm="python" requested_mask="x" denied_mask="x" fsuid=999 ouid=0

突然间,你的审计日志充满了抱怨你的应用程序试图运行shell的消息。你肯定没有编写这样的代码。发生了什么事?你被黑客攻击了吗?

你没有(可能吧;)被黑客攻击。

实际上,Python在执行一些相当普通的事情时会调用shell。

  • 你可以忽略它。让你的审计日志有拒绝条目,你不得不忽略它们。现在很难在监控中找到可疑行为。可能有问题,也可能没问题。希望你不需要让安全专家检查那个日志。

  • 允许它。现在您的配置文件比所需的更广。您正在丢弃最初获得的安全。希望您不需要让安全专家查看该配置文件。

此包修复了几个stdlib API,以避免使用 subprocess,让您保持简单的配置文件和干净的审计日志。

ctypes 与 ldconfig

我首先注意到应用程序尝试运行 gcc。这实际上是当早期尝试运行 ldconfig 失败时的回退。

这实际上是 ctypes.util.find_library 的工作方式。可以在几个地方使用它

  • Gunicorn 使用它来实现 sendfile。

  • Python 的 uuid 模块用于 uuid4。只需导入 uuid 模块就会触发它,即使您没有使用 uuid4

platform.uname 与 os.uname

platform.unameos.uname 大致相同,但有一个额外的字段。该字段通过执行 uname -p 来获取。

sh -c "uname %s 2>%s"

这在几个地方被使用

  • 获取您自己的版本号的一个命令技巧是 pkg_resources.require('myapp')[0].version,这会触发它。

  • Gunicorn 通过在 gunicorn.workers.workertmp 中的 platform.system() 之前加载您的代码来触发它。

激活猴子补丁

手动

尽可能早地在您的代码中执行

from apparmor_monkeys import patch_modules
patch_modules()

通过 .pth 钩子自动

并且 site-packages 目录会扫描 .pth 文件。这些文件将按顺序处理,通常只是添加到 sys.path 的路径列表。然而,任何 import 行都将被尊重。

在您的虚拟环境 site-packages 目录中创建一个 apparmor-monkeys.pth,包含以下内容

import apparmor_monkeys; apparmor_monkeys.patch_modules()

为了使这个技巧生效,它必须位于单独的一行上。

切换配置文件

您可以使用 change_profile 进一步强化您的 AppArmor 配置文件,在初始化您的应用程序后切换到不同的配置文件。

如果您使用的是多进程 gunicorn(即同步 gunicorn),则可以将您的工作进程包裹在其自己的特定配置文件中。在您的 gunicorn 配置中,您可以添加一个钩子来完成此操作

from apparmor_monkeys import change_profile

def post_fork(server, worker):
    change_profile("myapplication//worker")

您也可以对 celery 做同样的事情

from apparmor_monkeys import change_profile
from celery import signals

@signals.worker_process_init.connect
def switch_apparmor_profile(sender=None, signal=None):
    change_profile("tenselfservice-worker//worker")

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分布

apparmor_monkeys-0.0.1.zip (8.1 kB 查看哈希值)

上传时间 源代码

由以下支持