我们高度重视Percona的安全性,在这篇博客文章中,我们将展示如雷竞技下载官网何保护您的雷竞技下载官网Praybet雷竞技竞猜在线官网ercona监控和管理(PMM)具有SSL证书的服务器,并通过利用代理服务器自动化其生命周期。
介绍
您可能知道,PMM服务器提供了一个自签名的SSL证书,用于加密客户端(web或CLI)和服务器之间的通信。虽然有些人选择在非关键环境中使用此证书(通常由私有网络保护),但对于生产环境来说,这绝对不是最佳的安全实践。
我必须提到,自签名证书仍然可以实现加密连接的目标。当涉及到自签名证书时,您应该了解以下一些事情或问题:
- 它们不能由受信任的对象验证证书颁发机构(CA)
- 它们不能由于安全事件而被撤销(如果由受信任的CA发出,则可以被撤销)
- 当在公共网站上使用时,它们可能会对你的品牌或个人声誉产生负面影响
这就是为什么大多数现代浏览器在检测到自签名证书时会显示非常不吸引人的安全警告。它们中的大多数将防止用户不小心打开没有安全连接的网站(你听说过吗thisisunsafe针对Chrome的黑客攻击?)浏览器供应商显然是在试图提高广大互联网社区的安全意识。
我们强烈建议用户使用受信任的证书颁发机构颁发的SSL证书。
有些人发现跟踪有效期并记得在证书到期前更新是一件难以应付的事情。直到几年前,SSL证书还需要付费,而且相当昂贵。等项目让我们加密-一个非营利性的证书颁发机构,旨在通过提供绝对免费的SSL证书来普及网络安全。然而,他们的有效期只有三个月,这是相当短的。
我们将探讨两种最流行的反向代理工具,它们允许您利用SSL证书来提高PMM实例的安全性。更重要的是,我们将介绍如何使用这些工具自动化证书更新。虽然PMM Server有三种版本——docker、AMI和OVF——但我们将把重点放在docker上,它是我们最受欢迎的发行版。
本文中的所有脚本都假设您有基本的熟悉和使用经验码头工人和码头工人组成。
反向代理
虽然现在开源工具的选择相当丰富,但我们将讨论其中两个我认为最受欢迎的:nginx和traefik。
为了尝试这里提出的解决方案之一,你需要以下几点:
- 码头工人引擎
- Docker撰写v2
- 公共域名
- a类型的DNS记录,其中包含您的服务器(或云虚拟机)的公共IP
让我们看一下我们的网络图。它显示代理服务器位于PMM服务器及其客户机之间。这意味着代理(而不是PMM服务器)负责终止SSL和加密通信。

