Kasten k10 云原生应用安全系列 01 – 使用 keycloak 为 K10 配置基于 OIDC 的身份验证

使用 keycloak 为 K10 配置基于 OIDC 的身份验证

[toc]

前言

访问控制是云原生安全的重要组成部分,也是 Kubernetes 集群在多租户环境中必不可少的基本安全加固手段。在 Kubernetes 中,访问控制分为三个部分:请求认证、授权和准入控制,今天我们的话题重点放在 Kasten K10 的认证和授权这两方面。 Kasten K10 作为云原生数据管理平台,专为 Kubernetes 而构建,符合 Kubernetes 的安全标准, 旨在为为企业运营团队提供是一个易于使用、可扩展且安全的数据管理应用平台,助力企业实现 Kubernetes 应用程序的备份恢复、灾难恢复和应用移动性。本文展示了我们如何通过启用基于 OpenID Connect (OIDC) 的身份验证方式进行身份验证,Kasten K10 支持多个厂商如 Okta、Google、Dex、Keycloak 和 Ping ID 等,本文以开源的 Keycloak 为例,向大家阐述 K10 在认证与授权方面的特性。

20220919172845

1. OpenID Connect(OIDC)简介

OpenID Connect 是一种 OAuth2 认证方式, 被许多 OAuth2 提供者支持,例如 Azure AD、Salesforce 和 Google等。 协议对 OAuth2 的主要扩充体现在有一个附加字段会和访问令牌一起返回, 这一字段称作 ID Token(ID 令牌)。 ID 令牌是一种由服务器签名的 JWT 令牌,其中包含一些可预知的字段, 例如用户的邮箱地址,身份认证组件使用 OAuth2 令牌响应中的 id_token 即可完成用户识别。下图显示了用户访问 K10 仪表板时的事件顺序。

Kubernetes 并未提供 OpenID Connect 的身份服务。 企业可以使用现有的公用的 OpenID Connect 身份服务 (例如 Google 或者其他服务)。 或者选择自己运行身份认证服务机制 ,例如 CoreOS dex、 Keycloak、 CloudFoundry UAA 或者 Tremolo Security 的 OpenUnison等。 Kasten K10 支持多种方式进行身份验证,本文将用 Keycloak 进行举例。

2. Kasten 如何使用 OIDC 方式进行验证

下图显示了用户访问 K10 仪表板时的事件顺序,流程中涉及的用户浏览器、K10 的身份验证服务和 OIDC 提供程序。

  1. 来自浏览器的请求会到达 K10 的身份验证服务,若请求未包含令牌的 Cookie 则该服务将视为未经身份验证,因此重定向到 OIDC 提供商。
  2. K10 的身份验证服务调用 OIDC Provider 的 Endpoint /authorize 。K10 认证服务的回调 URL 为 https://example.com/k10/auth-svc/v0/oidc/redirect 。这将包含在 /授权 HTTP 请求中。
  3. OIDC Provider 将 K10 回调 URL 与在 OIDC Provider 处注册的回调 URL 进行比较,若匹配,则 OIDC Provider 会继续执行流程并显示登录窗口。
  4. 如果请求中的回调与提供者注册的回调不匹配,OIDC 提供者将重定向回 K10 的 auth 服务,并显示重定向 URL 不匹配的错误。
  5. 若匹配,K10 的身份验证服务将在发出 JSON Web Token(JWT)请求时使用提供程序返回的“Code”。
  6. 然后, OIDC Provider 使用 JWT 响应 K10 的身份验证服务。
  7. 然后 K10 的身份验证服务请求验证 Token,若成功,则会将用户重定向到 K10 的仪表板。
  8. 来自浏览器的后续请求使用请求中的 Token 访问 K10 的身份验证服务。若令牌有效,并未过期,身份验证服务将不再重定向到 OIDC Provider。

3. Keyclock 简介

Keycloak 是一个开源的、面向现代应用和服务的IAM(身份认证和访问控制)解决方案,是由 Red Hat 基金会开发的项目,企业可利用 keycloak 向应用程序和服务添加身份认证,如:单点登录(Single-Sign On),Keycloak 支持 OpenID Connect、OAuth 2.0、SAML 2.0 标准协议。 通过配置,可实现对不同身份认证服务的集成,通过这些身份认证服务登录应用。

4. Keycloak 安装与配置

Kubernetes 的安装不是本文的重点,您选择您希望使用的 Kubernetes 平台与分发版本,和使用任何方式来安装 Keycloak。 以下我们举例在 Minikube 上进行 Keyclock 的部署。
确保您已安装 Minikube,最好启用 Ingress 插件,如果未启用 Ingress 插件,请运行以下命令以启用它 minikube addons enable ingress。当然为了 Kasten 的顺利安装,我还启用了存储类和快照等插件。

