前言
Grafana是一种流行的开源数据可视化和监控平台,可以帮助用户通过各种图表和面板展示各种数据,并实时监控系统和应用程序的性能;通常grafana会提供一个分享链接给到系统嵌入使用,为体现用户友好性,会开启匿名登录,免去在主系统使用还需要二次登录garafna的尴尬场面。
但同样带来的也有安全性问题,比如node_exporter产生的系统数据、postgres_exporter产生的数据库数据,用户登录主系统后,不怀好意者就可以把内嵌链接抠出来放到任何地方使用;那如何既可以免二次登录又可以保证安全性呢?
处理方法
1、授权登录
grafana提供标准协议oauth2的接入方式,可以根据相关接入文档进行配置使用;但不可避免的需要做很多额外的学习以及操作
2、自定义图表
grafana提供 api keys,可以通过调用相关接口进行自定义图表开发展示
3、白名单配置
开启匿名登录,但是需要做好安全性配置,例如白名单,但同样存在局限性
4、接口登录转发(同域条件下)
这是本文介绍的方式,核心流程就是 提供前端访问后台接口,后台对接口进行权限校验(校验主系统登录权限),校验通过后访问grafana登录接口,成功后将得到的cookie添加至响应信息并重定向至grafna页面
5、更多…
实际处理
1、grafna.ini 配置
[server]
domain = 127.0.0.1:8887
[auth.anonymous]
# enable anonymous access
enabled = false
2、后台接口处理
本文采用springboot为后台框架,接口示例如下
@RestController
@RequestMapping("/grafana")
public class GrafanaController {
/**
* grafana登录地址.
*/
@Value("${grafana.login.url}")
private String grafanaLoginUrl;
/**
* 账号.
*/
@Value("${grafana.login.userName}")
private String grafanaLoginUserName;
/**
* 密码.
*/
@Value("${grafana.login.pwd}")
private String grafanaLoginPwd;
/**
* The Response.
*/
@Resource
private HttpServletResponse response;
/**
* grafana 登录处理.
*
* @param url the url
* @throws IOException the io exception
*/
@GetMapping
public void grafanaLogin(String url) throws IOException {
if (check()) {
JSONObject json = new JSONObject();
json.put("user", grafanaLoginUserName);
json.put("password", grafanaLoginPwd);
HttpResponse execute = HttpRequest.post(grafanaLoginUrl)
.body(json.toJSONString()).execute();
List<HttpCookie> cookies = execute.getCookies();
HttpCookie httpCookie = cookies.get(0);
Cookie cookie = new Cookie(httpCookie.getName(), httpCookie.getValue());
//cookie.setDomain(httpCookie.getDomain());
cookie.setPath(httpCookie.getPath());
cookie.setVersion(httpCookie.getVersion());
cookie.setComment(httpCookie.getComment());
cookie.setHttpOnly(httpCookie.isHttpOnly());
cookie.setMaxAge((int) httpCookie.getMaxAge());
cookie.setSecure(httpCookie.getSecure());
response.addCookie(cookie);
response.getWriter().println("欢迎使用Grafana");
}
response.sendRedirect(url);
}
/**
* 自定义校验逻辑.
*
* @return the boolean
*/
private boolean check() {
// 自定义校验逻辑
return false;
}
# 系统端口
server.port=8888
# grafana 登录接口
grafana.login.url=http://127.0.0.1:3000/grafana/login
# grafana 登录用户名
grafana.login.userName=admin
# grafana 登录密码
grafana.login.pwd=admin
3、前端使用方式
如果使用ifame嵌入的方式,地址填写为:
http://127.0.0.1:8887/grafana?url=http://127.0.0.1:8887/grafana/d/xJB9FGz/node-exporter?kiosk=tv
- 端口为网关端口
- url的值为所需要展示的链接地址
4、网关配置
可采用nginx等工具