作为一名热衷于探索云原生技术的老手,我今天要分享下如何使用openLDAP分组授权Grafana的用户角色。我们将一起在 k8s 集群上部署 Grafana v10.2.2,并通过 Helm、OpenLDAP
认证以及 nginx-ingress 代理来完成这个实验。
在现代的微服务架构中,监控工具对于确保服务的稳定性和性能至关重要。Grafana 提供了丰富的数据可视化功能,支持多种数据源,但它默认的认证机制可能不满足企业级安全要求。OpenLDAP 提供了一种灵活且广泛支持的身份验证解决方案,通过将其与 Grafana 集成,我们可以确保用户访问控制的一致性和安全性。
组件 | 版本号 |
---|---|
Grafana | v10.2.2 |
Kubernetes | v1.26.3 |
Helm | 最新稳定版 |
Ingress | nginx 1.26 |
在我们开始这段旅程之前,确保你已经安装了 Helm,这是我们航行的指南针。如果你的集群中还没有 Helm,可以参考官方文https://helm.sh/ 进行安装。
首先,我们需要添加 Grafana 的 Helm 仓库,这是我们获取 Grafana Helm chart 的起点:
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm search repo grafana
接下来,我们将使用 Helm 来部署 Grafana。我们会选择版本 7.0.21 的 chart,这是一个稳定且功能丰富的版本,我们先下载 chart 到本地,稍后我们还需要自定义 grafana 的配置文件实现角色绑定。
在使用grafana的时候,使用注销账号会遇到502的问题,因此选择了10.2.2版本
helm fetch grafana/grafana --version 7.0.21 --untar
为了保证后续 Grafana 配置顺利的使用,我们将配置 OpenLDAP 认证。首先,我们需要准备好 openLDAP 用户组的划分,这样可以基于 openLDAP 不同的组,来实现分配 user 在 grafana 里面拥有不同的角色,这里看下openLdap的分组信息:
配置好 openldap 的分组后,编辑刚刚下载下来的 grafana chart,修改目录中的 values.yaml 文件
# Administrator credentials when not using an existing secret (see below)
adminUser: admin
adminPassword: nicaicai #云原生生态圈管理员密码初始化
auth.ldap:
enabled: true
allow_sign_up: true
config_file: /etc/grafana/ldap.toml
loglevel: debug
ldap:
enabled: true
# `existingSecret` is a reference to an existing secret containing the ldap configuration
# for Grafana in a key `ldap-toml`.
existingSecret: ""
# `config` is the content of `ldap.toml` that will be stored in the created secret
config: |-
verbose_logging = true
[[servers]]
host = "openldap.devopsman.cn"
port = 389
use_ssl = false
start_tls = false
ssl_skip_verify = true
bind_dn = "cn=ldap,ou=People,dc=openldap,dc=devopsman,dc=com"
bind_password = "nicaicai"
timeout = 10
search_filter = "(uid=%s)"
search_base_dns = ["ou=people,dc=openldap,dc=devopsman,dc=com"]
group_search_filter = "(&(objectClass=posixGroup)(memberUid=%s))"
group_search_base_dns = ["ou=tech,ou=Group,dc=openldap,dc=devopsman,dc=com"]
group_search_filter_user_attribute = "uid"
[servers.attributes]
email = "mail"
name = "givenName"
surname = "sn"
username = "cn"
[[servers.group_mappings]]
group_dn = "cn=superadmins,ou=tech,ou=Group,dc=openldap,dc=devopsman,dc=com"
org_role = "Admin"
grafana_admin = true # Available in Grafana v5.3 and above
org_id = 1
[[servers.group_mappings]]
group_dn = "cn=admins,ou=tech,ou=Group,dc=openldap,dc=devopsman,dc=com"
org_role = "Admin"
org_id = 1
[[servers.group_mappings]]
group_dn = "cn=grafana-editor,ou=tech,ou=Group,dc=openldap,dc=devopsman,dc=com"
org_role = "Editor"
org_id = 1
[[servers.group_mappings]]
group_dn = "*"
org_role = "Viewer"
org_id = 1
这里我们就完成 grafana 启用 openLDAP 认证的配置了。
helm upgrade --namespace qa-logging --version 7.0.21 -f ./grafana.values.yaml loki-grafana ./grafana
helm list -n qa-logging |grep grafana
kubectl logs -n qa-logging -f -l app.kubernetes.io/name=grafana
前面我们配置了 nginx-ingress,这里解析完成 DNS 之后,就可以直接访问了。顺便验证一下不同的 group_mapping 中的用户权限是否一致,我们在 cn=numbers 组中添加了用户 marionxue, 在 grafana 配置中匹配 到group_dn = "*"
了,因此 marionxue 在 grafana 中的身份就是 viewer 权限。
从上图可知,该结果与我们的预期是保持一致的。
通过上述过程,我们成功地在 Kubernetes 集群中部署了 Grafana,并集成了 OpenLDAP 认证,绑定了openLDAP组与Grafana的角色。实现通过管理openLDAP用户就能统一管理Grafana的认证和平台角色Role,减少了基于OpenLDAP认证的服务的维护复杂度,Jenkins+openLDA集成也是能达到此种效果,非常类似。好了希望这篇文章能够帮助你在你自己的云原生旅程中有所帮助。