Kubernetes(十九)Security Context(一)

一    官网文档

Pod 安全性标准

为 Pod 或容器配置安全性上下文

Pod的安全策略

二    Security Context

(1)背景引入

说明:'privileged'(特权模式) '不等于' root-->比如:root用户无法'关闭容器网卡'

思考:哪些容器需要'修改内核参数'?

(2)安全上下文的配置级别

Kubernetes(十九)Security Context(一)_第1张图片

(3)安全上下文的设置方式

Kubernetes(十九)Security Context(一)_第2张图片

三    Pod 设置 Security Context

用法: 在 Pod 定义的'资源清单文件中'添加 'securityContext' 字段,就可以为 Pod 指定安全上下文相关的设定

特点: 通过'该字段'指定的内容将会对'当前 Pod 中的所有容器'生效

(2)常用字段的介绍

kubectl explain 'pods.spec.securityContext'

Kubernetes(十九)Security Context(一)_第3张图片

apiVersion: v1
kind: Pod
metadata:
  name: security-context
spec:
  volumes:
  - name: sec-vol
    emptyDir: {}
  securityContext:          '三个常用参数'
    runAsUser: 1000
    runAsGroup: 3000
    fsGroup: 2000
  containers:
  - name: sec-demo
    image: busybox
    command: ["sh", "-c", "sleep 3600"]
    volumeMounts:
    - name: sec-vol
      mountPath: /pod/sec
    securityContext:
      allowPrivilegeEscalation: false

Kubernetes(十九)Security Context(一)_第4张图片

一个思考

制作镜像'USER'是root,但是进程运行的是1000,不能往'数据卷'里面写文件-->'怎么办?'

(1)进程指定成root -->'根本上'

(2)initContaner  --> chmod 改变权限

(3)查看和验证

说明的是runAsUser指的是'常驻进程-->也就是entrypoint或者cmd'的'用户身份'-->'也是进入容器后相应bash的用户身份'

①  进入容器,top命令查看

kubectl exec -it security-context -- top

Kubernetes(十九)Security Context(一)_第5张图片

对比

Kubernetes(十九)Security Context(一)_第6张图片

②   查看数据卷


③   综合查看

④  尝试删除

Kubernetes(十九)Security Context(一)_第7张图片

四    容器设置 Security Context

kubectl explain pods.spec.'containers.securityContext'

说明: 参数和Pod级别差不多,这里'不再细讲'

apiVersion: v1
kind: Pod
metadata:
  name: security-context-container
spec:
  securityContext:
    runAsUser: 1000                              '对比'
  containers:
  - name: sec-ctx-demo
    image: busybox
    command: [ "sh", "-c", "sleep 60m" ]
    securityContext:
      runAsUser: 2000                            '对比'
      allowPrivilegeEscalation: false          

Kubernetes(十九)Security Context(一)_第8张图片

kubectl exec -it security-context-container -- top

Kubernetes(十九)Security Context(一)_第9张图片

五   设置 Linux Capabilities

(1)背景

Kubernetes(十九)Security Context(一)_第10张图片

(2)什么是 Capabilities

 capabilities man page 

Kubernetes(十九)Security Context(一)_第11张图片

(3) docker中设置

场景引入

Docker 容器本质上就是一个进程,所以理论上容器就会和进程一样会有一些默认的开放权限,默认情况下 Docker 会删除必须的 capabilities 之外的所有 capabilities,因为在容器中我们经常会以 root 用户来运行,使用 capabilities 限制后,容器中的使用的 root 用户权限就比我们平时在宿主机上使用的 root 用户权限要少很多了,这样即使出现了安全漏洞,也很难破坏或者获取宿主机的 root 权限,所以 Docker 支持 Capabilities 对于容器的安全性来说是非常有必要的。

不过我们在运行容器的时候可以通过指定 --privileded 参数来开启容器的超级权限,这个参数一定要慎用,因为他会获取系统 root 用户所有能力赋值给容器,并且会扫描宿主机的所有设备文件挂载到容器内部,所以是非常危险的操作。

但是如果你确实需要一些特殊的权限,我们可以通过 --cap-add 和 --cap-drop 这两个参数来动态调整,可以最大限度地保证容器的使用安全。

Kubernetes(十九)Security Context(一)_第12张图片

下面'表格中'列出的 Capabilities 是 'Docker 默认给容器添加的',我们可以通过 --cap-drop '去除'其中一个或者多个

Kubernetes(十九)Security Context(一)_第13张图片

vendor/github.com/containerd/containerd/oci/'spec_unix.go',这个文件定义了'缺省的capability'

 新版本

Kubernetes(十九)Security Context(一)_第14张图片

下面'表格中'列出的 Capabilities 是 Docker '默认删除'的,我们可以通过'--cap-add添加'其中一个或者多个:

Kubernetes(十九)Security Context(一)_第15张图片

需求:修改网络接口数据

默认情况下是'没有权限的',因为需要的 'NET_ADMIN' 这个 Capabilities ,'默认被移除了'

docker run -it --rm '--cap-add=NET_ADMIN' busybox /bin/sh
所以在'不使用 --privileged 的情况下'('也不建议')我们可以使用 --cap-add=NET_ADMIN 将这个 Capabilities 添加回来

备注: root和privileged的'权限的对比'在这里凸线出来了-->root默认只有14种'capabilities',privileged具有'操作系统所有'的

参考博客

(4)操作系统上设置

 kernel 2.2 之后Linux  以capabilities区分不同单元的关联root特权,'非root'进程都去'检查对应的capabilities'

扩展学习

Kubernetes(十九)Security Context(一)_第16张图片

Kubernetes(十九)Security Context(一)_第17张图片

结论:ping 命令在执行时需要'访问网络',所需的 capabilities 为 'cap_net_admin' 和 'cap_net_raw'

继续探究

列出了'系统支持'的capability

查看'当前进程'的 capabilities 信息

Kubernetes(十九)Security Context(一)_第18张图片

Kubernetes(十九)Security Context(一)_第19张图片

(5)Kubernetes设置

Kubernetes(十九)Security Context(一)_第20张图片

效果

Kubernetes(十九)Security Context(一)_第21张图片

细节: 如果在容器中先'关闭网卡,再开启网卡',网络不通

Kubernetes(十九)Security Context(一)_第22张图片

你可能感兴趣的:(kubernetes)