基础概念
安全概念很大,聚焦在身份和权限部分
访问k8s的服务
- 首先需要知道是谁在访问服务,身份
- 访问过程中需要保证通信链路的安全性,证书体系
- 访问服务后需要确认该身份能够做哪些操作,权限
身份在k8s中通过ServiceAccount进行描述,一个ServiceAccount可以关联一个Secret。 Secret中可以设置访问的证书,k8s中也可以生成token(jwt), 使用token访问api-server。
角色在k8s中使用Role(有Role和ClusterRole两种)描述,对于什么类型的什么资源,有怎样的操作权限。 角色通过RoleBanding和ServiceAccount绑定。
当在集群中pod访问api-server时 1、采用tls的方式访问和api-server建立连接 2、发送数据携带token从token中可以获取身份信息,并验证身份是否合法(可以依赖外部身份验证) 3、然后校验请求动作和身份的权限
serviceAccount和Secret使用
pod中对于ServiceAccount和secret使用,有两种场景 1、pod本身使用,ServiceAccount直接设置在pod.spec.serviceAccountName字段 2、pod中代码,需要调用API访问,此时需要kubeconfig, kubeconfig中除了apisevrver的信息外,其实就是ServiceAccount和Secret的信息
可见集群中Secret很是重要,为了防止Secret泄露可以定期会更新secret。
apiVersion: v1
kind: Pod
metadata:
name: example-pod
namespace: default
spec:
serviceAccountName: my-service-account
containers:
- name: example-container
image: busybox
command: ["sh", "-c", "while true; do sleep 3600; done"]
volumeMounts:
- name: kube-api-access
mountPath: /var/run/secrets/kubernetes.io/serviceaccount
readOnly: true
volumes:
- name: kube-api-access
projected:
defaultMode: 420
sources:
- serviceAccountToken:
expirationSeconds: 3607
path: token
- configMap:
items:
- key: ca.crt
path: ca.crt
name: kube-root-ca.crt
- downwardAPI:
items:
- fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
path: namespace