最小化在AppArmor下运行Python所需权限的Monkeypatches
项目描述
最小化在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.uname 与 os.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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 39ef57a98397c7714e056e3c240986544f96410f0772a66c7fada6590deac9e4 |
|
MD5 | f0502aafcba486f89712f44f22023e6c |
|
BLAKE2b-256 | 2d1f287a51d78ef4db623594467881c6dda002c39fbf0021f953731af04f57bc |