我有一个运行 MySQL 的 Docker 容器 (LXC)。由于 Docker 背后的想法通常是“每个容器一个正在运行的进程”,因此如果我定义针对 MySQL 二进制文件的 AppArmor 配置文件,它们会被强制执行吗?有没有办法让我测试一下?
答案1
首先,cgroup 不用于将应用程序与系统上的其他应用程序隔离。它们用于管理资源使用和设备访问。各种命名空间(PID、UTS、挂载、用户...)提供了一些(有限的)隔离。
此外,在 Docker 容器内启动的进程可能无法管理其运行的 AppArmor 配置文件。目前采取的方法是在启动容器之前设置特定的 AppArmor 配置文件。
看起来Docker中的libcontainer执行驱动支持为容器设置 AppArmor 配置文件,但我在文档中找不到任何示例或参考。
显然 AppArmor 也支持Ubuntu 中的 LXC。
您应该为您的应用程序编写一个 AppArmor 配置文件,并确保 LXC/libcontainer/Docker/... 在启动容器内的进程之前加载它。
应该强制执行以这种方式使用的配置文件,并且为了测试它,您应该尝试非法访问并确保它失败。
在这种情况下,二进制文件和实际执行的配置文件之间没有链接。您必须明确告诉 Docker/LXC 在您的容器中使用此配置文件。为 MySQL 二进制文件编写配置文件只会在主机上强制执行,而不会在容器中执行。
答案2
答案很可能是:不会。
这Ubuntu 服务器指南主题 LXC几乎讨论了您的确切问题并做出以下声明:
容器中的程序无法进一步受到限制 - 例如,MySQL 在容器配置文件下运行(保护主机),但无法进入 MySQL 配置文件(保护容器)。
避免利用产生不良影响的更好选择是限制运行容器的用户并使用利用用户名内核的特性。但是,docker
据我所知,目前不支持userns
.
在这种情况下,从主机的角度来看,MySQL 将以非特权用户身份运行,而在容器内它可以以root
.如果需要,您可以将iptables
MySQL 绑定到主机的外部端口。