在尝试为我的 python-flask 应用程序(通过 gunicorn 执行)编写 apparmor 配置文件时,我无法让 aa-logprof 询问我有关所有依赖项的信息。
如果在抱怨模式下,应用程序按预期工作,但 aa-logprof 没有提出更多建议(请参阅本帖最后的完整配置文件)。我读到的所有地方,人们似乎都声称 aa-logprof 应该询问所有依赖项,它从 /var/log/syslog 本身读取。如果我切换到 aa-enforce,应用程序将失败并死机。跟踪系统日志显示网络被拒绝,这当然是因为 aa-logprof 没有询问我。我的问题不是我如何为应用程序启用网络,而是我的方法有什么不正确,因为我没有被询问所有依赖项?
当抱怨时,网络内容是允许的(并且 logprof 不会问我有关它?!)
Feb 22 20:54:40 devshed kernel: [7991608.610578] type=1400 audit(1424634880.675:68975): apparmor="ALLOWED" operation="accept" profile="/usr/local/bin/gunicorn" pid=2350 comm="gunicorn" laddr=127.0.0.1 lport=5000 family="inet" sock_type="stream" protocol=6
Feb 22 20:54:40 devshed kernel: [7991608.716887] type=1400 audit(1424634880.783:68976): apparmor="ALLOWED" operation="accept" profile="/usr/local/bin/gunicorn" pid=2353 comm="gunicorn" laddr=127.0.0.1 lport=5000 family="inet" sock_type="stream" protocol=6
强制执行时,网络内容被拒绝(并且 logprof 也不会询问我有关它?)
Feb 22 20:41:04 devshed kernel: [7990792.228716] type=1400 audit(1424634064.295:68737): apparmor="DENIED" operation="create" profile="/usr/local/bin/gunicorn" pid=2162 comm="gunicorn" family="inet" sock_type="stream" protocol=0
/usr/local/bin/gunicorn {
#include <abstractions/base>
#include <abstractions/bash>
#include <abstractions/python>
/bin/dash rix,
/bin/uname rix,
/etc/nsswitch.conf r,
/etc/services r,
/proc/*/mounts r,
/sbin/ldconfig rix,
/sbin/ldconfig.real rix,
/usr/bin/python2.7 ix,
/usr/local/bin/ r,
/usr/local/bin/gunicorn r,
/usr/share/mysql/charsets/Index.xml r,
/tmp/* rw,
/var/tmp/* a,
/var/www/api/app.log w,
/var/www/api/app/* r,
/var/www/api/* a,
}
答案1
我不认为这是你的错。apparmor-utils 的 2.8.98-0ubuntu2 版本(Ubuntu 14.10 中提供)似乎存在错误。aa-genprof 经常崩溃(python 错误),我注意到 aa-logprof 也有类似你描述的行为。它满足了一些规则,但其他规则似乎被遗漏了。
希望下一版本会更好。新版本已经发布,只是尚未包含。
顺便说一句,aa-genprof 中的崩溃与您发布的类似的套接字规则有关,所以我怀疑日志解析器存在一些问题。