在做了一些阅读之后,我发现Linux版本> = 3.8时通常支持Linux用户命名空间.但是,有可能在给定的OS上禁用用户命名空间,使得对内核版本的检查不可靠.有没有一种强大的方法可以检查我当前使用的操作系统是否支持用户命名空间并且可以使用它?
我需要使用开源软件对 docker 容器内的文件实施防病毒访问扫描解决方案。Clamav On-Access工作正常,但有一些要求和限制:
这个限制 - “从主机观看时,fanotify 不适用于容器事件”,真的存在还是我只是错误配置了 ClamAV?我对 fanotify 如何与命名空间一起工作没有深入的了解,但对我来说它看起来像是内核限制。
更新:是否有针对此限制的解决方法?添加/var/lib/docker/overlay2/container_id/merged是一种选择,因为动态容器性质clamd.conf需要在每个容器事件上更新。但即使添加了路径,ClamAV 也不会检测到容器中的恶意文件。
每个容器运行 ClamAV 会产生巨大的内存开销,尤其是对于小容器。
链接集合:
要与您一起创建持久名称空间,unshare请使用以下语法:
touch /root/mynetns1
unshare --net==/root/mynetns1
Run Code Online (Sandbox Code Playgroud)
要与您一起创建持久名称空间,ip请使用以下语法:
ip netns add mynetns2
Run Code Online (Sandbox Code Playgroud)
该ip命令不会列出或可以访问由 所创建的命名空间unshare,反之亦然。
该ip命令更擅长自定义网络命名空间,但该unshare命令允许您启动具有多个不同命名空间的程序。理想情况下,我会使用 来创建一个命名空间ip,但使用其他命名空间来启动该命令unshare。为此,unshare需要能够引用由 创建的命名空间ip,如何做到这一点?
现在我正在使用ip netns exec mynetns1 unshare [other namespaces] ...作为黑客,但我更喜欢使用unshare.
我还希望能够让我的程序与他们单独创建的网络命名空间进行交互,因此有关如何列出和访问其网络命名空间的信息也会很有帮助。
network-programming namespaces docker kubernetes linux-namespaces
如何将在子命名空间中创建的装载传播到父级?
我正在尝试创建一个利用overlayfs允许写入只读目录的工具.棘手的是,我希望任何用户都能够在没有root权限的情况下使用它.因此我希望这可以通过mount命名空间来实现,前提是管理员已经挂载了一个共享目录,然后任何用户都应该能够在该父树命名空间可见的树下创建一个覆盖(因此任何用户都可以登录) shell可以看到覆盖挂载).
这是我尝试过的,但不起作用:
# admin creates a shared tree for users to mount under
sudo mkdir /overlays
# bind mount over itself with MS_REC | MS_SHARED
sudo mount --bind --rshared /overlays /overlays
Run Code Online (Sandbox Code Playgroud)
假设用户想要创建覆盖/some/readonly/dir,他们应该创建/overlays/user/{upper,work,mnt}.我希望他们能够在/overlays使用以下代码传播的目录下安装叠加层.
// user_overlay.c
#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <linux/capability.h>
#include <sys/mount.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int child(void *args)
{
pid_t p;
p = mount("overlay", "/overlays/user/mnt", "overlay", 0, "lowerdir=/some/readonly/dir,upperdir=/overlays/user/upper,workdir=/overlays/user/work");
if (p …Run Code Online (Sandbox Code Playgroud) Docker 容器具有与之关联的 cgroup 和命名空间,无论它们是在 pod、虚拟机还是主机中运行。
同样,Kubernetes Pod 是否具有与其关联的命名空间和 cgroup,或者只是 pod 内的容器具有这些(cgroup 和命名空间)关联。如果他们这样做,我如何从主机那里找到这些信息?
cgroups kubernetes docker-container linux-namespaces kubernetes-pod
我正在使用linux命名空间,我注意到如果用户想要在新的网络命名空间中执行进程(不使用用户命名空间),他需要是root用户或具有该CAP_SYS_ADMIN功能.
在取消共享(2)手册页说:
CLONE_NEWNET(自Linux 2.6.24起)
该标志与clone(2)CLONE_NEWNET标志具有相同的效果.取消共享网络命名空间,以便将调用进程移动到新的网络命名空间中,该命名空间不与任何以前存在的进程共享.使用CLONE_NEWNET需要CAP_SYS_ADMIN功能.
因此,如果我想在网络沙箱中执行pdf阅读器,我必须使用user-net-namespaces或某些特权包装器.
为什么?新进程将被放置在没有接口的新网络命名空间中,因此它将与真实网络隔离,对吧?非特权非用户网络命名空间引发哪种问题/安全威胁?
使用用户命名空间时,是否可以使用从 docker 容器内的主机安装的 docker 套接字?
我有以下配置:
/etc/subuid
user:100000:65536
Run Code Online (Sandbox Code Playgroud)
/etc/subgid
user:100000:65536
Run Code Online (Sandbox Code Playgroud)
/etc/docker/daemon.json
{
"userns-remap": "ns-user"
}
Run Code Online (Sandbox Code Playgroud)
我创建了 UID 为 100000 的用户 ns-user 和 GID 为 100000 的组 ns-user。另外,我已将 ns-user 添加到组 docker。当我在主机上以 ns 用户身份登录时,我可以通过套接字使用 docker。
问题是,当我运行安装了 docker 套接字的容器时,套接字上的权限被拒绝。docker 容器内的套接字权限:
srw-rw---- 1 nobody nogroup 0 Jun 26 15:00 /var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)
编辑1:
为了澄清,我认为容器内的 root (uid 0) 映射到有权访问 docker socket 的主机上的 ns-user (uid 100000)。但事实上我的许可被拒绝了。为什么?
我不想使用 --userns=host 参数。
chroot需要CAP_SYS_CHROOT按照说明书进行。该unshare命令使用 chroot。
该命令unshare -UrR newroot/无需运行即可工作root,这是有道理的,因为该-r标志使我们root位于名称空间内,从而为我们提供了CAP_SYS_CHROOT功能。
问题开始时unshare -UR newroot/不需要运行为root,而unshare -U chroot newroot/会给我Operation not permitted错误。因此,在第一个中,我不要求位于root用户名称空间内,第二个是相同的,但尝试手动执行。
检查代码,使用时发生的唯一一件事-R是将newrootto设置为optarg,所以我无法理解为什么在一个示例中它有效,而在另一个示例中却无效。
今天在Linux内核命名空间方面遇到一些困难,特别是将唯一PID命名空间内的PID与全局PID命名空间内的PID相关联
我需要能够执行以下操作之一:
a)使用命名空间分配的PID从全局范围中终止进程
要么
b)将特定于命名空间的PID转换为全局PID,因此我可以从全局范围中删除PID
要么
c)在PID命名空间内启用进程以向我报告其全局PID,因此我可以从全局范围中终止PID
有在包含在命名空间场景的PID信息的流程结构进行一些讨论在这里.我不确定如何/如果我可以从用户态应用程序访问这些结构,或者我是否需要通过内核hack添加支持.
为什么? 我有一个当前使用网络命名空间的应用程序.我正在添加对PID命名空间的支持.以下是它目前的工作原理:
在引入PID命名空间之前: 主应用程序当前在另一个网络命名空间中启动bash控制台.然后它使用该bash控制台启动程序,并让这些程序报告其当前的PID.当主应用程序想要杀死该网络命名空间中的子进程时,它只是告诉操作系统杀死报告的PID.
使用PID命名空间(损坏状态): 主应用程序当前在另一个网络和PID命名空间中启动bash控制台.然后它使用该bash控制台启动程序,并让这些程序报告其当前的PID.但是,报告的当前PID在全局PID命名空间中无效(当全局命名空间中的PID为56000时,它可能为10).因此,主应用程序无法终止该网络+ PID命名空间中的子进程
与往常一样,任何指导表示赞赏
您将在Internet上找到的大多数Dockerfile以root身份构建和运行软件!这必须吓唬每个人,对吧?......但似乎并非如此......
所以pb是以root身份运行服务器,即使在容器中也是如此,因为容器内的root与容器外的root完全相同.
其中一个解决方案是使用"USER"指令正确构建Dockerfile,就像本例中的tor中继一样.
另一个解决方案是使用"linux用户命名空间"将容器内的UID/GID"映射"到容器外的UID/GID.例如,容器中的例外根(uid = 0)可以映射到主机内的个人用户帐户,因此在共享卷中创建的文件具有良好的权限.
所以我的问题是:Docker的安全性最佳做法是什么?以非root身份运行代码(即Dockerfile中的USER指令)?或者通过使用"用户名称空间"?或者最终(或者另外)使用selinux和/或AppArmor?
谢谢 :)
linux-namespaces ×10
linux ×6
docker ×4
c ×2
cgroups ×2
kubernetes ×2
antivirus ×1
chroot ×1
clam ×1
containers ×1
filesystems ×1
kernel ×1
linux-kernel ×1
namespaces ×1
pid ×1
sandbox ×1