#kubernetes #authentication #cli

nightly app kubeauth

用 Rust 编写的 Kubernetes 身份验证服务

1 个不稳定版本

0.1.7 2023 年 4 月 26 日
0.1.6 2023 年 4 月 25 日

#2290命令行工具

Download history

60 每月下载量

GPL-3.0-only

77KB
466

img-verification

如何安装 kubeauth

什么是 kubeauth

kubeauth 是一个为 Kubernetes 编写的实验性简单身份验证后端。它用 Rust 编写并使用 rocket 框架。它设计用于与 kubeapi 服务器配合使用 webhook 令牌身份验证。

工作原理

kubeauth 是一个简单的 HTTP 服务器。它默认监听端口 8000。它基本上有一个端点。端点 token 用于使用从 kubeapi 服务器发送的 Webhook 令牌审查请求来验证用户。

需要验证的用户有一个配置的令牌。该令牌发送到 kubeapi 服务器。

示例 kubeconfig

- name: kubernetes-webhook
  user:
    #Token
    token: "alice:alicepassword"

客户端在其请求中将令牌发送到 kubeapi 服务器。

然后 kubeapi 服务器将发送一个 Webhook 令牌审查请求到 kubeauth 以检查令牌是否有效。kubeauth 将检查令牌是否有效以及用户是否允许进行身份验证。如果令牌有效且用户允许进行身份验证,kubeauth 将将 Webhook 令牌审查响应发送回 kubeapi 服务器。kubeapi 服务器将随后验证用户。

为什么创建 kubeauth

在 Kubernetes 中默认没有真正的组。只有角色和角色绑定。因此,如果您想创建一组用户,您必须为每个单个用户创建一个角色绑定。这不是很方便。因此,我创建了 kubeauth。组实际上是由身份验证后端提供的。因此,您可以创建用户组并将角色分配给组。这要方便得多。

这就是 kubeauth 的作用,它是一个简单的 Kubernetes 身份验证后端。它设计用于与 kubeapi 服务器配合使用 webhook 令牌身份验证。在身份验证过程中,kubeauth 将检查用户是否允许进行身份验证以及令牌是否有效。如果用户允许进行身份验证且令牌有效,kubeauth 将将 Webhook 令牌审查响应发送回 kubeapi 服务器,包括组!kubeapi 服务器将随后验证用户并将组分配给用户。

这对于 kyverno 策略也很有用!在一个项目中,我想限制用户组的用户只能挂载到特定的主机路径。我必须为每个用户创建一条规则。当我使用 kubectl 时,该 cli 列出了为每个用户应用的每条规则。为什么?而且很难管理那么多策略。因此,之后创建 kubeauth 就派上了用场。组太棒了。

使用 kubeauth 的身份验证方法

kubeauth 支持以下身份验证方法

  • JSON 文件(请参阅 contrib/users.json)

目前计划支持以下身份验证方法

  • LDAP (实验阶段)

不过请随意贡献。这是一个开源项目,最初是为了我的学士论文而创建的。所以我没有时间实现所有我想实现的功能。但我将尽可能实现。

然而,可以轻松地添加身份验证方法。您只需要实现 Authenticator 特性,并将新身份验证器添加到 Authenticator::auth 函数。

身份验证器位于 src/authenticators 目录。

身份验证器是动态加载的。因此,您无需重新编译 kubeauth 即可添加您想要使用的新身份验证器。但身份验证器实现必须编译。

设置身份验证方法

身份验证方法是通过参数设置的。您可以使用 -a 参数设置身份验证方法。该参数接受一个字符串作为值。该字符串是身份验证器的名称。身份验证器必须位于 src/authenticators 目录。

示例: kubeauth -a json_auth -a ldap_auth 将加载 json_auth 和 ldap_auth 身份验证器。

下载

您可以从 发布页面 下载最新版本。

配置身份验证方法

目前 kubeauth 支持以下身份验证方法