$ minikube addons list
|-----------------------------|----------|--------------|-----------------------|
|         ADDON NAME          | PROFILE  |    STATUS    |      MAINTAINER       |
|-----------------------------|----------|--------------|-----------------------|
| csi-hostpath-driver         | minikube | enabled ✅   | kubernetes            |
| dashboard                   | minikube | enabled ✅   | kubernetes            |
| default-storageclass        | minikube | enabled ✅   | kubernetes            |
| ingress                     | minikube | enabled ✅   | unknown (third-party) |
| metrics-server              | minikube | enabled ✅   | kubernetes            |
| storage-provisioner         | minikube | enabled ✅   | kubernetes            |
| volumesnapshots             | minikube | enabled ✅   | kubernetes            |
|-----------------------------|----------|--------------|-----------------------|

Keycloak 官方手册
https://www.keycloak.org/guides

4.1. 运行 Keycloak

Keycloak QuickStarts 存储库包含一些示例,利用这些示例,您可以将 Keycloak 快速部署到 Kubernetes。首先是通过存储库来检索这些文件,让我们从创建 Keycloak deployment 和 Service 开始。

$ kubectl create -f https://raw.githubusercontent.com/keycloak/keycloak-quickstarts/latest/kubernetes-examples/keycloak.yaml

以上命令将在 Kubernetes 上启动 Keycloak,同时使用用户名和密码都是 admin 创建一个初始管理员用户。 请注意一定在启用了 Ingress Controller 的情况下访问 Keycloak,我们在这里为 Keyclock 创建一个 Ingress。

$ wget -q -O - https://raw.githubusercontent.com/keycloak/keycloak-quickstarts/latest/kubernetes-examples/keycloak-ingress.yaml | \
sed "s/KEYCLOAK_HOST/keycloak.$(minikube ip).nip.io/" | \
kubectl create -f -

运行以下命令找出 Keycloak 的 URL,请记住这些 URL,因为在本指南中您将需要它们。帐户控制台的 URL 现在无法使用,因为您需要先创建 Realms 领域

KEYCLOAK_URL=https://keycloak.$(minikube ip).nip.io &&
echo "" &&
echo "Keycloak:                 $KEYCLOAK_URL" &&
echo "Keycloak Admin Console:   $KEYCLOAK_URL/admin" &&
echo "Keycloak Account Console: $KEYCLOAK_URL/realms/myrealm/account" &&
echo ""

Keycloak:                 https://keycloak.192.168.59.102.nip.io
Keycloak Admin Console:   https://keycloak.192.168.59.102.nip.io/admin
Keycloak Account Console: https://keycloak.192.168.59.102.nip.io/realms/myrealm/account

4.2. 登录 Keyclock 管理控制台与创建 Realms

通过上面的信息,我们在浏览器上登录 Keyclock 控制台

20220920163118

Keycloak 中的 Realms 即,领域。相当于租户的概念。它允许创建隔离的应用程序和用户组。默认情况下,Keycloak 中有一个名为master 的领域。这专门用于管理 Keycloak,不应用于您自己的应用程序。让我们创建我们的自己的领域。打开 Keycloak 管理控制台,然后单击 Create Realm, 给出 Realm的名称,如 name:myrealm ,点击 Create

20220920163137

4.3. 创建用户

最初在新的 Realms 中领域没有用户,所以让我们创建一个:

20220920163638

并为这个用户设定密码

20220920163732

4.4. 登录账户控制台

现在让我们尝试登录到帐户控制台以验证用户配置是否正确, 打开 Keycloak 帐户控制台,注意要通过以下链接进行登录。使用您之前创建的密码登录,

https://keycloak.192.168.59.102.nip.io/realms/myrealm/account

4.5. 创建 Client 与 获取 Client Secret

在 Keycloak 帐户控制台,中为 Kasten 创建 Client

20220921094319

在 Credential 中发现 Client Secret 并记录用做 Kasten 安装参数。

20220921093934

5. 将 OIDC 认证方式设置与应用到 Kasten K10 平台

5.1 kubernetes Cluster 的设置

Kubernetes API Server 配置是 Kubernetes 集群基础设置重要组成部分,关于 kubernetes Cluster 的设置可以参考如下链接,建议您不仅查看 K10 产品手册,还需要参阅Kubernetes AuthenticatingOpenID Connect Tokensconfiguring the api server 的重要内容。

kubernetes Cluster for OIDC Provider 的设置
https://docs.kasten.io/latest/access/authentication.html#cluster-setup
Kubernetes Authenticating configuring the api server
https://kubernetes.io/docs/reference/access-authn-authz/authentication/#configuring-the-api-server
OpenID Connect Tokens
https://kubernetes.io/docs/reference/access-authn-authz/authentication/#openid-connect-tokens

5.2 K10 为 OIDC Provider 设置重定向 URI 授权

作为与 OIDC Provider 交换的一部分,K10 将在对应 OIDC Provider 的网页请求中包含重定向 URL。 OIDC Provider将在用户经过身份验证后将用户返回到 K10 Dashboard。如果您使用的 OIDC Provider 要求对重定向进行专门授权,则需要将重定向 URL 添加到提供商的允许列表中:

对于外部公开的 K10 实例,请使用
https://<URL to k10 gateway service>/<k10 release name>/auth-svc/v0/oidc/redirect

对于通过 kubectl 端口转发公开的 K10 实例,请使用
http://127.0.0.1:<forwarding port>/<k10 release name>/auth-svc/v0/oidc/redirect

5.3 更新 Kasten 参数

helm upgrade k10 k10-5.0.7.tgz --namespace=kasten-io -f k10_val.yaml \
  --set auth.oidcAuth.enabled=true \
  --set auth.oidcAuth.providerURL="https://keycloak.192.168.59.103.nip.io/realms/myrealm/account/" \
  --set auth.oidcAuth.redirectURL="http://127.0.0.1:8080" \
  --set auth.oidcAuth.scopes="profile email" \
  --set auth.oidcAuth.prompt="select_account" \
  --set auth.oidcAuth.clientID="kasten" \
  --set auth.oidcAuth.clientSecret="XS4EqWGiC3axCg28seRpsgFg3XRXtLKi" \
  --set auth.oidcAuth.usernameClaim="email"

更新后 K10 会重新进行部署,使用以下命令观察 K10 的部署情况。
$ kubectl get po -n kasten-io -w

直到所有的 Pod 都在 Running 状态

$ kubectl get po -n kasten-io
NAME                                     READY   STATUS    RESTARTS   AGE
aggregatedapis-svc-648d7f646d-bqkcl      1/1     Running   0          12m
auth-svc-6fc7cb59dd-h7snz                1/1     Running   0          12m
catalog-svc-78f6dff5cd-nh47k             2/2     Running   0          12m
controllermanager-svc-7bc5b4ff96-9tb86   1/1     Running   0          12m
crypto-svc-78f6c8b55-tgqh6               3/3     Running   0          12m
dashboardbff-svc-65f8fb95d8-xdmp2        1/1     Running   0          12m
executor-svc-7549565d58-kj4cj            2/2     Running   0          12m
executor-svc-7549565d58-pd9kq            2/2     Running   0          12m
executor-svc-7549565d58-t4f4s            2/2     Running   0          12m
frontend-svc-57b9c55745-8h9r8            1/1     Running   0          12m
gateway-745fdc6fd7-2v7ns                 1/1     Running   0          12m
jobs-svc-5994db5d5-gshq4                 1/1     Running   0          12m
k10-grafana-64d9cf4cb8-6hfk4             1/1     Running   0          12m
kanister-svc-649f44bb87-vt2jr            1/1     Running   0          12m
logging-svc-7666b8cd9d-85bsd             1/1     Running   0          12m
metering-svc-77bf7f9874-jc7rl            1/1     Running   0          12m
prometheus-server-6df9bb5899-gxcng       2/2     Running   0          12m
state-svc-67b648dc7f-zmjp9               2/2     Running   0          12m

一旦 Pod 处于运行状态,您可以在运行以下命令后通过 http://127.0.0.1:8080/k10/#/ 访问 K10 仪表板:

kubectl --namespace kasten-io port-forward service/gateway 8080:8000

第一次访问仪表板时,您将被重定向到 Keycloak 登录页面,如下所示

20220921110455

使用 Keycloak 成功登录后,您将被重定向到 K10 仪表板,如下所示。

20220921110334

5.4. RBAC - 基于角色的访问控制

请注意,本教程中的用户名对 K10 具有不受限制的管理员访问权限。这些是用于启用管理员访问权限的命令

$ kubectl create clusterrolebinding <clusterrolebinding-name> --clusterrole=k10-admin --user=<user-name>
$ kubectl create rolebinding <clusterrolebinding-name> --role=k10-ns-admin --user=<user-name> --namespace=kasten-io

我们将在以后的文章中详细介绍 RBAC。如果您想了解有关 K10 的 RBAC 的更多信息,请参考如下链接。

k10 RBAC
https://docs.kasten.io/latest/multicluster/rbac.html

6. 总结

已经在 Kubernetes 环境中使用基于 OIDC 的身份验证部署应用程序的企业发现使用熟悉的身份验证工作流程部署 K10 非常有用。刚接触 OIDC 的企业也会发现很容易采用它,正如这篇文章将显示的那样。在这两种情况下,他们发现在使用 OIDC 部署 K10 等应用程序时,使用基于角色的细粒度访问控制的能力非常有吸引力。在本教程中,我们介绍了为 OIDC 设置 Keycloak 帐户以及使用基于 OIDC 的身份验证安装 K10 的步骤。由于 OIDC 授权代码流遵循通用的安全标准,因此 K10 的 OIDC 集成适用于任何 OIDC Provider。在以后的博文中,我们还将讨论在 OIDC 提供程序中设置 Group 以及在多租户环境上使用 Kasten 达到 Kubernetes Backup as a Service 的效果。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注