AKS 应用程序的运维与维护





0/5 (0投票)
本文将向您展示如何利用 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 目录中的用户的应用程序。要创建该应用程序,请执行以下步骤
- 选择 Azure Active Directory -> 应用注册 -> 新建应用注册
- 在此处输入详细信息
- 点击创建,然后点击清单进行编辑
- 将
groupMembershipClaims
从null
更改为All
- 生成并保存密钥
- 输入描述,设置过期时间,然后点击保存
- 确保保存密钥值
以下子节详细介绍了设置和授予 Azure AD 应用程序权限,以便它可以访问 Azure AD 中的用户信息。
设置应用程序访问用户信息的权限
我们需要为 Azure AD 服务器应用程序设置权限,以便能够访问 Azure AD 中的用户
- 选择设置,然后转到所需权限
- 点击添加,然后转到选择 API
- 选择Microsoft Graph
- 允许应用程序读取 AAD 数据
- 在应用程序权限下,在读取目录数据旁边打勾
- 允许
委派权限
,以便应用程序可以代表用户读取目录数据 - 在委派权限下,在登录并读取用户配置文件和读取目录数据旁边打勾
授予权限并记下应用程序 ID
- 从 API 列表中选择 Microsoft Graph;然后选择授予权限
- 返回应用程序并记下应用程序 ID
创建客户端应用程序
此应用程序用于登录群集。过程与前面类似,但略有不同。让我们开始吧
- 注册客户端应用程序
- 添加并授予所需权限。
- 授予此应用程序访问 AAD 服务器应用程序的权限
- 在应用程序旁边打勾,然后点击选择,然后点击完成
- 记下应用程序 ID。创建群集时,它将用作“客户端应用程序 ID”
这样,我们就创建了一个客户端应用程序 ID。
获取 AAD 租户 ID
您可以通过选择 Azure Active Directory -> 属性来获取 Azure 租户的 ID
您可以通过访问 https://login.windows.net/<domainname>.onmicrosoft.com/.well-known/openid-configuration 来获取任何域的租户 ID。例如,在这里,域名是 handsonaksoutlook
:https://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 日:初始版本