k8s 安全性

85 阅读1分钟

基础概念

安全概念很大,聚焦在身份和权限部分

访问k8s的服务

  • 首先需要知道是谁在访问服务,身份
  • 访问过程中需要保证通信链路的安全性,证书体系
  • 访问服务后需要确认该身份能够做哪些操作,权限

image.png

身份在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