启用TLS加密
启用TLS加密客户端与InfluxDB服务器之间的通信。 当配置有签名证书时,TLS还允许客户端验证InfluxDB服务器的真实性。
按照步骤设置 HTTPS 上的 TLS,连接到您的服务器,并排除问题:
InfluxData 强烈建议 启用HTTPS,特别是如果您打算通过网络向InfluxDB发送请求。
获取需求
要在InfluxDB中启用HTTPS,您需要一个传输层安全性(TLS)证书,也称为安全套接字层(SSL)证书。 InfluxDB支持三种类型的TLS证书:
由证书授权机构(CA)签署的单域名证书
单域证书为HTTPS请求提供加密安全性,并允许客户端验证InfluxDB服务器的身份。 这些证书由受信任的第三方 证书颁发机构 (CA) 签署和颁发。 使用此证书选项,每个InfluxDB实例都需要一个唯一的单域证书。
由证书颁发机构签署的通配符证书
通配符证书为HTTPS请求提供加密安全性,并允许客户端验证InfluxDB服务器的身份。 通配符证书可以在不同服务器上的多个InfluxDB实例之间使用。
自签名证书
自签名证书不是由受信任的第三方CA签署的。 与CA签署的证书不同,自签名证书仅为HTTPS请求提供加密安全性。 它们不允许客户端验证InfluxDB服务器的身份。 使用此证书选项,每个InfluxDB实例都需要一个独特的自签名证书。 您可以在自己的机器上生成自签名证书。
配置InfluxDB以使用TLS
下载或生成证书文件
从以下选项中选择:
下载和安装CA证书文件
如果使用CA签署的证书,请按照他们的说明下载和安装证书文件。 请注意证书文件安装的位置,然后继续设置证书文件权限。
我的证书在哪里?
您的证书文件的位置取决于您的系统、域和证书授权机构。
例如,如果 Let’s Encrypt 是你的 CA 并且你使用 certbot 来安装证书,默认位置是
/etc/letsencrypt/live/$domain。关于 Let’s Encrypt 证书路径的更多信息,请参见 Where are my certificates?
生成自签名证书
要生成 自签名证书,请在您的系统上使用 openssl 命令。
以下示例:
- 为您的 TLS 证书配置 主题备用名称 (
subjectAltName, SAN)。 - 为类Unix和Windows系统生成位于
/etc/ssl的证书。
仅供示例目的,该代码创建一个未加密的私钥。
加密私钥
使用加密密钥来增强安全性。 如果您必须使用未加密的密钥,请确保它安全存储并具有适当的文件权限。
# Create a temporary configuration file that defines properties for
# the Subject Alternative Name (SAN) extension
cat > san.cnf <<EOF
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
C = US
ST = California
L = San Francisco
O = Example Company
OU = IT Department
CN = example.com
[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = example.com
DNS.2 = www.example.com
IP.1 = 10.1.2.3
EOF
# Generate a private key and certificate signing request (CSR)
# using the configuration file
openssl req -new -newkey rsa:2048 -nodes \
-keyout /etc/ssl/influxdb-selfsigned.key \
-out /etc/ssl/influxdb-selfsigned.csr \
-config san.cnf
# Generate the self-signed certificate
openssl x509 -req -in /etc/ssl/influxdb-selfsigned.csr \
-signkey /etc/ssl/influxdb-selfsigned.key \
-out /etc/ssl/influxdb-selfsigned.crt \
-days NUMBER_OF_DAYS \
-extensions v3_req -extfile san.cnf
# Remove the temporary configuration file
rm san.cnf
将以下内容替换为您自己的值:
NUMBER_OF_DAYS: 文件保持有效的天数/etc/ssl: 您系统的SSL配置目录- 在
req_distinguished_name和alt_names中配置字段值——例如,在[alt_names]部分,设置您用来访问 InfluxDB 服务器的域名和 IP 地址。
输出是一个私钥和一个包含指定域名和IP地址的CSR,位于主题备用名称SAN扩展中。生成的证书对于example.com、www.example.com和IP地址10.1.2.3有效。
设置证书文件权限
运行 InfluxDB 的用户必须对 TLS 证书文件具有读取权限。
您可以选择设置多个用户、组和权限。最终,请确保运行InfluxDB的所有用户对TLS证书具有读取权限。
在您的终端中,运行 chown 来设置所有者,并运行 chmod 来设置已安装证书文件的权限。
以下示例展示了如何将所有权转移给用户和组 influxdb,并为在 前一步 生成的自签名证书和密钥文件设置读取权限:
sudo chown influxdb: /etc/ssl/influxdb-selfsigned.crt /etc/ssl/influxdb-selfsigned.key
sudo chmod 644 /etc/ssl/influxdb-selfsigned.crt
sudo chmod 600 /etc/ssl/influxdb-selfsigned.key
验证证书和密钥文件
为了确保证书和密钥文件正确并相互匹配,请在终端中输入以下命令:
openssl x509 -noout -modulus -in /etc/ssl/influxdb-selfsigned.crt | openssl md5
openssl rsa -noout -modulus -in /etc/ssl/influxdb-selfsigned.key | openssl md5
使用 TLS 标志运行 influxd
要使用TLS命令行标志启动InfluxDB,请输入以下命令,并提供您的密钥和证书文件的路径:
influxd \
--tls-cert="/etc/ssl/influxdb-selfsigned.crt" \
--tls-key="/etc/ssl/influxdb-selfsigned.key" > /var/log/influxdb.log 2>&1 &
如果成功,InfluxDB将在后台运行并记录到 influxdb.log。
验证TLS连接
要测试您的证书,请使用https://协议访问InfluxDB,例如,使用cURL:
curl --verbose https://localhost:8086/api/v2/ping
如果使用自签名证书,则跳过证书验证——例如,在cURL命令中,传递-k, --insecure标志:
curl --verbose --insecure https://localhost:8086/api/v2/ping
如果成功,curl --verbose 输出将显示一个 TLS 握手——例如:
* [CONN-0-0][CF-SSL] TLSv1.3 (IN), TLS handshake
您可以使用
tls-min-version
和
tls-strict-ciphers进一步配置TLS设置。
将Telegraf连接到受保护的InfluxDB实例
要将 Telegraf 连接到启用 TLS 的 InfluxDB 2.7 实例,请更新 Telegraf 配置文件中的以下 influxdb_v2 输出设置:
- 将网址更新为使用HTTPS而不是HTTP。
- 如果使用自签名证书,请取消注释并将
insecure_skip_verify设置为true。
Telegraf 配置示例
###############################################################################
# OUTPUT PLUGINS #
###############################################################################
# Configuration for sending metrics to InfluxDB
[[outputs.influxdb_v2]]
## The URLs of the InfluxDB cluster nodes.
##
## Multiple URLs can be specified for a single cluster, only ONE of the
## urls will be written to each interval.
urls = ["https://127.0.0.1:8086"]
[...]
## Optional TLS Config for use on HTTP connections.
[...]
## Use TLS but skip chain & host verification
insecure_skip_verify = true
使用更新的配置文件重新启动 Telegraf。
排查TLS问题
在激活TLS之后识别和解决问题。
检查InfluxDB日志
检查InfluxDB日志中是否有关于该问题的错误消息或警告。
示例 TLS 错误
msg="http: TLS handshake error from [::1]:50476:
remote error: tls: illegal parameter" log_id=0rqN8H_0000 service=http
验证证书和密钥文件
为了确保证书和密钥文件正确并相互匹配,请在终端中输入以下命令:
openssl x509 -noout -modulus -in /etc/ssl/influxdb-selfsigned.crt | openssl md5
openssl rsa -noout -modulus -in /etc/ssl/influxdb-selfsigned.key | openssl md5
使用OpenSSL的测试
使用 OpenSSL 测试服务器的证书和密钥 - 例如,在终端中输入以下命令:
openssl s_client -connect localhost:8086 -CAfile /etc/ssl/influxdb-selfsigned.crt
检查文件权限
确保 InfluxDB 进程对证书和密钥文件具有读取权限——例如,输入以下命令以设置文件权限:
sudo chmod 644 /etc/ssl/influxdb-selfsigned.crt
sudo chmod 600 /etc/ssl/influxdb-selfsigned.key
验证 TLS 配置
确保 InfluxDB 中的 TLS 配置是正确的。 检查 InfluxDB 配置中的证书和密钥文件的路径 或者命令行标志。
示例错误:无法验证证书
Sep 25 14:00:02 host influxd-systemd-start.sh[11782]: ts=2024-09-25T12:00:02.055617Z lvl=error msg="Unable to gather" log_id=0rr6jG30000 service=scraper scraper-name="new target" error="Get \"https://10.1.2.3:8086/metrics\": tls: failed to verify certificate: x509: cannot validate certificate for 10.1.2.3 because it doesn't contain any IP SANs"
Sep 25 14:00:02 host influxd-systemd-start.sh[11782]: ts=2024-09-25T12:00:02.055397Z lvl=info msg="http: TLS handshake error from 10.1.2.3:46380: remote error: tls: bad certificate" log_id=0rr6jG30000 service=http
如果您通过IP地址访问您的InfluxDB服务器,请在您的subjectAltName配置中包含该地址。
更新 OpenSSL 和 InfluxDB
确保您使用的是最新版本的 OpenSSL 和 InfluxDB,因为更新可能包含 TLS 相关问题的修复。