Kubernetes身份认证和授权操作全攻略:访问控制之Service Account

算法探幽人
• 阅读 1642

这是本系列的最后一篇文章,前面我们了解了访问控制中的基本概念以及身份认证和授权的具体操作,本文我们将进一步了解访问控制中的service account。

Kubernetes中有用户和service account的概念,可用于访问资源。用户与密钥和证书相关联用于验证API请求,使用其中一个配置方案对在集群外部发起的任何请求进行身份验证。最常见的方案是通过X.509证书进行身份认证请求。有关创建证书和将证书与用户关联的信息,请参阅Kubernetes身份验证教程。

请记住,Kubernetes不维护数据库或用户和密码的配置文件。相反,它希望在集群之外进行管理。通过身份验证模块的概念,Kubernetes可以将身份验证委派给第三方,如OpenID或Active Directory。

尽管X.509证书可用于身份验证的外部请求,但service account可以用于验证集群中运行的进程。此外,service account与进行API server内部调用的pod相关联。

每个Kubernetes安装都有一个默认的service account,它与每个正在运行的pod相关联。类似地,为了使pod能够调用内部API Server端点,有一个名为Kubernetes的ClusterIP服务,它与默认的service account一起使内部进程可以调用API端点。

kubectl get serviceAccounts
NAME      SECRETS   AGE
default   1         122m
 kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1            443/TCP   123m

请注意,这个service account指向嵌在每个pod内部的secret。这一secret包含API Server所需的令牌。

kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-4rpmv   kubernetes.io/service-account-token   3      123m

当我们开始调度pod并且访问它时,一切都变得明朗起来。我们将使用curl命令启动一个基于BusyBox的pod。

kubectl run -i --tty --rm curl-tns --image=radial/busyboxplus:curl
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
If you don't see a command prompt, try pressing enter.
[ root@curl-tns-56c6d54585-6v2xp:/ ]$

当我们在BusyBox shell中时,让我们尝试访问API Server端点。

[ root@curl-tns-56c6d54585-6v2xp:/ ]$ curl https://kubernetes:8443/api

由于请求缺少身份验证令牌,因此不会产生任何结果。让我们看看如何检索可以嵌入HTTP头部的令牌。

如之前所讨论的,令牌作为一个secret安装在pod里。查看/var/run/secrets/kubernetes.io/serviceaccount 来查找令牌。

[ root@curl-tns-56c6d54585-6v2xp:/ ]$ cd /var/run/secrets/kubernetes.io/serviceaccount
[ root@curl-tns-56c6d54585-6v2xp:/tmp/secrets/kubernetes.io/serviceaccount ]$ ls
ca.crt     namespace  token

让我们来设置一些环境变量以简化curl命令。

CA_CERT=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)

以下curl命令请求在默认命名空间中的服务。让我们看看我们能否从API Server中获得回应。

[ root@curl-tns-56c6d54585-6v2xp:~ ]$ curl --cacert $CA_CERT -H "Authorization: Bearer $TOKEN" "https://kubernetes/api/v1/namespaces/$NAMESPACE/services/"
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {
 
  },
  "status": "Failure",
  "message": "services is forbidden: User \"system:serviceaccount:default:default\" cannot list resource \"services\" in API group \"\" in the namespace \"default\"",
  "reason": "Forbidden",
  "details": {
    "kind": "services"
  },
  "code": 403
}

然而,默认的service account并没有足够的权限来检索在同一命名空间内的服务。

请记住,Kubernetes遵循封闭开放的惯例,这意味着在默认情况下用户和service account没有任何权限。

为了满足这一请求,我们需要创建一个角色绑定,将默认service account和适当的角色相关联。这一步与我们将角色绑定到Bob的方式类似,后者授予他列出pod的权限。

退出pod并且运行以下命令,为默认service account创建一个角色绑定。

kubectl create rolebinding default-view \
  --clusterrole=view \
  --serviceaccount=default:default \
  --namespace=default
 rolebinding.rbac.authorization.k8s.io/default-view created

以上命令将默认service account与集群角色视图相关联,该角色视图使pod能够列出资源。

如果你十分好奇,想看所有可用的集群角色,运行命令:kubectl get clusterroles。

让我们再次启动BusyBox pod并且访问API Server。

kubectl run -i --tty --rm curl-tns --image=radial/busyboxplus:curl
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
If you don't see a command prompt, try pressing enter.
[ root@curl-tns-56c6d54585-2cx44:/ ]$
CA_CERT=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)
curl --cacert $CA_CERT -H "Authorization: Bearer $TOKEN" "https://kubernetes/api/v1/namespaces/$NAMESPACE/services/"
{
  "kind": "ServiceList",
  "apiVersion": "v1",
  "metadata": {
    "selfLink": "/api/v1/namespaces/default/services/",
    "resourceVersion": "11076"
  },
  "items": [
    {
      "metadata": {
        "name": "kubernetes",
        "namespace": "default",
        "selfLink": "/api/v1/namespaces/default/services/kubernetes",
        "uid": "b715a117-6be1-4de0-8830-45bddcda701c",
        "resourceVersion": "151",
        "creationTimestamp": "2019-08-13T09:45:27Z",
        "labels": {
          "component": "apiserver",
          "provider": "kubernetes"
        }
      },
      "spec": {
        "ports": [
          {
            "name": "https",
            "protocol": "TCP",
            "port": 443,
            "targetPort": 8443
          }
        ],
        "clusterIP": "10.96.0.1",
        "type": "ClusterIP",
        "sessionAffinity": "None"
      },
      "status": {
        "loadBalancer": {
 
        }
      }
    }
  ]
}

