kubernetes(七)--安全机制

徘徊边缘 提交于 2020-02-05 23:06:37

一、安全机制说明

Kubernetes 作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。API Server 是集群内部各个组件通信的中介,也是外部控制的入口。所以 Kubernetes 的安全机制基本就是围绕保护 API Server 来设计的。Kubernetes 使用了认证(Authentication)、鉴权(Authorization)、准入控制(AdmissionControl)三步来保证API Server的安全

image

二、认证--Authentication

2.1、认证的方式

1)HTTP Token 认证

通过一个 Token 来识别合法用户

HTTP Token 的认证是用一个很长的特殊编码方式的并且难以被模仿的字符串 - Token 来表达客户的一种方式。Token 是一个很长的很复杂的字符串,每一个 Token 对应一个用户名存储在 API Server 能访问的文件中。当客户端发起 API 调用请求时,需要在 HTTP Header 里放入 Token

2)HTTP Base 认证

通过用户名+密码的方式认证

用户名+密码用 BASE64 算法进行编码后的字符串放在 HTTP Request 中的 HeatherAuthorization 域里发送给服务端,服务端收到后进行编码,获取用户名及密码

3)HTTPS 证书认证

最严格,基于 CA 根证书签名的客户端身份认证方式

image

2.2、认证组件

image

2.2.1、两种类型

Kubenetes 组件对 API Server 的访问:kubectl、Controller Manager、Scheduler、kubelet、kube-proxy

Kubernetes 管理的 Pod 对容器的访问:Pod(dashborad 也是以 Pod 形式运行)

2.2.2、安全性说明

Controller Manager、Scheduler 与 API Server 在同一台机器,所以直接使用 API Server 的非安全端口访问,--insecure-bind-address=127.0.0.1

kubectl、kubelet、kube-proxy 访问 API Server 就都需要证书进行 HTTPS 双向认证

2.2.3、证书颁发

手动签发:通过 k8s 集群的跟 ca 进行签发 HTTPS 证书

自动签发:kubelet 首次访问 API Server 时,使用 token 做认证,通过后,Controller Manager 会为kubelet 生成一个证书,以后的访问都是用证书做认证了

2.3、kubeconfig

kubeconfig 文件包含集群参数(CA证书、API Server地址),客户端参数(上面生成的证书和私钥),集群context 信息(集群名称、用户名)。Kubenetes 组件通过启动时指定不同的 kubeconfig 文件可以切换到不同的集群