Nginx
Nginx于2004年进入市场,这对任何软件产品来说都是一个相当稳定的时代。从那时起,它已经获得了巨大的采用,到目前为止,它为许多网站提供了反向代理。让我们看看使用Nginx进行SSL证书管理需要什么。
首先,让我提醒您PMM服务器存储自签名证书的位置:
|
1
2
3.
4
5
6
7
|
%
码头工人
执行
-t
pmm-服务器
上海
-c
"ls -l /srv/nginx/*.{crt,key,pem}"
总计
24
-rw-r--r--
1
根
根
6016
小君
10
11
:
24
ca-确实的事情
.pem
-rw-r--r--
1
根
根
977
小君
10
11
:
24
证书
.crt
-rw-r--r--
1
根
根
1704
小君
10
11
:
24
证书
。key
-rw-r--r--
1
根
根
424
小君
10
11
:
24
dhparam
.pem
|
我们当然可以通过挂载包含自定义证书的主机目录来传递自己的证书,或者通过复制证书到容器。但是,这需要我们先出具证书。我们想要实现的是获得自动颁发的证书。我必须说,即使nginx没有提供开箱即用的功能,有一些开源项目可以有效地缩小这一差距。
其中一个项目是nginx代理。它看起来相当成熟和稳定,拥有16K GitHub星。它有一个同行项目-acme-companion-它负责证书的生命周期。我们将同时使用它们,所以最终我们将运行三个独立的容器:
- Nginx-proxy反向代理
- 证书管理组件
- Pmm-server—代理容器
在启动容器之前,需要完成以下步骤:
- 为项目选择一个根目录。
- 创建目录
/ nginx。在你的项目根目录中(docker会负责创建嵌套目录)。这将是您的项目根文件夹。 - 创建文件
/ nginx / proxy.conf。的默认值主要需要此文件client_max_body_size,这个值刚好太低,所以PMM可以正确处理大的有效载荷。文件内容如下:
|
1
2
3.
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# proxy.conf
服务器_令牌从;
客户端_马克斯_身体_大小10米;
# HTTP 1.1支持
代理_http_版本1。1;
代理_缓冲从;
代理_集_头宿主
美元http_宿主;
代理_集_头升级
美元http_升级;
代理_集_头连接
美元代理_连接;
代理_集_头X-Real-IP
美元远程_addr;
代理_集_头X-Forwarded-For
美元代理_添加_x_转发_为;
代理_集_头X-Forwarded-Proto
美元代理_x_转发_原型;
代理_集_头X-Forwarded-Ssl
美元代理_x_转发_ssl;
代理_集_头X-Forwarded-Port
美元代理_x_转发_港口;
#缓解httpoxy攻击
代理_集_头代理
""
;
|
在启动容器之前,需要完成以下步骤:
- 为项目选择一个根目录。
- 创建目录
/ nginx。在你的项目根目录中(docker会负责创建嵌套目录)。这将是您的项目根文件夹。 - 创建文件
/ nginx / proxy.conf。的默认值主要需要此文件client_max_body_size,这个值刚好太低,所以PMM可以正确处理大的有效载荷。文件内容如下:
注意,最新版本的docker客户端附带
码头工人组成子命令,而早期版本可能需要你额外安装一个基于python的docker-compose工具。
这就是docker-compose.yml的样子。您可以继续创建它,同时确保进行替换my-domain.org用你自己的公共域名。
|
1
2
3.
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
23
24
25
26
27
28
29
30.
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
# docker-compose.yml
版本:“3”
服务:
nginx:
图像: nginxproxy / nginx代理
容器_名字: nginx
环境:
-默认的_主机= pmm。我的域。org
港口:
-
“80:80”
-
“443:443”
重新启动:总是
卷:
-
。/ nginx /代理。相依: / etc / nginx / proxy.conf
:罗
-
。vhost / nginx /。d: / etc / nginx / vhost.d
:罗
-
。/ nginx确实的事情: / etc / nginx /确实的事情
:罗
-
。/ nginx / html: / usr / share / nginx / html
-
。/ nginx dhparam: / etc / nginx / dhparam
-/var/run/docker。袜子: / tmp / docker.sock
:罗
letsencrypt:
图像: nginxproxy / acme-companion
容器_名字: acme-companion
重新启动:总是
环境:
-NGINX_代理_容器= nginx
-默认的_电子邮件= admin@我的域。org
取决于_在:
-nginx
卷:
-
。vhost / nginx /。d: / etc / nginx / vhost.d
-
。/ nginx确实的事情: / etc / nginx /确实的事情
-
。/ nginx / html: / usr / share / nginx / html
-/var/run/docker。袜子: / var /运行/ docker.sock
:罗
pmm-server:
容器_名字: pmm-server
图像: 雷竞技下载官网percona / pmm-server
: 2
重新启动: unless-stopped
环境:
-虚拟_主机= pmm。我的域。org
-LETSENCRYPT_主机= pmm。我的域。org
-虚拟_端口= 80
-禁用_遥测= 0
-启用_DBAAS = 1
-启用_备份_管理= 1
-启用_提醒= 1
-女朋友_分析_检查_为_更新= false
-女朋友_身份验证_登录_饼干_NAME = pmm_会话
-女朋友_安全_禁用_功能= true
取决于_在:
-nginx
卷:
-pmm-data:如果
暴露:
-
“80”
卷:
pmm-data:
名字: pmm-data
外部:假
|
现在通过运行启动您的站点Docker compose up -d。就是这样!如果一切正常,您应该通过访问PMM服务器的登录页面https://pmm.my-domain.org。如果你输入Docker ps a在码头,你会看到所有三个集装箱列出:
|
1
2
3.
4
5
6
|
%
码头工人
ps
-一个
容器
ID
图像
命令
创建
状态
港口
的名字
07979480350 c
雷竞技下载官网/pmm-服务器
:
2
“/ opt / entrypoint.sh”
1
小时
前
向上
1
小时
(
健康的
)
80/tcp
,
443/tcp
pmm-服务器
b7ed4cbf1064
nginxproxy/acme-同伴
“/ bin / bash / app / entr……”
1
小时
前
向上
1
小时
acme-同伴
d35da441c103
nginxproxy/nginx-代理
“/ app / docker-entrypo……”
1
小时
前
向上
1
小时
0.0.0.0
:
80->
80/tcp
,
:
:
:
80->
80/tcp
,
0.0.0.0
:
443->
443/tcp
,
:
:
:
443->
443/tcp
nginx
|
如果出现任何问题,您可以通过检查容器日志来排除故障。Docker日志pmm-serverorgydF4y2BaDocker日志极致伴侣也许对探索有用。
限制对PMM的访问
有时需要限制对已知ip或网络的访问。高兴地,nginx代理你可以很容易地进行配置。你所需要做的就是:
- 用域名创建一个文本文件,例如,
pmm.my-domain.org-并保存到/ nginx / vhost.d /
123.456789# pmm.myy-domain.org的内容#允许来自已知IP地址或网络的流量允许 127.0.0.0/8 ; #内部网络允许 100.1.1.0/20. ; #另一个网络允许 219.24.87.93 ; #只有一个IP地址#拒绝来自所有其他ip和网络的流量否认 所有 ; - 最后,使用docker restart重新启动容器
pmm-server。
从现在开始,如果有人试图从不在中的IP地址访问PMM服务器允许列表,他们应该得到错误HTTP 403禁止。
测试连接安全性
虽然使用SSL证书保护您的连接是一个好主意,但还有许多其他安全问题是证书本身无法解决的。有一些有用的web服务不仅允许您验证证书,还允许您执行许多其他重要检查来测试连接,例如足够的密码强度、使用过时的安全协议、对已知SSL攻击的脆弱性等。
Qualys是否有这样的服务,检查证书所需要的一切都是去他们的网页,输入你网站的域名,让他们做剩下的工作。几分钟后,你会看到这样的扫描报告:

瞧!我们在没有花费太多时间的情况下就实现了非常高的连接安全性评级!这就是这个工具的魔力?
在使用Nginx代理之前,我永远无法从第一次尝试中获得相同的结果,我能得到的最好分数是“B”。我花了很多时间来了解扫描报告的每个警告的含义,并且花了更多的时间来找到一个合适的解决方案并将其应用到我的配置中。
总结一下——如果你不断更新你的Nginx版本及其配套版本,它将为你节省大量的时间,并使你的TLS符合最高的安全标准。是的,可以保证证书在到期前轮换。
Traefik
Traefik是一个较新的产品。它于2016年首次发布,自那时起获得了巨大的发展势头。
Traefik作为代理服务器和docker和Kubernetes的负载均衡器非常受欢迎。许多人声称Traefik比Nginx更强大、更灵活,但也更难设置。与Nginx不同,Traefik不需要额外的工具就可以管理证书的生命周期,这就是为什么我们只启动两个容器——一个用于PMM服务器,一个用于Traefik代理。
基本配置
要开始使用非常小的Traefik配置,请遵循以下步骤。
- 为项目选择一个根目录
- 创建一个基本的
docker-compose.yml在根文件夹中存放以下内容:
123.4567891011121314151617181920.21222324252627282930.313233343536373839404142434445464748495051525354555657585960版本:“3”服务:traefik:图像: traefik : v2.7容器_名字: traefik重新启动:总是命令:- “——log.level =调试”- “——providers.docker = true”- “——providers.docker.exposedbydefault = false”- “——entrypoints.web.address =: 80”- “——entrypoints.websecure.address =: 443”- “——certificatesresolvers.le.acme.httpchallenge = true”- “——certificatesresolvers.le.acme.httpchallenge.entrypoint =网络”- '(电子邮件保护)'- “——certificatesresolvers.le.acme.storage = / letsencrypt / acme.json”港口:- “80:80”- “443:443”卷:- 。/ letsencrypt: / letsencrypt-/var/run/docker。袜子: / var /运行/ docker.sock :罗网络:-wwwpmm-server:图像: 雷竞技下载官网percona / pmm-server : 2容器_名字: pmm-server重新启动:总是环境:-禁用_遥测= 0-启用_DBAAS = 1-启用_备份_管理= 1-启用_提醒= 1-女朋友_分析_检查_为_更新= false-女朋友_身份验证_登录_饼干_NAME = pmm_会话-女朋友_安全_禁用_功能= true卷:-pmm-data:如果暴露:- “80”标签:- “traefik.enable = true”- ' traefik.http.routers.pmm.rule =主机(pmm.my-domain.org)”- “traefik.http.routers.pmm.entrypoints = websecure”- “traefik.http.routers.pmm.tls.certresolver =勒”网络:-www卷:pmm-data:名字: pmm-data外部:假网络:www:名字: www外部:假 - 取代my-domain.org用你自己的域名
- 确保服务器上的端口80和443是开放的,并且可以公开访问
- 创建目录
letsencrypt在你的项目的根目录中-它将被挂载到容器中,这样Traefik就可以保存证书了
一旦你用docker启动项目合成-d,你应该可以去https://pmm.my-domain.org和查看PMM服务器的登录页面。
如果你跑了Docker ps a,你会在输出中看到两个容器:
|
1
2
3.
4
5
|
%
码头工人
ps
-一个
容器
ID
图像
命令
创建
状态
港口
的名字
4 a2746c26738
traefik
:
v2
。
7
“/ entrypoint.sh——公关……”
52
秒
前
向上
48
秒
0.0.0.0
:
80->
80/tcp
,
:
:
:
80->
80/tcp
,
0.0.0.0
:
443->
443/tcp
,
:
:
:
443->
443/tcp
traefik
27943 a8edfef
雷竞技下载官网/pmm-服务器
:
2
“/ opt / entrypoint.sh”
52
秒
前
向上
48
秒
(
健康的
)
80/tcp
,
443/tcp
pmm-服务器
|
如果遇到任何问题,可以通过检查Traefik容器的日志进行故障排除Docker日志traefik。基于明显的性能原因,我们建议您通过设置log.level参数信息。
高级配置
对基本配置的进一步分析证实,它存在一些问题,特别是:
- 访问http://pmm.my-domain.org将导致
HTTP 404未找到,即默认情况下没有配置重定向。 - Qualys SSL报告使用“B,这对于刺激环境是不够的。报告强调了三个问题:
- 服务器支持过时或不安全的TLS 1.0和1.1协议
- 服务器使用了不少弱密码
- 代理响应中缺少安全标头
- 服务器支持过时或不安全的TLS 1.0和1.1协议
我们将努力逐一解决上述所有问题。
- 重定向HTTP来HTTPS
Traefik使用一个叫做entryPoint的特殊HTTP选项。它可以通过将以下参数传递给Traefik轻松实现:12——entrypoints。网络。http。重定向。入口点。= websecure——entrypoints。网络。http。重定向。入口点。计划= https
- 避免使用过时的TLS 1.0和1.1协议
- 避免使用弱密码
由于这两个问题与TLS有关,为什么不将两者的解决方案合并为一个呢?Traefik提供了两种类型的配置——静态配置和动态配置。解决密码所需的选项数量可能会相当大,这就是为什么我们将选择使用动态配置,即将所有内容放在一个文件中,而不是内联在我们的
docker-compose.yml文件。因此,让我们创建一个名为dynamic.yml并把它放在项目根目录下:123.45678910111213141516tls:选项:默认的:minVersion: VersionTLS12sniStrict:真preferServerCipherSuites:真密码套件:-TLS_ECDHE_RSA_与_CHACHA20_POLY1305_SHA256-TLS_ECDHE_RSA_与_AES_128_GCM_SHA256-TLS_ECDHE_RSA_与_AES_256_GCM_SHA384-TLS_CHACHA20_POLY1305_SHA256-TLS_AES_256_GCM_SHA384-TLS_AES_128_GCM_SHA256curvePreferences:-secp521r1-secp384r1正如您在这里看到的,我们仅将TLS版本限制为最安全的,密码套件和加密算法首选项也是如此。文件名可以是您喜欢的任何名称,因此我们需要将Traefik指向包含动态配置的文件。为此,我们将利用
文件提供者参数:12- “——providers.file = true”- “——providers.file.filename = / dynamic.yml” - 向代理响应添加安全标头
额外的安全头将进入静态配置:
123.45678- '(电子邮件保护)'- “traefik.http.middlewares.secureheaders.headers.forceSTSHeader = true”- “traefik.http.middlewares.secureheaders.headers.stsPreload = true”- “traefik.http.middlewares.secureheaders.headers.stsIncludeSubdomains = true”- “traefik.http.middlewares.secureheaders.headers.stsSeconds = 315360000”- “traefik.http.middlewares.secureheaders.headers.contentTypeNosniff = true”- “traefik.http.middlewares.secureheaders.headers.browserXssFilter = true”- “traefik.http.middlewares.secureheaders.headers.frameDeny = true”
Traefik应该到此为止了。我们已经成功地解决了所有安全问题,一份新的SSL报告证实了这一点。

