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

相关推荐
做萤石二次开发的哈哈1 天前
视频解码器怎么对接?解码上墙、电视墙开窗与场景切换的ISAPI接入实战
人工智能·物联网·监控·视频编解码·大屏端·萤石开放平台·蓝海aiot一站式工作台
lisanmengmeng2 天前
nagios 图形化监控部署
监控·nagios
鸿观工坊2 天前
第5篇 Nginx 监控:流量、连接与性能指标
监控
鸿观工坊2 天前
第4篇 Spring Boot 应用监控:Micrometer 与 JVM 指标
监控
鸿观工坊2 天前
第1篇 Prometheus 监控体系全景与基础环境搭建
监控
苏渡苇10 天前
Spring Insight 里如何把 Span 画成瀑布时间线
后端·spring·spring cloud·springboot·监控·apm
行百里er10 天前
轻量级 Spring 监测工具——Spring Insight 发布了
spring boot·后端·监控
宋均浩11 天前
告警规则 243 砍到 27:Prometheus 降噪实战,日均打扰 47 次 → 3 次
云原生·监控·devops
小小ken12 天前
水星摄像头(MIPC552W)双摄版和乔安摄像头(JA-A12,JA-w1)接入easynvr具体步骤
监控·摄像头·nvr·easynvr·水星·乔安
行百里er12 天前
Spring Insight 里如何把 Span 画成瀑布时间线
spring boot·后端·监控