[root@k8s-master01 ~]# cd .kube/
[root@k8s-master01 .kube]# ls
cache  config  http-cache
[root@k8s-master01 .kube]# cat config 
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJd01ESXdNakEyTVRjMU4xb1hEVE13TURFek1EQTJNVGMxTjFvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTmVzCkFic2VOa1hjZzFuUzVFRFh3b1Q3RS9oTU9BL3JFUTZNSDJIQkM2VkhndG5mSmVJMkRqOFZ2cVVHTnI1ZGtGN1QKdmpxbDFRVDQ1bENKWElkdWhqK1FadVJjQk13RkdKd09KODQzRkd0QWdSemVBT1RPSHE4VXREc0hNU3NuOHRTdApaVFFEbEMxK1lwUUI1a0xDM2FRWnJpZzJpMlRURXYwTjk1RWU1T2FUOUkzRjdOWGR4d25SYTNSQjZyUnRwdlhLCkhEdnVUK2JBQmdJVUd5Rk1PNkdxRU44UnN6SnhYME5ha0N4ajlzMGNaUy9VTzF4UCtOcm9GcHdVSzI0dU1SeG8KSHhCRG1KaHZ1K2gzWjFMRzRJK1gzTy9vUXpMSGZFZEtmUkRKL083MTVMRWtrNzYwMVhLYTNBQXJmQzkvQllabQo1Q3pLL29uVFRTSjZESTJlcUlVQ0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFFVmRpc0dwOUdGcHhZT2tMd2tCT2s5S2ZhaEsKWk1KdWdvSklFdnVTS0VqOTdiUkpCSE5pVmk0aHJjN2JXUWVxVlRxYlc0MGhFQkdjUXpKeUVySmlZVzJsSTVoawp4bWtXSSs5R3JsaHBtU1NGbC93SUxTbWRCaG9jcjdZMEU5THNoTHdPUmdzYm00U1BxSmVXNHNjNml1V08wTENkCjlhSzQ2VGh3RTYxM3JWblVvb2YzQUtyUENhaDBFc1ZJZFlEemFFamFTcHBHOWVzYVVsQjV4NjFWMTR5MkFvOS8KWUNtK3h4c29QamdBMHlHS0dMWHl1cE1CN25NWEhoK0pQWVpmUUFDeU5yVWVoM0RWa2hrMVJtb0wrUm81VEdaRApoUVd5aEM3N0w2T05kTm9takdEcVRnTktob3VxMEdNNVdGSEhhdENQSmNlcW8weEIzbWF1ZDd0dE9tUT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
    server: https://10.0.0.11:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJUkZmT05zRGdhUVV3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TURBeU1ESXdOakUzTlRkYUZ3MHlNVEF5TURFd05qRTNOVGhhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXZ1U1BGQTVObDgvWTNoT1YKMXorL3EzcElHRUs0V0JJRnJmRDhlV2xkNldOZzMzWFV3NE5YYlkwNDIyMlhrTThuOWhlYjhsL0tPdlVZSVg4SwpMTGhnQTEzTVZsa0grU0ZwYURIdVJnRVVKVFM5UVUzbFdFNXYwWjJQd2tOdzdVVmJYNzhFZzRUWWI1YUxzTThsClJJeFNDeWhBa2tmUkd2WXJQMXZpSFhrNWtiWVY1MkZiVVlUOXRmUGZreWFkTWRVNW83YkJiU3daeVNjK1FiQmcKR3l4OEVCeng4NEZycUpydXFXeTZaQlMveFBlc3czWVVpbDJhaDJzelNVOXJPY2xucVFoODN1ZzFUMFBVczhZMwpYanVOVmtveWpQcUFjMHRkSit1cXRzVUtFdTJmU0hScDFSL3YyKzV3QTNXdUsyeTIxZWROZVI5c2ZTeWY3SWsyCjZFKzZRd0lEQVFBQm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFKWTJDbzl4L0hOZmJQVVlwenBLOE0vaHI3SlRwODFNR0lnTQpOaWp0LzhpdGRNY0QxbTJFSkZwK3pyZDhmeGd6Zi9tWkd2ZWRWQzROVzVhZkJ6bDJEbXJnaWtlOXVwSzRqMHpyClduTFRaN003L3dBWFpjRW1lck1pYVFiRkRXVzZtaEJIK2tUckxieDYyZXFBWCsrQUNZZWU3TnQrQk5YOS8vNE4KMlNkT3pkbkw0NVl2QnFLNlAxb3VKUklBQSt6ZWdYa3hyKzBpMmVZL21ncGhmY3JreUhWY1RCcGVhU3lObkR1UwpuaGphNitNb3l5SGx3elRHTkI3L01aajlQOVVrUHRuKzR3S1pPRUxlN1NrNER6N0JMNVJVaGZ0MmZRL1I2bjczCkJRMVo1eWRQVHhIUTI5aUtabitxOXRWUjNiTUpWdVloQnhyaHhRK3o1MGhNdmxZbnpHYz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBdnVTUEZBNU5sOC9ZM2hPVjF6Ky9xM3BJR0VLNFdCSUZyZkQ4ZVdsZDZXTmczM1hVCnc0TlhiWTA0MjIyWGtNOG45aGViOGwvS092VVlJWDhLTExoZ0ExM01WbGtIK1NGcGFESHVSZ0VVSlRTOVFVM2wKV0U1djBaMlB3a053N1VWYlg3OEVnNFRZYjVhTHNNOGxSSXhTQ3loQWtrZlJHdllyUDF2aUhYazVrYllWNTJGYgpVWVQ5dGZQZmt5YWRNZFU1bzdiQmJTd1p5U2MrUWJCZ0d5eDhFQnp4ODRGcnFKcnVxV3k2WkJTL3hQZXN3M1lVCmlsMmFoMnN6U1U5ck9jbG5xUWg4M3VnMVQwUFVzOFkzWGp1TlZrb3lqUHFBYzB0ZEordXF0c1VLRXUyZlNIUnAKMVIvdjIrNXdBM1d1SzJ5MjFlZE5lUjlzZlN5ZjdJazI2RSs2UXdJREFRQUJBb0lCQUJoUmk3eTFXY00yVWwxdwpSMDJGckloTzZySlVoYUdLb2ppWGs4SnYzdXZsb2lpMW5TWlBMQ3NqcTVPZ3NZZGNMSzRZTWVDOXZVaW5ncXg1CnY3VVV3LzZKeTRkUWpraDVyakQ4ODJydHBrQmJLS1VTSkY2TWw0Z3Z0Mm03Sjc3Q2NES1JaaVRQSHJlUWlUazgKR25aU0hmMlg0aW9BaGk0V0lFcFJEVXhON2p5V3FrcmxBTGFBL1ZiSnR4UWowMlVnem0rNnd4ejUrNTlka0tDRgppV1F4eVdrV3FkRjQ3L05HcUFXVFFjbStPcmYwNmt1VTArV240cDVyK1kvTWgxdFJpbjFXMnhKUlB4dFN3MTFRCkE3Nm5mTDRGZnhuYkwvOEVHWE1zd0NucUZBVzhmZDhXKzRXSlo4c0dNTkYvVDZqZ3hxVWhERGl6S3RCendTT2gKWW9iMmdLRUNnWUVBOEpWdVNVaDh0MklGUm9pMVlXWENuNnltQzdCOTNtc3RvMmpxN3JGTEJRVXRFZDRDYXRzagpCa3dNL2xWbDIzK1FZVVljYUNhSU5YdHYyUy9aNUxKM3d6SytWWXdWcm9pRDlvck5RTjJBZ3NiejZFa1d6Ly8xClBXWUsrNXVxR1dlN3djbExvK3VGSXpuZUdpYmlOU2xQMmdONHhCc0FydU8zblAvWFRlbnBRQkVDZ1lFQXl4LzkKMEhhd3BZSzRtd0h6cDZOWXpRZzY1L2hRNEppSXpGMGl1SGR0a3N2Rk1qbG93bzB1ZGxNSVBtY3NsOXJWRnN2bgpTY1BZRmFjTng5RDRjdkNsc1o2eEtxRTNYS2pUdDBjaDlPc25EWFVOVnpHaTcxVXhRT3p6dnVCbytrMXAzZUNqCnJnSzRLZXpwUHVlejJPb1BZc0lSU0JoaHlJNjlETUZpTnI0cGFSTUNnWUVBNGxSUitwTTg4UEEvOGtrdUNjREgKeFp1UVlqTFpWdU1SZmtkM3JMSVIxMWsxT3pmV29sd2hxUXptdEdYMmV2YVpCMG9EODE4OGlNUGxSemNqRDJsdQpEYTZ4TEoycTBCVVJ3R0I0RSt2TnVEb2V2NG55OGg3andhMDc2OVJYdzZxNUVlZWpSMFNNYmNWRTB1bDlxWEdCCjg2R01mVURCOWNXNHVQUmV3cWVwaldFQ2dZRUFsMWZveHpBSUFlbmFIalJnRk9HU1FvSUZVZDBrZFpOeEtjT2oKSVFwcTY5dER2RjRsL2Y4dlJSNHNvRUpEYVltMUIxMDVvUzU0aS9tQ1BRVW9lSXR4Q1Z5UjZJOWlMbm5qOVVUYwp1aDJUWldWM1lTWXNubUk5Wm9DbVErdjBpN3F1VEpFWm80ZUhMRVhHckFYN2JIMUlwVzZ2YmFZdEJUL0ZBQUgrCmFZZGFWMTBDZ1lBNnhWbXdlcHZBckNiVDZFQUE1RVVJQ2RKZTAzRFd5a3VzMnVQRU5qSmtUS3RJM3lueHl1b0gKbkVQL3FleHZqZkpMckVFcXZNemxMTVhzdTdTSElXeWdSNWRxem41Z3pvOFBwV0d3VkJ2OTM2V1o3SnRTMGdEUAprUzlkUnpWYlZKREJwZWdQdHNFQ09aQUJrTzI5QzhzY2IvUnZFdnB4YkpJdkpvTWF4b3FHWEE9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=

