一 Pod安全

1.1 PodSecurityPolicy启用

为了更精细地控制Pod对资源的使用方式,Kubernetes从1.4版本开始引入了PodSecurityPolicy资源对象对Pod的安全策略进行管理,并在1.1版本中升级为Beta版,到1.14版本时趋于成熟。
若想启用PodSecurityPolicy机制,需要在kube-apiserver服务的启动参数--enable-admission-plugins中进行设置:
[root@k8smaster01 ~]# vi /etc/systemd/system/kube-apiserver.service
  1 ……
2 --enable-admission-plugins=PodSecurityPolicy \
3 ……
[root@k8smaster01 ~]# systemctl daemon-reload
[root@k8smaster01 ~]# systemctl restart kube-apiserver.service
在开启PodSecurityPolicy准入控制器后,Kubernetes默认不允许创建任何Pod,需要创建PodSecurityPolicy策略和相应的RBAC授权策略(Authorizing Policies),Pod才能创建成功。
[root@k8smaster01 study]# vi nginx-pod.yaml #测试创建Pod
  1 apiVersion: v1
2 kind: Pod
3 metadata:
4 name: nginx
5 spec:
6 containers:
7 - name: nginx
8 image: nginx
9 ports:
10 - name: web
11 containerPort: 80
[root@k8smaster01 study]# kubectl create -f nginx-pod.yaml

1.2 PodSecurityPolicy配置

[root@k8smaster01 study]# vi psp-non-privileged.yaml
  1 apiVersion: policy/v1beta1
2 kind: PodSecurityPolicy
3 metadata:
4 name: psp-non-privileged
5 spec:
6 privileged: false #不允许特权模式的Pod
7 seLinux:
8 rule: RunAsAny
9 supplementalGroups:
10 rule: RunAsAny
11 runAsUser:
12 rule: RunAsAny
13 fsGroup:
14 rule: RunAsAny
15 volumes:
16 - '*'
[root@k8smaster01 study]# kubectl create -f psp-non-privileged.yaml
[root@k8smaster01 study]# kubectl get psp psp-non-privileged #查看策略
[root@k8smaster01 study]# kubectl create -f nginx-pod.yaml #再次创建Pod
解释:如上PodSecurityPolicy“psp-non-privileged”设置了privileged:false,表示不允许创建特权模式的Pod。
[root@k8smaster01 study]# vi nginx-pod2.yaml #开启Pod的特权模式
  1 apiVersion: v1
2 kind: Pod
3 metadata:
4 name: nginx2
5 spec:
6 containers:
7 - name: nginx2
8 image: nginx
9 securityContext:
10 privileged: true
11 ports:
12 - name: web
13 containerPort: 80
[root@k8smaster01 study]# kubectl create -f nginx-pod2.yaml
解释:如上开启Pod的特权模式,在创建Pod时,系统将提示如上“禁止创建特权模式的Pod”的报错信息。

二 PodSecurityPolicy配置详解

在PodSecurityPolicy对象中可以设置下列字段来控制Pod运行时的各种安全策略。

2.1 特权模式配置

privileged:是否允许Pod以特权模式运行。

2.2 宿主机资源相关配置

  1. hostPID:是否允许Pod共享宿主机的进程空间。
  2. hostIPC:是否允许Pod共享宿主机的IPC命名空间。
  3. hostNetwork:是否允许Pod使用宿主机网络的命名空间。
  4. hostPorts:是否允许Pod使用宿主机的端口号,可以通过hostPortRange字段设置允许使用的端口号范围,以[min,max]设置最小端口号和最大端口号。
  5. Volumes:允许Pod使用的存储卷Volume类型,设置为“*”表示允许使用任意Volume类型,建议至少允许Pod使用下列Volume类型。
    1. configMap
    2. downwardAPI
    3. emptyDir
    4. persistentVolumeClaim
    5. secret
    6. projected
  6. AllowedHostPaths:允许Pod使用宿主机的hostPath路径名称,可以通过pathPrefix字段设置路径的前缀,并可以设置是否为只读属性。
示例1:
  1 apiVersion: policy/v1beta1
