Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker 从Kubernetes[Linux功能]中部署的容器执行跟踪路由时不允许执行操作_Docker_Kubernetes - Fatal编程技术网

Docker 从Kubernetes[Linux功能]中部署的容器执行跟踪路由时不允许执行操作

Docker 从Kubernetes[Linux功能]中部署的容器执行跟踪路由时不允许执行操作,docker,kubernetes,Docker,Kubernetes,为了理解Kubernetes中的安全上下文和功能,我创建了以下pod描述: apiVersion:v1 种类:豆荚 元数据: 名称:应用 规格: securityContext: runAsUser:1000 容器: -姓名:忙 图片:busybox 命令: -睡眠 - "3600" securityContext: runAsUser:2000 能力: 添加:[“网络管理员”、“系统时间”] 在这里,我添加了网络管理和系统时间功能 给定Linux功能手册页: 我希望能够执行跟踪路由或设置日

为了理解Kubernetes中的安全上下文和功能,我创建了以下pod描述:

apiVersion:v1 种类:豆荚 元数据: 名称:应用 规格: securityContext: runAsUser:1000 容器: -姓名:忙 图片:busybox 命令: -睡眠 - "3600" securityContext: runAsUser:2000 能力: 添加:[“网络管理员”、“系统时间”] 在这里,我添加了网络管理和系统时间功能

给定Linux功能手册页:

我希望能够执行跟踪路由或设置日期:

$ kubectl exec -it app -- traceroute google.fr
traceroute: socket: Operation not permitted
command terminated with exit code 1

$ kubectl exec -it app -- /bin/sh date --set="10:00:00"
date: can't set date: Operation not permitted

由于设置了正确的功能,我发现奇怪的是这些操作是不允许的。这是预期的吗?

在您使用的示例中

BusyBox的磁盘大小在1到5MB之间(取决于变体),它是制作节省空间的发行版的一个非常好的组成部分。 BusyBox将许多常见UNIX实用程序的微型版本组合到一个小型可执行文件中。它为您通常在GNU fileutils、shellutils等中找到的大多数实用程序提供了替代程序。BusyBox中的实用程序通常比其功能齐全的GNU同类程序有更少的选项。;但是,所包含的选项提供了预期的功能,其行为与GNU对应项非常相似。BusyBox为任何小型或嵌入式系统提供了一个相当完整的环境

我已经尝试在许多真实的场景中实现你想要的。老实说,您选择在这里测试
securityContext
的示例并不是最好的。我将发布相当详细的信息来说明原因

要在busybox上运行traceroute或设置日期,您需要适当的
权限
。如果您将默认的busybox pod与
root
priviligies一起使用,如下面的示例所示,它将按预期工作

apiVersion: v1
kind: Pod
metadata:
  name: app
spec:
  containers:
  - name: busy
    image: busybox
    command:
     - sleep
     - "3600"

$ kubectl exec -ti app -- traceroute bbc.com
traceroute to bbc.com (151.101.128.81), 30 hops max, 46 byte packets
 1  10.32.1.1 (10.32.1.1)  0.006 ms  0.007 ms  0.003 ms
 2  216.239.48.36 (216.239.48.36)  5.476 ms  216.239.48.74 (216.239.48.74)  5.361 ms  216.239.48.36 (216.239.48.36)  4.669 ms
 ...
