在没有 --privileged 的 docker 容器中使用 perf
Use perf inside a docker container without --privileged
我正在尝试使用 Docker 容器中的 perf 工具来记录给定的命令。
kernel.perf_event_paranoid
设置为 1,但当我不放置 --privileged
标志时,容器的行为就好像它是 2。
我可以使用 --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
(系统调用)已在 docker 中被列入黑名单:
https://docs.docker.com/engine/security/seccomp/"Docker v17.06: Seccomp security profiles for Docker"
Significant syscalls blocked by the default profile
perf_event_open
Tracing/profiling syscall, which could leak a lot of information on the host.
我的第一个解决方法是使用一个脚本来下载官方 seccomp 文件 https://github.com/moby/moby/blob/master/profiles/seccomp/default.json,并将 perf_event_open
添加到白名单系统调用列表中。
然后我开始 docker --security-opt seccomp=my-seccomp.json
运行 docker 与 --cap-add SYS_ADMIN
我正在尝试使用 Docker 容器中的 perf 工具来记录给定的命令。
kernel.perf_event_paranoid
设置为 1,但当我不放置 --privileged
标志时,容器的行为就好像它是 2。
我可以使用 --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
(系统调用)已在 docker 中被列入黑名单:
https://docs.docker.com/engine/security/seccomp/"Docker v17.06: Seccomp security profiles for Docker"
Significant syscalls blocked by the default profile
perf_event_open
Tracing/profiling syscall, which could leak a lot of information on the host.
我的第一个解决方法是使用一个脚本来下载官方 seccomp 文件 https://github.com/moby/moby/blob/master/profiles/seccomp/default.json,并将 perf_event_open
添加到白名单系统调用列表中。
然后我开始 docker --security-opt seccomp=my-seccomp.json
运行 docker 与 --cap-add SYS_ADMIN