应用部署、运行与管理(二)

管理容器进程的运行身份:

 

示例:

下面的资源配置清单securitycontext-runasuser-httpd.yaml配置以这个UID和GID的身份来运行这个httpd应用,考虑到非特权用户默认无法使用1024以下的端口号,文件中通过环境变量env 改变了应用监听端口

 

[root@k8s-master01 yaml]# cat securitycontext-runasuser-demo.yaml

apiVersion: v1
kind: Pod
metadata:
  name: securitycontext-runasuser-demo
  namespace: dev
spec:
  containers:
  - name: demo
    image: ikubernetes/demoapp:v1.0
    imagePullPolicy: Always
    env:
    - name: PORT
      value: "8080"
    securityContext:
      runAsUser: 1001
      runAsGroup: 1001

 

[root@k8s-master01 yaml]# kubectl apply -f securitycontext-runasuser-demo.yaml -n dev
pod/securitycontext-runasuser-demo created

 

[root@k8s-master01 yaml]# kubectl exec securitycontext-runasuser-demo -- ps aux
Error from server (NotFound): pods "securitycontext-runasuser-demo" not found
[root@k8s-master01 yaml]# kubectl exec securitycontext-runasuser-demo -n dev -- ps aux
PID   USER     TIME  COMMAND
    1 1001      0:00 python3 /usr/local/bin/demo.py
    8 1001      0:00 ps aux
[root@k8s-master01 yaml]# kubectl exec securitycontext-runasuser-demo -n dev -- id
uid=1001 gid=1001

 查看容器日志:

[root@k8s-master01 yaml]# kubectl logs securitycontext-runasuser-demo -n dev
* Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)

 

在容器中额外运行其他程序:(kubectl exec命令)

查看端口、查看id等如上代码

 

自定义容器应用与参数

容器镜像启动容器时运行的默认程序由其Dockerfile文件中的ENTRYPOINT指令进行定义,传递给程序的参数则通过CMD指令设定,ENTRYPOINT指令不存在时,CMD可以同时指定程序与参数。

要了解镜像的ENTRYPOINT与CMD,可以在任何存在此镜像的节点执行类似如下命令:

[root@k8s-master01 ~]# docker pull ikubernetes/demoapp:v1.0
v1.0: Pulling from ikubernetes/demoapp
c9b1b535fdd9: Pull complete
3cbce035cd7c: Pull complete
b83463f478a5: Pull complete
34b1f286d5e2: Pull complete
Digest: sha256:6698b205eb18fb0171398927f3a35fe27676c6bf5757ef57a35a4b055badf2c3
Status: Downloaded newer image for ikubernetes/demoapp:v1.0
docker.io/ikubernetes/demoapp:v1.0
[root@k8s-master01 ~]# docker inspect ikubernetes/demoapp:v1.0 -f {{.Config.Entrypoint}}
[/bin/sh -c python3 /usr/local/bin/demo.py]
[root@k8s-master01 ~]# docker inspect ikubernetes/demoapp:v1.0 -f {{.Config.Cmd}}
[]

 下面资源配置清单pod-demo-with-cmd-and-args.yaml  文件将镜像ikubernetes/demoapp:v1.0 d 默认应用程序修改为/bin/sh -c,然后程序的参数定义为python3 /usr/local/bin/demo.py -p 8081

[root@k8s-master01 yaml]# cat pod-demo-with-cmd-and-args.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-demo-with-cmd-and-args
  namespace: dev
spec:
  containers:
  - name: demo
    image: ikubernetes/demoapp:v1.0
    imagePullPolicy: IfNotPresent
    command: ["/bin/sh","-c"]
    args: ["python3 /usr/local/bin/demo.py -p 8081"]
[root@k8s-master01 yaml]# kubectl apply -f pod-demo-with-cmd-and-args.yaml -n dev
pod/pod-demo-with-cmd-and-args created
[root@k8s-master01 yaml]# kubectl get pods -n dev
NAME                             READY   STATUS    RESTARTS   AGE
pod-demo-with-cmd-and-args       1/1     Running   0          10s
pod-nginx-68dc879f46-fcwxh       1/1     Running   0          31h
pod-nginx-68dc879f46-htp2z       1/1     Running   0          31h
pod-nginx-68dc879f46-kzhb5       1/1     Running   0          31h
pod-nginx-68dc879f46-rblxg       1/1     Running   0          31h
pod-using-hostnetwork            1/1     Running   0          28h
pod-using-hostport               1/1     Running   0          29h
securitycontext-runasuser-demo   1/1     Running   0          25h

[root@k8s-master01 yaml]# kubectl exec pod-demo-with-cmd-and-args -n dev -- netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:8081 0.0.0.0:* LISTEN

端口已经改为8081了

 

管理容器的内核功能

