当前位置: 首页 > 面试题库 >

在没有--privileged的docker容器内使用perf

栾峰
2023-03-14
问题内容

我试图在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(syscall)已在Docker中列入黑名单的事实:
https
://docs.docker.com/engine/security/seccomp/“ Docker
v17.06:Seccomp安全配置文件对于Docker”


默认配置文件阻止了大量系统调用

perf_event_open 跟踪/分析系统调用,这可能会泄漏主机上的许多信息。

我对此的第一个解决方法是拥有一个脚本,该脚本可以下载官方seccomp文件https://github.com/moby/moby/blob/master/profiles/seccomp/default.json,并将其添加perf_event_open到白名单中列出的系统调用。

然后我用 --security-opt seccomp=my-seccomp.json



 类似资料:
  • 编辑(2/19/21):自从几年前我提出这个原始问题以来,已经过去了很多时间,从那时起我看到了一系列的活动。我重新选择了一个答案,我认为它与解决这个问题的最本地化和最安全的选项一致(通常与docker compose相关)。虽然docker引入了命令,但这通常是一个危险的操作,我会谨慎使用,因为您可能会无意中影响机器上的其他应用程序或设置 我在使用Docker 1.9删除Docker卷时遇到问题。

  • 问题内容: 我首先得到了我的nginx码头工人形象: 然后我开始了: 然后我停止了它: 然后我尝试重新启动它: 好吧,这是一个错误。但实际上,现在容器列表中没有任何内容: 为什么重启nginx镜像失败?如何解决? 问题答案: 这是因为 您已使用开关。 容器已停止且未移除 你发现它停止了 您可以使用以下命令简单地启动它: 编辑:替代方法 如果您想每次使用以下命令启动容器, 然后使用以下之一: 方法1

  • 问题内容: 我有一个Wordpress / MySQL docker容器,用于开发主题和插件。我在localhost:8000上访问它。 它使用了Gulp构建过程,我正在尝试将browsersync添加到组合中。我很难让browsersync真正代理出容器。从Gulp输出中,我可以看到它正在生成更改,只是实际上并未在浏览器中进行任何更改。 这是我的docker-compose.yml,gulpfi

  • 问题内容: 我的工作正常,但现在停止了。我尝试了以下命令,但无济于事: -在主机和容器上 我所得到的是。Docker版本0.7.0 有任何想法吗? PS也禁用 问题答案: 遵循以下建议进行修复: […]您可以尝试重设所有内容吗? 它将迫使docker重新创建网桥并重新初始化所有网络规则 https://github.com/dotcloud/docker/issues/866#issuecomme

  • 我让它正常工作,但现在它停止了。我尝试了以下命令,但没有用: -在主机和容器上 我得到的是未知主机google。com。Docker版本0.7.0 有什么想法吗? P、 S.ufw也被禁用

  • 问题内容: 我要完成的工作是在已经使用Ansible在Digital Ocean Ubuntu / Docker Droplet上创建的Docker容器内运行命令。 似乎找不到任何东西,或者我主要是缺少一些东西。这是我在剧本中完成的任务。我对Ansible非常陌生,因此任何建议或智慧都将不胜感激。 问题答案: 您应该能够使用以下命令执行脚本(包含命令序列): 应该可以通过Ansible流程访问。