问题

从我们过去的博客Best Logging Solution for Docker [Basic Version],

https://kratik.hashnode.dev/best-logging-solution-for-docker

我们看到了如何使用 Loki 和 Grafana 进行日志记录。

但我认为有一个小问题如果你的服务器在公共互联网上并且你为你的用例启用了端口转发,那么任何使用你的 Loki URL 的人都可以将它作为数据源添加到他们的 Grafana 安装中,并且能够查看您所有的敏感日志,这是我们想要的最后一件事。

很简单吧?

当您开箱即用地运行 Loki 时,它不附带任何类型的额外安全层。所以基本上任何可以访问该 URL 的人都可以访问和查看您的日志,就这么简单!


Loki 官方文档说 Grafana Loki 不附带任何包含的身份验证层。

grafana.com/docs/loki/latest/operations/aut..


解决方案

现在我正在考虑它,感觉我们可以使用一些简单的策略来增强安全性。那些是 :

  1. 如果不需要,不要在公共子网上启动您的服务器。 (因此减少了有人从您的网络外部连接的可能性)

2.不要使用端口转发,而是使用docker网络支持的DNS。 (例如,我们可以使用http://loki:3100代替http://Server_IP:3100)

  1. 使用一些防火墙/安全组将服务/用户列入白名单,以允许对所需端口的有限访问。

  2. Advance - 您可以将反向代理(NGINX)与基本身份验证一起使用。因此,即使有人连接到端点,他们也需要输入基本身份验证凭据才能连接:)


高级解决方案的实现(只是为了好玩!)

第 1 步:准备好您的环境

我假设,您已经准备好一个 docker 环境,该环境已经在使用 Loki 而没有任何身份验证方法。

也可以参考我之前的博客](https://kratik.hashnode.dev/best-logging-solution-for-docker)[。

你知道我做了什么吗?

我参考了这个官方 docker-compose 文件几秒钟就开始了。

version: "3"

networks:
  loki:

services:
  loki:
    image: grafana/loki:2.6.1
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml
    networks:
      - loki

  promtail:
    image: grafana/promtail:2.6.1
    volumes:
      - /var/log:/var/log
    command: -config.file=/etc/promtail/config.yml
    networks:
      - loki

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    networks:
      - loki

Step-2: 准备带有Basic Auth的NGINX反向代理

幸运的是,我偶然发现了这个很酷的开源项目,它可以为你完成这项工作:

https://github.com/dtan4/nginx-basic-auth-proxy

那么现在怎么办?这个怎么用?

你只需要提供所需的环境变量,它就会相应地启动 NGINX。

那些是:

  1. BASIC_AUTH_USERNAME & BASIC_AUTH_PASSWORD u003d> 基本认证凭据

  2. PROXY_PASS u003d> 你想从 NGINX 反向代理转发你的请求

  3. PORT u003d> 你希望 NGINX 监听的端口。

注意:在这里,我们将在 PROXY_PASS 部分添加我们的 Loki URL,以便它可以将我们的请求转发给 Loki._

Step-3:将所有部分组合在一起

所以现在,我们知道如何保护 Loki 安装,让我们在docker-compose.yaml文件中添加这个反向代理。

version: "3"

networks:
  loki:

services:
  loki:
    image: grafana/loki:2.6.1
    ports:
      - 3100
    command: -config.file=/etc/loki/local-config.yaml
    networks:
      - loki

  promtail:
    image: grafana/promtail:2.6.1
    volumes:
      - /var/log:/var/log
    command: -config.file=/etc/promtail/config.yml
    networks:
      - loki

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    networks:
      - loki

  nginx:
    image: quay.io/dtan4/nginx-basic-auth-proxy
    environment:
      - BASIC_AUTH_USERNAME=loki_user
      - BASIC_AUTH_PASSWORD=loki_super_secret_password
      - PROXY_PASS=http://loki:3100
      - PORT=3200
      - SERVER_NAME=_
    ports:
      - 3200:3200
      - 8090:8090
    networks:
      - loki

在这里,我还禁用了 Loki 的端口转发,因为这不是必需的。另外,请注意,在 PROXY_PASS 环境变量中,我给出了loki:3100,它是docker-compose文件中的服务名称,并且可以由同一 docker 网络中的容器在内部解析。

在这里,我们在端口 3200 上运行这个 NGINX 服务器 + 我们在同一个端口上进行了端口转发,所以我们可以使用 localhost:3200 连接到 NGINX 服务器。

此外,端口 8090 用于 NGINX 指标。您可以在 ->:8090/nginx_status上进行检查

第 4 步:实际操作!

现在,打开这个 docker-compose 文件,看看 Grafana 端会发生什么。

所以,让我们尝试添加一个数据源,就像之前一样。

试用 1:在旧端口 3100 上

image.png

正如预期的那样,我们禁用了端口转发,它应该会失败。

image.png

试用版 2:使用 NGINX 端口(无凭据)

image.png

同样,这也如上所述失败。

只是为了好奇,让我们curl看看。

image.png

哦,好的,让我们尝试使用我们在 docker-compose 中提供给 NGINX 的凭据。

      - BASIC_AUTH_USERNAME=loki_user
      - BASIC_AUTH_PASSWORD=loki_super_secret_password

试用版 3:具有基本身份验证凭据的 NGINX

现在使用相同的端点,启用 Basic Auth,并添加这些基本身份验证凭据

image.png

唔...

image.png

瞧! - 我们能够通过额外的安全层(即基本身份验证)连接到 Loki 数据源。

我知道你们中的大多数人都在使用 Kubernetes,只有一小部分用户可以与此相关(并实现它),但这是一个关于如何使用 NGINX 反向代理、设置 Basic 的非常有趣的小练习Authdocker-compose(或 docker swarm)服务间通信保护 Loki 安装。 😄

另一个快乐的原因是:


就是这样!让我知道你要在评论框中说什么。

谢谢阅读 :)


读取:

1.grafana.com/docs/loki/latest/operations/aut..

2.docs.nginx.com/nginx/admin-guide/security-c..

  1. NGINX docker镜像中使用的bash脚本:github.com/dtan4/nginx-basic-auth-proxy/blo..

4.另外,Dockerfile:github.com/dtan4/nginx-basic-auth-proxy/blo..

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