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。