一  在pod中使用宿主节点的命名空间

  1.1  在pod中使用宿主的网络命名空间

  

[root@node01 Chapter13]# cat pod-with-host-network.yml
apiVersion: v1
kind: Pod
metadata:
name: pod-with-host-network
spec:
hostNetwork: true
containers:
- name: main
image: alpine
command: ["/bin/sleep", "999999"]
  • 如果需要pod使用节点的网络命名空间的话,仅仅需要在pod的mainifest的定义里面添加 hostNetwork: true

 

 1.2  绑定到宿主机的端口上面而不是宿主机的网络的命名空间

[root@node01 Chapter13]# cat kubia-hostport.yml
apiVersion: v1
kind: Pod
metadata:
name: kubia-hostport
spec:
containers:
- name: kubia
image: luksa/kubia
ports:
- containerPort: 8080
hostPort: 9000
  • 在pod的容器spec.containers.ports.hostPort:9000就可以将容器使用主机的端口来访问
  • 这个与将pod添加到服务有所不同,这个只有被调度到的主机可以访问

  1.3  使用宿主机的PID以及PIC的命名空间

apiVersion: v1
kind: Pod
metadata:
name: pod-with-host-pid-and-ipc
spec:
hostPID: true
hostIPC:
true
containers:
- name: main
image: alpine
command: ["/bin/sleep", "999999"]

二   配置容器级别的安全上下文

  2.1  使用指定用户运行容器

apiVersion: v1
kind: Pod
metadata:
name: pod-as-user-guest
spec:
containers:
- name: mian
image: alpine
command: ["/bin/sleep", "999999"]
securityContext:
runAsUser:
405

  2.2  阻止容器以root用户运行

apiVersion: v1
kind: Pod
metadata:
name: pod-no-root
spec:
containers:
- name: mian
image: alpine
command: ["/bin/sleep", "999999"]
securityContext:
runAsNonRoot: true

  2.3  使用特权模式运行pod

apiVersion: v1
kind: Pod
metadata:
name: pod-root
spec:
containers:
- name: mian
image: alpine
command: ["/bin/sleep", "999999"]
securityContext:
privileged: true
  • 添加之后,pod就会有可以改变宿主机的权限,例如设置iptables规则等

  2.4 在容器内部单独添加内核功能而不是将最大的权限全部交给pod

apiVersion: v1
kind: Pod
metadata:
name: pod-with-some
spec:
containers:
- name: mian
image: alpine
command: ["/bin/sleep", "999999"]
securityContext:
capabilities:
add:
- SYS_TIME

  2.5  关闭容器中某些操作内核的权限

apiVersion: v1
kind: Pod
metadata:
name: pod-with-drop-some
spec:
containers:
- name: mian
image: alpine
command: ["/bin/sleep", "999999"]
securityContext:
capabilities:
drop:
- SYS_TIME

  2.6 禁止容器里面的进程写入容器的文件系统,但是允许其写入挂载的卷里面

apiVersion: v1
kind: Pod
metadata:
name: pod-with-readonly-filesystem
spec:
containers:
- name: main
image: alpine
command: ["/bin/sleep","999999"]
securityContext:
readOnlyRootFilesystem:
true
volumeMounts:
- name: my-volume
mountPath: /volume
readOnly: false
volumes:
- name: my-volume
emptyDir:

三  限制pod使用安全相关的特性

  3.1  PodSecurityPolicy资源介绍

apiVersion: extensions/v1beta1
kind: PodSecurityPolicy
metadata:
name: default
spec:
hostIPC: false
hostPID: false
hostNetwork: false
hostPorts:
- min: 10000
max: 11000
- min: 13000
max: 14000
privileged: false
readOnlyRootFilesystem: true
runAsUser:
rule: RunAsAny
fsGroup:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
seLinux:
rule: RunAsAny
volumes:
- '*'

  3.2 如果要对容器内的应用运行时候指定用户名以及用户组需要配置runasuser,fsgroup,supplementalGroup等的属性,其一个示范配置如下

runAsUser:
rule: MustRunAs
ranges:
- min: 2
max: 2
fsGroup:
rule: MustRunAs
ranges:
- min: 2
max: 10
- min:20
max: 30
supplementGroups:
rule: MustRunAs
ranges:
- min: 2
max: 10
- min: 20
max: 30
  • 注意一点的是PodsecurityPolicy里面定义的规则不针对集群里面已经存在的pod
  • 对于用户推送的pod,如果与策略里面相悖,则无法创建成功,如果创建容器的时候并未对其用户指定,则会使用集群策略里面的条例
  • 对于runAsUser而言可以指定mustRunAsNonRoot,如此设置之后必须指定一个非root的用户来运行pod

  3.3 更细粒度的内核功能权限划分,被允许添加,默认添加,以及禁止添加的内核功能