您可以随意为默认service account创建其他绑定,以检查RBAC如何扩展到pod。

关于Kubernetes身份认证与授权系列文章到此结束,我们讨论了身份验证,授权和Service account的基本概念,希望能对你有所帮助。

点赞
收藏
评论区
推荐文章
Prodan Labs Prodan Labs
4年前
Kubernetes Ingress — NGINX
在Kubernetes中,Service是一种抽象的概念,它定义了每一组Pod的逻辑集合和访问方式,并提供一个统一的入口,将请求进行负载分发到后端的各个Pod上。Service默认类型是ClusterIP,集群内部的应用服务可以相互访问,但集群外部的应用服务无法访问。为此Kubernetes提供了NodePorts,LoadBalan
Wesley13 Wesley13
3年前
RBAC模型
RBAC基于角色的访问控制(RoleBasedAccessControl)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注。在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用
Stella981 Stella981
3年前
IdentityServer4在Asp.Net Core中的应用(一)
  IdentityServer4是一套身份授权以及访问控制的解决方案,专注于帮助使用.Net技术的公司为现代应用程序建立标识和访问控制解决方案,包括单点登录、身份管理、授权和API安全。  下面我将具体介绍如何在.NetCore中实现OAuth授权,从最简单的授权模式开始,在上一篇对OAuth2.0的详细描述中,在客户端模式中,我们说它在严
Easter79 Easter79
3年前
SpringCloud Alibaba微服务实战十九
!(https://oscimg.oschina.net/oscnet/4890bf88dd2a49fda56ac51f2c120c84.png)概述前面几篇文章我们一直是在实现SpringCloud体系中的认证功能模块,验证当前登录用户的身份;本篇文章我们来讲SpringCloud体系中的授权功能,验证你是否能访问某些功能。
Stella981 Stella981
3年前
Apache Hadoop配置Kerberos指南
  通常,一个Hadoop集群的安全使用kerberos来进行保障。在启用Kerberos后,需要用户进行身份验证。用户通过验证后可以使用GRANT/REVOKE语句来进行基于角色的访问控制。本文介绍一下在CDH集群中如何配置kerberos。1.KDC安装和配置脚本  脚本install\_kerberos.sh可以完成kerberos服
Stella981 Stella981
3年前
Apache Shiro反序列化识别那些事
1.1关于ApacheShiroApacheshiro是一个Java安全框架,提供了认证、授权、加密和会话管理功能,为解决应⽤安全提供了相应的API:1.认证⽤用户身份识别,常被称为用户”登录”2.授权访问控制3.密码加密保护或隐藏数据防止被偷窥4.会话管理用户相关的时间敏感的状态1.2Shiro反序列化
Stella981 Stella981
3年前
Service Account和RBAC授权
一、介绍ServiceAccount概念的引入是基于这样的使用场景:运行在pod里的进程需要调用KubernetesAPI以及非KubernetesAPI的其它服务。ServiceAccount它并不是给kubernetes集群的用户使用的,而是给pod里面的进程使用的,它为pod提供必要的身份认证。二、创建ServiceAcco
Stella981 Stella981
3年前
Kubernetes
1、Kubernetes中的用户所有的系统都存在访问和使用其的用户,Kubernetes也一样,在Kubernetes集群中有存在两类用户:serviceaccounts:由Kubernetes进行管理的特殊用户;普通用户:普通用户是由外部应用进行管理的用户。对于普通用户,
Wesley13 Wesley13
3年前
Mysql用户与权限操作
1.用户与权限概述用户是数据库的使用者和管理者。MySQL通过用户的设置来控制数据库操作人员的访问与操作范围。服务器中名为mysqI的数据库,用于维护数据库的用户以及权限的控制和管理。MySQL中的所有用户信息都保存在mysql.user数据表中。根据my
Shiro权限控制入门
Shiro权限控制是一款优秀的Java安全框架,可用于对Java应用程序进行身份验证、授权、加密和会话管理等功能。本文将简要介绍Shiro权限控制框架的几个关键概念和使用方法。
融云IM即时通讯 融云IM即时通讯
6个月前
融云 IM 干货丨云存储的安全措施有哪些?
云存储的安全措施云存储的安全性是确保数据机密性、完整性和可用性的关键。以下是一些常见的云存储安全措施:1.访问控制与权限管理身份认证:通过密码、多因素认证(如短信验证码、生物识别等)确认用户身份,确保只有授权用户才能访问云存储数据。基于角色的访问控制(RB