linux内核常用功能如下:
从2.1版开始,Linux内核有了能力(capability)的概念,即它打破了UNIX/LINUX操作系统中超级用户/普通用户的概念,由普通用户也可以做只有超级用户可以完成的工作.
Capabilities的主要思想在于分割root用户的特权,即将root的特权分割成不同的能力,每种能力代表一定的特权操作。例如:能力CAP_SYS_MODULE表示用户能够加载(或卸载)内核模块的特权操作,而CAP_SETUID表示用户能够修改进程用户身份的特权操作。在Capbilities中系统将根据进程拥有的能力来进行特权操作的访问控制。
    在Capilities中,只有进程和可执行文件才具有能力,每个进程拥有三组能力集,分别称为cap_effective, cap_inheritable, cap_permitted(分别简记为:pE,pI,pP),其中cap_permitted表示进程所拥有的最大能力集;cap_effective表示进程当前可用的能力集,可以看做是cap_permitted的一个子集;而cap_inheitable则表示进程可以传递给其子进程的能力集。系统根据进程的cap_effective能力集进行访问控制,cap_effective为cap_permitted的子集,进程可以通过取消cap_effective中的某些能力来放弃进程的一些特权。可执行文件也拥有三组能力集,对应于进程的三组能力集,分别称为cap_effective, cap_allowed 和 cap_forced(分别简记为fE,fI,fP),其中,cap_allowed表示程序运行时可从原进程的cap_inheritable中集成的能力集,cap_forced表示运行文件时必须拥有才能完成其服务的能力集;而cap_effective则表示文件开始运行时可以使用的能力。


各种能力:
CAP_CHOWN:修改文件属主的权限
CAP_DAC_OVERRIDE:忽略文件的DAC访问限制
CAP_DAC_READ_SEARCH:忽略文件读及目录搜索的DAC访问限制
CAP_FOWNER:忽略文件属主ID必须和进程用户ID相匹配的限制
CAP_FSETID:允许设置文件的setuid位
CAP_KILL:允许对不属于自己的进程发送信号
CAP_SETGID:允许改变进程的组ID
CAP_SETUID:允许改变进程的用户ID
CAP_SETPCAP:允许向其他进程转移能力以及删除其他进程的能力
CAP_LINUX_IMMUTABLE:允许修改文件的IMMUTABLE和APPEND属性标志
CAP_NET_BIND_SERVICE:允许绑定到小于1024的端口
CAP_NET_BROADCAST:允许网络广播和多播访问
CAP_NET_ADMIN:允许执行网络管理任务
CAP_NET_RAW:允许使用原始套接字
CAP_IPC_LOCK:允许锁定共享内存片段
CAP_IPC_OWNER:忽略IPC所有权检查
CAP_SYS_MODULE:允许插入和删除内核模块
CAP_SYS_RAWIO:允许直接访问/devport,/dev/mem,/dev/kmem及原始块设备
CAP_SYS_CHROOT:允许使用chroot()系统调用
CAP_SYS_PTRACE:允许跟踪任何进程
CAP_SYS_PACCT:允许执行进程的BSD式审计
CAP_SYS_ADMIN:允许执行系统管理任务,如加载或卸载文件系统、设置磁盘配额等
CAP_SYS_BOOT:允许重新启动系统
CAP_SYS_NICE:允许提升优先级及设置其他进程的优先级
CAP_SYS_RESOURCE:忽略资源限制
CAP_SYS_TIME:允许改变系统时钟
CAP_SYS_TTY_CONFIG:允许配置TTY设备
CAP_MKNOD:允许使用mknod()系统调用
CAP_LEASE:允许修改文件锁的FL_LEASE标志

 

下面的配置清单

securitycontext-capabilities-demo.yaml 文件在安全上下文启用了内核功能NET_ANMIN,并且禁用了CHOWN.demo容器未定义USER指令,所有默认用root身份运行容器
[root@k8s-master01 yaml]# cat securitycontext-capabilities-demo.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: securitycontext-capabilities-demo
  namespace: dev
spec:
  containers:
  - name: demo
    image: ikubernetes/demoapp:v1.0
    imagePullPolicy: IfNotPresent
    command: ["/bin/sh","-c"]
    args: ["/sbin/iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80 && /usr/bin/python3 /usr/local/bin/demo.py"]
    securityContext:
      capabilities:
        add: ["NET_ADMIN"]
        drop: ["CHOWN"]

[root@k8s-master01 yaml]# kubectl apply -f securitycontext-capabilities-demo.yaml -n dev
pod/securitycontext-capabilities-demo created
[root@k8s-master01 yaml]# kubectl get pods -n dev
NAME                                READY   STATUS              RESTARTS   AGE
pod-demo-with-cmd-and-args          1/1     Running             0          35m
pod-nginx-68dc879f46-fcwxh          1/1     Running             0          32h
pod-nginx-68dc879f46-htp2z          1/1     Running             0          32h
pod-nginx-68dc879f46-kzhb5          1/1     Running             0          32h
pod-nginx-68dc879f46-rblxg          1/1     Running             0          32h
pod-using-hostnetwork               1/1     Running             0          28h
pod-using-hostport                  1/1     Running             0          29h
securitycontext-capabilities-demo   0/1     ContainerCreating   0          13s
securitycontext-runasuser-demo      1/1     Running             0          25h
[root@k8s-master01 yaml]# kubectl exec securitycontext-capabilities-demo -n dev -- iptables -t nat -nL PREROUTING
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 redir ports 80

清单中iptables 规则已经生成

[root@k8s-master01 yaml]# kubectl exec securitycontext-capabilities-demo -n dev -- chown 200.200 /etc/hosts
chown: /etc/hosts: Operation not permitted
command terminated with exit code 1

root用户不能修改容器文件属主属组,所以chown功能关闭成功

 

 

posted @ 2021-08-15 19:15  拥抱大海,面向天空  阅读(86)  评论(0)    收藏  举报