Kubernetes基础:is forbidden: User YYY cannot list resource的RBAC问题对应

深入浅出kubernetes 专栏收录该内容
132 篇文章 70 订阅

在这里插入图片描述
这篇文章memo一下一种常见的RBAC权限问题的判断和对应方法。

环境准备

快速环境搭建建议使用单机版Kubernetes的安装脚本,一键安装,详情可参看:

环境信息如下所示

[root@host132 ~]# kubectl get node -o wide
NAME              STATUS   ROLES    AGE   VERSION   INTERNAL-IP       EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION          CONTAINER-RUNTIME
192.168.163.132   Ready    <none>   32m   v1.15.0   192.168.163.132   <none>        CentOS Linux 7 (Core)   3.10.0-957.el7.x86_64   docker://18.9.7
[root@host132 ~]# 

现象

现象说明:
返回码403,返回的message中出现注入namespaces is forbidden的信息,如果访问其他的比如api/v1/pods,则会返回pods is forbidden的信息。

[root@host132 ~]# curl --insecure https://192.168.163.132:6443/api/v1/namespaces --header "Authorization: bearer 00fdeedfa65384fe4dca538a54a0e8a1"
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {
    
  },
  "status": "Failure",
  "message": "namespaces is forbidden: User \"kubelet-bootstrap\" cannot list resource \"namespaces\" in API group \"\" at the cluster scope",
  "reason": "Forbidden",
  "details": {
    "kind": "namespaces"
  },
  "code": 403
}[root@host132 ~]# 

现象分析:
首先上述示例是通过token方式进行访问,这种方式就是在报文的header中添加bearer的token。首先需要确认的是在kube-apiserver中设定的token文件的内容是否正确,而这一点从返回值可以判断出来,因为根据Kubernetes的这种认证方式,如果不正确首先会返回Unauthorized的信息,同时返回码一般也为401,需要判断的是此csv文件中以逗号分割的第二列的值(也就是curl命令中出现的User “kubelet-bootstrap”)是否正确,如果确认则进行/api的访问确认。

  • /api访问确认
[root@host132 ~]# curl --insecure https://192.168.163.132:6443/api --header "Authorization: bearer 00fdeedfa65384fe4dca538a54a0e8a1"
{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "192.168.163.132:6443"
    }
  ]
}[root@host132 ~]#

发现能正常访问,所以排除了apiserver没能正常运行等可能性,进一步确认的话,可以考虑删除apiserver的authorization-mode和anonymous-auth设定(允许匿名访问和取消RBAC),详细可参看:

  • https://liumiaocn.blog.csdn.net/article/details/100518110

如果能够访问,则基本确认这个就是RBAC的权限设置不正确的原因。

对应方法

直接将出现权限不足的用户先行与超级权限的组进行关联,如果能够使用,则说明是RBAC的问题,然后再根据需要创建合适的角色和ClusterRoleBinding与之关联即可。示例如下所示:

[root@host132 ~]# kubectl create clusterrolebinding bootstrap --clusterrole=cluster-admin --user=kubelet-bootstrap
clusterrolebinding.rbac.authorization.k8s.io/bootstrap created
[root@host132 ~]# 
[root@host132 ~]# kubectl describe clusterrolebinding bootstrap
Name:         bootstrap
Labels:       <none>
Annotations:  <none>
Role:
  Kind:  ClusterRole
  Name:  cluster-admin
Subjects:
  Kind  Name               Namespace
  ----  ----               ---------
  User  kubelet-bootstrap  
[root@host132 ~]# 

对应确认

权限关联之后,再次使用相同的curl命令访问API,发现已经能够成功访问

[root@host132 ~]# curl --insecure https://192.168.163.132:6443/api/v1/namespaces --header "Authorization: bearer 00fdeedfa65384fe4dca538a54a0e8a1" 2>/dev/null |grep name
    "selfLink": "/api/v1/namespaces",
        "name": "default",
        "selfLink": "/api/v1/namespaces/default",
        "name": "kube-node-lease",
        "selfLink": "/api/v1/namespaces/kube-node-lease",
        "name": "kube-public",
        "selfLink": "/api/v1/namespaces/kube-public",
        "name": "kube-system",
        "selfLink": "/api/v1/namespaces/kube-system",
[root@host132 ~]# 

其他基础

参考内容

https://kubernetes.io/docs/reference/access-authn-authz/rbac/

  • 0
    点赞
  • 1
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值