apiVersion: extensions/v1beta1
kind: PodSecurityPolicy
spec:
allowedCapabilities:
- SYS_TIME
defaultAddCapabilities:
- CHOWN
requiredDropCapabilities:
- SYS_ADMIN
- SYS_MODULE
  • allowedcapabilities的作用是,允许pod访问docker系统里面的功能
  • defaultAddCapabilities作用是,默认添加到pod里面的对系统权限访问功能
  • requiredDropCapabilities作用是不允许添加到pod的系统功能,一旦添加,将无法成功的创建pod

  3.4 限制pod可以使用存储卷的类型

kind: PodSecurityPolicy
spec:
volumes:
- emptyDir
- configMap
- secret
- downwardAPI
- persistentVolumeClaim
  • 指定了pod可以使用的存储卷类型

  3.5 对不同的用户或者用户组分配不同的PodSecurityPolicy

  使用的方法是利用集群角色以及集群角色绑定到不同用户或者用户组,使得,不同用户或者不同用户组里面的用户拥有不同的PodSecurityPolicy的规则,前面提到过,PodSeurityPolicy属于集群资源,但是不可能某个Policy可以对集群里面的所有的pod都能有效果,于是我们可以试图用一个之前已经学过的资源来让PodSecurityPolicy来关联不同的用户以及用户组来让不同的用户组拥有不同的权限

  3.5.1 创建1个psp

apiVersion: extensions/v1beta1
kind: PodSecurityPolicy
metadata:
name: privileged
spec:
privileged: true
runAsUser:
rule: RunAsAny
fsGroup:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
seLinux:
rule: RunAsAny
volumes:
- '*'

  3.5.2 为它创建一个集群角色

k create clusterrole privileged --verb=use --resource=podsecuritypolicies --resource-name=privileged

  3.5.3 创建一个集群角色绑定

k create clusterrolebinding psp-bob --clusterrole=privileged --user=wxm

  3.5.4 创建这个用户

k config set-credentials wxm --username=wxm --password=password

  3.5.5 使用这个用户来创建带有特权的pod

k --user wxm create -f pod-privileged.yml

 四 隔离pod网络

  4.1  在一个命名空间中启用网络隔离

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metddata:
name: default-deny
spec:
podSelector:
  • 在任何一个特定的命名空间里面创建这个Networkpolicy,则任何客户端都无法访问这个命名空间的pod
  • 前提是kubernets集群里面的网络插件(cni)支持NetworkPolicy

  4.2  允许同一个命名空间的部分pod访问

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: postgres-netpolicy
spec:
podSelector:
matchLabels:
app: database
ingress:
- from:
- podSelector:
matchLabels:
app: webserver
ports:
- port: 5432
  • 这个networkpolicy允许命名空间中标签为database的pod被访问
  • 并且只能被标签为webserver的pod访问
  • 并且只能访问5432的端口

  4.3 允许带有特定标签的命名空间的pod访问某个特定标签的pod

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: shopping-cart-policy
spec:
podSelector:
matchLabels:
app: shopping-cart
ingress:
- from:
- namespaceSelector:
matchLabels:
app: wxm
ports:
- port: 80

  4.4 使用CIDR隔离网络

    只能允许特定网端的pod访问指定的pod

ingress:
- from:
- ipBlock:
cidr: 192.168.1.0/24

  4.5 限制pod的出流量

spec:
podSelector:
matchLabels:
app: webserver
egress:
- to:
- podSelector:
matchLabels:
app: database
  • webserver标签只能和ddatabase标签访问,其余的任何pod和IP都不能访问

  