2 kind: PodSecurityPolicy
3 metadata:
4 name: allow-hostpath-volumes
5 spec:
6 volumes:
7 - hostPath
8 allowedHostPaths:
9 - pathPrefix: "/foo"
10 readOnly: true
解释:结果为允许Pod访问宿主机上以“/foo”为前缀的路径,包括“/foo”“/foo/”“/foo/bar”等,但不能访问“/fool”“/etc/foo”等路径,也不允许通过“/foo/../”表达式访问/foo的上层目录。
  1. FSGroup:设置允许访问某些Volume的Group ID范围,可以将规则(rule字段)设置为MustRunAs、MayRunAs或RunAsAny。
    1. MustRunAs:需要设置Group ID的范围,例如1~65535,要求Pod的securityContext.fsGroup设置的值必须属于该Group ID的范围。
    2. MayRunAs:需要设置Group ID的范围,例如1~65535,不强制要求Pod设置securityContext.fsGroup。
    3. RunAsAny:不限制Group ID的范围,任何Group都可以访问Volume。
  2. ReadOnlyRootFilesystem:要求容器运行的根文件系统(rootfilesystem)必须是只读的。
  3. allowedFlexVolumes:对于类型为flexVolume的存储卷,设置允许使用的驱动类型。
示例2:
  1 apiVersion: policy/v1beta1
2 kind: PodSecurityPolicy
3 metadata:
4 name: allow-flex-volumes
5 spec:
6 volumes:
7 - flexVolume
8 allowedflexVolumes:
9 - driver: example/lvm
10 - driver: example/cifs

2.3 用户和组相关配置

  1. RunAsUser:设置运行容器的用户ID(User ID)范围,规则字段(rule)的值可以被设置为MustRunAs、MustRunAsNonRoot或RunAsAny。
    1. MustRunAs:需要设置User ID的范围,要求Pod的securityContext.runAsUser设置的值必须属于该User ID的范围。
    2. MustRunAsNonRoot:必须以非root用户运行容器,要求Pod的securityContext.runAsUser设置一个非0的用户ID,或者镜像中在USER字段设置了用户ID,建议同时设置allowPrivilegeEscalation=false以避免不必要的提升权限操作。
  2. RunAsAny:不限制User ID的范围,任何User都可以运行。
    1. RunAsGroup:设置运行容器的Group ID范围,规则字段的值可以被设置为MustRunAs、MustRunAsNonRoot或RunAsAny。
    2. MustRunAs:需要设置Group ID的范围,要求Pod的securityContext.runAsGroup设置的值必须属于该Group ID的范围。
    3. MustRunAsNonRoot:必须以非root组运行容器,要求Pod的securityContext.runAsUser设置一个非0的用户ID,或者镜像中在USER字段设置了用户ID,建议同时设置allowPrivilegeEscalation=false以避免不必要的提升权限操作。
    4. RunAsAny:不限制Group ID的范围,任何Group的用户都可以运行。
  3. SupplementalGroups:设置容器可以额外添加的Group ID范围,可以将规则(rule字段)设置为MustRunAs、MayRunAs或RunAsAny。
    1. MustRunAs:需要设置Group ID的范围,要求Pod的securityContext.supplementalGroups设置的值必须属于该Group ID范围。
    2. MayRunAs:需要设置Group ID的范围,不强制要求Pod设置securityContext.supplementalGroups。
    3. RunAsAny:不限制Group ID的范围,任何supplementalGroups的用户都可以运行。

2.4 提升权限相关配置

  1. AllowPrivilegeEscalation:设置容器内的子进程是否可以提升权限,通常在设置非root用户(MustRunAsNonRoot)时进行设置。
  2. DefaultAllowPrivilegeEscalation:设置AllowPrivilegeEscalation的默认值,设置为disallow时,管理员还可以显式设置AllowPrivilegeEscalation来指定是否允许提升权限。

2.5 Linux能力相关配置

  1. AllowedCapabilities:设置容器可以使用的Linux能力列表,设置为“*”表示允许使用Linux的所有能力(如NET_ADMIN、SYS_TIME等)。
  2. RequiredDropCapabilities:设置不允许容器使用的Linux能力列表。
  3. DefaultAddCapabilities:设置默认为容器添加的Linux能力列表,例如SYS_TIME等,Docker建议默认设置的Linux能力请查看https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linuxcapabilities。

2.6.SELinux相关配置

  1. seLinux:设置SELinux参数,可以将规则字段(rule)的值设置为MustRunAs或RunAsAny。
    1. MustRunAs:要求设置seLinuxOptions,系统将对Pod的securityContext.seLinuxOptions设置的值进行校验。
    2. RunAsAny:不限制seLinuxOptions的设置。

