使用 HTTPS 保护多服务器安全引擎安装

作者:Manuel Sabban
Secure A Multi-Server Security Engine Installation With HTTPS

欢迎来到我们关于如何设置和保护多服务器 CrowdSec 安全引擎安装教程的第二部分。在第一部分中,我引导您完成了跨多台服务器设置 CrowdSec 安全引擎的过程,其中一台服务器作为父服务器,另外两台机器将警报转发给它。

在这一部分中,我将解决之前多服务器安全引擎安装中,明文 HTTP 通信带来的安全问题。为了解决这个问题,我建议在安全引擎之间建立加密通道进行通信。此解决方案允许 server-2server-3 信任 server-1 的身份,并避免中间人攻击。

使用自签名证书

创建证书

首先,您需要创建一个证书。这可以使用以下单行命令来实现。

bash
openssl req -x509 -newkey rsa:4096 -keyout encrypted-key.pem -out cert.pem -days 365 -addext "subjectAltName = IP:172.31.100.242"

目前,安全引擎在启动时无法要求输入私钥的密码。因此,您可以选择在每次启动或重新加载安全引擎时手动解密私钥,或者存储未加密的密钥。无论如何,要去除密码,您可以使用以下命令

bash
openssl rsa -in encrypted-key.pem -out key.pem

然后,在安全引擎启动后,可以安全地删除未加密的密钥文件。

配置安全引擎以使用自签名证书

server-1 上,您需要配置安全引擎以使用生成的证书。如下所示,以下 /etc/crowdec/config.yaml 摘录的 api.server 部分中的 tls.cert_filetls.key_file 选项设置为生成的证书文件。

yaml
api:
  server:
    log_level: info
    listen_uri: 10.0.0.1:8080
    profiles_path: /etc/crowdsec/profiles.yaml
    online_client: # Crowdsec API credentials (to push signals and receive bad 

    tls:
      cert_file: /etc/crowdsec/ssl/cert.pem
      key_file: /etc/crowdsec/ssl/key.pem

在客户端,配置更改发生在两个文件中。首先,修改 /etc/crowdec/config.yaml,通过将 insecure_skip_verify 设置为 true 来接受自签名证书。

您还需要在 /etc/crowdsec/local_api_credentials.yaml 文件中将 HTTP 更改为 HTTPS,以反映这些更改。这个小改动必须在所有三台服务器(server-1server-2server-3)上完成。

注意: 请记住,如果 server-1 也用作日志处理器,则也必须在 server-1 上完成此 LAPI 配置。

yaml
url: https://10.0.0.1:8080/
login: <login>
password: <password>

旁注: 显然,使用自签名证书并不能对 LAPI 服务器的所有权提供任何信任。使用该服务的服务器(本设置中的 server-2server-3)仍然容易受到中间人攻击,但至少此设置提供了加密通信。这就是需要 InsecureSkipVerify 选项的原因。

使用证书颁发机构颁发的证书

可以利用 Let's Encrypt 或 Amazon ACM 等服务来解决 InsecureSkipVerify 的问题,方法是为完全限定域名颁发证书,该域名可以添加到 /etc/hosts 或本地 DNS 服务器。然后可以使用此指定的完全限定域名填充 /etc/crowdsec/local_api_credentials.yaml

这确实有效,并且可以避免设置 InsecureSkipVerify 选项。这确保了客户端和服务器之间的通信不会被篡改,只要 DNS 配置是可信的,但这仍然应被视为一种权宜之计。

使用 PKI

配置和管理 SSL 公钥基础设施 (PKI) 的过程不属于本教程的范围,但我强烈建议您查看 OpenSSL 官方文档。简单的 PKI 场景对于此安全引擎设置来说已经足够了。

按照 OpenSSL 文档,有几件事值得一提。

为了在我们的 CrowdSec TLS 场景中使用,证书请求必须使用与 Crowdsec LAPI 服务器的 IP 地址相对应的主题备用名称来颁发。这可以通过在调用 OpenSSL 进行证书请求时定位 SAN 环境变量来完成(请参阅 OpenSSL 简单 PKI 场景 中的步骤 3.3)。

bash
SAN=IP:10.0.0.1 openssl req -new -config etc/server.conf -out certs/crowdsec.csr -keyout certs/crowdsec.key

根证书和签名证书的公共部分(在 OpenSSL 简单 PKI 场景的步骤 4.5 中创建的捆绑文件)必须在启动 CrowdSec 安全引擎之前添加到本地证书存储中。在本设置中,这是连接到 LAPI 服务器所必需的。有很多方法可以做到这一点,golang 源代码指定了证书的预期位置,或者您可以使用 systemd 服务文件中的 SSL_CERT_FILE 环境变量来指定启动安全引擎时在哪里找到证书。

关于 CrowdSec 和 TLS 身份验证的更新说明

在本文首次发布后,我们为安全引擎添加了一项新功能,您现在不仅能够通过 TLS 保护通信安全,还可以使用证书确保身份验证。在官方文档中,您可以找到一个很好的示例,展示了如何在安全引擎之间或安全引擎和修复组件之间使用证书进行 TLS 身份验证。

结论

本文重点介绍了如何在不同的 CrowdSec 安全引擎安装之间保护通信安全。所考虑的用例是在专用网络中的安全引擎安装,但这也可以部署在公共网络上,通过互联网进行通信。在这种情况下,第三方证书可以轻松解决问题。

根据需求,我提出了三种不同的方法来实现安全引擎之间的安全 TLS 通信——使用自签名证书、使用证书颁发机构颁发的证书以及使用 SSL 公钥基础设施。

第一种场景,使用自签名证书,仅适用于您想要确保加密通信而无需身份验证的情况。当您有可能修改本地 DNS 解析时,第二种提出的场景可能仅被视为一种权宜之计。第三种提出的场景是最复杂的,但它适用于大多数用例,并且可能是安全问题较高时的首选方法。

我希望本教程对您有所帮助。感谢阅读,敬请期待!

如果您有任何问题或反馈,请随时通过我们的社区平台 DiscordDiscourse 与我们联系。

Manuel 于 2009 年获得了量子密钥分发博士学位,并在成为安全软件从业者之前担任了几年 SRE。他于 2021 年初加入 CrowdSec,成为其核心团队成员,并全天候致力于产品开发。

加载 Disqus 评论