在本章中,我们将探讨如何设置用户访问Argo CD的权限,以及从终端或CI/CD管道连接CLI的选项,以及如何执行基于角色的访问控制。我们将查看单点登录(SSO)选项,通常这是一个需要付费的功能,但由于Argo CD完全开源且没有商业提供,因此您可以直接使用。我们将涵盖的主要主题如下:
• 声明式用户
• 服务账户
• 单点登录
技术要求
在本章中,我们假设您已经在设备上或云平台上安装了Argo CD。我们不需要高可用性的安装;它可以在本地的Kubernetes集群中,但我们需要一个可以自我管理的安装,因为我们将对其进行多个更改。对于单点登录部分,我们需要一个可以被外部提供商访问的安装,因此我们需要一个域名或公共IP地址。我们将编写一些代码(更精确地说是YAML代码),因此还需要一个代码编辑器。我使用的是Visual Studio Code(https://code.visualstudio.com)。我们将进行的所有更改都可以在https://github.com/PacktPublishing/ArgoCD-inPractice的ch04文件夹中找到。
声明式用户
开放式Web应用程序安全项目(OWASP)- https://owasp.org-是一个非营利性基金会,致力于Web应用程序安全领域的工作。他们最著名的项目是OWASP十大(https://owasp.org/www-project-top-ten/),这是一个关于Web应用程序安全的最重要风险清单。他们每隔几年更新一次这个清单。目前,在他们最新的版本中,即2021年版中,我们在第一位的是Broken Access Control(它在2017年的清单上排在第五位)。由于十大的主要目标是在社区中提高对主要Web安全风险的认识,因此我们可以理解为Broken Access Control处于首位,这是为了在我们的用户和每个人获得的访问权限方面做出适当的设置,以避免违反最小特权原则。我们的开发团队通常会获得开发环境的写访问权限,而对于我们的生产环境则只有只读权限,而SRE则具有完全的权限。接下来,我们将看到如何实现这一点。
管理员和本地用户
在集群中安装Argo CD后,我们只有管理员用户。最初,管理员用户的密码是应用程序服务器Pod的名称(如果有多个,则是第一个启动的Pod);它看起来像这样 - argocd-server-bfb77d489-wnzjk。但是,这被认为是不好的选择,因为大多数安装的第一部分(Pod以argocd-server-开头)是固定的,而第二部分是生成的,应该具有随机字符,但它们实际上并不是随机的(可以在https://argo-cd.readthedocs.io/en/stable/security_considerations/#cve-2020-8828-insecure-default-administrative-password找到更多详细信息)。此外,它对所有具有集群访问权限的人都可见(这并不一定意味着具有Argo CD管理员访问权限)。因此,自从发布版本2.0.0以来,安装应用程序时会为用户生成一个新密码,并将其保存在名为argocd-initial-admin-secret的Secret中。我们可以使用以下命令查看安装后的密码:
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
命令输出是您的密码,应该类似于以下内容(应该删除%字符,因为shell插入了这个CR / LF以便提示符开始新的一行):
pOLpcl9ah90dViCD%
现在,您可以使用UI和CLI的密码检查它是否正常工作。要更新密码,您可以通过导航到“用户信息”部分使用UI,也可以使用argocd account update-password命令通过CLI进行更新(https://argo-cd.readthedocs.io/en/stable/user-guide/commands/argocd_account_updatepassword/)。如果您忘记了密码,有一种方法可以重置它,涉及直接对存储bcrypt哈希的Argo CD主Secret资源进行一些更改-更多细节可以在https://argo-cd.readthedocs.io/en/stable/faq/#i-forgot-theadmin-password-how-do-i-reset-it找到。
在我们启用管理员用户后,下一步是禁用它,因为它太强大了,我们要遵循最小权限原则,这意味着我们应该只使用我们需要的最小类型的访问权限来完成我们的工作(可以在这里了解更多信息:https://en.wikipedia.org/wiki/Principle_of_least_privilege)。但是为了不失去对系统的访问权限,我们需要首先创建一个权限较少的本地用户,它将允许我们执行日常任务。我们将其命名为alina,并允许它访问UI和CLI。经验法则是,对于需要访问Argo CD的每个同事,始终都要有一个专用用户,而不是将其用作组或团队用户。如果某人离开团队失去了对系统的访问权限,这将有所帮助,因为我们始终可以禁用或删除他们的帐户。要添加新用户,ConfigMap argocd-cm文件应如下所示:
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cm
data:
accounts.alina: apiKey, login
accounts.gitops-ci: apiKey
admin.enabled: "false"
我们应该创建提交并将此更新推送到远程,以便Argo CD应用我们的配置更改(为了在推送时自动应用此ConfigMap,您需要安装和配置Argo CD,如第3章“运行Argo CD”所述)。假设CLI已安装并指向我们的API服务器实例(使用管理员用户登录),我们可以通过运行以下代码来验证新用户是否已创建:
argocd account list
输出应该如下所示:
这意味着我们已经准备好了该用户,但我们仍然需要设置其密码。为此,我们可以使用此命令,使用管理员密码作为当前密码:
argocd account update-password --account alina --currentpassword pOLpcl9ah90dViCD --new-password k8pL-xzE3WMexWm3cT8tmn
输出应该如下所示:
Password updated
在运行此update-password命令时,有可能跳过传递current-password和new-password参数;这样,它们的值就不会保存在shell历史记录中。如果不传递它们,您将被要求以交互方式输入它们,这是一种更安全的选择。
要查看发生了什么,我们需要运行此命令查看argocd-secret Secret资源。我们将在那里看到我们的用户的新条目,就像管理员用户一样:
kubectl get secret argocd-secret -n argocd -o yaml
我们应该得到以下结果(我们将删除对我们无关的一些字段):
如果我们查看为该用户创建的令牌(在accounts.alina.tokens字段中),我们将看到它实际上是null,这意味着我们目前没有创建任何令牌。
echo "bnVsbA==" | base64 –d
输出如下:
null%
如果您想知道这个用户有什么权限,实际上它目前什么也做不了。我们可以使用它登录,但是如果我们尝试列出应用程序或集群,我们将得到空列表。为了允许它做一些事情,我们有两个选择:要么我们将为用户提供特定的权限,要么我们设置默认策略,每个用户在身份验证时都将回退到该策略,以防找不到特定的策略。我们现在将把默认策略设置为只读,并检查如何在使用访问令牌时添加特定的权限。为此,我们需要修改一个名为argocd-rbac-cm.yaml的新ConfigMap资源,其中我们将设置所有基于角色的访问控制(RBAC)规则。在与argocd-cm.yaml ConfigMap相同的位置创建一个名为argocd-rbac-cm.yaml的新文件,并添加以下内容:
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-rbac-cm
data:
policy.default: role:readonly
不要忘记在 kustomization.yml 文件中添加条目。现在,在 patchesStrategicMerge 下,我们应该有两个条目,分别针对我们修改的两个 ConfigMap:
patchesStrategicMerge:
- patches/argocd-cm.yaml
- patches/argocd-rbac-cm.yaml
创建两个文件的提交并将其推送到远程,以便 Argo CD 可以应用 RBAC 默认策略。更改完成后,我们可以使用 CLI 来使用新用户。为此,首先我们应该登录到 API 服务器(在我的情况下,我使用端口转发从本地安装中使用服务器 https://localhost:8083):
argocd login localhost:8083 --username alina
你可能会收到一个警告消息,指出证书来自未知的机构,这是正确的,因为它是自签名的。我们现在可以忽略它,因为我们正在连接到 localhost:
WARNING: server certificate had error: x509: certificate signed by unknown authority. Proceed insecurely (y/n)?
接下来,请输入 alina 账户的密码,你将会成功登录并可以开始执行命令。
我们可以尝试列出 Argo CD 已安装的应用程序,以确保我们具有读取权限:
argocd app list
输出应该如下所示(在将默认策略设置为只读之前,此列表将为空):
现在,我们可以继续禁用管理员用户,我们可以在 argocd-cm ConfigMap 中使用 admin.enabled 字段,并将其设置为 false。它应该像这样:
提交更改并将其推送到远程,以便不能再使用管理员用户。您向保护 Argo CD 实例并准备其用于生产迈出了一步。我们已经看到了如何以声明性方式处理用户,如何创建新的本地用户并禁用管理员,以及密码如何处理。接下来,我们将学习用于自动化的用户,即所谓的服务账户。