我试图在Docker容器中使用perf工具来记录给定命令。
kernel.perf_event_paranoid设置为1,但是当我不放置该--privileged标志时,容器的行为就像是2 。
kernel.perf_event_paranoid
--privileged
我可以使用--privileged,但是我在perf上运行的代码是不可信的,并且如果我可以通过允许使用perf工具承担一点安全风险,那么在容器上赋予特权权限似乎具有不同的风险级别。
还有其他使用容器内部perf的方法吗?
~$ docker version Client: Version: 17.03.1-ce API version: 1.27 Go version: go1.7.5 Git commit: 7392c3b/17.03.1-ce Built: Tue May 30 17:59:44 2017 OS/Arch: linux/amd64 Server: Version: 17.03.1-ce API version: 1.27 (minimum version 1.12) Go version: go1.7.5 Git commit: 7392c3b/17.03.1-ce Built: Tue May 30 17:59:44 2017 OS/Arch: linux/amd64 Experimental: false ~$ cat /proc/sys/kernel/perf_event_paranoid 1 ~$ perf record ./my-executable perf_event_open(..., PERF_FLAG_FD_CLOEXEC) failed with unexpected error 1 (Operation not permitted) perf_event_open(..., 0) failed unexpectedly with error 1 (Operation not permitted) Error: You may not have permission to collect stats. Consider tweaking /proc/sys/kernel/perf_event_paranoid: -1 - Not paranoid at all 0 - Disallow raw tracepoint access for unpriv 1 - Disallow cpu events for unpriv 2 - Disallow kernel profiling for unpriv
经过研究,问题不在于perf_event_paranoid,而是perf_event_open(syscall)已在Docker中列入黑名单的事实: https ://docs.docker.com/engine/security/seccomp/“ Docker v17.06:Seccomp安全配置文件对于Docker”
perf_event_paranoid
perf_event_open
默认配置文件阻止了大量系统调用 perf_event_open 跟踪/分析系统调用,这可能会泄漏主机上的许多信息。
默认配置文件阻止了大量系统调用
perf_event_open 跟踪/分析系统调用,这可能会泄漏主机上的许多信息。
我对此的第一个解决方法是拥有一个脚本,该脚本可以下载官方seccomp文件https://github.com/moby/moby/blob/master/profiles/seccomp/default.json,并将其添加perf_event_open到白名单中列出的系统调用。
然后我用 --security-opt seccomp=my-seccomp.json
--security-opt seccomp=my-seccomp.json