用TLS暴露你的私人Grafana仪表板

·  阅读 102
用TLS暴露你的私人Grafana仪表板

Expose your private Grafana dashboards with TLS

Grafana仪表盘对于快速获得关键指标的反馈,或者只是浏览生产系统上用户行为的有趣统计数据来说是非常好的。

在这篇文章中,我将向你展示如何使用inlets PRO作为安全隧道,在你的笔记本电脑、私人数据中心或本地网络上暴露你的私人Grafana仪表盘。inlets PRO将使用TLS提供链接级加密,以防止对隧道流量的窥探。由于Grafana默认不带有TLS,我们将使用Caddy为Grafana获得一个证书,通过隧道输出80和443端口,而不是明文HTTP端口3000。

Expose your private Grafana dashboards with TLS

你的Grafana仪表盘可以部署在Kubernetes内部,或者作为一个Docker容器。我将向你展示如何用一个样本仪表盘进行设置,你可以跟着做,然后将其用于你可能有的任何现有部署。

这里的说明并不是严格针对Grafana的,所以如果你有一个运行在5000端口的flask应用,只要在你看到3000 的地方替换该端口即可。同样,如果你在8080端口上运行OpenFaaS,用8080 替换3000,依此类推。

概述

以下是本教程的工作流程:

  • 在Docker中运行Grafana或指向我们网络上的现有安装程序
  • 安装inlets-proinletsctl
  • 创建一个隧道和一个有公共IP的出口服务器
  • 使用我们的公共IP获得一个域名或添加一个新的子域名
  • 安装Caddy
  • 运行Caddy,为我们的仪表盘获得一个漂亮的绿色锁。

然后你就可以从任何地方享受你的仪表盘了。

我还会告诉你如何从一个隧道访问多个仪表盘或服务。

你需要一个inlets-pro许可证,你可以在store.openfaas.com购买一个供个人使用,或者使用inlets文档中的链接获得免费试用。

Grafana的快速启动

  • 安装Docker
  • 运行一个Grafana容器
docker run -d -p 3000:3000 \
  --name grafana \
  --restart=always \
  grafana/grafana:latest
复制代码

现在你在http://127.0.0.1:3000,但是你不能通过互联网访问这个,而且它没有TLS来保护它。

请确保在进一步行动之前,将默认密码从admin/admin改为admin。

Expose your private Grafana dashboards with TLS

获得一个公共IP

运行一个私人仪表盘的问题是,它不能被路由,而且你的管理员不太可能为你打开一个端口。如果你在家里,想用你的ISP和端口转发来做这件事,请再想想,你可能会泄露你的个人信息,并使你的家庭网络成为目标。

让我们得到一个没有附加条件的公共IP。

下载inletsctl并使用它来获取inlets-pro 客户端:

curl -sSLf https://inletsctl.inlets.dev | sudo sh

sudo inletsctl download --pro

# or run without sudo, and move the binary after
复制代码

现在为你喜欢的云创建一个退出服务器(又称退出节点)。我将使用DigitalOcean,它恰好是最快和最便宜的。其他支持的供应商包括:Packet, ec2, scaleway, civo, gce和azure。

运行以下命令,并确保你有一个来自你的仪表盘的访问令牌,保存为~/access-token.txt

注意--remote-tcp 标志,它告诉inlets client ,将流量发送到哪里:

inletsctl create  \
  --provider digitalocean \
  --access-token-file ~/access-token.txt \
  --region lon1 \
  --remote-tcp 127.0.0.1
复制代码

当程序完成运行后,你会看到一个命令,你可以运行它来连接到隧道并开始代理流量。

你需要将--tcp-ports 标志设置为一个以逗号分隔的端口列表,以冲出隧道,或一个单一的端口。在我们的例子中,我们不会直接暴露Grafana,但我们会暴露Caddy(一个反向代理),它将通过LetsEncrypt启用TLS。

设置export TCP_PORTS=80,443 ,这是普通HTTP服务ACME挑战所需的两个端口,以及443来服务之后的加密流量:

export TCP_PORTS="80,443"
export LICENSE=""
inlets-pro client --connect "wss://134.122.101.204:8123/connect" \
  --token "67462dccc691fd58c485ab5e631c6b69af594572" \
  --license "$LICENSE" \
  --tcp-ports $TCP_PORTS
复制代码

这是我的客户端程序在运行:

Expose your private Grafana dashboards with TLS

为仪表板准备一个域名

这一步我们需要一个域名,它们的价格低至1美元,所以请不要抱怨。到namecheap.com去买一些有趣的东西,你可以重复使用它,而且不会伤害你的口袋。

如果你已经有一个域名,我们将使用一个子域名。

使用退出服务器的IP地址,用DNS A记录创建一个子域:

dashboard.example.com 134.122.101.204
复制代码

如果你是DigitalOcean的用户,你可以使用doctl ,用这个地址来创建。doctl compute domain create --ip-address $IP $SUB_DOMAIN.

安装一个反向代理

我们需要一个可以获得TLS证书的反向代理。我发现Caddy 1.0对我们来说足够快速和容易使用。Caddy 2也可以使用,但如果你决定使用它,你需要学习新的Caddy文件格式。

下载MacOS、Linux或Windows的二进制文件:v1.0.4

解压缩或解压缩下载的文件,你会发现caddycaddy.exe

  • 创建一个Caddy文件
dashboard.domain.com

proxy / 127.0.0.1:3000 {
  transparent
}
复制代码

第一行告诉Caddy在获取TLS证书时要使用哪个域名

第二个代码块说,任何发送到这个域的请求应该被代理到我们本地机器的3000端口。

试试吧

我们就快成功了,我们需要做的就是运行Caddy,然后打开我们的URL。

  • 运行Caddy

如果你是在MacOS上,你需要以sudo ,以访问本地主机的80、443端口。

sudo ./caddy -disable-tls-alpn-challenge
复制代码

注意,你会被要求提供你的域名的电子邮件,输入它然后继续。

https://dashboard.domain.com
复制代码

检查绿色的锁:

Expose your private Grafana dashboards with TLS

更进一步

现在我们有了一个单一的仪表盘,有了自己的域名,我们可以用同样的方法和我们的Caddy服务器添加其他的仪表盘和服务。

在一个不同的端口上运行第二个仪表板:

docker run -d -p 3001:3000 \
  --name grafana \
  --restart=always \
  grafana/grafana:latest
复制代码

编辑Caddyfile ,重新启动caddy:

dashboard1.domain.com {
  proxy / 127.0.0.1:3000 {
    transparent
  }
}

dashboard2.domain.com {
  proxy / 127.0.0.1:3001 {
    transparent
  }
}
复制代码

不需要重启隧道或隧道服务器。

把事情搁置起来

当你不再需要隧道时,只需停止inlets-pro clientcaddy ,并在你需要时再次启动它们。出口服务器可以保持供应,或者你可以用inletsctl create 所给的命令完全删除它。

收尾工作

你现在有了一个安全的隧道,因为inlets-pro在其控制平面上使用了TLS,并通过Caddy提供的TLS证书为Grafana仪表板提供了额外的安全保障。

接下来,你为什么不试试运行另一个Docker容器,并把它放在你的Caddy代理后面,使用不同的DNS名称,比如`openfaas.example.com?

分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改