2.7 其他Linux相关配置

  1. AllowedProcMountTypes:设置允许的ProcMountTypes类型列表,可以设置allowedProcMountTypes或DefaultProcMount。
  2. AppArmor:设置对容器可执行程序的访问控制权限,详情请参考https://kubernetes.io/docs/tutorials/clusters/apparmor/#podsecuritypolicyannotations。
  3. Seccomp:设置允许容器使用的系统调用(SystemCalls)的profile。
  4. Sysctl:设置允许调整的内核参数,详情请参考https://kubernetes.io/docs/concepts/cluster-administration/sysctlcluster/#podsecuritypolicy。

2.8 常见PodSecurityPolicy安全策略配置

示例1:基本没有限制的安全策略,允许创建任意安全设置的Pod。
  1 apiVersion: policy/v1beta1
2 kind: PodSecurityPolicy
3 metadata:
4 name: privileged
5 annotations:
6 seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*'
7 spec:
8 privileged: true
9 allowPrivilegeEscalation: true
10 allowedCapabilities:
11 - '*'
12 volumes:
13 - '*'
14 hostNetwork: true
15 hostPorts:
16 - min: 0
17 max: 65535
18 hostIPC: true
19 hostPID: true
20 runAsUser:
21 rule: 'RunAsAny'
22 seLinux:
23 rule: 'RunAsAny'
24 supplementalGroups:
25 rule: 'RunAsAny'
26 fsGroup:
27 rule: 'RunAsAny'
示例2:要求Pod运行用户为非特权用户;禁止提升权限;不允许使用宿主机网络、端口号、IPC等资源;限制可以使用的Volume类型等。
  1 apiVersion: policy/v1beta1
2 kind: PodSecurityPolicy
3 metadata:
4 name: restricted
5 annotations:
6 seccomp.security.alpha.kubernetes.io/allowedProfileNames: 'docker/default'
7 apparmor.security.beta.kubernetes.io/allowedProfileNames: 'runtime/default'
8 seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default'
9 apparmor.security.beta.kubernetes.io/dafaultProfileName: 'runtime/default'
10 spec:
11 privileged: false
12 allowPrivilegeEscalation: false
13 requiredDropCapabilities:
14 - ALL
15 volumes:
16 - 'configMap'
17 - 'emptyDir'
18 - 'projected'
19 - 'secret'
20 - 'downwardAPI'
21 - 'persistentVolumeClaim'
22 hostNetwork: false
23 hostIPC: false
24 hostPID: false
25 runAsUser:
26 rule: 'MustRunAsNonRoot'
27 seLinux:
28 rule: 'MustRunAs'
29 ranges:
30 - min: 1
31 max: 65535
32 fsGroup:
33 rule: 'MustRunAs'
34 ranges:
35 - min: 1
36 max: 65535
37 readOnlyRootFilesystem: false
示例3:创建如下ClusterRole(也可以创建Role)并将其设置为:允许使用PodSecurityPolicy。
  1 kind: ClusterRole
2 apiVersion: rbac.authorization.k8s.io/v1
3 metadata:
4 name: <role name>
5 rules:
6 - apiGroup: ['policy']
7 resources: ['podsecuritypolicies']
8 verbs: ['use']
9 resourceNames:
10 - <list of policies to authorize> # 允许使用的PodSecurityPolicy列表
然后创建一个ClusterRoleBinding与用户和ServiceAccount进行绑定。
  1 kind: ClusterRoleBinding
2 apiVersion: rbac.authorization.k8s.io/v1
3 metadata:
4 name: <binding name>
5 roleRef:
6 kind: ClusterRole
7 name: <roke name> # 之前创建的ClusterRole名称
8 apiGroup: rbac.authorization.k8s.io
9 subjects:
10 # 对特定Namespace中的ServiceAccount进行授权
11 - kind: ServiceAccount
12 name: <authorized servie account name> # ServiceAccount 的名称
13 namespace: <authorized pod namespace> # Namespace的名称
14 # 对特定用户进行授权(不推荐)
15 - kind: User
16 apiGroup: rbac.authorization.k8s.io
17 name: <authorized user name> # 用户名

三 Pod的安全设置详解

3.1 Pod安全策略类型

