Grafana
可以配置成通过反向代理的方式来认证.流行的 Web 服务器有很多的插件式身份验证模块, 任何一个都可以和 AuthProxy 功能配合使用. 下面我们详细介绍一下具体配置.
[auth.proxy]
# Defaults to false, but set to true to enable this feature
enabled = true
# HTTP Header name that will contain the username or email
header_name = X-WEBAUTH-USER
# HTTP Header property, defaults to `username` but can also be `email`
header_property = username
# Set to `true` to enable auto sign up of users who do not exist in Grafana DB. Defaults to `true`.
auto_sign_up = true
# If combined with Grafana LDAP integration define sync interval
ldap_sync_ttl = 60
# Limit where auth proxy requests come from by configuring a list of IP addresses.
# This can be used to prevent users spoofing the X-WEBAUTH-USER header.
# Example `whitelist = 192.168.1.1, 192.168.1.0/24, 2001::23, 2001::0/120`
whitelist =
# Optionally define more headers to sync other user attributes
# Example `headers = Name:X-WEBAUTH-NAME Email:X-WEBAUTH-EMAIL`
headers =
curl -H "X-WEBAUTH-USER: admin" http://localhost:3000/api/users
[
{
"id":1,
"name":"",
"login":"admin",
"email":"admin@localhost",
"isAdmin":true
}
]
然后我们可以发送第二个请求到 /api/user
获取登录用户的详细信息.我们将使用该请求来说明 Grafana
如何自动将我们指定的新用户添加到系统中. 这里, 我们创建了一个名为 "anthony" 的新用户.
curl -H "X-WEBAUTH-USER: anthony" http://localhost:3000/api/user
{
"email":"anthony",
"name":"",
"login":"anthony",
"theme":"",
"orgId":1,
"isGrafanaAdmin":false
}
我将演示如何使用 Apache
来验证用户身份. 在这个例子中, 我们使用 BasicAuth
和 Apache
的基于文本文件的身份验证处理程序, i.e. htpasswd
文件. 但是, 可以使用任何可用的 Apache
身份验证功能.
在这个例子中, 我们使用 Apache
作为 Grafana
的反向代理. Apache
在将请求转发给 Grafana
后端服务之前处理用户身份验证.
Apache
配置
<VirtualHost *:80>
ServerAdmin webmaster@authproxy
ServerName authproxy
ErrorLog "logs/authproxy-error_log"
CustomLog "logs/authproxy-access_log" common
<Proxy *>
AuthType Basic
AuthName GrafanaAuthProxy
AuthBasicProvider file
AuthUserFile /etc/apache2/grafana_htpasswd
Require valid-user
RewriteEngine On
RewriteRule .* - [E=PROXY_USER:%{LA-U:REMOTE_USER},NS]
RequestHeader set X-WEBAUTH-USER "%{PROXY_USER}e"
</Proxy>
RequestHeader unset Authorization
ProxyRequests Off
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
</VirtualHost>
- 前4行是标准的虚拟主机配置, 因此我们不做具体分析.
- 我们使用
<proxy>
配置块将我们的身份验证规则应用于每个代理请求.这些规则包括所需的基本身份验证, 其中user:password
凭据存储在/etc/ apache2/grafana_htpasswd
文件中. 可以使用htpasswd
命令创建此文件.- 接下来的配置比较棘手. 我们使用
Apache
重写引擎来创建X-WEBAUTH-USER
头, 填充经过身份验证的用户.- RewriteRule .* - [E=PROXY_USER:%{LA-U:REMOTE_USER}, NS]:这行配置有点神奇. 它能做什么呢, 是为每个请求使用
rewriteEngines
预见(LA-U)功能来确定处理请求后REMOTE_USER
变量将被设置为什么. 然后将结果分配给变量PROXY_USER
. 这是必要的, 因为REMOTE_USER
变量无法用于RequestHeader
函数. - RequestHeader set X-WEBAUTH-USER "%{PROXY_USER}e": 使用经过身份验证的用户名现在存储在
PROXY_USER
变量中, 我们创建一个新的 HTTP 请求头, 该头将发送到包含用户名的后端Grafana
.
- RewriteRule .* - [E=PROXY_USER:%{LA-U:REMOTE_USER}, NS]:这行配置有点神奇. 它能做什么呢, 是为每个请求使用
- 接下来的配置比较棘手. 我们使用
- RequestHeader unset Authorization 在将 HTTP 请求转发到
Grafana
之前, 从 HTTP 请求中移除Authorization
头. 这可确保Grafana
不会尝试使用这些凭据对用户进行身份验证(BasicAuth
是Grafana
中受支持的身份验证处理程序).
对于这个例子, 我们使用官方的 Grafana
镜像Docker Hub.
- 使用以下内容创建文件
grafana.ini
[users]
allow_sign_up = false
auto_assign_org = true
auto_assign_org_role = Editor
[auth.proxy]
enabled = true
header_name = X-WEBAUTH-USER
header_property = username
auto_sign_up = true
启动 Grafana
容器, 使用我们的自定义 grafana.ini
来替换 /etc/grafana/grafana.ini
. 我们开放这个容器的任何端口, 因为它只能通过我们的 Apache
容器连接.
docker run -i -v $(pwd)/grafana.ini:/etc/grafana/grafana.ini --name grafana grafana/grafana
对于这个例子, 我们使用官方的 Apache
镜像Docker Hub.
- 使用以下内容创建文件
httpd.conf
ServerRoot "/usr/local/apache2"
Listen 80
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
<IfModule unixd_module>
User daemon
Group daemon
</IfModule>
ServerAdmin [email protected]
<Directory />
AllowOverride none
Require all denied
</Directory>
DocumentRoot "/usr/local/apache2/htdocs"
ErrorLog /proc/self/fd/2
LogLevel error
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog /proc/self/fd/1 common
</IfModule>
<Proxy *>
AuthType Basic
AuthName GrafanaAuthProxy
AuthBasicProvider file
AuthUserFile /tmp/htpasswd
Require valid-user
RewriteEngine On
RewriteRule .* - [E=PROXY_USER:%{LA-U:REMOTE_USER},NS]
RequestHeader set X-WEBAUTH-USER "%{PROXY_USER}e"
</Proxy>
RequestHeader unset Authorization
ProxyRequests Off
ProxyPass / http://grafana:3000/
ProxyPassReverse / http://grafana:3000/
- 创建一个
htpasswd
文件. 我们使用密码 password 创建一个新的用户 anthony
htpasswd -bc htpasswd anthony password
- 使用我们的自定义
httpd.conf
和htpasswd
文件启动httpd
容器. 容器监听80端口, 我们创建了一个指向grafana
容器的链接, 以便这个容器可以将主机名grafana
解析为grafana
容器的ip
地址.
docker run -i -p 80:80 --link grafana:grafana -v $(pwd)/httpd.conf:/usr/local/apache2/conf/httpd.conf -v $(pwd)/htpasswd:/tmp/htpasswd httpd:2.4
我们的 Grafana
和 Apache
容器运行起来了, 你现在可以连接到http://localhost/并使用我们在 htpasswd
文件中创建的用户名/密码登录.