对于解释型/虚拟机语言(例如 python、java、shell 脚本),是否可以将 apparmor 设置为仅限制特定脚本或程序?如果可以,如何设置?
答案1
是的,这是可能的。它也在 Ubuntu 中使用,尤其是在手机上。
要获取基本的 apparmor 脚本,您可以使用 apparmor-utils 包中的 aa-autodep。
Python 的简单示例:
cat >> ~/myapp << EOF
#! /usr/bin/python
EOF
sudo aa-autodep ~/myapp
cat /etc/apparmor.d/home.<user-name>.myapp
这会给你类似这样的结果:
# Last Modified: Mon Feb 24 18:31:50 2014
#include <tunables/global>
/home/sam/myapp flags=(complain) {
#include <abstractions/base>
#include <abstractions/python>
/home/sam/myapp r,
/usr/bin/python2.7 ix,
}
然后你可以进一步扩展它。
答案2
嗯,实际上使用“/usr/bin/python2.7 ix”并不是一个好主意。因为被利用的代码可能会从 shell 执行 python,例如:python -c 'some evil code'。
这绝对不是您想要的,并且完全破坏了沙盒概念(apparmor 是什么)。
ix
意味着继承与父配置文件相同的限制。在这种情况下,我不确定在与 /home/sam/myap 相同的限制下执行外部命令是否是个好主意。
既然我们在谈论安全性,我们应该问:为什么调用的外部命令/python/home/sam/myapp
应该能够访问、读取/写入/删除由系统创建的文件/home/sam/myapp
或系统范围的敏感文件?甚至创建与外部系统的连接?(还记得 skype 读取 /etc 下不必要的文件的旧案例吗?)
因此更安全的解决方案是使用子配置文件(subprofile)来运行外部 python 程序
#include <tunables/global>
/home/sam/myapp flags=(complain) {
#include <abstractions/base>
/home/sam/myapp r,
/usr/bin/python2.7 Cx -> trusted_domain,
profile trusted_domain {
#include <abstractions/....>
#include <abstraction/python>
/usr/bin/my-python-app r,
... your policy for data, logs, connections, python files...
}
}
答案3
我认为 yurii 可能搞混了,认为“ix”的意思是“不受约束”,也就是“Ux”或“ux”。我在这里没有看到任何通过 shell 或子进程再次启动 python 的逃逸漏洞。
有关执行标志的更多信息,请参阅https://gitlab.com/apparmor/apparmor/wikis/QuickProfileLanguage