当Kubernetes集群中设置了PodSecurityPolicy策略之后,系统将对Pod和Container级别的安全设置进行校验,对于不满足PodSecurityPolicy安全策略的Pod,系统将拒绝创建。
Pod和容器的安全策略可以在Pod或Container的securityContext字段中进行设置,如果在Pod和Container级别都设置了相同的安全类型字段,容器将使用Container级别的设置。
在Pod级别可以设置的安全策略类型如下:
  • runAsGroup:容器内运行程序的用户组ID。
  • runAsNonRoot:是否必须以非root用户运行程序。
  • fsGroup:SELinux相关设置。
  • seLinuxOptions:SELinux相关设置。
  • supplementalGroups:允许容器使用的其他用户组ID。
  • sysctls:设置允许调整的内核参数。
  • 在Container级别可以设置的安全策略类型如下。
  • runAsUser:容器内运行程序的用户ID。
  • runAsGroup:容器内运行程序的用户组ID。
  • runAsNonRoot:是否必须以非root用户运行程序。
  • privileged:是否以特权模式运行。
  • allowPrivilegeEscalation:是否允许提升权限。
  • readOnlyRootFilesystem:根文件系统是否为只读属性。
  • capabilities:Linux能力列表。
  • seLinuxOptions:SELinux相关设置。
示例1:
[root@k8smaster01 study]# vi security-context-pod01.yaml
  1 apiVersion: v1
2 kind: Pod
3 metadata:
4 name: security-context-demo
5 spec:
6 securityContext:
7 runAsUser: 1000
8 runAsGroup: 3000
9 fsGroup: 2000
10 volumes:
11 - name: sec-ctx-vol
12 emptyDir: {}
13 containers:
14 - name: sec-ctx-demo
15 image: tomcat
16 volumeMounts:
17 - name: sec-ctx-vol
18 mountPath: /data/demo
19 securityContext:
20 allowPrivilegeEscalation: false
[root@k8smaster01 study]# kubectl create -f security-context-pod01.yaml
[root@k8smaster01 study]# kubectl exec -ti security-context-demo /bin/bash
$ ps aux #运行进程的用户ID为1000
$ ls -l /data/ #挂载的目录Group ID为2000
total 0
drwxrwsrwx 2 root 2000 6 Nov 28 13:56 demo
解释:在spec.securityContext中设置了如下参数。
runAsUser=1000:所有容器都将以User ID 1000运行程序,所有新生成文件的User ID也被设置为1000。
runAsGroup=3000:所有容器都将以Group ID 3000运行程序,所有新生成文件的Group ID也被设置为3000。
fsGroup=2000:挂载的卷“/data/demo”及其中创建的文件都将属于Group ID 2000。

3.3 Container安全策略类型

  • runAsUser: 容器内运行程序的用户ID。
  • runAsGroup: 容器内运行程序的用户组ID。
  • runAsNonRoot: 是否必须以非root用户运行程序。
  • privileged: 是否以特权模式运行。
  • allowPrivilegeEscalation: 是否允许提升权限。
  • readOnlyRootFilesystem: 根文件系统是否为只读属性。
  • capabilities: Linux能力列表。
  • seLinuxOptions: SELinux相关设置。
示例2:
[root@k8smaster01 study]# vi security-context-pod02.yaml
  1 apiVersion: v1
2 kind: Pod
3 metadata:
4 name: security-context-demo-2
5 spec:
6 securityContext:
7 runAsUser: 1000
8 containers:
9 - name: sec-ctx-demo-2
10 image: tomcat
11 securityContext:
12 runAsUser: 2000
13 allowPrivilegeEscalation: false
[root@k8smaster01 study]# kubectl create -f security-context-pod02.yaml
[root@k8smaster01 study]# kubectl exec security-context-demo-2 /bin/bash
$ ps aux #运行进程的用户ID为1000

