kubernetes 中的授权机制

k8s中的授权策略也支持开启多个授权插件,只要一个验证通过即可。k8s授权处理主要是根据以下请求属性:

  • user, group, extra
  • API、请求方法(如get、post、update、patch和delete)和请求路径(如/api)
  • 请求资源和子资源
  • Namespace
  • API Group

目前k8s支持的授权模式主要有以下几种:

  • Node Authorization
  • ABAC Authorization
  • RBAC Authorization
  • Webhook Authorization

Node Authorization

1.7+版本才release的一种授权机制,通过配合NodeRestriction control准入控制插件来限制kubelet访问node,endpoint、pod、service以及secret、configmap、PV和PVC等相关的资源。配置方式为: –authorization-mode=Node,RBAC –admission-control=…,NodeRestriction,…

ABAC Authorization

ABAC(Attribute-based access control),使用这种模式需要配置参数: –authorization-mode=ABAC –authorization-policy-file=SOME_FILENAME。 这种模式的实现相对比较生硬,就是在master node保存一份policy文件,指定不用用户(或用户组)对不同资源的访问权限,当修改该文件后,需要重启apiserver,跟openstack 的ABAC类似。policy文件的格式如下:

# Alice can do anything to all resources:
{
    "apiVersion": "abac.authorization.kubernetes.io/v1beta1",
    "kind": "Policy",
    "spec": {
        "user": "alice",
        "namespace": "*",
        "resource": "*",
        "apiGroup": "*"
    }
}
# Kubelet can read any pods:
{
    "apiVersion": "abac.authorization.kubernetes.io/v1beta1",
    "kind": "Policy",
    "spec": {
        "user": "kubelet",
        "namespace": "*",
        "resource": "pods",
        "readonly": true
    }
}

# Kubelet can read and write events:
{
    "apiVersion": "abac.authorization.kubernetes.io/v1beta1",
    "kind": "Policy",
    "spec": {
        "user": "kubelet",
        "namespace": "*",
        "resource": "events"
    }
}

使用这种模式需要配置参数: –authorization-mode=ABAC –authorization-policy-file=SOME_FILENAME

RBAC Authorization

RBAC(Role-Based Access Control)依然处于Beta阶段,通过启动参数–authorization-mode=RBAC,使用kubeadm安装k8s默认会enabled。 RBAC API定义了四个资源对象用于描述RBAC中用户和资源之间的连接权限:

  • Role
  • ClusterRole
  • RoleBinding
  • ClusterRoleBinding

Role是定义在某个Namespace下的资源,在这个具体的Namespace下使用。 ClusterRole与Role相似,只是ClusterRole是整个集群范围内使用的。 RoleBinding把Role绑定到账户主体Subject,让Subject继承Role所在namespace下的权限。 ClusterRoleBinding把ClusterRole绑定到Subject,让Subject集成ClusterRole在整个集群中的权限。

我们可以通过kubectl命令获取对应的Role相关资源进行增删改查:

kubectl get roles --all-namespaces

kubectl get ClusterRoles

kubectl get rolebinding --all-namespaces

kubectl get clusterrolebinding

API Server已经创建一系列ClusterRole和ClusterRoleBinding。这些资源对象中名称以system:开头的,表示这个资源对象属于Kubernetes系统基础设施。 也就说RBAC默认的集群角色已经完成足够的覆盖,让集群可以完全在 RBAC的管理下运行。 修改这些资源对象可能会引起未知的后果,例如对于system:node这个ClusterRole定义了kubelet进程的权限,如果这个角色被修改,可能导致kubelet无法工作。

Webhook Authorization

用户在外部提供 HTTPS 授权服务,然后配置 apiserver 调用该服务去进行授权。apiserver配置参数: –authorization-webhook-config-file=SOME_FILENAME 配置文件的格式跟kubeconfig的格式类似,具体参考官方文档