65.9K
CodeProject 正在变化。 阅读更多。
Home

AKS 应用程序的运维与维护

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2019 年 4 月 24 日

CPOL

8分钟阅读

viewsIcon

9409

本文将向您展示如何利用 Azure Active Directory 作为身份验证提供者,通过基于角色的安全性来保护您的 AKS 群集。

在本文中,您可以从 Varian 技术办公室高级总监 Gunther Lenz 和 Varian Medical Systems DevOps 架构师 Shivakumar Gopalakrishnan 那里了解 AKS 应用程序的运维。

在生产系统中,您需要允许不同人员访问特定资源;这称为基于角色的访问控制 (RBAC)。本文将向您展示如何在 AKS 上启用 RBAC,并练习分配具有不同权限的不同角色。用户将能够验证他们尝试修改无权访问的资源时,访问被拒绝。建立 RBAC 的好处是,它不仅可以防止意外删除关键资源,而且是一项重要的安全功能,可将群集的完全访问权限限制为真正需要它的角色。

Kubernetes 中的服务角色

在云 shell 中,以 root 用户身份操作几乎可以在群集中执行任何操作。对于生产用例,这种 root 访问权限是危险的,并且在某些受监管的环境中不允许。遵循最小权限原则 (PoLP) 登录任何计算机系统是普遍接受的最佳实践,以避免在认为自己在操作本地群集时,因删除关键资源而导致意外停机。22% 至 29% 的数据丢失(https://blog.storagecraft.com/data-loss-statistics-infographic/)归因于人为错误。您不希望成为该统计数据的一部分(这非常痛苦)。

Kubernetes 开发人员意识到这是一个问题,并添加了 RBAC 以及服务角色的概念来控制对群集的访问。

服务角色允许您为 Kubernetes 资源分配只读和读/写访问权限。您可以说 X 个人对命名空间中运行的 Pod 具有只读访问权限。AKS 的优点在于,该人员可以与 Azure Active Directory 相关联(反过来,通过 SSO 解决方案可以将其链接到您的公司 Active Directory)。

删除任何没有 RBAC 的 AKS 群集

如果您已经有一个正在运行的群集,为了节省成本并减少变化,建议在开始之前删除该群集。与之前的警告一样,假定您使用的是自己的个人帐户。如果您使用的是公司或共享帐户,请在删除群集之前务必小心。

以下屏幕截图显示了如何在 Azure 门户中删除群集

创建支持 Azure AD RBAC 的 AKS 群集

Azure Active Directory (AAD) 提供了一个托管的 Active Directory,它是管理任何应用程序用户的可扩展且便捷的方式。能够轻松地将 AAD 与组织的单一登录 (SSO) 提供程序链接是一个巨大的优势。由于大多数组织都拥有 Office 365 在线服务,因此默认情况下,它们拥有 Azure AD 实例。作为操作员,通过将 Azure AD 与 Kubernetes RBAC 链接,您不必担心人员离职问题;作为应用程序所有者,您可以轻松地将成员分配到 Azure AD 组。

首先,我们需要创建 Azure AD 应用程序以链接到我们的 Kubernetes 群集。

创建 Azure AD 服务器应用程序

Azure AD 服务器是用于获取与您的帐户关联的默认 Azure AD 目录中的用户的应用程序。要创建该应用程序,请执行以下步骤

  1. 选择 Azure Active Directory -> 应用注册 -> 新建应用注册
  2. 在此处输入详细信息

  3. 点击创建,然后点击清单进行编辑

  4. groupMembershipClaimsnull 更改为 All

  5. 生成并保存密钥

  6. 输入描述,设置过期时间,然后点击保存

  7. 确保保存密钥值

以下子节详细介绍了设置和授予 Azure AD 应用程序权限,以便它可以访问 Azure AD 中的用户信息。

设置应用程序访问用户信息的权限

我们需要为 Azure AD 服务器应用程序设置权限,以便能够访问 Azure AD 中的用户

  1. 选择设置,然后转到所需权限

  2. 点击添加,然后转到选择 API

  3. 选择Microsoft Graph

  4. 允许应用程序读取 AAD 数据

  5. 应用程序权限下,在读取目录数据旁边打勾

  6. 允许 委派权限,以便应用程序可以代表用户读取目录数据

  7. 委派权限下,在登录并读取用户配置文件读取目录数据旁边打勾

授予权限并记下应用程序 ID

  1. 从 API 列表中选择 Microsoft Graph;然后选择授予权限

  2. 返回应用程序并记下应用程序 ID

创建客户端应用程序

此应用程序用于登录群集。过程与前面类似,但略有不同。让我们开始吧

  1. 注册客户端应用程序

  2. 添加并授予所需权限。
  3. 授予此应用程序访问 AAD 服务器应用程序的权限

  4. 在应用程序旁边打勾,然后点击选择,然后点击完成

  5. 记下应用程序 ID。创建群集时,它将用作“客户端应用程序 ID

这样,我们就创建了一个客户端应用程序 ID。

获取 AAD 租户 ID

您可以通过选择 Azure Active Directory -> 属性来获取 Azure 租户的 ID

您可以通过访问 https://login.windows.net/<domainname>.onmicrosoft.com/.well-known/openid-configuration 来获取任何域的租户 ID。例如,在这里,域名是 handsonaksoutlookhttps://login.windows.net/handsonaksoutlook.onmicrosoft.com/.well-known/openid-configuration

部署群集

在云 shell 中,创建一个资源组

az group create --name handsonaks-rbac --location eastus

在云 shell 中使用以下命令部署群集

az aks create \
  --resource-group handsonaks-rbac \
  --name handsonaks-rbac \
  --generate-ssh-keys \
  --aad-server-app-id <server-app-id> \
  --aad-server-app-secret <server-app-secret> \
  --aad-client-app-id <client-app-id> \
  --aad-tenant-id <tenant-id>

您的全新群集应该会在大约 10 分钟内准备就绪。

将服务角色附加到 AAD 用户

现在,我们将在我们的目录中创建用户并将角色分配给他们。

在您的 Active Directory 中创建用户

选择Azure Active Directory->用户,然后选择新用户

不要选择新建来宾用户。来宾用户无法被分配角色。

用户名必须在您是管理员的域中。在这种情况下,使用的是 Outlook 帐户,因此域名是 handsonaksoutlook.onmicrosoft.com。记下密码。

创建只读组并将用户添加到其中

为了演示您可以管理组而不是单个用户,让我们创建一个只读用户组并将新用户添加到该组

创建组时可以选择用户

验证 RBAC

让我们通过在 Kubernetes 上创建 RBAC 角色并检查它是否确实有效来尝试一下。

创建只读用户角色

在云 shell 中,连接到您的群集。请注意,您必须指定 --admin 才能在您的群集上进行操作

az aks get-credentials --resource-group handsonaks-rbac --name handsonaks-rbac --admin

创建群集范围的只读角色

创建以下文件并将其保存为 cluster-read-only-role.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
  name: read-only
rules:
- apiGroups:
  - ""
  resources: ["*"]
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - extensions
  resources: ["*"]
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - apps
  resources: ["*"]
  verbs:
  - get
  - list
  - watch

运行以下命令创建名为 read-only 的群集范围角色,该角色在整个群集中具有只读权限

kubectl create -f cluster-read-only-role.yaml

将角色绑定到 AAD 组

创建以下文件并将其保存为 readonly-azure-aad-group.yaml

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: read-only
roleRef:
  kind: ClusterRole #this must be Role or ClusterRole
  name: read-only # this must match the name of the Role or ClusterRole you wish to bind to
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: Group
  apiGroup: rbac.authorization.k8s.io
  name: "<insert the read-only group id here"

运行以下命令创建只读角色,但这次,访问权限授予了组中的任何人

kubectl create -f readonly-azure-aad-group.yaml

访问测试。

现在,以只读用户的身份获取凭据。这次,传递 "--admin" 参数

az aks get-credentials --resource-group handsonaks-rbac --name handsonaks-rbac

运行以下命令测试 RBAC

kubectl get all

您将被要求登录

To sign in, use a web browser to open the page 
https://microsoft.com/devicelogin and enter the code BRVBZLAHE to authenticate.

使用 readonly 帐户用户名登录。首次登录时,系统会要求您更改密码

成功登录后,您可以关闭窗口,您应该会看到以下输出

NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP   14h
Error from server (Forbidden): horizontalpodautoscalers.autoscaling is forbidden: 
User "service-readonly-user@handsonaksoutlook.onmicrosoft.com" 
cannot list horizontalpodautoscalers.autoscaling in the namespace "default"
Error from server (Forbidden): jobs.batch is forbidden: 
User "service-readonly-user@handsonaksoutlook.onmicrosoft.com" cannot list 
jobs.batch in the namespace "default"
Error from server (Forbidden): cronjobs.batch is forbidden: 
User "service-readonly-user@handsonaksoutlook.onmicrosoft.com" cannot list 
cronjobs.batch in the namespace "default"</none>

我们可以看到大部分内容,但排除了 Pod autoscalers/batch 作业和 cronjobs。让我们尝试删除某些内容(例如 Pod)来查看我们是否确实具有只读访问权限

kubectl delete pods/<pod name running in the namespace kube-system> -n kube-system

您将收到一个“Forbidden”消息

Error from server (Forbidden): pods "heapster-779db6bd48-nvhv9" is forbidden: 
User "service-readonly-user@handsonaksoutlook.onmicrosoft.com" cannot delete pods 
in the namespace "kube-system"

我们已经确保我们对已授予访问权限的用户拥有访问权限。

本文向您展示了如何通过利用 Azure Active Directory 作为身份验证提供者来使用基于角色的安全性保护您的 AKS 群集。我们创建了一个服务角色,允许您为 Kubernetes 资源分配只读或读/写访问权限,并探讨了一些高级功能。首先,我们向您展示了如何创建 AAD 服务器应用程序。然后,我们创建了客户端应用程序。接下来,我们向您展示了如何获取 AAD 租户 ID 并部署了群集。一旦部署了启用 RBAC 的解决方案,我们就通过在 Active Directory 中创建用户来测试只读功能。然后,我们创建了一个只读组并将用户添加到了其中。最后,我们创建了只读用户角色并将该角色绑定到了用户的 AAD 组。

如果您发现本文很有趣,您可以探索 Hands-On Kubernetes on Azure,以便在云上高效地部署和管理 Kubernetes 群集。这本书将成为您成功实现容器编排和在 Azure 上部署 Kubernetes 群集的资源。 Hands-On Kubernetes on Azure 不仅将帮助您轻松地在 Azure 上部署和管理 Kubernetes 群集,还将帮助您掌握行业最佳实践知识,以处理复杂系统的 Advanced Azure Kubernetes Services (AKS) 概念。

历史

  • 2019 年 4 月 24 日:初始版本
© . All rights reserved.