035.集群安全-Pod安全的更多相关文章

  1. Apache-Shiro+Zookeeper系统集群安全解决方案之缓存管理

    上篇[Apache-Shiro+Zookeeper系统集群安全解决方案之会话管理],解决了Shiro在系统集群开发时安全的会话共享问题,系统在使用过程中会有大量的权限检查和用户身份检验动作,为了不频繁 ...

  2. 一键运行CIS安全扫描,集群安全无忧!

    CIS安全扫描是Rancher 2.4推出的其中一个重磅功能,旨在帮助用户快速.有效地加强集群的安全性.本文将详细介绍CIS安全扫描这一功能,包含详细的操作demo. 本文来自Rancher Labs ...

  3. Apache-Shiro+Zookeeper系统集群安全解决方案之会话管理

    如今的系统多不是孤军奋战,在多结点会话共享管理方面有着各自的解决办法,比如Session粘连,基于Web容器的各种处理等或者类似本文说的完全接管Web容器的Session管理,只是做法不尽相同. 而本 ...

  4. mongodb副本集加分片集群安全认证使用账号密码登录

    mongodb副本集加分片集群搭建网上资料有很多.粘贴一个写的比较好的.副本集加分片搭建 对于搭建好的mongodb副本集加分片集群,为了安全,启动安全认证,使用账号密码登录. 默认的mongodb是 ...

  5. kubernetes实战(八):k8s集群安全机制RBAC

    1.基本概念 RBAC(Role-Based Access Control,基于角色的访问控制)在k8s v1.5中引入,在v1.6版本时升级为Beta版本,并成为kubeadm安装方式下的默认选项, ...

  6. Kubernetes集群安全概述

    API的访问安全性 API Server的端口和地址 在默认情况下,API Server通过本地端口和安全端口两个不同的HTTP端口,对外提供API服务,其中本地端口是基于HTTP协议的,用于在本机( ...

  7. kubernetes(k8s)集群安全机制RBAC

    1.基本概念 RBAC(Role-Based Access Control,基于角色的访问控制)在k8s v1.5中引入,在v1.6版本时升级为Beta版本,并成为kubeadm安装方式下的默认选项, ...

  8. elasticsearch集群安全重启节点

    es2.x 关闭集群的动态分片:(动态分片开启状态如果节点宕机了,会导致集群重新分配数据进行数据转移,会导致节点直接大量传输数据)curl -XPUT 'http://192.168.248.193: ...

  9. kafka集群安全化之启用kerberos与acl

    一.背景 在我们部署完kafka之后,虽然我们已经可以“肆意”的用kafka了,但是在一个大公司的实际生产环境中,kafka集群往往十分庞大,每个使用者都应该只关心自己所负责的Topic,并且对其他人 ...

随机推荐

  1. Python-多任务复制文件夹

    import multiprocessing import os import time def copy_file(queue, file_name, old_folder_name, new_fo ...

  2. git pull 显示的冲突---解决办法git stash

    git pull:显示本地仓库与远程仓库有冲突 Please, commit your changes or stash them before you can merge. Aborting 解决办 ...

  3. mysql中not exists的简单理解

    http://www.cnblogs.com/glory-jzx/archive/2012/07/19/2599215.html http://sunxiaqw.blog.163.com/blog/s ...

  4. Hessian简介

    Hessian Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单.快捷.采用的是二进制RPC协议,因为 ...

  5. The Monster(Codeforce-C-思维题)

    C. The Monster time limit per test 1 second memory limit per test 256 megabytes   As Will is stuck i ...

  6. Hexo博客maupassant主题添加Google Adsense广告

    自从在 Github Page 落户以后,很长一段时间使用的是极简且有点艺术范儿的 fexo 主题,而不是大名鼎鼎的 next 主题.后来偶然发现了符合我审美的Hexo博客 maupassant 主题 ...

  7. gedit搭建c开发环境

    在管理外部工具中,创建启动脚本 #!/bin/sh DIR=$GEDIT_CURRENT_DOCUMENT_DIR NAME=$GEDIT_CURRENT_DOCUMENT_NAME /home/lx ...

  8. 沈向洋|微软携手 OpenAI 进一步履行普及且全民化人工智能的使命

    OpenAI 进一步履行普及且全民化人工智能的使命"> 作者简介 沈向洋,微软全球执行副总裁,微软人工智能及微软研究事业部负责人 我们正处于技术发展历程中的关键时刻. 云计算的强大计算 ...

  9. C#开发BIMFACE系列36 服务端API之:回调机制

    系列目录     [已更新最新开发文章,点击查看详细] 在<C# 开发 BIMFACE 系列文章>中介绍了模型转换.模型对比接口.这2个功能接口比较特殊,发起请求后,逻辑处理是在BIMFA ...

  10. 从0开发3D引擎(十):使用领域驱动设计,从最小3D程序中提炼引擎(上)

    目录 上一篇博文 下一篇博文 前置知识 回顾上文 最小3D程序完整代码地址 通用语言 将会在本文解决的不足之处 本文流程 解释本文使用的领域驱动设计的一些概念 本文的领域驱动设计选型 设计 引擎名 识 ...