kubernets之节点和网络的安全保障策略的更多相关文章

  1. 一个C++版的网络数据包解析策略

    C++版的网络数据包解析策略(升级版) 一.数据包格式形如下图 二.代码 int ReceiveFromRemoteEndPoint() { int nPackageDataLength = ; ch ...

  2. wxs 及 获取节点 和 网络请求

    wxs:微信小程序脚本语言,结合 wxml 可以构建页面的结构 在 wxml 中使用 wxs wxs 中的注释 : 单行注释:// 多行注释:/* */ wxs 在页面中的用法 在页面中引用 wxs ...

  3. weave 建立跨节点docker网络

    weave的工作原理上与利用openvswitch建立vxlan基本一样,都是通过用三层的协议封装二层的报文来进行扩展,weave使用的是udp.weave封装了docker,在操作上为我们隐藏了很多 ...

  4. kubernets 单节点安装

    关闭防火墙和Selinux. setenforce 0 systemctl stop firewalld systemctl disable firewalld 配置EPEL源 yum install ...

  5. 一个节点rac+单节点dg网络配置(listener.ora与tnsnames.ora)

    环境说明:  实验环境是 一个节点的 rac + 单机dg    (主备全部用asm存储) tnsnames.ora  文件  (oracle用户) node 1 : node1-> pwd / ...

  6. 十四,K8s集群网络flannel及canal策略

    目录 k8s网络CNI之flannel k8s网络通信模型 常见CNI插件(Container,Network,Interface) 插件通信一般的解决方案 网络插件的应用 Flannel插件 fla ...

  7. C++版的网络数据包解析策略(升级版)

    初版:http://www.cnblogs.com/wjshan0808/p/6580638.html 说明:在实现了对应的接口后该策略可以适合绝大多数的网络数据包结构 首先,是三个接口 IProdu ...

  8. kubernter相关内容

    1. Kubernetes 第一章:互联网架构的演变 随着1946年世界上第一台电子计算机的问世网络就随之出现了,只不过当初只是为了解决多个终端之间的连接,这就是局域网的雏形.后来,随着美国国防部高级 ...

  9. Kubernetes基础:Service

    本文的试验环境为CentOS 7.3,Kubernetes集群为1.11.2,安装步骤参见kubeadm安装kubernetes V1.11.1 集群 Service 介绍 我们通过Pod.Deplo ...

随机推荐

  1. 纯HTML + CSS制作个人资料卡

    总体预览: 材料:背景图与头像.jpg IDE:VS Code 外部链接:CDN加速的font-awesome图标 <link rel="stylesheet" href=& ...

  2. C# 9.0中引入的新特性init和record的使用思考

    写在前面 .NET 5.0已经发布,C# 9.0也为我们带来了许多新特性,其中最让我印象深刻的就是init和record type,很多文章已经把这两个新特性讨论的差不多了,本文不再详细讨论,而是通过 ...

  3. js上 八.语句

    1.什么是语句 概念:在JavaScript中表达式是短语,语句就是整句或命令. 作用:用来执行以使某件事发生 特征:用 ; 结尾 Js中语句的常见形式: ü 表达式语句 ü 复合语句 ü 声明语句 ...

  4. PHP MySQL 快速导入10万条数据

    项目背景 数据来源:所有数据均为外部导入,最大数据量在10w+ 输出数据:导出经过业务处理之后的数据 使用框架:fastadmin 涉及的问题: 1.数据读取 2.数据保存 使用数据:10w+ 解决方 ...

  5. qs的工具方法讲解

    简单来说,qs 是一个增加了一些安全性的查询字符串解析和序列化字符串的库. 今天在学习同事的代码, 在学习过程中遇到了这样一句代码 研究了很久,只了解了个大概,后面慢慢的用熟练只会,想着做个总结,温习 ...

  6. java基础模拟考试三套试卷

    卷1: 一.单选题(15道,共30分) //1.下列关于JDK.JRE.JVM关系描述正确的是 (A) A:JDK是开发工具,包含了JRE.JRE是运行环境,包含了JVM.JVM是虚拟机,可以保证跨平 ...

  7. C#未能找到路径“\bin\roslyn\csc.exe”的一部分。

    主要原因是因为两个库存在,需要生成一个 roslyn文件,但是这个项目是从 vs2017中,打开的,所以,没有必要存在它. 那么就删除这两个关联的库,就可以达到目的 S2017 打开  程序包管理控制 ...

  8. 让vs2013自带的IISExpress支持apk文件下载

    使用vs2013作为android的服务器端开发时,总是会碰到需要自动更新的功能,VS2013自带IIS Express,想要下载apk文件,就需要添加MIME映射.没有图形界面,只能命令行.进入C: ...

  9. Java通过IO流输出文件目录

    //通过IO流输出文件目录,不同级的目录之间用*间隔 1 package com.fjnu.io; 2 3 import java.io.File; 4 5 public class dicOut { ...

  10. 登录&单点登录介绍

    COOKIE & SESSION & TOKEN 主要用来跟踪会话,识别用户所用.cookie 是客户端,session 是服务端的. 因为 http 是无状态协议,每一次的访问都不知 ...