DataKit 采集器敏感信息加密
敏感信息如密码、账号信息等,如果您希望避免在配置文件中以明文存储这些信息,则可以使用该功能。
如密码加密,DataKit 在启动加载采集器配置文件时遇到 ENC[] 时会在文件、env、或者 AES 加密得到密码后替换文本并重新加载到内存中,以得到正确的密码。
安装 DataKit
登陆观测云控制台,点击左侧「集成」选择顶部「DataKit」,即可看到各种方式的安装命令。
本文选择 Linux 方式安装,执行安装命令即可。
采集器加密配置
ENC 目前主机支持两种方式:
文件形式(推荐)
配置文件中密码格式: ENC[file:///path/to/enc4dk] ,在对应的文件中填写正确的密码即可。
接下来以 mysql 为例,说明两种方式如何配置使用。
首先,将明文密码放到文件 /usr/local/datakit/enc4mysql 中(文件路径以及密码可自定义)。
然后修改配置文件 usr/local/datakit/conf.d/db/mysql.conf 。
# 部分配置[[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 配置二选一。
# 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 加密后填入)。
# 部分配置[[inputs.mysql]] host = "localhost" user = "datakit" pass = "ENC[aes://5w1UiRjWuVk53k96WfqEaGUYJ/Oje7zr8xmBeGa3ugI=]" port = 3306 # sock = "<SOCK>" # charset = "utf8"
复制代码
注意,通过 AES 加密得到的密文需要完整的填入,可根据实际语言进行加密处理,以下是 JAVA 的 AES 加密示例:
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 采集器密码加密,能避免敏感信息在配置文件中明文暴露,降低未授权访问或意外泄露风险,满足企业及行业安全规范与合规要求,同时防止配置文件在备份、迁移等流转过程中,敏感信息被轻易获取破解,保障数据安全。
评论