2.4、ServiceAccount

Pod中的容器访问API Server。因为Pod的创建、销毁是动态的,所以要为它手动生成证书就不可行了。Kubenetes使用了Service Account解决Pod 访问API Server的认证问题

2.5、Secret 与 SA 的关系

Kubernetes 设计了一种资源对象叫做 Secret,分为两类,一种是用于 ServiceAccount 的 service-account-token,另一种是用于保存用户自定义保密信息的 Opaque。ServiceAccount 中用到包含三个部分:Token、ca.crt、namespace

  • token是使用 API Server 私钥签名的 JWT。用于访问API Server时,Server端认证
  • ca.crt,根证书。用于Client端验证API Server发送的证书
  • namespace, 标识这个service-account-token的作用域名空间
[root@k8s-master01 ~]# kubectl get secret --all-namespaces
[root@k8s-master01 ~]# kubectl describe secret default-token-5gm9r --namespace=kube-system

默认情况下,每个 namespace 都会有一个 ServiceAccount,如果 Pod 在创建时没有指定 ServiceAccount,就会使用 Pod 所属的 namespace 的 ServiceAccount

2.6、总结

image

三、鉴权--Authorization

上面认证过程,只是确认通信的双方都确认了对方是可信的,可以相互通信。而鉴权是确定请求方有哪些资源的权限。API Server 目前支持以下几种授权策略(通过 API Server 的启动参数 “--authorization-mode” 设置)

  • AlwaysDeny:表示拒绝所有的请求,一般用于测试
  • AlwaysAllow:允许接收所有请求,如果集群不需要授权流程,则可以采用该策略
  • ABAC(Attribute-Based Access Control):基于属性的访问控制,表示使用用户配置的授权规则对用户请求进行匹配和控制
  • Webbook:通过调用外部 REST 服务对用户进行授权
  • RBAC(Role-Based Access Control):基于角色的访问控制,现行默认规则(常用)

