Grafana集成openLDAP实现统一登录功能
openLDAP的部署
openLDAP这里简单起见,我们直接用docker方式部署。
生产环境,需要将配置文件之类的挂载到宿主机上,防止数据丢失的情况出现。具体参考https://github.com/osixia/docker-openldap
我这里搭建测试环境用的是ECS地址: 10.10.2.195 (centos7系统)
# 安装ldap server程序
docker pull osixia/openldap
docker run -p 389:389 --name myopenldap --network bridge --hostname openldap-host --env LDAP_ORGANISATION="mylitboy" --env LDAP_DOMAIN="mylitboy.com" --env LDAP_ADMIN_PASSWORD="ldap123" --detach osixia/openldap
说明:
配置LDAP组织者:--env LDAP_ORGANISATION="mylitboy"
配置LDAP域:--env LDAP_DOMAIN="mylitboy.com"
配置LDAP密码:--env LDAP_ADMIN_PASSWORD="ldap123"
默认登录用户名:admin
# 安装web ui
docker pull osixia/phpldapadmin
docker run -d --privileged -p 10004:80 --name myphpldapadmin --env PHPLDAPADMIN_HTTPS=false --env PHPLDAPADMIN_LDAP_HOSTS=10.10.2.195 --detach osixia/phpldapadmin
说明:
PHPLDAPADMIN_LDAP_HOSTS 需要做修改,适配自己的环境
web界面: http://10.10.2.195:10004
Login DN: cn=admin,dc=mylitboy,dc=com
Password: ldap123
LDAP添加用户账号
有了web页面:http://10.10.2.195:10004/
Login DN: cn=admin,dc=mylitboy,dc=com
Password: ldap123
下面的添加账号的操作,可以在web界面操作,也可以通过客户端操作。
这里我使用的是一个win下的客户端工具, 个人认为比较好用: LdapAdmin.exe
然后:
1、去创建名为group的ou,然后进去后再创建一个名为grafana的ou,然后再去创建3个group,分别是 grafana-admins grafana-editors grafana-viewers 。
2、创建一个名为people的ou,进去创建3个user,分别是 lisi wangwu zhangsan (创建好账号后,右击set password,设置下密码,我这里简单点直接账号密码用一样的) 。 示例如下:
3、将lisi zhangsan wangwu 这3个账号,分别加到step1的不同group里面。示例如下:
最终效果如下:
我们还可以用ldap的命令行工具查看下:
yum install openldap-clients 安装下ldap的客户端
ldapsearch -LLL -w ldap123 -x -H ldap://10.10.2.195:389 -D"cn=admin,dc=mylitboy,dc=com" -b "ou=grafana,ou=group,dc=mylitboy,dc=com"
结果如下:
dn: ou=grafana,ou=group,dc=mylitboy,dc=com
objectClass: top
objectClass: organizationalUnit
ou: grafana
dn: cn=grafana-admins,ou=grafana,ou=group,dc=mylitboy,dc=com
gidNumber: 501
objectClass: posixGroup
objectClass: top
cn: grafana-admins
memberUid: wangwu
dn: cn=grafana-editors,ou=grafana,ou=group,dc=mylitboy,dc=com
gidNumber: 501
objectClass: posixGroup
objectClass: top
cn: grafana-editors
memberUid: zhangsan
dn: cn=grafana-viewers,ou=grafana,ou=group,dc=mylitboy,dc=com
gidNumber: 501
objectClass: posixGroup
objectClass: top
cn: grafana-viewers
memberUid: lisi
Grafana的修改
# egrep -v '^#|^$|^;' /etc/grafana/grafana.ini
app_mode = production
[paths]
data = /var/lib/grafana
temp_data_lifetime = 24h
logs = /var/log/grafana
plugins = /var/lib/grafana/plugins
provisioning = conf/provisioning
[server]
protocol = http
http_addr = 10.10.11.111
http_port = 3000
domain = 10.10.11.111
root_url = http://10.10.11.111:3000
enable_gzip = false
[database]
type = mysql
host = 10.10.11.111:3306
name = grafana
user = grafana
password = grafana
ssl_mode = disable
max_idle_conn = 2
max_open_conn = 10
conn_max_lifetime = 14400
[remote_cache]
[dataproxy]
[analytics]
[security]
[snapshots]
[dashboards]
[users]
allow_sign_up = false # 设置为false后,禁止注册账号
allow_org_create = true
auto_assign_org = true
password_hint = password
default_theme = dark
[auth]
[auth.anonymous]
[auth.github]
[auth.google]
[auth.generic_oauth]
enabled = false
[auth.saml] # Enterprise only
[auth.grafana_com]
[auth.proxy]
[auth.basic]
enabled = false # 设置为false后,虽然可以注册grafana账号首次可以进去后,但是退出后就不能登录了,这样是为了让大家都使用ldap登录方式,而不是自行注册
[auth.ldap]
enabled = true
config_file = /etc/grafana/ldap.toml
allow_sign_up = true # 必须打开这个功能,不然新的ldap账号就无法登录了
[smtp]
enabled = true
host = 10.10.13.92:25
skip_verify = true
from_address = server@demo.com
[emails]
[log]
level = info
[log.console]
[log.file]
format = text
log_rotate = true
max_lines = 1000000
max_size_shift = 28
daily_rotate = true
max_days = 7
[log.syslog]
[alerting]
enabled = true
execute_alerts = true
error_or_timeout = alerting
nodata_or_nullvalues = no_data
concurrent_render_limit = 5
evaluation_timeout_seconds = 30
notification_timeout_seconds = 30
max_attempts = 3
[explore]
[metrics]
[metrics.graphite]
[tracing.jaeger]
[grafana_com]
[external_image_storage]
[external_image_storage.s3]
[external_image_storage.webdav]
[external_image_storage.gcs]
[external_image_storage.azure_blob]
[external_image_storage.local]
[rendering]
[enterprise]
[panels]
[plugins]
allow_loading_unsigned_plugins=grafana-image-renderer
# cat /etc/grafana/ldap.toml | egrep -v '^$|^#' 下面内容都是重要部分,因此都加红高提醒
[[servers]]
host = "10.10.2.195"
port = 389
use_ssl = false
start_tls = false
ssl_skip_verify = false
bind_dn = "cn=admin,dc=mylitboy,dc=com"
bind_password = 'ldap123'
search_filter = "(uid=%s)"
search_base_dns = ["ou=people,dc=mylitboy,dc=com"]
group_search_filter = "(&(objectClass=posixGroup)(memberUid=%s))"
group_search_base_dns = ["ou=grafana,ou=group,dc=mylitboy,dc=com"]
[servers.attributes]
name = "givenName"
surname = "sn"
username = "uid"
member_of = "cn"
email = "email"
[[servers.group_mappings]]
group_dn = "grafana-admins"
org_role = "Admin"
[[servers.group_mappings]]
group_dn = "grafana-editors"
org_role = "Editor"
[[servers.group_mappings]]
group_dn = "grafana-viewers"
org_role = "Viewer"
Grafana的登录和权限管理
默认情况下,grafana有个admin的账号,我们先改个复杂的密码,后期admin一般用作备用账号。
然后,用不同的账号登录进去,看下账号权限是否符合我们ldap里面定义的那样。
下面是使用3个ldap账号登录的效果截图:
zhangsan登录
lisi登录
wangwu登录
admin登录
授权
1、新的运维入职, 我们直接在ldap上,将其加到 grafana-admins组即可具备Admin管理权限。
2、开发入职,我们直接在ldap上,将其加到 grafana-viewers 组即可具备只读权限。
3、开发leader,我们直接在ldap上,将其加到 grafana-editors组即可具备简单的修改权限。
4、部分dashboard需要授权多人编辑,可以单独编辑dashboard,给team或者个人开独立的权限。
参考文档
https://blog.csdn.net/mylitboy/article/details/88865428
https://grafana.com/docs/grafana/v7.5/auth/ldap/
https://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_liunx_51_ldap_for_grafana.html