KubeSphere的ACL、RBAC、ABAC授权中间件

292 阅读6分钟

casbin-kubesphere-auth

Casbin-kubesphere-auth 是一个通过casbin 在 kubesphere 上应用几种安全认证检查的插件。这个插件支持以下功能:

  • 检查对k8s资源的操作是否合法(例如,对某一部署执行 "DELETE "操作)。不合法的请求将被拦截并拒绝。
  • 检查你在任何pod/deployment上使用的docker镜像是否被信任。如果不是,请求将被拦截和拒绝。

上述功能是通过k8s的接纳webhook实现的。Webhook服务可以作为一个docker文件构建,为了更好地支持kubesphere,这个webhook服务也被打包成一个helm应用,可以上传到本地kubesphere市场并轻松部署。

你可以在kubesphere和原始k8s中使用这个插件。

概述

此项目的结构

  • casbin-kubesphere/ 此文件夹用于创建一个舵手包。
  • k8sconfig/ 此文件夹包含部署此webhook所需的yaml配置文件。
  • webhook/ 这个文件夹包含webhook服务的真正代码。这个文件夹还包括一个Docker文件,这意味着服务的docker镜像应该建立在这个文件夹的基础上。
    • webhook/casbinconfig包含casbin模型和策略。
    • webhook/certificate包含证书、私钥和公钥,仅作示例。除了测试环境外,你不能在任何环境中使用这个密钥,因为每个人都可以得到这个文件夹中的私钥。你应该通过下面的教程中提到的方法生成一套你自己的钥匙。
    • 其他的是实现这项服务的代码。

开始吧:如何使这个插件工作

第一步:安装好k8s和kubesphere:

安装k8s:https://kubernetes.io/docs/setup/

安装kubesphere:https://kubesphere.com.cn/en/docs/quick-start/minimal-kubesphere-on-k8s/

(安装kubesphere时,请选择 "minimal install on kubernets "而不是 "all in one for linux")

步骤2 启用你的k8s的ValidatingWebhookConfiguration

简而言之,你应该向k8s apiserver添加配置"--enable-admission-plugins=NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook"。添加这个配置的具体方法取决于你如何安装你的k8s。

例如,如果你使用minikube,你应该停止minikube并通过以下命令重新启动它

minikube start --extra-config=apiserver.enable-admission-plugins=NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook

或者如果你使用kubeadm来安装k8s,也许你需要将'--enable-admission-plugins=NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook'一行添加到api-server配置文件的适当位置,该文件通常在/etc/kubernetes/manifests下。

或者也许你可以直接使用'kube-apiserver'
......

你可以从k8s文档中找到更多信息见https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/

生成一套证书和私钥

K8s要求任何k8s的webhook必须使用https,而不是http。

在这一步,我们将生成一个自制的CA,并使用这个CA为你的webhook签署一个自签名的证书。如果你已经有一个由真正的CA签署的证书,你可以跳过这一步。

在webhook/certificate中,有一个此步骤的输出示例。但你不能直接使用它,因为私钥也暴露在这个文件夹中,而泄漏的私钥会使你的连接不安全。

为假CA生成私钥

openssl genrsa -des3 -out ca.key 2048

移除私钥的密码保护:

openssl rsa -in ca.key -out ca.key

为webhook服务器生成一个私钥,并移除密码:

openssl genrsa -des3 -out server.key 2048
openssl rsa -in server.key  -out server.key 

复制你的系统的openssl配置文件供临时使用。你可以使用openssl version -a 来找出配置文件的位置:

找到[req]段并添加以下一行。req_extensions = v3_req

找到[v3_req]段并添加以下行。subjectAltName = @alt_names

将以下几行添加到文件中:

[alt_names]
DNS.2=casbin-webhook-svc.default.svc

casbin-webhook-svc.default.svc "应替换为你自己的服务的真实服务名称(如果你决定修改服务名称)。

使用修改后的配置文件来生成一个证书请求文件

openssl req -new -nodes -keyout server.key -out server.csr -config openssl.cnf 

使用自制的CA来响应请求并签署证书

openssl x509 -req -days 3650 -in server.csr -out server.crt -CA ca.crt  -CAkey ca.key -CAcreateserial -extensions v3_req  -extfile openssl.cnf 

重新审视yaml配置

为了使webhook进入工作状态,我们需要对k8s应用一些yaml配置。

在k8sconfig文件夹中有两个yaml文件:webhook2.yaml和webhook3.yaml。

应用webhook3.yaml将使你使用该插件的图像创建一个部署,以及一个暴露该插件的IP和端口的服务。

应用webhook2.yaml将使你告诉k8s接纳webhooks的服务,当对指定的资源进行操作时,请求应该被发送到这些服务。

在webhook2.yaml中你可以看到'caBundle'属性。这是为你的webhook服务签署证书的CA的base64编码字符串,因为k8s需要知道这个CA,这样他们才能确保你的webhook提供的证书是有效的。例如,在这个项目中,你可以使用'base64 ca.crt'来获得这个字符串。需要注意的是,像'\n'、'\r' 这样的东西必须被删除。

在webhook3.yaml中,你可以发现我们使用了本地的docker镜像,并将镜像策略设置为'从不从远程拉取镜像'。为了方便运行这个小项目。如果你的公司有一个私有的docker repo,你应该修改这一部分。

重新审视casbin的配置

casbin的模型和策略都存储在webhook/casbinconfig中。有两套模型和政策。image_model.conf和image_policy控制一个图像是否被信任,permission_model.conf和permission_policy.csv控制是否可以对资源进行操作。

重新审视webhook的配置

在webhook/webhookconfig中你可以看到config.json。通过这个文件,你可以打开或关闭一个检查规则,或修改casbin Enforcer的参数表。例如,你可以修改它们,使casbin的执行者可以使用类似redis或mysql适配器的东西,这样就可以动态地修改ploicies。在这个项目中,我们使用文件作为策略来制作一个exapmle,这并不推荐,因为如果是这样的话,每次对策略做一些改变时,你都必须关闭该服务并重建docker镜像。

将该服务打包到舵手应用中

如果你想让这个服务成为你组织的基础设施,你应该把这个服务打包到helm app中,这是kubesphere应用商店支持的唯一格式。

如果你还没有安装helem,请看helm.sh/docs/,并安装它。

运行

helm create casbin-kubesphere

你可以看到一个文件夹'casbin-kubesphere'被创建。在这个项目中,我们已经运行了这个命令,你可以看到那里已经有一个casbin-kubesphere文件夹。

删除 casbin-kubesphere/templates 下的所有内容,除了 deployment.yaml。结合k8sconfig/webhook2.yaml和k8sconfig/webhook3.yaml的内容,将其复制到deployment.yaml中。

抹去values.yaml中的所有内容

运行

helm package casbin-kubesphere

你会看到一个名为 "casbin-kubesphere-0.1.0.tgz "的文件被创建。这是该插件的舵手包。

要在k8s中直接安装这个插件,运行helm install casbin-kubesphere-0.1.0.tgz。

要想把这个应用上传到kubesphere,让大家都能使用,请看kubesphere.com.cn/en/docs/wor…