3.1、RBAC 授权模式

RBAC(Role-Based Access Control)基于角色的访问控制,在 Kubernetes 1.5 中引入,现行版本成为默认标准。相对其它访问控制方式,拥有以下优势:

  • 对集群中的资源和非资源均拥有完整的覆盖
  • 整个 RBAC 完全由几个 API 对象完成,同其它 API 对象一样,可以用 kubectl 或 API 进行操作
  • 可以在运行时进行调整,无需重启 API Server

3.2、RBAC 的 API 资源对象说明

RBAC 引入了 4 个新的顶级资源对象:Role、ClusterRole、RoleBinding、ClusterRoleBinding,4 种对象类型均可以通过 kubectl 与 API 操作

image

需要注意的是 Kubenetes 并不会提供用户管理,那么 User、Group、ServiceAccount 指定的用户又是从哪里来的呢? Kubenetes 组件(kubectl、kube-proxy)或是其他自定义的用户在向 CA 申请证书时,需要提供一个证书请求文件

image

API Server会把客户端证书的CN字段作为User,把names.O字段作为Group

kubelet 使用 TLS Bootstaping 认证时,API Server 可以使用 Bootstrap Tokens 或者 Token authenticationfile 验证=token,无论哪一种,Kubenetes 都会为 token 绑定一个默认的 User 和 Group

Pod使用 ServiceAccount 认证时,service-account-token 中的 JWT 会保存 User 信息

有了用户信息,再创建一对角色/角色绑定(集群角色/集群角色绑定)资源对象,就可以完成权限绑定了

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!