Ubuntu 20.04安装与安全加固Grafana:完整指南
引言
Grafana 是一个开源的数据可视化和监控工具,可以与 Prometheus、InfluxDB、Graphite 和 ElasticSearch 等复杂数据源集成。通过内置的共享功能,Grafana 允许你创建警报、通知和即席过滤器,同时更加便于与团队成员合作。
在这个教程中,您将安装Grafana并使用SSL证书和Nginx反向代理确保其安全。一旦设置好Grafana,您将可以通过GitHub配置用户认证,从而更好地组织您的团队权限。
先决条件
要跟随这个教程,你需要:
- One Ubuntu 20.04 server set up by following the Initial Server Setup Guide for Ubuntu 20.04, including a non-root user with sudo privileges and a firewall configured with ufw.
- A fully registered domain name. This tutorial uses your_domain throughout. You can purchase a domain name on Namecheap, get one for free on Freenom, or use the domain registrar of your choice.
- The following DNS records set up for your server. You can follow the How To Add Domains article for details on how to add them if you are using Silicon Cloud.
An A record with your_domain pointing to your server’s public IP address.
An A record with www.your_domain pointing to your server’s public IP address. - Nginx set up by following the How To Install Nginx on Ubuntu 20.04 tutorial, including a server block for your domain.
- An Nginx server block with Let’s Encrypt configured, which you can set up by following How To Secure Nginx with Let’s Encrypt on Ubuntu 20.04.
- Optionally, to set up GitHub authentication, you’ll need a GitHub account associated with an organization.
第一步—安装Grafana
在这第一步中,你将在你的Ubuntu 20.04服务器上安装Grafana。你可以通过直接从官方网站下载或通过APT存储库安装Grafana。由于APT存储库使得安装和管理Grafana的更新更加容易,所以在本教程中你将使用该方法安装。
使用wget命令下载Grafana的GPG密钥,然后将输出导入apt-key。这将将该密钥添加到您的APT安装的可信密钥列表中,从而允许您下载和验证经GPG签名的Grafana软件包。
- wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
在此命令中,选项 -q 关闭 wget 的状态更新信息,而 -O 将下载的文件输出到终端。这两个选项确保只有下载文件的内容被管道传输到 apt-key。
接下来,在您的APT源中添加Grafana存储库。
- sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
刷新你的APT缓存以更新软件包列表。
- sudo apt update
你现在可以开始安装了。
- sudo apt install grafana
一旦安装了Grafana,使用systemctl来启动Grafana服务器。
- sudo systemctl start grafana-server
接下来,通过检查服务的状态来验证Grafana是否正在运行。
- sudo systemctl status grafana-server
你将会收到类似于这样的输出:
Output● grafana-server.service - Grafana instance
Loaded: loaded (/lib/systemd/system/grafana-server.service; disabled; vendor preset: enabled)
Active: active (running) since Thu 2020-05-21 08:08:10 UTC; 4s ago
Docs: http://docs.grafana.org
Main PID: 15982 (grafana-server)
Tasks: 7 (limit: 1137)
...
这个输出包含了关于Grafana进程的信息,包括它的状态、主进程标识符(PID)等等。active(running)表示该进程正常运行。
最后,使服务在启动时自动启动Grafana。
- sudo systemctl enable grafana-server
你将会收到以下的输出结果:
OutputSynchronizing state of grafana-server.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable grafana-server
Created symlink /etc/systemd/system/multi-user.target.wants/grafana-server.service → /usr/lib/systemd/system/grafana-server.service.
这证实了systemd已经创建了必要的符号链接来自动启动Grafana。
Grafana 现已安装并可供使用。接下来,您将使用反向代理和 SSL 证书来保证与 Grafana 的连接安全。
第二步 – 设置反向代理
使用SSL证书可以通过加密Grafana的连接来确保您的数据安全。但是,要利用此连接,您首先需要将Nginx重新配置为Grafana的反向代理。
在先决条件中使用Let’s Encrypt设置Nginx服务器块时创建的Nginx配置文件。您可以使用任何文本编辑器,但在本教程中,我们将使用nano来打开它。
- sudo nano /etc/nginx/sites-available/your_domain
找到以下的区块。
您的域名的配置文件位于/etc/nginx/sites-available。
这是文章《如何在Ubuntu 20.04上安装并保护Grafana》的第2部分(共5部分)。
内容片段:
...
location / {
try_files $uri $uri/ =404;
}
...
由于您已配置Nginx通过SSL进行通信,并且所有网页流量都已通过Nginx,因此您只需告诉Nginx将所有请求转发到Grafana,Grafana默认运行在3000端口上。
在此位置块中删除现有的try_files
行,并将其替换为以下选项:
您的域名配置文件位于/etc/nginx/sites-available/
中。
...
location / {
proxy_set_header Host $http_host;
proxy_pass http://localhost:3000;
}
...
这将把代理映射到适当的端口,并将服务器名称传递到请求头中。
此外,为了使Grafana的实时WebSocket连接正常工作,请在server
节外添加以下部分:
您的域名配置文件位于/etc/nginx/sites-available/your_domain
。
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
...
然后在server
块中添加以下location
部分:
您的域名配置文件位于/etc/nginx/sites-available/your_domain
。
server {
...
location /api/live {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $http_host;
proxy_pass http://localhost:3000;
}
...
客户端不会向被代理的服务器发送Upgrade
和Connection
标头。因此,为了让被代理的服务器知道客户端打算将协议更改为WebSocket,这些标头必须明确传递。
最终的配置会看起来像这样:
您的域名配置文件位于/etc/nginx/sites-available/
。
一旦完成,如果使用 nano 编辑器,请按下 CTRL+X
,然后输入 Y
,最后按 ENTER
保存并关闭文件。
现在,测试新的设置以确保一切都已正确配置:
- sudo nginx -t
您将收到如下输出结果:
输出nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
最后,通过重新加载 Nginx 来激活更改:
- sudo systemctl reload nginx
您可以通过将您的网络浏览器指向 https://your_domain
来访问默认的 Grafana 登录界面。如果无法访问 Grafana,请确保防火墙已设置为允许 443 端口的流量通过,然后重新按照之前的指示操作。
通过对 Grafana 的连接进行加密,您现在可以实施额外的安全措施,首先是更改 Grafana 的默认管理员凭据。
第三步 – 更新凭证
由于每个 Grafana 安装默认使用相同的管理凭据,因此最佳实践是尽快更改您的登录信息。在这一步中,您将更新凭据以提高安全性。
从您的网页浏览器中导航到 https://your_domain
,这将显示默认的登录界面。您会看到 Grafana 的标志,一个要求您输入电子邮件或用户名和密码的表单,一个登录按钮,以及一个“忘记密码?”链接。
在邮件或用户名和密码字段中输入“admin”,然后点击登录按钮。
在接下来的屏幕上,您将被要求通过更改默认密码来增加账户的安全性。
请在“新密码”和“确认新密码”栏中输入您想要使用的密码。
从这里,您可以点击“提交”按钮保存新的信息,或者点击“跳过”按钮跳过这一步骤。如果您选择跳过,下次登录时会提示您更改密码。
为了增加您的 Grafana 设置的安全性,请点击“提交”。您将进入“欢迎来到 Grafana”仪表盘:
您已经通过更改默认凭据来确保您的账户安全。接下来,您将修改您的 Grafana 配置,以便任何人在未经您许可的情况下无法创建新的 Grafana 账户。
第四步——禁用 Grafana 的注册和匿名访问
Grafana 提供了允许访客自行创建用户账户并预览仪表盘的选项,无需注册。当 Grafana 无法通过互联网访问,或者与公开可用的数据(如服务状态)进行交互时,可能需要开启这些功能。然而,在在线使用 Grafana 处理敏感数据时,匿名访问可能成为安全问题。为了解决这个问题,您需要对 Grafana 的配置进行一些更改。
首先,打开 Grafana 的主配置文件进行编辑:
- sudo nano /etc/grafana/grafana.ini
请在 [users]
标题下找到以下 allow_sign_up
指令:
...
[users]
# disable user signup / registration
;allow_sign_up = true
...
启用此指令后,登录界面上将添加一个“注册”按钮,允许用户自行注册并访问 Grafana。
通过将此指令设置为 false
,可以禁用“注册”按钮,从而加强 Grafana 的安全和隐私保护。
通过删除行首的分号并将选项设置为 false
来取消对该指令的注释:
...
[users]
# disable user signup / registration
allow_sign_up = false
...
接下来,在 [auth.anonymous]
部分找到以下启用指令:
...
[auth.anonymous]
# enable anonymous access
;enabled = false
...
将设置项设置为 true
可以让未注册用户访问您的仪表盘;将该选项设置为 false
则仅限已注册用户访问仪表盘。
通过移除行首的分号并将选项设为 false
来取消对本指令的注释:
...
[auth.anonymous]
# enable anonymous access
enabled = false
...
保存文件并退出文本编辑器。
为了激活更改,请重新启动 Grafana 服务:
- sudo systemctl restart grafana-server
通过检查 Grafana 的服务状态,验证一切是否正常运作:
- sudo systemctl status grafana-server
就像之前一样,输出将报告 Grafana 是活动的(正在运行)。
现在,请将您的网络浏览器指向 https://您的域名
。要返回到注册页面,请将光标移动到屏幕左下角的头像上,然后点击出现的“退出”选项。
一旦您退出登录,请验证是否没有“注册”按钮,并且在未输入登录凭据的情况下无法登录。
目前,Grafana 已经完全配置完成并准备好使用了。接下来,您可以通过 GitHub 进行身份认证来简化组织的登录流程。
(可选)第5步 – 设置 GitHub OAuth 应用程序
对于登录的另一种方法,您可以配置 Grafana 通过 GitHub 进行身份验证,该方法提供给所有授权的 GitHub 组织的成员登录访问权限。当您希望允许多个开发人员协作并访问指标,而无需创建特定于 Grafana 的凭据时,这可能非常有用。
首先,使用与您的组织关联的 GitHub 账户登录,然后导航到您的 GitHub 个人资料页面。
通过点击屏幕左侧的您的姓名,然后在下拉菜单中选择您的组织,可以切换设置上下文。这将从个人设置切换到组织设置。
在下一个屏幕上,您将看到您的组织概况,您可以在其中更改诸如组织显示名称、组织电子邮件和组织网址等设置。
由于 Grafana 使用 OAuth(一种用于授权远程第三方访问本地资源的开放标准)通过 GitHub 对用户进行身份认证,所以您需要在 GitHub 上创建一个新的 OAuth 应用程序。
点击屏幕左下角的“开发者设置”下的“OAuth 应用”链接。
如果您在 GitHub 上尚未与组织关联任何 OAuth 应用程序,系统将显示“没有组织所有的应用程序”的提示信息。否则,您将看到已与您的账号连接的 OAuth 应用程序列表。
点击“注册新应用”按钮继续。
在下一个屏幕上,填写关于您的 Grafana 安装的以下详细信息:
- 应用程序名称 (Application name):这有助于您区分不同的 OAuth 应用程序。
- 主页 URL (Homepage URL):这告诉 GitHub Grafana 的位置。在此字段中输入
https://您的域名
,将“您的域名”替换为您的实际域名。
- 应用程序描述 (Application Description):这提供了 OAuth 应用程序用途的描述。
- 应用程序回调 URL (Application callback URL):这是用户成功认证后将被发送到的地址。对于 Grafana,此字段必须设置为
https://您的域名/login/github
。
请记住,通过 GitHub 登录的 Grafana 用户将看到您在前三个字段中输入的值,所以请确保输入的内容有意义且适当。
当完成时,表格的样子会像这样:
点击“注册应用”按钮。
您将会被重定向到一个包含与您的新的 OAuth 应用程序相关的客户端 ID 和客户端密钥的页面。请记下这两个值,因为您需要将它们添加到 Grafana 的主配置文件中以完成设置。
警告:请确保将您的客户端 ID 和客户端密钥妥善保存在安全且非公开的地方,因为它们可能被用作攻击的基础。
在创建了 GitHub OAuth 应用程序后,您现在可以重新配置 Grafana,以使用 GitHub 进行身份验证。
(可选)第六步 – 配置 Grafana 作为 GitHub OAuth 应用程序
为了完成 Grafana 设置的 GitHub 身份验证,您现在需要对 Grafana 配置文件进行一些更改。
首先,打开主要的 Grafana 配置文件:
- sudo nano /etc/grafana/grafana.ini
请找到 [auth.github]
标题,并取消注释此部分,方法是删除每行开头的 ;
,除了 ;allowed_domains =
和 ;team_ids =
以外的行。在本教程中,这两行不会被更改。
接下来,进行以下更改:
- 将
enabled
和 allow_sign_up
设置为 true
。这将启用 GitHub 身份验证,并允许授权组织的成员自行创建账户。请注意,此设置与您在第4步中更改的 [users]
下的 allow_sign_up
属性不同。
- 将
client_id
和 client_secret
设置为您在创建 GitHub OAuth 应用程序时获得的值。
- 将
allowed_organizations
设置为您的组织名称,以确保只有您组织的成员才能注册和登录 Grafana。
完整的配置将如下所示:
...
[auth.github]
enabled = true
allow_sign_up = true
client_id = your_client_id_from_github
client_secret = your_client_secret_from_github
scopes = user:email,read:org
auth_url = https://github.com/login/oauth/authorize
token_url = https://github.com/login/oauth/access_token
api_url = https://api.github.com/user
;allowed_domains =
;team_ids =
allowed_organizations = your_organization_name
...
现在您已经告诉Grafana关于GitHub的所有信息。要完成设置,您需要在反向代理后启用重定向。这可以通过在[server]
标题下设置root_url
值来实现。/etc/grafana/grafana.ini
文件的相关部分如下:
...
[server]
root_url = https://your_domain
...
保存您的配置并关闭文件。
然后,重新启动Grafana以激活更改。
- sudo systemctl restart grafana-server
最后,验证服务是否处于运行状态。
- sudo systemctl status grafana-server
输出将表明服务处于活动状态(正在运行)。
现在,通过访问https://your_domain
来测试您的新认证系统。如果您已经登录Grafana,请将鼠标悬停在屏幕左下角的头像上,并点击出现在您的名字旁边的辅助菜单中的“注销”。
在登录页面上,您会看到在原来的登录按钮下面有一个新的部分,其中包含一个带有GitHub徽标的GitHub登录按钮。
点击“使用GitHub登录”按钮,您将被重定向到GitHub,在那里您将登录您的GitHub账号并确认您的意图以授权Grafana。
点击绿色的“授权您的_github_organization”按钮。
注意:
确保您的GitHub帐户属于您所批准的组织,并且您的Grafana电子邮件地址与GitHub电子邮件地址相匹配。如果您尝试使用未属于您所批准的组织的GitHub帐户进行身份验证,将收到一个“登录失败”消息,告知您用户不是所需组织的成员之一。
您将使用现有的Grafana帐户登录。如果登录用户尚未拥有Grafana帐户,Grafana将创建一个具有查看者权限的新用户帐户,以确保新用户仅能使用现有的仪表盘。
要更改新用户的默认权限,请打开主要的Grafana配置文件进行编辑。
- sudo nano /etc/grafana/grafana.ini
在[users]
标题下,找到auto_assign_org_role
指令,并通过删除行首的;
来取消注释设置。
将指令设置为以下值之一:
- 查看者 (Viewer): 只能使用现有仪表盘。
- 编辑者 (Editor): 可以使用、修改和添加仪表盘。
- 管理员 (Admin): 拥有所有权限。
本教程将自动分配设置为“查看者”。/etc/grafana/grafana.ini
文件的相关部分如下:
...
[users]
...
auto_assign_org_role = Viewer
...
保存修改后,关闭文件并重新启动Grafana。
- sudo systemctl restart grafana-server
检查服务的状态。
- sudo systemctl status grafana-server
就像以前一样,状态将会显示为活动(运行中)。
目前,您已经完全配置好了Grafana,允许您的GitHub组织成员注册并使用您的Grafana安装。
结论
在本教程中,您安装、配置并保护了Grafana,并学会了如何允许您组织的成员通过GitHub进行身份验证。
要扩展您当前的Grafana安装,请查看官方和社区构建的仪表盘和插件列表。要了解关于如何使用Grafana的更多信息,请参阅官方Grafana文档,或查看我们的其他监控教程。