DataKit 采集器敏感信息加密最佳实践

DataKit 采集器敏感信息加密

敏感信息如密码、账号信息等,如果您希望避免在配置文件中以明文存储这些信息,则可以使用该功能。

如密码加密,DataKit 在启动加载采集器配置文件时遇到 ENC[] 时会在文件、env、或者 AES 加密得到密码后替换文本并重新加载到内存中,以得到正确的密码。

安装 DataKit

登陆观测云控制台,点击左侧「集成」选择顶部「DataKit」,即可看到各种方式的安装命令。

本文选择 Linux 方式安装,执行安装命令即可。

采集器加密配置

ENC 目前主机支持两种方式:

  • 文件形式(推荐)
  • AES 加密

文件形式(推荐)

配置文件中密码格式: ENC[file:///path/to/enc4dk] ,在对应的文件中填写正确的密码即可。

接下来以 mysql 为例,说明两种方式如何配置使用。

首先,将明文密码放到文件 /usr/local/datakit/enc4mysql 中(文件路径以及密码可自定义)。

然后修改配置文件 usr/local/datakit/conf.d/db/mysql.conf

ini 复制代码
# 部分配置
[[inputs.mysql]]
  host = "localhost"
  user = "datakit"
  pass = "ENC[file:///usr/local/datakit/enc4mysql]"  # mysql明文密码的文件存放地址
  port = 3306
  # sock = "<SOCK>"
  # charset = "utf8"

DK 会从 /usr/local/datakit/enc4mysql 中读取密码并替换密码,替换后为 pass = "HelloWord"

AES 加密方式

配置:vi /usr/local/datakit/conf.d/datakit.conf ,编辑 DataKit 主配置文件 datakit.conf 并添加如下配置,aes_key 跟 aes_Key_file 配置二选一。

ini 复制代码
# crypto key or key filePath.
[crypto]
  # 配置秘钥(如下二选一)
  aes_key = "0123456789abcdef"
  # 或者,将秘钥放到文件中并在此配置文件位置。
  aes_Key_file = "/usr/local/datakit/mykey"

然后修改配置文件 usr/local/datakit/conf.d/db/mysql.conf (pass 的密文需要通过 aes 加密后填入)。

ini 复制代码
# 部分配置
[[inputs.mysql]]
  host = "localhost"
  user = "datakit"
  pass = "ENC[aes://5w1UiRjWuVk53k96WfqEaGUYJ/Oje7zr8xmBeGa3ugI=]"
  port = 3306
  # sock = "<SOCK>"
  # charset = "utf8"

注意,通过 AES 加密得到的密文需要完整的填入,可根据实际语言进行加密处理,以下是 JAVA 的 AES 加密示例:

ini 复制代码
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
import java.util.Base64;

public class AESUtils {
    public static String AESEncrypt(byte[] key, String plaintext) throws Exception {
        javax.crypto.Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");

        SecureRandom random = new SecureRandom();
        byte[] iv = new byte[16];
        random.nextBytes(iv);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
        byte[] encrypted = cipher.doFinal(plaintext.getBytes());
        byte[] ivAndEncrypted = new byte[iv.length + encrypted.length];
        System.arraycopy(iv, 0, ivAndEncrypted, 0, iv.length);
        System.arraycopy(encrypted, 0, ivAndEncrypted, iv.length, encrypted.length);

        return Base64.getEncoder().encodeToString(ivAndEncrypted);
    }

    public static String AESDecrypt(byte[] key, String cryptoText) throws Exception {
        byte[] ciphertext = Base64.getDecoder().decode(cryptoText);

        SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");

        if (ciphertext.length < 16) {
            throw new Exception("ciphertext too short");
        }

        byte[] iv = new byte[16];
        System.arraycopy(ciphertext, 0, iv, 0, 16);
        byte[] encrypted = new byte[ciphertext.length - 16];
        System.arraycopy(ciphertext, 16, encrypted, 0, ciphertext.length - 16);

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);

        byte[] decrypted = cipher.doFinal(encrypted);

        return new String(decrypted);
    }
}
public static void main(String[] args) {
    try {
        String key = "0123456789abcdef"; // 16, 24, or 32 bytes AES key
        String plaintext = "HelloAES9*&.";
        byte[] keyBytes = key.getBytes("UTF-8");

        String encrypted = AESEncrypt(keyBytes, plaintext);
        System.out.println("Encrypted text: " + encrypted);

        String decrypt = AESDecrypt(keyBytes, encrypted);
        System.out.println("解码后的是:"+decrypt);
    } catch (Exception e) {
        System.out.println(e);
        e.printStackTrace();
    }
}

总结

对 DataKit 采集器密码加密,能避免敏感信息在配置文件中明文暴露,降低未授权访问或意外泄露风险,满足企业及行业安全规范与合规要求,同时防止配置文件在备份、迁移等流转过程中,敏感信息被轻易获取破解,保障数据安全。

相关推荐
indexsunny3 天前
互联网大厂Java面试实战:从Spring Boot到微服务架构的深度探讨
java·数据库·spring boot·安全·微服务·监控·面试实战
SkyWalking中文站6 天前
使用 TraceQL 查询 SkyWalking 和 Zipkin 链路追踪数据并在 Grafana 中可视化
运维·grafana·监控
zs宝来了6 天前
Prometheus 监控体系原理:Pull 模式与 TSDB 时序数据库
prometheus·时序数据库·监控·tsdb·pull模式
lvbinemail7 天前
动环方案实践:温湿度传感器+串口服务器+Zabbix+Grafana
zabbix·监控·机房·动环
可观测性用观测云13 天前
Claude Code 意外开源:我们看到了每一个企业级 Agent 都需要行为分析
ai编程·监控
夫礼者17 天前
【极简监控】核弹级排障利器:仿 Jenkins Script Console 打造免重启诊断“黑科技”
java·jenkins·监控·排错
志遥17 天前
我把 Sentry 接进了 7 端小程序:从异常捕获、Breadcrumb 到 Source Map 定位
微信小程序·监控
夫礼者17 天前
【极简监控】不骗篇幅!7个零运维成本的排障“微操”,让线上问题彻底左移
java·运维·监控
夫礼者17 天前
【极简监控】打破中间件黑盒:用 Micrometer 打造“SLF4J式”的降维打击Metrics监控体系
java·中间件·监控·metrics·micrometer
johnny23318 天前
监控:HertzBeat、Tianji、CheckCle、ApiMonitor、xrkmonitor 、Pika、FastMonitor
监控