kubernets CKS 4.2 Pod安全上下文(二)

上一篇:kubernets CKS 4.1 Pod安全上下文(一)

本小结CKS暂时未出题
安全上下文(Security Context):K8s对Pod和容器提供的安全机制,可以设置Pod特权和访问控制。

4.2.1 案例1:设置容器以普通用户运行

背景:容器中的应用程序默认以root账号运行的,这个root与宿主机root账号是相同的, 拥有大部分对Linux内核的系统调用权限,这样是不安全的,所以我们应该将容器以普 通用户运行,减少应用程序对权限的使用。 可以通过两种方法设置普通用户:
• Dockerfile里使用USER指定运行用户
• K8s里指定spec.securityContext.runAsUser,指定容器默认用户UID

spec:
  securityContext:
    runAsUser: 1000 # 镜像里必须有这个用户UID
    fsGroup: 1000 # 数据卷挂载后的目录属组设置为该组
  containers:
  - image: wangjinxiong/flask-demo:root
    name: web
    securityContext:
      allowPrivilegeEscalation: false # 不允许提权

创建一个deployment模板并编辑

kubectl create deployment flask-demo --image=wangjinxiong/flask-demo:root --dry-run="client" -o yaml > flask-demo.yaml

编辑配置加入Pod安全上下文配置。

# cat flask-demo.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: flask-demo
  name: flask-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: flask-demo
  template:
    metadata:
      labels:
        app: flask-demo
    spec:
      securityContext:
        runAsUser: 1000 # 镜像里必须有这个用户UID
        fsGroup: 1000 # 数据卷挂载后的目录属组设置为该组
      containers:
      - image: wangjinxiong/flask-demo:root
        name: flask-demo
        securityContext:
           allowPrivilegeEscalation: false # 不允许提权
        resources: {}

进入容器:

# kubectl exec -it flask-demo-7c5fdc67ff-qlhnt -- /bin/bash
I have no name!@flask-demo-7c5fdc67ff-qlhnt:/data/www$ 
I have no name!@flask-demo-7c5fdc67ff-qlhnt:/data/www$ 
I have no name!@flask-demo-7c5fdc67ff-qlhnt:/data/www$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
1000         1     0  0 09:09 ?        00:00:00 /bin/sh -c python main.py
1000         9     1  1 09:09 ?        00:00:02 python main.py
1000        10     0  1 09:12 pts/0    00:00:00 /bin/bash
1000        17    10  0 09:12 pts/0    00:00:00 ps -ef
I have no name!@flask-demo-7c5fdc67ff-qlhnt:/data/www$

修改数据,发觉无权限,因为镜像以root账号创建的,其他用户无修改权限:

I have no name!@flask-demo-7c5fdc67ff-qlhnt:/data/www$ ls
Dockerfile  main.py  templates
I have no name!@flask-demo-7c5fdc67ff-qlhnt:/data/www$ touch wangjinxiong.txt
touch: cannot touch 'wangjinxiong.txt': Permission denied
I have no name!@flask-demo-7c5fdc67ff-qlhnt:/data/www$ ls /data/www
Dockerfile  main.py  templates
I have no name!@flask-demo-7c5fdc67ff-qlhnt:/data/www$ ls -l /data/
total 0
drwxr-xr-x 1 root root 56 Jul  9 10:13 www
I have no name!@flask-demo-7c5fdc67ff-qlhnt:/data/www$ chmod 777 /data/www
chmod: changing permissions of '/data/www': Operation not permitted
I have no name!@flask-demo-7c5fdc67ff-qlhnt:/data/www$

使用wangjinxiong/flask-demo:noroot不存在这个问题,因为镜像以python账号创建的.

4.2.2 案例2:避免使用特权容器

背景:容器中有些应用程序可能需要访问宿主机设备、修改内核等需求,在默认情况下,容器没这个有这个能力,因此这时会考虑给容器设置特权模式。
启用特权模式:

containers:
  - image: lizhenliang/flask-demo:root
    name: web
    securityContext:
      privileged: true

启用特权模式就意味着,你要为容器提供了访问Linux内核的所有能力,这是很危险的,为了减少系统调用的供给,可以使用Capabilities为容器赋予仅所需的能力。

4.2.3 Capabilities

Linux Capabilities:Capabilities是一个内核级别的权限,它允许对内核调用权限进行更细粒度的控制,而不是简单地以root身份能力授权。
Capabilities包括更改文件权限、控制网络子系统和执行系统管理等功能。在securityContext中,可以添加或删除Capabilities,做到容器精细化权限控制。
示例1:容器默认没有挂载文件系统能力,添加SYS_ADMIN增加这个能力

apiVersion: v1
kind: Pod
metadata:
  name: cap-pod
spec:
  containers:
  - image: busybox
    name: test
    command:
    - sleep
    - 24h
    securityContext:
      capabilities:
        add: ["SYS_ADMIN"]

示例2:只读挂载容器文件系统,防止恶意二进制文件创建

apiVersion: v1
kind: Pod
metadata:
  name: cap-pod
spec:
  containers:
  - image: busybox
    name: test
    command:
    - sleep
    - 24h
    securityContext:
      readOnlyRootFilesystem: true
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值