为了方便大家,我将把最后的版本yml下面的文件。
docker-compose.yml
|
1
2
3.
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.
21
22
23
24
25
26
27
28
29
30.
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
版本:“3”
服务:
traefik:
图像: traefik
: v2.7
容器_名字: traefik
主机名: traefik
命令:
-
“——log.level =调试”
-
“——providers.docker = true”
-
“——providers.docker.exposedbydefault = false”
-
“——providers.file = true”
-
“——providers.file.filename = / dynamic.yml”
-
“——entrypoints.web.address =: 80”
-
“——entrypoints.web.http.redirections.entryPoint.to = websecure”
-
“——entrypoints.web.http.redirections.entryPoint.scheme = https”
-
“——entrypoints.websecure.address =: 443”
-
“——certificatesresolvers.le.acme.httpchallenge = true”
-
“——certificatesresolvers.le.acme.httpchallenge.entrypoint =网络”
-
'(电子邮件保护)'
-
“——certificatesresolvers.le.acme.storage = / letsencrypt / acme.json”
港口:
-
“80:80”
-
“443:443”
卷:
-
。/ letsencrypt: / letsencrypt
-
。/动态。yml: / dynamic.yml
-/var/run/docker。袜子: / var /运行/ docker.sock
:罗
网络:
-www
pmm-server:
图像: 雷竞技下载官网percona / pmm-server
: 2
容器_名字: pmm-server
重新启动:总是
环境:
-禁用_遥测= 0
-启用_DBAAS = 1
-启用_备份_管理= 1
-启用_提醒= 1
-女朋友_分析_检查_为_更新= false
-女朋友_身份验证_登录_饼干_NAME = pmm_会话
-女朋友_安全_禁用_功能= true
卷:
-pmm-data:如果
暴露:
-
“80”
标签:
-
“traefik.enable = true”
-
' traefik.http.routers.pmm.rule =主机(pmm.my-domain.org)”
-
“traefik.http.routers.pmm.entrypoints = websecure”
-
“traefik.http.routers.pmm.tls.certresolver =勒”
-
'(电子邮件保护)'
-
“traefik.http.middlewares.secureheaders.headers.forceSTSHeader = true”
-
“traefik.http.middlewares.secureheaders.headers.stsPreload = true”
-
“traefik.http.middlewares.secureheaders.headers.stsIncludeSubdomains = true”
-
“traefik.http.middlewares.secureheaders.headers.stsSeconds = 315360000”
-
“traefik.http.middlewares.secureheaders.headers.contentTypeNosniff = true”
-
“traefik.http.middlewares.secureheaders.headers.browserXssFilter = true”
-
“traefik.http.middlewares.secureheaders.headers.frameDeny = true”
网络:
-www
卷:
pmm-data:
名字: pmm-data
外部:假
网络:
www:
名字: www
外部:假
|
一些安全方面
码头工人套接字
我相信你注意到了下面的部分docker-compose.yml:
|
1
2
|
卷:
-
' / var /运行/ docker.sock: / var /运行/ docker.sock:罗”
|
你可能会说,将docker套接字传递给一个或多个容器并不是超级安全的,对吧?没错,但如果我们想要自动化,这是一个很难的要求。事实证明,代理服务器和它的伙伴都在幕后做了很多事情来实现它,所以它们需要访问docker运行时,以便能够侦听docker事件并对它们做出反应。
考虑这个例子:如果您添加一个新的服务(或网站在我们的情况下)以相同或不同docker-compose.yml然后用Docker compose up -d,代理将检测此事件并向证书颁发机构请求新证书,或者从存储中获取(如果已经颁发了)。只有这样,它才能将证书传递给您的服务。这种对docker运行时的低级控制使得Nginx或Traefik可以操作其他容器。没有这个插座,任务是不可能完成的。
通常,在开发应用程序或服务时,工程团队将把所有的服务——后端、前端和数据库——放在一起docker-compose.yml,这非常方便,因为它可以在团队中共享。但是,您肯定希望将prod与非prod环境隔离开来。例如,如果您的数据库服务器也部署在docker容器中,那么它应该在不同的环境中完成,更加坚固️?比这个。
80端口的使用
在一篇关于安全性的博客文章中提到端口80(未加密HTTP使用的标准端口)可能显得很奇怪。然而,Nginx和Traefik都依赖于它在服务器端是开放的。这是因为我们使用了所谓的HTTP挑战(阅读更多关于挑战类型的信息在这里),大多数代理都支持这个功能,也是最容易实现的。当CA准备处理颁发证书的请求时,它需要验证您的域所有权。它通过查询一个特殊对象来实现.well-known站点上的端点,只能在端口80上可用。然后,如果成功,它将继续颁发证书。
两个代理服务器都提供了非常方便的重定向选项HTTP来HTTPS,这也有利于搜索引擎优化(SEO)。
结论
我发现很难不同意自动化SSL证书生命周期,特别是如果您拥有或维护不止几个公共站点(或PMM服务器)?),这比手动操作要愉快得多。值得庆幸的是,开源代理的成熟度和功能的完整性是惊人的,它们被许多人使用和信任,这就是为什么我们建议您也尝试一下。
注:你可以在你的配置中做更多的事情,例如为静态资产添加压缩,加强你的安全性,发布一个通配符证书等等,但这对于一篇文章来说太多了,这可能是一个在下一篇文章中探索的好话题。
你试过其他代理吗?它们与Nginx或Traefik相比如何?我们很乐意听到您的经验,请通过我们的网站与我们分享社区论坛。






