Kubernetes精选学习

【K8s 精选】隔离 Pod 的安全策略

2021-10-15  本文已影响0人  熊本极客

网络策略负责限制出流量Pod 安全策略负责 Pod 内限制系统的访问权限

1 网络策略

参考 Kubernetes 网络策略

NetworkPolicy 的示例:
ingress 入规则:允许以下 Pod 连接到 default 名字空间下的带有 role=db 标签的所有 Pod 的 6379 TCP 端口
egress 出规则:允许名字空间 default 中所有自带标签 role=db 的 Pod 使用 TCP 协议 与 10.0.0.0/24 范围内的 IP 通信,只要目标端口介于 32000 和 32768 之间就可以。

piVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    # IP 地址范围为 172.17.0.0–172.17.0.255 和 172.17.2.0–172.17.255.255 (即,除了 172.17.1.0/24 之外的所有 172.17.0.0/16)
    - ipBlock:
        # CIDR 表示范围
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    # 带有 project=myproject 标签的所有名字空间中的 Pod
    - namespaceSelector:
        matchLabels:
          project: myproject
    # default 名字空间下带有 role=frontend 标签的所有 Pod
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 32000
     endport: 32768

默认拒绝所有出站流量

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-egress
spec:
  podSelector: {}
  policyTypes:
  - Egress

2 Pod 安全策略

Pod 安全性标准定义了三种不同的策略。

Profile 作用
Privileged 有目的地开放且完全无限制的策略。通常针对由特权较高、受信任的用户所管理的系统级或基础设施级负载
Baseline 便于常见的容器化应用采用,同时禁止已知的特权提升。针对的是应用运维人员和非关键性应用的开发人员
Restricted 旨在实施当前保护 Pod 的最佳实践。针对运维人员和安全性很重要的应用的开发人员,以及不太被信任的用户

restricted 安全策略 模板如下:

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: restricted-security-policy
  annotations:
    seccomp.security.alpha.kubernetes.io/allowedProfileNames: 'docker/default,runtime/default'
    apparmor.security.beta.kubernetes.io/allowedProfileNames: 'runtime/default'
    seccomp.security.alpha.kubernetes.io/defaultProfileName:  'runtime/default'
    apparmor.security.beta.kubernetes.io/defaultProfileName:  'runtime/default'
spec:
  privileged: false   # Don't allow privileged pods!
  # 不允许升级到 root 权限
  allowPrivilegeEscalation: false
  # 这与 allowPrivilegeEscalation 是多余的
  # 必须从容器中去除的权能字。 所给的权能字会从默认权能字集合中去除,并且一定不可以添加
  requiredDropCapabilities:
    - ALL
  # 允许的 volume 类型.
  volumes:
    - 'configMap'
    - 'emptyDir'
    - 'projected'
    - 'secret'
    - 'downwardAPI'
    # Assume that persistentVolumes set up by the cluster admin are safe to use.
    - 'persistentVolumeClaim'
  #  控制是否 Pod 可以使用节点的网络名字空间。 此类授权将允许 Pod 访问本地回路(loopback)设备、在本地主机(localhost) 上监听的服务、还可能用来监听同一节点上其他 Pod 的网络活动。
  hostNetwork: false
  # 控制 Pod 容器是否可共享宿主上的 IPC 名字空间
  hostIPC: false
  # 控制 Pod 中容器是否可以共享宿主上的进程 ID 空间
  hostPID: false
  runAsUser:
    # 允许在非 root 权限在运行 container
    rule: 'MustRunAsNonRoot'
  # 设置容器的 SELinux 上下文
  seLinux:
    rule: 'RunAsAny'
  # 控制容器可以添加的组 ID
  supplementalGroups:
    # 要求至少指定一个 range 值。 第一个 range 中的最小值用作默认值。 所有 range 值都被用来执行验证检查。
    rule: 'MustRunAs'
    ranges:
      # 禁止添加到 root 组
      - min: 1
        max: 65535
  # 控制应用到某些卷上的附加用户组
  fsGroup:
    rule: 'MustRunAs'
    ranges:
      # 禁止添加到 root 组
      - min: 1
        max: 65535
  # 以只读方式访问根文件系统
  readOnlyRootFilesystem: false
上一篇 下一篇

猜你喜欢

热点阅读