• Kubernetes-保障集群内节点和网络安全


    13.1.在pod中使用宿主节点的Linux命名空间

    13.1.1.在pod中使用宿主节点的网络命名空间

       在pod的yaml文件中就设置spec.hostNetwork: true  

       这个时候pod使用宿主机的网络,如果设置了端口,则使用宿主机的端口。

    apiVersion: v1
    kind: pod
    metadata:
        name: pod-host-yaohong
    spec:
        hostNetwork: true  //使用宿主节点的网络命名空间
        containers: 
        - image: luksa/kubia
          command: ["/bin/sleep", "9999"]

    13.1.2.绑定宿主节点上的端口而不使用宿主节点的网络命名空间

       在pod的yaml文件中就设置spec.containers.ports字段来设置

       在ports字段中可以使用

      containerPorts设置通过pod 的ip访问的端口

      container.hostPort设置通过所在节点的端口访问

    apiVersion: v1
    kind: pod
    metadata:
        name: kubia-hostport-yaohong
    spec:
        containers: 
        - image: luksa/kubia
        - name: kubia
          ports:
          - containerport: 8080 //该容器通过pod IP访问该端口
            hostport: 9000  //该容器可以通过它所在节点9000端口访问
            protocol: Tcp

    13.1.3.使用宿主节点的PID与IPC

       PID是进程ID,PPID是父进程ID

       在linux下的多个进程间的通信机制叫做IPC(Inter-Process Communication),它是多个进程之间相互沟通的一种方法。

    apiVersion: v1
    kind: pod
    metadata:
        name: pod-with-host-pid-and-ipc-yaohong
    spec:
        hostPID: true //你希望这个pod使用宿主节点的PID命名空间
        hostIPC: true //你希望pod使用宿主节点的IPC命名空间
        containers:
        - name: main
          image: alpine
          command: ["/bin/sleep", "99999"]
    

     

    13.2.配置节点的安全上下文

    13.2.1.使用指定用户运行容器

      查看某个pod运行的用户

    $ kubectl -n kube-system exec coredns-7b8dbb87dd-6ll7z id
    uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
    

      容器的运行用户再DockerFile中指定,如果没有指定则为root

      指定pod的运行的用户方法如下

    apiVersion: v1
    kind: pod
    metadata:
        name: pod-as-user
    spec:
        containers:
        - name: main
          image: alpine
          command: ["/bin/sleep", "99999"]
          securityContext:
            runAsUser: 405   //你需要指定的用户ID,而不是用户名

    13.2.2.阻止容器以root用户运行

      runAsNonRoot来设置
    apiVersion: v1
    kind: pod
    metadata:
        name: pod-as-user
    spec:
        containers:
        - name: main
          image: alpine
          command: ["/bin/sleep", "99999"]
          securityContext:
            runAsNonRoot: true   //这个容器只允许以非root用户运行

    13.2.3.使用特权模式运行pod

      为了获得宿主机内核完整的权限,该pod需要在特权模式下运行。需要添加privileged参数为true。

    apiVersion: v1
    kind: pod
    metadata:
        name: pod-as-privileged
    spec:
        containers:
        - name: main
          image: alpine
          command: ["/bin/sleep", "99999"]
          securityContext:
            privileged: true   //这个容器将在特权模式下运行

    13.2.4.为容器单独添加内核功能

    apiVersion: v1
    kind: pod
    metadata:
        name: pod-as-capability
    spec:
        containers:
        - name: main
          image: alpine
          command: ["/bin/sleep", "99999"]
          securityContext:
            capabilities:    //该参数用于pod添加或者禁用某项内核功能
              add:
              - SYS_TIME      //添加修改系统时间参数
    

    13.2.5.在容器中禁止使用内核功能

    apiVersion: v1
    kind: pod
    metadata:
        name: pod-as-capability
    spec:
        containers:
        - name: main
          image: alpine
          command: ["/bin/sleep", "99999"]
          securityContext:
            capabilities:    //该参数用于pod添加或者禁用某项内核功能
              drop:
              - CHOWN      //禁用容器修改文件的所有者

    13.2.6.阻止对容器根文件系统的写入

      securityContext.readyOnlyFilesystem设置为true来实现阻止对容器根文件系统的写入。
    apiVersion: v1
    kind: pod
    metadata:
        name: pod-with-readonly-filesystem
    spec:
        containers:
        - name: main
          image: alpine
          command: ["/bin/sleep", "99999"]
          securityContext:
             readyOnlyFilesystem: true  //这个容器的根文件系统不允许写入
          volumeMounts:
          - name: my-volume
            mountPath: /volume    //volume写入是允许的,因为这个目录挂载一个存储卷
            readOnly: false 

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

    13.3.1.PodSecurityPolicy资源介绍

       PodSecurityPolicy是一种集群级别(无命名空间)的资源,它定义了用户能否在pod中使用各种安全相关的特性。

    13.3.2.了解runAsUser、fsGroups和supplementalGroup策略

    runAsUser:
      runle: MustRunAs
      ranges:
      - min: 2             //添加一个max=min的range,来指定一个ID为2的user
        max: 2
      fsGroup:
        rule: MustRunAs
        ranges:
        - min: 2
          max: 10         //添加多个区间id的限制,为2-10 或者20-30
        - min: 20
          max: 30 
      supplementalGroups:
        rule: MustRunAs
        ranges:
        - min: 2
          max: 10
        - min: 20
          max: 30

    13.3.3.配置允许、默认添加、禁止使用的内核功能

       三个字段会影响容器的使用

      allowedCapabilities:指定容器可以添加的内核功能
      defaultAddCapabilities:为所有容器添加的内核功能
      requiredDropCapabilities:禁止容器中的内核功能
    apiVersion: v1
    kind: PodSecurityPolicy
    spec:
      allowedCapabilities:
      - SYS_TIME                 //允许容器添加SYS_time功能
      defaultAddCapabilities:
      - CHOWN                    //为每个容器自动添加CHOWN功能
      requiredDropCapabilities:
      - SYS_ADMIN                //要求容器禁用SYS_ADMIN和SYS_MODULE功能

    13.4.隔离pod网络

    13.4.1.在一个命名空间中使用网络隔离

      podSelector进行对一个命名空间下的pod进行隔离

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: postgres-netpolicy
    spec:
      podSelector:         //这个策略确保了对具有app=databases标签的pod的访问安全性
        matchLabels:
          app: database
      ingress:
      - from:
        - podSelector:    //它只允许来自具有app=webserver标签的pod的访问
          matchLabels:
            app: webserver
        ports:
        - port: 5432      //允许对这个端口的访问

    13.4.2.在 不同的kubernetes命名空间之间进行网络隔离

       namespaceSelector进行对不同命名空间间进行网络隔离

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: postgres-netpolicy
    spec:
      podSelector:         //这个策略确保了对具有app=databases标签的pod的访问安全性
        matchLabels:
          app: database
      ingress:
      - from:
        - namespaceSelector:    //只允许tenant: manning标签的命名空间中运行的pod进行互相访问
          matchLabels:
            tenant: manning   
        ports:
        - port: 5432      //允许对这个端口的访问

    13.4.3.使用CIDR网络隔离

      ingress:
      - from:
        - ipBlock:
            cidr: 192.168.1.0/24    //指明允许访问的ip段

    13.4.4.限制pod对外访问流量

       使用egress进行限制

    spec:
      podSelector:         //这个策略确保了对具有app=databases标签的pod的访问安全性
        matchLabels:
          app: database
      egress:              //限制pod的出网流量
      - to:
        - podSelector:
            matchLables:   //database的pod只能与有app: webserver的pod进行通信
              app: webserver
    

      

  • 相关阅读:
    【Framework】HTTP运行期与页面执行模型
    【Framework】深入研究Asp.net页面的生命周期
    【WCF】Silverlight+wcf+自定义用户名密码验证
    【缓存】EF4ProviderWrappers
    【缓存】Sql Server 2005/2008 SqlCacheDependency查询通知的使用总结
    【缓存】利用Cache防止同一帐号重复登录
    【缓存】.net中Cache管理操作
    【缓存】系统缓存全解析 (上)
    【缓存】系统缓存全解析 (中)
    【缓存】系统缓存全解析 (下)
  • 原文地址:https://www.cnblogs.com/yaohong/p/11369084.html
Copyright © 2020-2023  润新知