由于超出这个问题范围的不便原因,我必须tcpdump
从 Python 脚本中运行。我目前只是打电话subprocess.Popen(['tcpdump', ...)
,一切正常。但是,当我使用 pyInstaller 等工具将脚本打包成可执行文件并运行它(以 root 身份)时,出现以下错误:
tcpdump: error while loading shared libraries: libcrypto.so.0.9.8: "failed to map segment from shared object: Permission denied"
据我所知,这是 AppArmor 的抱怨。现在,我可以轻松地将对 tcpdump 的调用替换为以下内容:
subprocess.call(['aa-complain', '/usr/sbin/tcpdump'])
pcap = subprocess.Popen(['tcpdump', ...)
subprocess.call(['aa-enforce', '/usr/sbin/tcpdump'])
现在它打印两条信息行(关于更改为抱怨/强制模式),并运行 tcpdump 而不会进一步抱怨。
运行这个脚本的人在想要捕获数据包时会以 root 身份运行它,所以我不明白这是一个安全问题。同时,上面的内容对我来说似乎很老套。那么对于你们当中的 AppArmor 专家来说:这是处理这个问题的规范方法吗?
附言。我还感谢您提供了有关 AppArmor 的良好、快速介绍的链接,因为这是我第一次遇到这种情况。
答案1
好吧,如果您还没有浏览过的话,这应该是一个开始:https://help.ubuntu.com/community/AppArmor