阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Kubernetes API服务器的安全防护

159次阅读
没有评论

共计 7475 个字符,预计需要花费 19 分钟才能阅读完成。

正文

12.1. 了解认证机制

启动 API 服务器时,通过命令行选项可以开启认证插件。

12.1.1. 用户和组

了解用户:

分为两种连接到 api 服务器的客户端:

1. 真实的人

2.pod,使用一种称为 ServiceAccount 的机制

了解组:

认证插件会连同用户名,和用户 id 返回组,组可以一次性给用户服务多个权限,不用单次赋予,

system:unauthenticated 组:用于所有认证插件都不会认证客户端身份的请求。

system:authenticated 组:会自动分配给一个成功通过认证的用户。

system:serviceaccount 组:包含 所有在系统中的 serviceaccount。

system:serviceaccount:<namespace> 组:包含了所有在特定命名空间中的 serviceAccount。

12.1.2 ServiceAccount 介绍

每个 pod 中都包含 /var/run/secrets/kubernetes.io/serviceaccount/token 文件,如下图所示,文件内容用于对身份进行验证,token 文件持有 serviceaccount 的认证 token。

Kubernetes API 服务器的安全防护

应用程序使用 token 去连接 api 服务器时,认证插件会对 serviceaccount 进行身份认证,并将 serviceaccount 的用户名传回到 api 服务器内部。

       serviceaccount 的用户名格式如下:

system:serviceaccount:<namespace>:<service account name>

ServiceAccount 是运行在 pod 中的应用程序,和 api 服务器身份认证的一中方式

了解 ServiceAccount 资源

ServiceAcount 作用在单一命名空间,为每个命名空间创建默认的 ServiceAccount。

       Kubernetes API 服务器的安全防护

多个 pod 可以使用相同命名空间下的同一的 ServiceAccount

 ServiceAccount 如何与授权文件绑定

  在 pod 的 manifest 文件中,可以指定账户名称的方式,将一个 serviceAccount 赋值给一个 pod,如果不指定,将使用该命名空间下默认的 ServiceAccount.

  可以 将不同的 ServiceAccount 赋值给 pod,让 pod 访问不同的资源。

 

 

12.1.3 创建 ServiceAccount

为了集群的安全性,可以手动创建 ServiceAccount,可以限制只有允许的 pod 访问对应的资源。

        创建方法如下:

$ kubectl get sa
NAME      SECRETS  AGE
default  1        21h
 
 
$ kubectl create serviceaccount yaohong
serviceaccount/yaohong created
 
 
$ kubectl get sa
NAME      SECRETS  AGE
default  1        21h
yaohong  1        3s

使用 describe 来查看 ServiceAccount。

$ kubectl describe sa yaohong
Name:                yaohong
Namespace:          default
Labels:              <none>
Annotations:        <none>
Image pull secrets:  <none>
Mountable secrets:  yaohong-token-qhbxn  // 如果强制使用可挂载秘钥。那么使用这个 serviceaccount 的 pod 只能挂载这个秘钥
Tokens:              yaohong-token-qhbxn
Events:              <none>

查看该 token,

$ kubectl describe secret yaohong-token-qhbxn
Name:        yaohong-token-qhbxn
Namespace:    default
Labels:      <none>
Annotations:  kubernetes.io/service-account.name: yaohong
              kubernetes.io/service-account.uid: a3d0d2fe-bb43-11e9-ac1e-005056870b4d
 
Type:  kubernetes.io/service-account-token
 
Data
====
ca.crt:    1342 bytes
namespace:  7 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6Inlhb2hvbmctdG9rZW4tcWhieG4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoieWFvaG9uZyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImEzZDBkMmZlLWJiNDMtMTFlOS1hYzFlLTAwNTA1Njg3MGI0ZCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0Onlhb2hvbmcifQ.BwmbZKoM95hTr39BuZhinRT_vHF-typH4anjkL0HQxdVZEt_eie5TjUECV9UbLRRYIqYamkSxmyYapV150AQh-PvdcLYPmwKQLJDe1-7VC4mO2IuVdMCI_BnZFQBJobRK9EdPdbZ9uxc9l0RL5I5WyWoIjiwbrQvtCUEIkjT_99_NngdrIr7QD9S5SxHurgE3HQbmzC6ItU911LjmxtSvBqS5NApJoJaztDv0cHKvlT67ZZbverJaStQdxr4yiRbpSycRNArHy-UZKbNQXuzaZczSjVouo5A5hzgSHEBBJkQpQ6Tb-Ko5XGjjCgV_b9uQvhmgdPAus8GdFTTFAbCBw

 

12.1.4 将 ServiceAccount 分配给 pod

在 pod 中定义的 spec.serviceAccountName 字段上设置,此字段必须在 pod 创建时设置后续不能被修改。

自定义 pod 的 ServiceAccount 的方法如下图

      Kubernetes API 服务器的安全防护

12.2 通过基于角色的权限控制加强集群安全

12.2.1. 介绍 RBAC 授权插件

RBAC 授权插件将用户角色作为决定用户能否执行操作的关机因素

 

12.2.2 介绍 RBAC 授权资源

RBAC 授权规则通过四种资源来进行配置的,他们可以分为两组:

Role 和 ClusterRole,他们决定资源上可执行哪些动词。

       RoleBinding 和 ClusterRoleBinding,他们将上述角色绑定到特定的用户,组或者 ServiceAccounts 上。

Role 和 RoleBinding 是 namespace 级别资源

ClusterRole 和 ClusterRoleBinding 是集群级别资源

12.2.3 使用 Role 和 RoleBinding

  Role 资源定义了哪些操作可以在哪些资源上执行,

创建 Role

service-reader.yml

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: kube-system
  name: service-reader
rules:
– apiGroups: [“”]
  verbs: [“get”, “list”]
  resources: [“services”]

在 kube-system 中创建 Role

#kubectl -n kube-system create -f service-reader.yml

查看该 namespace 下的 role

$ kubectl -n kube-system get role
NAME                                            AGE
extension-apiserver-authentication-reader        41h
kube-state-metrics-resizer                      41h
service-reader                                  2m17s
system::leader-locking-kube-controller-manager  41h
system::leader-locking-kube-scheduler            41h
system:controller:bootstrap-signer              41h
system:controller:cloud-provider                41h
system:controller:token-cleaner                  41h

绑定角色到 ServiceAccount

将 service-reader 角色绑定到 default ServiceAccount

$ kubectl  create rolebinding test –role=service-reader
rolebinding.rbac.authorization.k8s.io/test created

Kubernetes API 服务器的安全防护

$ kubectl  get rolebinding test -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  creationTimestamp: 2019-08-11T03:40:51Z
  name: test
  namespace: default
  resourceVersion: “239323”
  selfLink: /apis/rbac.authorization.k8s.io/v1/namespaces/default/rolebindings/test
  uid: d0aff243-bbe9-11e9-ac1e-005056870b4d
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: service-reader

 

12.2.4 使用 ClusterRole 和 ClusterRoleBinding

 查看集群 ClusterRole

# kubectl get clusterrole
NAME                                                                  AGE
admin                                                                  42h
cluster-admin                                                          42h
edit                                                                  42h
flannel                                                                42h
kube-state-metrics                                                    42h
system:aggregate-to-admin                                              42h

创建 ClusterRole

kubectl create clusterrole flannel –verb=get,list -n kube-system

查看 yaml 文件

# kubectl get  clusterrole flannel -o yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {“apiVersion”:”rbac.authorization.k8s.io/v1″,”kind”:”ClusterRole”,”metadata”:{“annotations”:{},”name”:”flannel”},”rules”:[{“apiGroups”:[“”],”resources”:[“pods”],”verbs”:[“get”]},{“apiGroups”:[“”],”resources”:[“nodes”],”verbs”:[“list”,”watch”]},{“apiGroups”:[“”],”resources”:[“nodes/status”],”verbs”:[“patch”]}]}
  creationTimestamp: 2019-08-09T09:58:42Z
  name: flannel
  resourceVersion: “360”
  selfLink: /apis/rbac.authorization.k8s.io/v1/clusterroles/flannel
  uid: 45100f6f-ba8c-11e9-8f57-005056870608
rules:
– apiGroups:
  – “”
  resources:
  – pods
  verbs:
  – get
– apiGroups:
  – “”
  resources:
  – nodes
  verbs:
  – list
  – watch
– apiGroups:
  – “”
  resources:
  – nodes/status
  verbs:
  – patch

 

创建 clusterRoleBinding

$ kubectl  create clusterrolebinding  cluster-tetst  –clusterrole=pv-reader  –serviceaccount=kuebsystem:yaohong
clusterrolebinding.rbac.authorization.k8s.io/cluster-tetst created

Kubernetes API 服务器的安全防护

 

 

12.2.5 了解默认的 ClusterRole 和 ClusterRoleBinding

如下所示使用 kubectl get clusterroles 和 kubectl get clusterrolesbinding 可以获取 k8s 默认资源。

用 edit ClusterRole 允许对资源进行修改

用 admin ClusterRole 赋予一个命名空间全部的权限

$ kubectl get clusterroles
NAME                                                                  AGE
admin                                                                  44h
cluster-admin                                                          44h
edit                                                                  44h
flannel                                                                44h
kube-state-metrics                                                    44h
system:aggregate-to-admin                                              44h
system:aggregate-to-edit                                              44h
system:aggregate-to-view                                              44h
system:auth-delegator                                                  44h
system:aws-cloud-provider                                              44h
system:basic-user                                                      44h
system:certificates.k8s.io:certificatesigningrequests:nodeclient      44h
system:certificates.k8s.io:certificatesigningrequests:selfnodeclient  44h
system:controller:attachdetach-controller                              44h
system:controller:certificate-controller                              44h
system:controller:clusterrole-aggregation-controller                  44h
。。。
wps@wps:~$ kubectl get clusterrolebindings
NAME                                                  AGE
clust-tetst                                            17m
cluster-admin                                          44h
cluster-tetst                                          13m
flannel                                                44h
kube-state-metrics                                    44h
kubelet-bootstrap                                      44h
system:aws-cloud-provider                              44h
system:basic-user                                      44h
system:controller:attachdetach-controller              44h
system:controller:certificate-controller              44h
。。。

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计7475字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中