grafana 关闭匿名登录情况下的免密登录

前言

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等工具

你可能感兴趣的:(grafana,grafana)