一 官网文档
Pod 安全性标准
为 Pod 或容器配置安全性上下文
Pod的安全策略
二 Security Context
(1)背景引入
说明:'privileged'(特权模式) '不等于' root-->比如:root用户无法'关闭容器网卡'
思考:哪些容器需要'修改内核参数'?
(2)安全上下文的配置级别
(3)安全上下文的设置方式
三 Pod 设置 Security Context
用法: 在 Pod 定义的'资源清单文件中'添加 'securityContext' 字段,就可以为 Pod 指定安全上下文相关的设定
特点: 通过'该字段'指定的内容将会对'当前 Pod 中的所有容器'生效
(2)常用字段的介绍
kubectl explain 'pods.spec.securityContext'
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
一个思考
制作镜像'USER'是root,但是进程运行的是1000,不能往'数据卷'里面写文件-->'怎么办?'
(1)进程指定成root -->'根本上'
(2)initContaner --> chmod 改变权限
(3)查看和验证
说明的是runAsUser指的是'常驻进程-->也就是entrypoint或者cmd'的'用户身份'-->'也是进入容器后相应bash的用户身份'
① 进入容器,top命令查看
kubectl exec -it security-context -- top
对比
② 查看数据卷
④ 尝试删除
四 容器设置 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
kubectl exec -it security-context-container -- top
五 设置 Linux Capabilities
(1)背景
(2)什么是 Capabilities
capabilities man page
(3) docker中设置
场景引入
Docker 容器本质上就是一个进程,所以理论上容器就会和进程一样会有一些默认的开放权限,默认情况下 Docker 会删除必须的
capabilities
之外的所有capabilities
,因为在容器中我们经常会以 root 用户来运行,使用capabilities
限制后,容器中的使用的 root 用户权限就比我们平时在宿主机上使用的 root 用户权限要少很多了,这样即使出现了安全漏洞,也很难破坏或者获取宿主机的 root 权限,所以 Docker 支持Capabilities
对于容器的安全性来说是非常有必要的。不过我们在运行容器的时候可以通过指定
--privileded
参数来开启容器的超级权限,这个参数一定要慎用,因为他会获取系统 root 用户所有能力赋值给容器,并且会扫描宿主机的所有设备文件挂载到容器内部,所以是非常危险的操作。但是如果你确实需要一些特殊的权限,我们可以通过
--cap-add
和--cap-drop
这两个参数来动态调整,可以最大限度地保证容器的使用安全。
下面'表格中'列出的 Capabilities 是 'Docker 默认给容器添加的',我们可以通过 --cap-drop '去除'其中一个或者多个
vendor/github.com/containerd/containerd/oci/'spec_unix.go',这个文件定义了'缺省的capability'
新版本
下面'表格中'列出的 Capabilities 是 Docker '默认删除'的,我们可以通过'--cap-add添加'其中一个或者多个:
需求:修改网络接口数据
默认情况下是'没有权限的',因为需要的 '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'
扩展学习
结论:ping 命令在执行时需要'访问网络',所需的 capabilities 为 'cap_net_admin' 和 'cap_net_raw'
继续探究
列出了'系统支持'的capability
查看'当前进程'的 capabilities 信息
(5)Kubernetes设置
效果
细节: 如果在容器中先'关闭网卡,再开启网卡',网络不通