每种身份验证方法都与其关联环境变量。环境变量用于配置身份验证方法。有关环境变量的名称,请参阅身份验证方法的 README.md 文件。

试用

如果您想尝试,如果令牌身份验证工作正常,您可以使用

kubectl get pods --token=alice:alicepassword

这将使用用户 alice 进行身份验证。

您还可以使用 curl 来测试令牌身份验证。示例

curl --insecure -X POST -H "Content-Type: application/json" -d '{"apiVersion":"authentication.k8s.io/v1","kind":"TokenReview","metadata":{"creationTimestamp":null},"spec":{"token":"alice:alicepassword"}}' https://localhost:8000/token

先决条件

安装 kubeauth 有几种选择。当前的工作方法是安装 kubeauth 作为独立二进制文件,并让 kubespray 设置所有必要的配置。另一种选择是将 kubeauth 安装为 kubernetes 部署。这尚未完全测试和记录。

而且我老实说,我不知道将 kubeauth 安装为 kubernetes 部署是否是个好主意,因为它是作为 Kubernetes 身份验证后端的。所以如果 kubeauth 崩溃,您将无法再进行 Kubernetes 身份验证。

但我对建议和拉取请求持开放态度。

作为独立二进制文件安装 kubeauth

cargo build --release 将在目标/release 目录中构建二进制文件。将二进制文件复制到您选择的位置,并确保它在您的 PATH 中。

contrib 目录中有一个 systemd 服务文件。将其复制到 /etc/systemd/system,并调整 kubeauth 二进制文件的路径。然后运行 systemctl enable kubeauthsystemctl start kubeauth

作为 kubernetes 部署安装 kubeauth

该功能尚未完全测试和文档化。但想法是将kubeauth安装为Kubernetes部署。在contrib目录中有一个Kubernetes部署文件。将其复制到您选择的路径,并修改kubeauth二进制文件的路径。然后运行kubectl apply -f kubeauth-deployment.yaml

以Docker容器形式安装kubeauth

该功能尚未完全测试和文档化。但想法是将kubeauth安装为Docker容器。在contrib目录中有一个Dockerfile。将其复制到您选择的路径,并修改kubeauth二进制文件的路径。然后运行docker build -f contrib/Dockerfile -t kubeauth .docker run -----.

配置集群

目前我并不完全清楚如何配置集群以使用kubeauth。但我找到了kubespray来帮助我。所以我使用kubespray来配置集群。我将尝试解释我是如何做到的。

安装kubespray

按照kubespray GitHub页面上的说明来安装kubespray。我使用了master分支。

配置kubespray

配置集群的魔法在于group_vars/all/all.yml。有一些选项可以配置集群。我将尝试解释其中最重要的。

您需要编辑

kube_webhook_token_auth: true
kube_webhook_token_auth_url_skip_tls_verify: true
kube_webhook_token_auth_url: https://yourhost:8000/token

kubespray将执行魔法,并配置集群以使用kubeauth。


我必须将kube_webhook_token_auth_url_skip_tls_verify: true设置为true,因为我没有kubeauth服务器的有效证书。您可能希望将其更改为false并使用有效证书。

证书在Rocket.toml中设置。您可以在Rocket.toml中更改证书的路径。


kubeauth不必在kubeapi服务器上运行。您可以在任何主机上运行kubeauth。您只需确保kubeapi服务器可以访问kubeauth服务器。

此外,当kubeauth没有运行时,kubeapi仍然可以工作,因为认证插件在Kubernetes中是链式的。所以如果kubeauth关闭,下一个认证插件将被使用。例如,使用证书的x509认证插件。

构建依赖

sudo apt-get install libsasl2-dev libldap2-dev libssl-dev

免责声明

我不是Rust专家。所以这个项目中可能有一些不好的代码。请随时贡献并改进代码。我将尽可能地改进代码,并欢迎建议和pull请求。

许可

该项目根据GPL-3.0许可证授权 - 请参阅license.md文件以获取详细信息

依赖

~28–60MB
~1M SLoC