4.3.1 背景知识

1.基于角色的访问控制

基于角色的访问控制(RBAC)是一种控制计算机、网络资源访问的方法,其核心理念是为不同用户赋予不同的角色,通过角色授权进行访问控制。RBAC模式可以在API Server启动时加入相关参数来开启:--authorization-mode=Example,RBAC。

Kubernetes提供了四种RBAC对象:Role、ClusterRole、RoleBinding和ClusterRoleBinding。

其中,Role和ClusterRole代表一系列权限的集合,一个Role资源通常是特定命名空间内的某些权限的集合,ClusterRole则是无命名空间限制的资源。

例如,下面是一个Role资源的声明文件,它创建了一个名为pod-reader的角色,这个角色的权限是能够对命名空间内部的Pod进行查看、事件监听和列举操作。


apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
    namespace: default
    name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
    resources: ["pods"]
    verbs: ["get", "watch", "list"]

RoleBinding和ClusterRoleBinding则用来将Role和ClusterRole定义的权限赋予一个或一组特定的用户。

例如,下面是一个RoleBinding资源的声明文件,它将pod-reader角色的权限赋予jane用户:


apiVersion: rbac.authorization.k8s.io/v1
# This role binding allows "jane" to read pods in the "default" namespace.
# You need to already have a Role named "pod-reader" in that namespace.
kind: RoleBinding
metadata:
    name: read-pods
    namespace: default
subjects:
# You can specify more than one "subject"
- kind: User
    name: jane # "name" is case sensitive
    apiGroup: rbac.authorization.k8s.io
roleRef:
    # "roleRef" specifies the binding to a Role / ClusterRole
    kind: Role #this must be Role or ClusterRole
    name: pod-reader # this must match the name of the Role or ClusterRole
        you wish to bind to
    apiGroup: rbac.authorization.k8s.io

本书的17.2节对Kubernetes的RBAC机制做了更多介绍。

2.WebSocket

WebSocket是一种网络传输协议[1],可在单个TCP连接上进行全双工通信,使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。为了实现兼容性,WebSocket握手使用HTTP Upgrade头,从HTTP更改为WebSocket协议。

一个典型的WebSocket握手的客户端请求如下:


GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

相应的服务端响应内容:


HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat

后文的漏洞利用程序会涉及构造WebSocket报文的部分,它与上述示例类似,稍有不同。

3.Kubernetes API Server

在一个Kubernetes集群中,API Server处于通信的中枢位置,是集群控制平面的核心,各组件通过API Server进行交互。

API Server通过RESTful API提供服务。除此之外,它还具有代理转发的功能,将外界对于部分API的调用转发到后端实际执行这些API功能的组件上。例如,常用的对Pod执行exec的操作就是API Server作为代理,将请求转发到对应节点的Kubelet上,由该Kubelet执行具体命令。这个过程还涉及从HTTP到WebSocket的协议升级过程,API Server能够作为代理维护一条WebSocket连接。

[1] https://zh.wikipedia.org/wiki/WebSocket。