$ kubectl exec -ti app -- ping bbc.com
PING bbc.com (151.101.0.81): 56 data bytes
64 bytes from 151.101.0.81: seq=0 ttl=54 time=6.246 ms
64 bytes from 151.101.0.81: seq=1 ttl=54 time=6.081 ms
要运行traceroute,您需要
sudo
privileges`。有关详细信息,请查看有关的文档

如中所述,在YAML配置中,您已设置:

echo 'apiVersion: v1
kind: Pod
metadata:
  name: app
spec:
  securityContext:
    runAsUser: 1000 ## All containers in this pod will be run as user 1000
  containers:
  - name: busy
    image: busybox
    command:
     - sleep
     - "3600"
    securityContext:
      runAsUser: 2000 ## as you specified here, as default you will enter to this container as user with ID 2000
      capabilities : 
        add: ["NET_ADMIN", "SYS_TIME"]
在上面的示例中,您已经设置了
runAsUser:1000
,这意味着这个pod中的每个容器的默认登录名都将是用户1000。 在
container spec
下,您已经设置了
runAsUser:2000
,这意味着这个特定的容器,默认情况下将作为用户2000登录

要解释谁是
用户1000
,请检查。简言之,这个数字是

请注意root用户的UID是如何为0的。大多数Linux发行版保留前100个UID供系统使用。新用户从500或1000开始分配UID。例如,Ubuntu中的新用户从1000开始

接下来我要提到的是
Linux功能

来自BusyBox的输出:

$ kubectl exec -ti app /bin/sh
/ # capsh --print
/bin/sh: capsh: not found
$ kubectl exec -ti ubuntu /bin/bash
root@ubuntu:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
...
root@ubuntu:/# capsh --print
Current: = cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap+eip
Bounding set =cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap
$ kubectl exec -ti app /bin/sh
/ # whoami
root
/ # traceroute bbc.com
traceroute to bbc.com (151.101.192.81), 30 hops max, 46 byte packets
 1  10.32.1.1 (10.32.1.1)  0.005 ms  0.006 ms  0.003 ms
 2  216.239.48.36 (216.239.48.36)  5.453 ms  216.239.48.74 (216.239.48.74)  4.812 ms  209.85.252.4 (209.85.252.4)  6.787 ms
/ # adduser test
Changing password for test
New password:
Retype password:
passwd: password for test changed by root
/ # su test
/ $ whoami
test
/ $ id
uid=1000(test) gid=1000(test) groups=1000(test)
/ $ traceroute bbc.com
traceroute: socket: Operation not permitted
Ubuntu的输出:

$ kubectl exec -ti app /bin/sh
/ # capsh --print
/bin/sh: capsh: not found
$ kubectl exec -ti ubuntu /bin/bash
root@ubuntu:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
...
root@ubuntu:/# capsh --print
Current: = cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap+eip
Bounding set =cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap
$ kubectl exec -ti app /bin/sh
/ # whoami
root
/ # traceroute bbc.com
traceroute to bbc.com (151.101.192.81), 30 hops max, 46 byte packets
 1  10.32.1.1 (10.32.1.1)  0.005 ms  0.006 ms  0.003 ms
 2  216.239.48.36 (216.239.48.36)  5.453 ms  216.239.48.74 (216.239.48.74)  4.812 ms  209.85.252.4 (209.85.252.4)  6.787 ms
/ # adduser test
Changing password for test
New password:
Retype password:
passwd: password for test changed by root
/ # su test
/ $ whoami
test
/ $ id
uid=1000(test) gid=1000(test) groups=1000(test)
/ $ traceroute bbc.com
traceroute: socket: Operation not permitted
如果您想使用capabilites,则无法使用
Busybox
实现。如果您想了解有关linxu的
traceroute
的更多信息,请查看

作为使用
traceroute
的最后一个测试,我在容器中创建了随机用户

Ubuntu(默认Ubuntu映像没有跟踪路由,需要安装它。
apt get update
更新存储库,然后
apt get install traceroute

$ kubectl exec -ti ubuntu /bin/sh
# whoami
root
# traceroute bbc.com
traceroute to bbc.com (151.101.0.81), 30 hops max, 60 byte packets
 1  10.32.1.1 (10.32.1.1)  0.032 ms  0.008 ms  0.007 ms
 2  209.85.253.197 (209.85.253.197)  6.294 ms 216.239.48.74 (216.239.48.74)  5.613 ms 216.239.48.36 (216.239.48.36)  5.335 ms
# useradd -m test    
# passwd test
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
# su test
$ whoami
test
$ id  
uid=1000(test) gid=1000(test) groups=1000(test)
$ traceroute bbc.com
traceroute to bbc.com (151.101.64.81), 30 hops max, 60 byte packets
 1  10.32.1.1 (10.32.1.1)  0.034 ms  0.008 ms  0.008 ms
 2  216.239.48.36 (216.239.48.36)  5.515 ms 216.239.51.111 (216.239.51.111)  5.494 ms 216.239.48.36 (216.239.48.36)  5.591 ms
Busybox:

$ kubectl exec -ti app /bin/sh
/ # capsh --print
/bin/sh: capsh: not found
$ kubectl exec -ti ubuntu /bin/bash
root@ubuntu:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
...
root@ubuntu:/# capsh --print
Current: = cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap+eip
Bounding set =cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap
$ kubectl exec -ti app /bin/sh
/ # whoami
root
/ # traceroute bbc.com
traceroute to bbc.com (151.101.192.81), 30 hops max, 46 byte packets
 1  10.32.1.1 (10.32.1.1)  0.005 ms  0.006 ms  0.003 ms
 2  216.239.48.36 (216.239.48.36)  5.453 ms  216.239.48.74 (216.239.48.74)  4.812 ms  209.85.252.4 (209.85.252.4)  6.787 ms
/ # adduser test
Changing password for test
New password:
Retype password:
passwd: password for test changed by root
/ # su test
/ $ whoami
test
/ $ id
uid=1000(test) gid=1000(test) groups=1000(test)
/ $ traceroute bbc.com
traceroute: socket: Operation not permitted
简而言之,要在
Busybox
中执行
traceroute
,您需要拥有
root
权限。要在
ubuntu
上运行traceroute,您必须预先安装traceroute命令


关于更改容器中的日期,请检查。

什么是用户
2000
?如果连接到pod并运行
whoami
,则无法识别该用户:
bash/$whoami whoami:unknown uid 2000
如果从pod规范中删除
runAsUser:2000
行,traceroute
将起作用。My o目标是运行跟踪路由而不是root。这就是为什么我设置了用户,但给了他NET_ADMIN的功能。我确认删除runAsUser无法使跟踪路由工作。因此,您在容器中指定了
runAsUser:2000
但是
busybox
默认没有任何具有此ID的用户。正如George Tsers提到的,这是无法识别用户,因为没有具有此ID的用户。您是否包装了自己的图像并在其中添加了用户?您是否遵循了任何教程?它是否需要是busybox图像?您是否正在使用Kubeadm、Minikube、On-Prem?我使用的是busybox图像。根据您的建议,我尝试使用busybox RUN adduser中的此图像
echo'--disabled-密码--gecos“”MYUSER-u 2000'>customBusybox.Dockerfile
。其中我定义了一个UID为2000的用户。不幸的是,在运行我的traceroute命令时,我仍然有不允许的操作:`$k exec-it app--/bin/sh/$cat/etc/passwd | grep 2000 MYUSER:x:2000:2000::/home/MYUSER:/bin/sh/$traceroute google.fr traceroute:socket:operation不允许的操作`。你有什么建议吗?我在虚拟机上设置了一个kubernetes节点并使用功能。你需要添加
NET_RAW
而不是
NET_ADMIN
。这有助于我了解更多。我同意对于busybox/alpine映像,无论功能如何,如果不是root,都不可能运行跟踪路由。但是,可以删除c但是我不完全同意你回答的最后一部分,因为看起来ubuntu映像即使在明确删除[“NET_RAW”,“NET_BIND_SERVICE”,“NET_ADMIN”],对于根用户或非根用户,我仍然可以执行跟踪路由。这里做了一些证明:你能详细说明你不同意的地方吗?在Ubuntu上,你可以作为定义的用户(示例中创建了
test
user)执行跟踪路由,而该用户没有根用户权限。我提到了默认的
Ubuntu
image我用于