k8s中容器权限问题

问题1

在容器内strace/gdb一个进程报错:

operation not permitted

这涉及到ptrace系统调用的权限问题,默认容器是没有权限去ptrace进程的。

这个问题需要通过给容器提权才能解决,在K8S中需要给container级别增加如下选项:

      containers:
      - name: xxx
        image: xxx.com/php/zhongce_v2:a382ecfa39d16391bc91f2036437906ef97c875e-1553052454
        securityContext:
          capabilities:
            add: ["SYS_PTRACE"]
      containers:
      - name: xxx
        image: xxx.com/php/zhongce_v2:a382ecfa39d16391bc91f2036437906ef97c875e-1553052454
        securityContext:
          capabilities:
            add: ["SYS_PTRACE"]

注意,securityContext.capabilities选项只能在container级别生效,不能配置到POD级别。

capabilities还包括一些其他权限,另外也有平行于capabilities的其他选项可以配置,可以进一步学习:https://kubernetes.io/docs/tasks/configure-pod-container/security-context/。

问题2

因为容器内的程序用到了大量的systemV信号量,需要通过sysctl命令调大阀值。

直接在容器里调整是被禁止的:

sysctl kernel.sem=”1034 32000 100 1000″

sysctl: setting key “kernel.sem”: Read-only file system

对于如下的sysctl配置:

kernel.shm*,
kernel.msg*,
kernel.sem,
fs.mqueue.,
net.
.
允许在POD级别指定securityContext生效,但是前提是在kubelet启动参数中进行授权,比如:

kubelet –allowed-unsafe-sysctls kernel.sem

然后就可以在POD级进行sysctl修改,生效到POD下的所有容器:

    metadata:
      labels:
        app: xxxx
    spec:
      securityContext:
        sysctls:
        - name: kernel.sem
          value: "1034 32000 100 1000"
    metadata:
      labels:
        app: xxxx
    spec:
      securityContext:
        sysctls:
        - name: kernel.sem
          value: "1034 32000 100 1000"

然后在容器里观察一下,已经生效:

[root@zhongce-85d55fd5b5-hrwbs ~]# sysctl -a|grep sem
kernel.sem = 1034	32000	100	1000
kernel.sem_next_id = -1

[root@zhongce-85d55fd5b5-hrwbs ~]# sysctl -a|grep sem
kernel.sem = 1034	32000	100	1000
kernel.sem_next_id = -1

K8S调整sysctl的官方文档:https://kubernetes.io/zh/docs/tasks/administer-cluster/sysctl-cluster/。

更多的POD级securityContext参考官方文档:https://kubernetes.io/docs/concepts/policy/pod-security-policy/。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Kubernetes(k8s)集群容器默认是以非特权(non-privileged)模式运行的,这意味着容器内的进程没有足够的权限来执行一些特权操作,例如访问主机的设备或文件系统等。但是,如果您需要在容器内执行一些特权操作,可以考虑以下几种方法: 1. 在容器使用特权模式(privileged mode):在Pod的容器规范(spec)设置“securityContext.privileged”为true,这将使容器运行在特权模式下,具有与主机相同的权限。但是,这种方法存在一定的安全风险,因为容器内的进程可以直接访问主机的资源和设备。 2. 添加容器级别的特权:在Pod的容器规范设置“securityContext.capabilities.add”字段,可以为容器添加特定的特权。例如,您可以为容器添加SYS_ADMIN特权,以便在容器内执行一些管理员级别的操作。 3. 使用安全上下文(Security Context):在Pod或容器规范设置“securityContext”字段,可以为容器指定一些安全上下文,例如“runAsUser”和“runAsGroup”,以指定容器内的进程运行的用户和组。这可以帮助限制容器内进程的权限。 4. 使用Pod级别的特权:在Pod规范设置“securityContext.hostNetwork”为true,可以使Pod与主机共享网络命名空间,从而容器可以访问主机上的网络设备。 需要注意的是,在使用特权模式或添加特权时,需要对容器内的进程进行严格的访问控制和安全审计,以确保容器不会被利用来攻击主机或其他容器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值